/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.util.types;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Arrays;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import com.opengamma.util.ArgumentChecker;
/**
* Implementation of {@link ParameterizedType}.
*/
public final class ParameterizedTypeImpl implements ParameterizedType {
// TODO: Use something public from another library - the Guava stuff is all private however
private final Type[] _actualTypeArguments;
private final Type _rawType;
private final Type _ownerType;
private ParameterizedTypeImpl(final Type[] actualTypeArguments, final Type rawType, final Type ownerType) {
_actualTypeArguments = actualTypeArguments;
_rawType = rawType;
_ownerType = ownerType;
}
public static ParameterizedTypeImpl of(final Class<?> rawType, final Type... actualTypeArguments) {
ArgumentChecker.notNull(rawType, "rawType");
ArgumentChecker.noNulls(actualTypeArguments, "actualTypeArguments");
return new ParameterizedTypeImpl(actualTypeArguments.clone(), rawType, rawType.getEnclosingClass());
}
public static ParameterizedTypeImpl of(final Class<?> rawType, final Type typeArg1) {
ArgumentChecker.notNull(rawType, "rawType");
ArgumentChecker.notNull(typeArg1, "typeArg1");
return new ParameterizedTypeImpl(new Type[] {typeArg1 }, rawType, rawType.getEnclosingClass());
}
public static ParameterizedTypeImpl of(final Class<?> rawType, final Type typeArg1, final Type typeArg2) {
ArgumentChecker.notNull(rawType, "rawType");
ArgumentChecker.notNull(typeArg1, "typeArg1");
ArgumentChecker.notNull(typeArg2, "typeArg2");
return new ParameterizedTypeImpl(new Type[] {typeArg1, typeArg2 }, rawType, rawType.getEnclosingClass());
}
public static ParameterizedTypeImpl of(final Class<?> rawType, final Type typeArg1, final Type typeArg2, final Type typeArg3) {
ArgumentChecker.notNull(rawType, "rawType");
ArgumentChecker.notNull(typeArg1, "typeArg1");
ArgumentChecker.notNull(typeArg2, "typeArg2");
ArgumentChecker.notNull(typeArg3, "typeArg3");
return new ParameterizedTypeImpl(new Type[] {typeArg1, typeArg2, typeArg3 }, rawType, rawType.getEnclosingClass());
}
public static ParameterizedTypeImpl of(final Class<?> rawType, final Type typeArg1, final Type typeArg2, final Type typeArg3, final Type typeArg4) {
ArgumentChecker.notNull(rawType, "rawType");
ArgumentChecker.notNull(typeArg1, "typeArg1");
ArgumentChecker.notNull(typeArg2, "typeArg2");
ArgumentChecker.notNull(typeArg3, "typeArg3");
ArgumentChecker.notNull(typeArg4, "typeArg4");
return new ParameterizedTypeImpl(new Type[] {typeArg1, typeArg2, typeArg3, typeArg4 }, rawType, rawType.getEnclosingClass());
}
@Override
public Type[] getActualTypeArguments() {
return _actualTypeArguments.clone();
}
@Override
public Type getRawType() {
return _rawType;
}
@Override
public Type getOwnerType() {
return _ownerType;
}
@Override
public boolean equals(final Object o) {
if (o == this) {
return true;
}
if (!(o instanceof ParameterizedType)) {
return false;
}
final ParameterizedType other = (ParameterizedType) o;
return ObjectUtils.equals(_rawType, other.getRawType()) && ObjectUtils.equals(_ownerType, other.getOwnerType()) && Arrays.equals(_actualTypeArguments, other.getActualTypeArguments());
}
@Override
public int hashCode() {
return Arrays.hashCode(_actualTypeArguments) ^ ObjectUtils.hashCode(_ownerType) ^ ObjectUtils.hashCode(_rawType);
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
}