/*
* Copyright 2013, Arondor
*
* 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.arondor.common.reflection.catalog;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.arondor.common.reflection.api.catalog.AccessibleClassCatalog;
import com.arondor.common.reflection.bean.java.AccessibleClassBean;
import com.arondor.common.reflection.bean.java.AccessibleFieldBean;
import com.arondor.common.reflection.model.java.AccessibleClass;
import com.arondor.common.reflection.model.java.AccessibleConstructor;
import com.arondor.common.reflection.model.java.AccessibleField;
import com.arondor.common.reflection.model.java.AccessibleMethod;
/**
* Simple Class Catalog Parser
*
* @author francois
*
*/
public class SimpleAccessibleClassCatalog implements AccessibleClassCatalog
{
private final Map<String, AccessibleClass> accessibleClassMap = new HashMap<String, AccessibleClass>();
public SimpleAccessibleClassCatalog()
{
AccessibleClassBean stringClass = new AccessibleClassBean();
stringClass.setName(String.class.getName());
stringClass.setConstructors(new ArrayList<AccessibleConstructor>());
stringClass.setAccessibleMethods(new ArrayList<AccessibleMethod>());
stringClass.setAccessibleFields(new HashMap<String, AccessibleField>());
stringClass.setSuperclass(Object.class.getName());
stringClass.setInterfaces(new ArrayList<String>());
stringClass.setAllInterfaces(new ArrayList<String>());
stringClass.getAllInterfaces().add(Object.class.getName());
AccessibleFieldBean stringValue = new AccessibleFieldBean("value", "The String value", String.class, true, true);
stringClass.getAccessibleFields().put(stringValue.getName(), stringValue);
accessibleClassMap.put(stringClass.getName(), stringClass);
}
private boolean allowSuperclassesInImplementingClases = false;
public boolean isAllowSuperclassesInImplementingClases()
{
return allowSuperclassesInImplementingClases;
}
public void setAllowSuperclassesInImplementingClases(boolean allowSuperclassesInImplementingClases)
{
this.allowSuperclassesInImplementingClases = allowSuperclassesInImplementingClases;
}
public void addAccessibleClass(AccessibleClass accessibleClass)
{
accessibleClassMap.put(accessibleClass.getName(), accessibleClass);
}
public AccessibleClass getAccessibleClass(final String className) throws ClassNotFoundException
{
String name = className;
AccessibleClass accessibleClass = accessibleClassMap.get(name);
if (accessibleClass == null)
{
throw new ClassNotFoundException("No class " + name + " defined in catalog !");
}
return accessibleClass;
}
public Collection<AccessibleClass> getImplementingAccessibleClasses(String desiredInterfaceName)
{
List<AccessibleClass> result = new ArrayList<AccessibleClass>();
for (AccessibleClass clazz : accessibleClassMap.values())
{
for (String interfaceName : clazz.getAllInterfaces())
{
if (desiredInterfaceName.equals(interfaceName))
{
result.add(clazz);
break;
}
}
if (isAllowSuperclassesInImplementingClases())
{
if (clazz.getSuperclass().equals(desiredInterfaceName))
{
result.add(clazz);
}
else if (clazz.getName().equals(desiredInterfaceName))
{
result.add(clazz);
}
}
}
return result;
}
}