Subversion Repositories bacoAlunos

Rev

Blame | Compare with Previous | Last modification | View Log | RSS feed

package genson.reflect;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Interface implemented by classes who want to provide {@link genson.reflect.BeanDescriptor} instances for the
 * specified type.
 *
 * @author eugen
 */

public interface BeanDescriptorProvider {
  /**
   * Provides a BeanDescriptor for "type" using current Genson instance.
   *
   * @param type for which we need a BeanDescriptor.
   * @param genson current instance.
   * @return A BeanDescriptor instance able to serialize/deserialize objects of type T.
   */

  public <T> genson.reflect.BeanDescriptor<T> provide(Class<T> type, genson.Genson genson);

  /**
   * Provides a BeanDescriptor that can serialize/deserialize "ofClass" type, based on "type"
   * argument. The arguments "ofClass" and "type" will be the same in most cases, but for example
   * in BeanViews ofClass will correspond to the parameterized type and "type" to the BeanView
   * implementation.
   *
   * @param ofClass is the Class for which we need a BeanDescriptor that will be able to
   *                serialize/deserialize objects of that type;
   * @param type    to use to build this descriptor (use its declared methods, fields, etc).
   * @param genson  is the current Genson instance.
   * @return A BeanDescriptor instance able to serialize/deserialize objects of type ofClass.
   */

  public <T> genson.reflect.BeanDescriptor<T> provide(Class<T> ofClass, 1.5.0/docs/api/java/lang/reflect/Type.html">Type type, genson.Genson genson);


  public static class CompositeBeanDescriptorProvider implements BeanDescriptorProvider {
    private final List<BeanDescriptorProvider> providers;

    private final ConcurrentHashMap<Type, genson.reflect.BeanDescriptor<?>> cache = new ConcurrentHashMap<Type, genson.reflect.BeanDescriptor<?>>();

    public CompositeBeanDescriptorProvider(List<BeanDescriptorProvider> providers) {
      this.providers = new ArrayList<BeanDescriptorProvider>(providers);
    }

    @1.5.0/docs/api/java/lang/Override.html">Override
    public <T> genson.reflect.BeanDescriptor<T> provide(Class<T> ofClass, genson.Genson genson) {
      return provide(ofClass, ofClass, genson);
    }

    @1.5.0/docs/api/java/lang/Override.html">Override
    public <T> genson.reflect.BeanDescriptor<T> provide(Class<T> ofClass, 1.5.0/docs/api/java/lang/reflect/Type.html">Type type, genson.Genson genson) {
      genson.reflect.BeanDescriptor<T> desc = (genson.reflect.BeanDescriptor<T>) cache.get(type);
      if (desc == null) {
        for (BeanDescriptorProvider provider : providers) {
          desc = provider.provide(ofClass, type, genson);
          if (desc != null) break;
        }

        cache.putIfAbsent(type, desc);
      }

      return desc;
    }
  }
}