package org.powermock.reflect.internal.proxy;
import java.util.ArrayList;
import java.util.List;
class UnproxiedTypeFactory {
private static final String[] RESTRICTED_INTERFACES = {
"cglib.proxy.Factory"
};
UnproxiedType createFromInterfaces(Class<?>[] interfaces) {
Class<?>[] filteredInterfaces = filterInterfaces(interfaces);
if (filteredInterfaces.length == 0){
return new UnproxiedTypeImpl(Object.class);
}
if (filteredInterfaces.length == 1){
return new UnproxiedTypeImpl(filteredInterfaces[0]);
}
return new UnproxiedTypeImpl(filteredInterfaces);
}
UnproxiedType createFromSuperclassAndInterfaces(Class<?> superclass, Class<?>[] interfaces) {
if (Object.class.equals(superclass)){
return createFromInterfaces(interfaces);
}
Class<?>[] filteredInterfaces = filterInterfaces(interfaces);
return new UnproxiedTypeImpl(superclass, filteredInterfaces);
}
UnproxiedType createFromType(Class<?> type) {
return new UnproxiedTypeImpl(type);
}
private Class<?>[] filterInterfaces(Class<?>[] interfaces) {
List<Class<?>> filtered = new ArrayList<Class<?>>();
for (Class<?> anInterface : interfaces) {
if(!isMockFrameworkInterface(anInterface)){
filtered.add(anInterface);
}
}
return filtered.toArray(new Class[filtered.size()]);
}
private boolean isMockFrameworkInterface(Class<?> anInterface) {
String name = anInterface.getName();
for (String restrictedInterface : RESTRICTED_INTERFACES) {
if (name.contains(restrictedInterface)){
return true;
}
}
return false;
}
private static class UnproxiedTypeImpl implements UnproxiedType {
private final Class<?> type;
private final Class<?>[] interfaces;
private UnproxiedTypeImpl(Class<?> type) {
this.type = type;
this.interfaces = new Class[0];
}
private UnproxiedTypeImpl(Class<?>[] interfaces) {
this.type = null;
this.interfaces = interfaces;
}
private UnproxiedTypeImpl(Class<?> type, Class<?>[] interfaces) {
this.type = type;
this.interfaces = interfaces;
}
@Override
public Class<?> getOriginalType() {
return type;
}
@Override
public Class<?>[] getInterfaces() {
return interfaces;
}
}
}