* @see WireParser
*/
public class ObjectBinding implements Binding {
public Object parse(Element element, Parse parse, Parser parser) {
ObjectDescriptor descriptor = new ObjectDescriptor();
WireParser wireParser = (WireParser) parser;
String className = XmlUtil.attribute(element, "class");
String factoryObjectName = XmlUtil.attribute(element, "factory");
Element factoryElement = XmlUtil.element(element, "factory");
if (className!=null) {
descriptor.setClassName(className);
if (factoryObjectName!=null) {
parse.addProblem("attribute factory is specified together with attribute class in element object: "+XmlUtil.toString(element));
}
if (factoryElement!=null) {
parse.addProblem("element factory is specified together with attribute class in element object: "+XmlUtil.toString(element));
}
Element constructorElement = XmlUtil.element(element, "constructor");
if (constructorElement!=null) {
List<Element> argElements = XmlUtil.elements(constructorElement, "arg");
List<ArgDescriptor> argDescriptors = wireParser.parseArgs(argElements, parse);
descriptor.setArgDescriptors(argDescriptors);
if (element.hasAttribute("method")) {
parse.addProblem("attributes class and method indicate static method and also a constructor element is specified for element object: "+XmlUtil.toString(element));
}
}
} else if (factoryObjectName!=null) {
descriptor.setFactoryObjectName(factoryObjectName);
if (factoryElement!=null) {
parse.addProblem("element factory is specified together with attribute factory in element object: "+XmlUtil.toString(element));
}
} else if (factoryElement!=null) {
Element factoryDescriptorElement = XmlUtil.element(factoryElement);
Descriptor factoryDescriptor = (Descriptor) parser.parseElement(factoryDescriptorElement, parse, WireParser.CATEGORY_DESCRIPTOR);
descriptor.setFactoryDescriptor(factoryDescriptor);
} else {
parse.addProblem("element object must have one of {attribute class, attribute factory or element factory}: "+XmlUtil.toString(element));
}
// method
if (element.hasAttribute("method")) {
descriptor.setMethodName(element.getAttribute("method"));
List<Element> argElements = XmlUtil.elements(element, "arg");
List<ArgDescriptor> argDescriptors = wireParser.parseArgs(argElements, parse);
descriptor.setArgDescriptors(argDescriptors);
} else if (className == null) {
parse.addProblem("element object with a element factory or a attribute factory must have a attribute method: "+XmlUtil.toString(element));
}
if( (className == null) && (XmlUtil.element(element, "constructor") != null)){
parse.addProblem("element object with a element factory or a attribute factory can't have a constructor element: "+XmlUtil.toString(element));
}
// read the operations elements
List<Operation> operations = null;
List<Element> elements = XmlUtil.elements(element);
if (elements!=null) {
for (Element childElement: elements) {
if(!childElement.getTagName().equals("constructor")
&& !childElement.getTagName().equals("factory")
&& !childElement.getTagName().equals("arg")){
Operation operation = (Operation) parser.parseElement(childElement, parse, WireParser.CATEGORY_OPERATION);
if (operation!=null) {
if (operations==null) {
operations = new ArrayList<Operation>();
}
operations.add(operation);
}else{
parse.addProblem("element object can only have factory, arg, constructor elements or " +
"an operation element ("+ parser.getBindings().getTagNames(WireParser.CATEGORY_OPERATION) +")." +
" Invalid element '"+childElement.getTagName()+"' in: "+XmlUtil.toString(element));
}
}
}
}
descriptor.setOperations(operations);
// autowiring
String autoWireText = XmlUtil.attribute(element, "auto-wire");
Boolean isAutoWireEnabled = XmlUtil.booleanEquals(autoWireText, Boolean.FALSE);
if (isAutoWireEnabled==null) {
parse.addProblem("invalid auto-wire value: '"+autoWireText+"' in "+XmlUtil.toString(element));
} else if (isAutoWireEnabled) {
descriptor.setAutoWireEnabled(true);
}
return descriptor;
}