//
bilto.put(method, managedMethod);
}
//
ManagedTypeMetaData managedType = new ManagedTypeMetaData(clazz);
managedType.setDescription(typeDescription);
//
Map<String, ManagedMethodMetaData> setters = new HashMap<String, ManagedMethodMetaData>();
Map<String, ManagedMethodMetaData> getters = new HashMap<String, ManagedMethodMetaData>();
for (Map.Entry<Method, ManagedMethodMetaData> entry : bilto.entrySet())
{
Method method = entry.getKey();
//
String methodName = method.getName();
Class[] parameterTypes = method.getParameterTypes();
//
OperationType type = OperationType.OP;
Integer index = null;
if (method.getReturnType() == void.class)
{
if (parameterTypes.length == 1 && methodName.startsWith("set") && methodName.length() > 4)
{
type = OperationType.SET;
index = 3;
}
}
else
{
if (parameterTypes.length == 0)
{
type = OperationType.GET;
if (methodName.startsWith("get") && methodName.length() > 3)
{
index = 3;
}
else if (methodName.startsWith("is") && methodName.length() > 2)
{
index = 2;
}
}
}
// Put in the correct map if it is an attribute
if (index != null)
{
String attributeName = methodName.substring(index);
//
Map<String, ManagedMethodMetaData> map = type == OperationType.SET ? setters : getters;
ManagedMethodMetaData previous = map.put(attributeName, entry.getValue());
if (previous != null)
{
throw new IllegalArgumentException("Duplicate attribute " + type + " " + previous + " and " + method);
}
}
else
{
ManagedName managedName = methodNames.get(method);
if (managedName != null)
{
throw new IllegalArgumentException("Managed operation " + method.getName()
+ " cannot be annoated with @" + ManagedName.class.getName() + " with value "
+ managedName.value());
}
//
managedType.addMethod(entry.getValue());
}
}
// Process attributes
Set<String> attributeNames = new HashSet<String>();
attributeNames.addAll(getters.keySet());
attributeNames.addAll(setters.keySet());
for (String attributeName : attributeNames)
{
ManagedMethodMetaData managedGetter = getters.get(attributeName);
ManagedMethodMetaData managedSetter = setters.get(attributeName);
String propertyDescription = null;
ManagedName getterName = null;
ManagedName setterName = null;
String getterDescription = null;
String setterDescription = null;
Method getter = null;
Method setter = null;
ManagedParameterMetaData mpm = null;
if (managedGetter != null)
{
getter = managedGetter.getMethod();
getterName = methodNames.get(getter);
getterDescription = managedGetter.getDescription();
propertyDescription = getterDescription;
}
if (managedSetter != null)
{
setter = managedSetter.getMethod();
setterName = methodNames.get(setter);
setterDescription = managedSetter.getDescription();
if (propertyDescription == null)
{
propertyDescription = setterDescription;
}
mpm = managedSetter.getParameters().iterator().next();
}
// Consistency check
if (getterName != null)
{
if (setterName != null)
{
if (!getterName.value().equals(setterName.value()))
{
throw new IllegalArgumentException("Getter name=" + getterName.value()
+ " does not match the setter name=" + setterName.value());
}
}
attributeName = getterName.value();
}
else if (setterName != null)
{
attributeName = setterName.value();
}
//
ManagedPropertyMetaData managedProperty =
new ManagedPropertyMetaData(attributeName, getter, getterDescription, setter, setterDescription, mpm);
managedProperty.setDescription(propertyDescription);
//
ManagedPropertyMetaData previousManagedProperty = managedType.getProperty(managedProperty.getName());
if (previousManagedProperty != null)
{
throw new IllegalArgumentException("The same property was declared twice old=" + previousManagedProperty
+ " new=" + managedProperty);
}
//
managedType.addProperty(managedProperty);
}
//
return managedType;
}