/* 
 | 
 * Copyright (C) 2008 Google Inc. 
 | 
 * 
 | 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 | 
 * you may not use this file except in compliance with the License. 
 | 
 * You may obtain a copy of the License at 
 | 
 * 
 | 
 * http://www.apache.org/licenses/LICENSE-2.0 
 | 
 * 
 | 
 * Unless required by applicable law or agreed to in writing, software 
 | 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 | 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 | 
 * See the License for the specific language governing permissions and 
 | 
 * limitations under the License. 
 | 
 */ 
 | 
  
 | 
package cn.emay.sdk.util.json.gson; 
 | 
  
 | 
import java.lang.reflect.Type; 
 | 
import java.sql.Timestamp; 
 | 
import java.text.DateFormat; 
 | 
import java.text.ParseException; 
 | 
import java.text.ParsePosition; 
 | 
import java.text.SimpleDateFormat; 
 | 
import java.util.Date; 
 | 
import java.util.Locale; 
 | 
  
 | 
import cn.emay.sdk.util.json.gson.internal.bind.util.ISO8601Utils; 
 | 
  
 | 
/** 
 | 
 * This type adapter supports three subclasses of date: Date, Timestamp, and 
 | 
 * java.sql.Date. 
 | 
 * 
 | 
 * @author Inderjeet Singh 
 | 
 * @author Joel Leitch 
 | 
 */ 
 | 
final class DefaultDateTypeAdapter implements JsonSerializer<Date>, JsonDeserializer<Date> { 
 | 
  
 | 
    // TODO: migrate to streaming adapter 
 | 
  
 | 
    private final DateFormat enUsFormat; 
 | 
    private final DateFormat localFormat; 
 | 
  
 | 
    DefaultDateTypeAdapter() { 
 | 
        this(DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.US), DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT)); 
 | 
    } 
 | 
  
 | 
    DefaultDateTypeAdapter(String datePattern) { 
 | 
        this(new SimpleDateFormat(datePattern, Locale.US), new SimpleDateFormat(datePattern)); 
 | 
    } 
 | 
  
 | 
    DefaultDateTypeAdapter(int style) { 
 | 
        this(DateFormat.getDateInstance(style, Locale.US), DateFormat.getDateInstance(style)); 
 | 
    } 
 | 
  
 | 
    public DefaultDateTypeAdapter(int dateStyle, int timeStyle) { 
 | 
        this(DateFormat.getDateTimeInstance(dateStyle, timeStyle, Locale.US), DateFormat.getDateTimeInstance(dateStyle, timeStyle)); 
 | 
    } 
 | 
  
 | 
    DefaultDateTypeAdapter(DateFormat enUsFormat, DateFormat localFormat) { 
 | 
        this.enUsFormat = enUsFormat; 
 | 
        this.localFormat = localFormat; 
 | 
    } 
 | 
  
 | 
    // These methods need to be synchronized since JDK DateFormat classes are not 
 | 
    // thread-safe 
 | 
    // See issue 162 
 | 
    @Override 
 | 
    public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) { 
 | 
        synchronized (localFormat) { 
 | 
            String dateFormatAsString = enUsFormat.format(src); 
 | 
            return new JsonPrimitive(dateFormatAsString); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
 | 
        if (!(json instanceof JsonPrimitive)) { 
 | 
            throw new JsonParseException("The date should be a string value"); 
 | 
        } 
 | 
        Date date = deserializeToDate(json); 
 | 
        if (typeOfT == Date.class) { 
 | 
            return date; 
 | 
        } else if (typeOfT == Timestamp.class) { 
 | 
            return new Timestamp(date.getTime()); 
 | 
        } else if (typeOfT == java.sql.Date.class) { 
 | 
            return new java.sql.Date(date.getTime()); 
 | 
        } else { 
 | 
            throw new IllegalArgumentException(getClass() + " cannot deserialize to " + typeOfT); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private Date deserializeToDate(JsonElement json) { 
 | 
        synchronized (localFormat) { 
 | 
            try { 
 | 
                return localFormat.parse(json.getAsString()); 
 | 
            } catch (ParseException ignored) { 
 | 
            } 
 | 
            try { 
 | 
                return enUsFormat.parse(json.getAsString()); 
 | 
            } catch (ParseException ignored) { 
 | 
            } 
 | 
            try { 
 | 
                return ISO8601Utils.parse(json.getAsString(), new ParsePosition(0)); 
 | 
            } catch (ParseException e) { 
 | 
                throw new JsonSyntaxException(json.getAsString(), e); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public String toString() { 
 | 
        StringBuilder sb = new StringBuilder(); 
 | 
        sb.append(DefaultDateTypeAdapter.class.getSimpleName()); 
 | 
        sb.append('(').append(localFormat.getClass().getSimpleName()).append(')'); 
 | 
        return sb.toString(); 
 | 
    } 
 | 
} 
 |