Package com.vercer.engine.persist.util.generic

Source Code of com.vercer.engine.persist.util.generic.VarMap

/*
* Copied from Gentyref project http://code.google.com/p/gentyref/
* Reformatted and moved to fit package structure
*/
package com.vercer.engine.persist.util.generic;

import java.lang.reflect.GenericArrayType;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
import java.util.HashMap;
import java.util.Map;

/**
* Mapping between type variables and actual parameters.
*
* @author Wouter Coekaerts <wouter@coekaerts.be>
*/
class VarMap
{
  private final Map<TypeVariable<?>, Type> map = new HashMap<TypeVariable<?>, Type>();

  /**
   * Creates an empty VarMap
   */
  VarMap()
  {
  }

  void add(TypeVariable<?> variable, Type value)
  {
    map.put(variable, value);
  }

  void addAll(TypeVariable<?>[] variables, Type[] values)
  {
    assert variables.length == values.length;
    for (int i = 0; i < variables.length; i++)
    {
      map.put(variables[i], values[i]);
    }
  }

  VarMap(TypeVariable<?>[] variables, Type[] values)
  {
    addAll(variables, values);
  }

  Type map(Type type)
  {
    if (type instanceof Class<?>)
    {
      return type;
    }
    else if (type instanceof TypeVariable<?>)
    {
      assert map.containsKey(type);
      return map.get(type);
    }
    else if (type instanceof ParameterizedType)
    {
      ParameterizedType pType = (ParameterizedType) type;
      return new ParameterizedTypeImpl((Class<?>) pType.getRawType(), map(pType
          .getActualTypeArguments()), pType.getOwnerType() == null ? pType.getOwnerType()
          : map(pType.getOwnerType()));
    }
    else if (type instanceof WildcardType)
    {
      WildcardType wType = (WildcardType) type;
      return new WildcardTypeImpl(map(wType.getUpperBounds()), map(wType.getLowerBounds()));
    }
    else if (type instanceof GenericArrayType)
    {
      return GenericArrayTypeImpl.createArrayType(map(((GenericArrayType) type)
          .getGenericComponentType()));
    }
    else
    {
      throw new RuntimeException("not implemented: mapping " + type.getClass() + " (" + type
          + ")");
    }
  }

  Type[] map(Type[] types)
  {
    Type[] result = new Type[types.length];
    for (int i = 0; i < types.length; i++)
    {
      result[i] = map(types[i]);
    }
    return result;
  }
}
TOP

Related Classes of com.vercer.engine.persist.util.generic.VarMap

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.