@SuppressWarnings("unchecked")
private ActionSchemaArray createActions(final ResourceModel resourceModel,
final ResourceLevel resourceLevel)
{
ActionSchemaArray actionsArray = new ActionSchemaArray();
List<ResourceMethodDescriptor> resourceMethodDescriptors =
resourceModel.getResourceMethodDescriptors();
Collections.sort(resourceMethodDescriptors, new Comparator<ResourceMethodDescriptor>()
{
@Override
public int compare(final ResourceMethodDescriptor o1, final ResourceMethodDescriptor o2)
{
if (o1.getType().equals(ResourceMethod.ACTION))
{
if (o2.getType().equals(ResourceMethod.ACTION))
{
return o1.getActionName().compareTo(o2.getActionName());
}
else
{
return 1;
}
}
else if (o2.getType().equals(ResourceMethod.ACTION))
{
return -1;
}
else
{
return 0;
}
}
});
for (ResourceMethodDescriptor resourceMethodDescriptor : resourceMethodDescriptors)
{
if (ResourceMethod.ACTION.equals(resourceMethodDescriptor.getType()))
{
//do not apply entity-level actions at collection level or vice-versa
if (resourceMethodDescriptor.getActionResourceLevel() != resourceLevel)
{
continue;
}
ActionSchema action = new ActionSchema();
action.setName(resourceMethodDescriptor.getActionName());
//We have to construct the method doc for the action which includes the action return type
final String methodDoc = _docsProvider.getMethodDoc(resourceMethodDescriptor.getMethod());
if (methodDoc != null)
{
final StringBuilder methodDocBuilder = new StringBuilder(methodDoc.trim());
if (methodDocBuilder.length() > 0)
{
final String returnDoc = sanitizeDoc(_docsProvider.getReturnDoc(resourceMethodDescriptor.getMethod()));
if (returnDoc != null && !returnDoc.isEmpty())
{
methodDocBuilder.append("\n");
methodDocBuilder.append("Service Returns: ");
//Capitalize the first character
methodDocBuilder.append(returnDoc.substring(0, 1).toUpperCase());
methodDocBuilder.append(returnDoc.substring(1));
}
}
action.setDoc(methodDocBuilder.toString());
}
ParameterSchemaArray parameters = createParameters(resourceMethodDescriptor);
if (parameters.size() > 0)
{
action.setParameters(parameters);
}
Class<?> returnType = resourceMethodDescriptor.getActionReturnType();
if (returnType != Void.TYPE)
{
String returnTypeString =
buildDataSchemaType(returnType,
resourceMethodDescriptor.getActionReturnRecordDataSchema().getField(ActionResponse.VALUE_NAME).getType());
action.setReturns(returnTypeString);
}
final DataMap customAnnotation = resourceMethodDescriptor.getCustomAnnotationData();
String deprecatedDoc = _docsProvider.getMethodDeprecatedTag(resourceMethodDescriptor.getMethod());
if(deprecatedDoc != null)
{
customAnnotation.put(DEPRECATED_ANNOTATION_NAME, deprecateDocToAnnotationMap(deprecatedDoc));
}
if (!customAnnotation.isEmpty())
{
action.setAnnotations(new CustomAnnotationContentSchemaMap(customAnnotation));
}
actionsArray.add(action);
}
}
return actionsArray;
}