* @return a POJO of the type specified in the given resource description if there is no errors.
*/
public Object adaptInput(ResourceDescription description, Object source) {
String className = description.getType();
if (className == null) {
throw new LoggedRuntimeException("The class name cannot be found.", log);
}
if (source instanceof OMText) {
source = ((OMText) source).getText();
}
if (className.equals(source.getClass().getName())) {
return source;
} else if (source instanceof String && ClassHelper.isWrapperType(className)) {
return ClassHelper.createWrapperTypeInstance(className, (String) source);
} else if (source instanceof OMElement) {
OMElement omElement = (OMElement) source;
int index = className.indexOf(",");
if (index > 0) {
String[] classNames = className.split(",");
return adaptToMultiplePOJOs(omElement, classNames);
} else if (description.hasChildren()) {
final Collection<ResourceDescription> children = description.getChildResources();
Collection<Class> classes = description.getChildrenClasses();
if (classes.isEmpty()) {
classes = new ArrayList<Class>();
for (ResourceDescription child : children) {
if (child == null) {
continue;
}
String childClass = child.getType();
Class aClass = ClassHelper.loadAClass(childClass,
description.getResourceClassLoader());
if (aClass == null) {
continue;
}
classes.add(aClass);
}
description.addChildrenClasses(classes);
}
if (classes.isEmpty()) {
if (log.isDebugEnabled()) {
log.debug("Required arguments can not be found." + "Returning null");
}
return null;
}
Collection<String> childrenNames = description.getChildrenNames();
Iterator it = omElement.getChildElements();
OMElement tobeAdapted;
ArrayList<String> childTypeList =new ArrayList<String>();
for (ResourceDescription child : children) {
if (child == null) {
continue;
}
childTypeList.add(child.getType());
}
classes.clear();
while (it.hasNext()) {
tobeAdapted = (OMElement) it.next();
String localClass = tobeAdapted.getQName().getLocalPart();
for (String name : childTypeList) {
String classNamePart = name.substring(name.lastIndexOf(".") + 1);
if (classNamePart.equals(localClass)) {
Class aClass = ClassHelper.loadAClass(name,
description.getResourceClassLoader());
if (aClass == null) {
continue;
}
classes.add(aClass);
}
}
}
if (childrenNames.size() != classes.size()) {
return toObjects(omElement, classes, null);
} else {
return toObjects(omElement, classes,
childrenNames.toArray(new String[childrenNames.size()]));
}
} else {
OMElement tobeAdapted;
if (omElement.getParent() instanceof SOAPBody) {
tobeAdapted = omElement.getFirstElement();
Iterator it = omElement.getChildElements();
List adaptedInputs = new ArrayList();
while (it.hasNext()) {
tobeAdapted = (OMElement) it.next();
adaptedInputs.add(getAdaptedFacts(description, className, tobeAdapted, source));
}
return adaptedInputs;
} else {
tobeAdapted = omElement;
}
QName qName = getQName(description, className, tobeAdapted);
if (!qName.equals(tobeAdapted.getQName())) {
if (log.isDebugEnabled()) {
log.debug("The source element QName does not match with the expected QName." +
"[ Source Element QName: " + tobeAdapted.getQName() + " ] " +
"[ Expected QName : " + qName + " ].");
}
return null;
}
try {
return BeanUtil.deserialize(ClassHelper.loadAClass(className,
description.getResourceClassLoader()),
tobeAdapted, new DefaultObjectSupplier(), null);
} catch (AxisFault axisFault) {
throw new LoggedRuntimeException("Cannot create a custom Java object " +
"form XML. Java class is : " + className + " and XML is : " +
source, log);
}
}
} else {
throw new LoggedRuntimeException("Incompatible type , " +
"the provided class name ' " +
className + " ' doesn't match " +
"with the class name of the custom Java object.", log);
}
}