/*
* Copyright 2013 Nicolas Morel
*
* 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 com.github.nmorel.gwtjackson.client;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
import com.github.nmorel.gwtjackson.client.deser.map.key.KeyDeserializer;
import com.github.nmorel.gwtjackson.client.ser.map.key.KeySerializer;
/**
* <p>Abstract AbstractConfiguration class.</p>
*
* @author Nicolas Morel
* @version $Id: $
*/
public abstract class AbstractConfiguration {
public class PrimitiveTypeConfiguration {
private final Class type;
private PrimitiveTypeConfiguration( Class type ) {
this.type = type;
}
public PrimitiveTypeConfiguration serializer( Class serializer ) {
mapTypeToSerializer.put( type, serializer );
return this;
}
public PrimitiveTypeConfiguration deserializer( Class deserializer ) {
mapTypeToDeserializer.put( type, deserializer );
return this;
}
}
public class TypeConfiguration<T> {
private final Class<T> type;
private TypeConfiguration( Class<T> type ) {
this.type = type;
}
public TypeConfiguration<T> serializer( Class<? extends JsonSerializer> serializer ) {
mapTypeToSerializer.put( type, serializer );
return this;
}
public TypeConfiguration<T> deserializer( Class<? extends JsonDeserializer> deserializer ) {
mapTypeToDeserializer.put( type, deserializer );
return this;
}
}
public class KeyTypeConfiguration<T> {
private final Class<T> type;
private KeyTypeConfiguration( Class<T> type ) {
this.type = type;
}
public KeyTypeConfiguration<T> serializer( Class<? extends KeySerializer> serializer ) {
mapTypeToKeySerializer.put( type, serializer );
return this;
}
public KeyTypeConfiguration<T> deserializer( Class<? extends KeyDeserializer> deserializer ) {
mapTypeToKeyDeserializer.put( type, deserializer );
return this;
}
}
private final Map<Class, Class> mapTypeToSerializer = new HashMap<Class, Class>();
private final Map<Class, Class> mapTypeToDeserializer = new HashMap<Class, Class>();
private final Map<Class, Class> mapTypeToKeySerializer = new HashMap<Class, Class>();
private final Map<Class, Class> mapTypeToKeyDeserializer = new HashMap<Class, Class>();
private final Map<Class, Class> mapMixInAnnotations = new HashMap<Class, Class>();
private final List<String> whitelist = new ArrayList<String>();
private JsonAutoDetect.Visibility fieldVisibility = JsonAutoDetect.Visibility.DEFAULT;
private JsonAutoDetect.Visibility getterVisibility = JsonAutoDetect.Visibility.DEFAULT;
private JsonAutoDetect.Visibility isGetterVisibility = JsonAutoDetect.Visibility.DEFAULT;
private JsonAutoDetect.Visibility setterVisibility = JsonAutoDetect.Visibility.DEFAULT;
private JsonAutoDetect.Visibility creatorVisibility = JsonAutoDetect.Visibility.DEFAULT;
/**
* <p>Constructor for AbstractConfiguration.</p>
*/
protected AbstractConfiguration() {
configure();
}
/**
* <p>primitiveType</p>
*
* @param type Type
* @return a {@link PrimitiveTypeConfiguration} to configure serializer and/or deserializer for the given primitive type.
*/
protected PrimitiveTypeConfiguration primitiveType( Class type ) {
if ( !type.isPrimitive() ) {
throw new IllegalArgumentException( "Type " + type + " is not a primitive. Call type(Class) instead" );
}
return new PrimitiveTypeConfiguration( type );
}
/**
* <p>type</p>
*
* @param type Type
* @return a {@link TypeConfiguration} to configure serializer and/or deserializer for the given type.
* @param <T> a T object.
*/
protected <T> TypeConfiguration<T> type( Class<T> type ) {
if ( type.isPrimitive() ) {
throw new IllegalArgumentException( "Type " + type + " is a primitive. Call primitiveType(Class) instead" );
}
return new TypeConfiguration<T>( type );
}
/**
* Return a {@link KeyTypeConfiguration} to configure key serializer and/or deserializer for the given type.
*
* @param type a {@link java.lang.Class} object.
* @param <T> Type
* @return a {@link com.github.nmorel.gwtjackson.client.AbstractConfiguration.KeyTypeConfiguration} object.
*/
protected <T> KeyTypeConfiguration<T> key( Class<T> type ) {
if ( type.isPrimitive() ) {
throw new IllegalArgumentException( "Primitive types cannot be used as a map's key" );
}
return new KeyTypeConfiguration<T>( type );
}
/**
* Method to use for adding mix-in annotations to use for augmenting
* specified class or interface. All annotations from
* <code>mixinSource</code> are taken to override annotations
* that <code>target</code> (or its supertypes) has.
*
* @param target Class (or interface) whose annotations to effectively override
* @param mixinSource Class (or interface) whose annotations are to
* be "added" to target's annotations, overriding as necessary
* @return a {@link com.github.nmorel.gwtjackson.client.AbstractConfiguration} object.
*/
protected AbstractConfiguration addMixInAnnotations( Class<?> target, Class<?> mixinSource ) {
mapMixInAnnotations.put( target, mixinSource );
return this;
}
/**
* Method to add a regex into whitelist.
* <p>
* All the types matching whitelist are added to the subtype list of {@link Object} and
* {@link Serializable} serializer/deserializer.
* </p>
*
* @param regex the regex to add
* @return a {@link com.github.nmorel.gwtjackson.client.AbstractConfiguration} object.
*/
protected AbstractConfiguration whitelist( String regex ) {
whitelist.add( regex );
return this;
}
/**
* Override the default behaviour of {@link JsonAutoDetect.Visibility#DEFAULT} for fields.
*
* @param visibility the new default behaviour
* @return a {@link com.github.nmorel.gwtjackson.client.AbstractConfiguration} object.
*/
protected AbstractConfiguration fieldVisibility( JsonAutoDetect.Visibility visibility ) {
this.fieldVisibility = visibility;
return this;
}
/**
* Override the default behaviour of {@link JsonAutoDetect.Visibility#DEFAULT} for getters.
*
* @param visibility the new default behaviour
* @return a {@link com.github.nmorel.gwtjackson.client.AbstractConfiguration} object.
*/
protected AbstractConfiguration getterVisibility( JsonAutoDetect.Visibility visibility ) {
this.getterVisibility = visibility;
return this;
}
/**
* Override the default behaviour of {@link JsonAutoDetect.Visibility#DEFAULT} for boolean getters.
*
* @param visibility the new default behaviour
* @return a {@link com.github.nmorel.gwtjackson.client.AbstractConfiguration} object.
*/
protected AbstractConfiguration isGetterVisibility( JsonAutoDetect.Visibility visibility ) {
this.isGetterVisibility = visibility;
return this;
}
/**
* Override the default behaviour of {@link JsonAutoDetect.Visibility#DEFAULT} for setters.
*
* @param visibility the new default behaviour
* @return a {@link com.github.nmorel.gwtjackson.client.AbstractConfiguration} object.
*/
protected AbstractConfiguration setterVisibility( JsonAutoDetect.Visibility visibility ) {
this.setterVisibility = visibility;
return this;
}
/**
* Override the default behaviour of {@link JsonAutoDetect.Visibility#DEFAULT} for creators.
*
* @param visibility the new default behaviour
* @return a {@link com.github.nmorel.gwtjackson.client.AbstractConfiguration} object.
*/
protected AbstractConfiguration creatorVisibility( JsonAutoDetect.Visibility visibility ) {
this.creatorVisibility = visibility;
return this;
}
/**
* <p>configure</p>
*/
protected abstract void configure();
/**
* <p>Getter for the field <code>mapTypeToSerializer</code>.</p>
*
* @return a {@link java.util.Map} object.
*/
public Map<Class, Class> getMapTypeToSerializer() {
return mapTypeToSerializer;
}
/**
* <p>Getter for the field <code>mapTypeToDeserializer</code>.</p>
*
* @return a {@link java.util.Map} object.
*/
public Map<Class, Class> getMapTypeToDeserializer() {
return mapTypeToDeserializer;
}
/**
* <p>Getter for the field <code>mapTypeToKeySerializer</code>.</p>
*
* @return a {@link java.util.Map} object.
*/
public Map<Class, Class> getMapTypeToKeySerializer() {
return mapTypeToKeySerializer;
}
/**
* <p>Getter for the field <code>mapTypeToKeyDeserializer</code>.</p>
*
* @return a {@link java.util.Map} object.
*/
public Map<Class, Class> getMapTypeToKeyDeserializer() {
return mapTypeToKeyDeserializer;
}
/**
* <p>Getter for the field <code>mapMixInAnnotations</code>.</p>
*
* @return a {@link java.util.Map} object.
*/
public Map<Class, Class> getMapMixInAnnotations() {
return mapMixInAnnotations;
}
/**
* <p>Getter for the field <code>whitelist</code>.</p>
*
* @return a {@link java.util.List} object.
*/
public List<String> getWhitelist() {
return whitelist;
}
/**
* <p>Getter for the field <code>fieldVisibility</code>.</p>
*
* @return a {@link com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility} object.
*/
public Visibility getFieldVisibility() {
return fieldVisibility;
}
/**
* <p>Getter for the field <code>getterVisibility</code>.</p>
*
* @return a {@link com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility} object.
*/
public Visibility getGetterVisibility() {
return getterVisibility;
}
/**
* <p>Getter for the field <code>isGetterVisibility</code>.</p>
*
* @return a {@link com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility} object.
*/
public Visibility getIsGetterVisibility() {
return isGetterVisibility;
}
/**
* <p>Getter for the field <code>setterVisibility</code>.</p>
*
* @return a {@link com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility} object.
*/
public Visibility getSetterVisibility() {
return setterVisibility;
}
/**
* <p>Getter for the field <code>creatorVisibility</code>.</p>
*
* @return a {@link com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility} object.
*/
public Visibility getCreatorVisibility() {
return creatorVisibility;
}
}