package org.jvnet.jaxb2_commons.plugin.autoinheritance; import java.util.LinkedList; import java.util.List; import org.jvnet.jaxb2_commons.plugin.AbstractParameterizablePlugin; import org.xml.sax.ErrorHandler; import com.sun.codemodel.JClass; import com.sun.codemodel.JDefinedClass; import com.sun.tools.xjc.Options; import com.sun.tools.xjc.model.CElementInfo; import com.sun.tools.xjc.outline.ClassOutline; import com.sun.tools.xjc.outline.ElementOutline; import com.sun.tools.xjc.outline.Outline; public class AutoInheritancePlugin extends AbstractParameterizablePlugin { private String xmlRootElementsExtend = null; private List<String> xmlRootElementsImplement = new LinkedList<String>(); private String xmlTypesExtend = null; private List<String> xmlTypesImplement = new LinkedList<String>(); private List<String> jaxbElementsImplement = new LinkedList<String>(); public String getXmlRootElementsExtend() { return xmlRootElementsExtend; } public void setXmlRootElementsExtend(String globalElementsExtend) { this.xmlRootElementsExtend = globalElementsExtend; } public String getXmlRootElementsImplement() { return xmlRootElementsImplement.toString(); } public void setXmlRootElementsImplement(String xmlRootElementsImplement) { this.xmlRootElementsImplement.add(xmlRootElementsImplement); } public String getXmlTypesExtend() { return xmlTypesExtend; } public void setXmlTypesExtend(String globalComplexTypesExtend) { this.xmlTypesExtend = globalComplexTypesExtend; } public String getXmlTypesImplement() { return xmlTypesImplement.toString(); } public void setXmlTypesImplement(String xmlTypesImplement) { this.xmlTypesImplement.add(xmlTypesImplement); } public String getJaxbElementsImplement() { return jaxbElementsImplement.toString(); } public void setJaxbElementsImplement(String jaxbElementsImplement) { this.jaxbElementsImplement.add(jaxbElementsImplement); } @Override public String getOptionName() { return "XautoInheritance"; } @Override public String getUsage() { return "TBD"; } @Override public boolean run(Outline outline, Options opt, ErrorHandler errorHandler) { for (final ClassOutline classOutline : outline.getClasses()) { if (classOutline.target.getElementName() != null) { processGlobalElement(classOutline); } else { processGlobalComplexType(classOutline); } } for (final CElementInfo elementInfo : outline.getModel() .getAllElements()) { final ElementOutline elementOutline = outline .getElement(elementInfo); if (elementOutline != null) { processGlobalJAXBElement(elementOutline); } } return true; } protected void processGlobalElement(ClassOutline classOutline) { generateExtends(classOutline.implClass, xmlRootElementsExtend); generateImplements(classOutline.implClass, xmlRootElementsImplement); } protected void processGlobalJAXBElement(ElementOutline elementOutline) { generateImplements(elementOutline.implClass, jaxbElementsImplement); } protected void processGlobalComplexType(ClassOutline classOutline) { generateExtends(classOutline.implClass, xmlTypesExtend); generateImplements(classOutline.implClass, xmlTypesImplement); } private void generateExtends(JDefinedClass theClass, String name) { if (name != null) { final JClass targetClass = theClass.owner().ref(name); if (theClass._extends() == theClass.owner().ref(Object.class)) { theClass._extends(targetClass); } } } private void generateImplements(JDefinedClass theClass, String name) { if (name != null) { final JClass targetClass = theClass.owner().ref(name); theClass._implements(targetClass); } } private void generateImplements(JDefinedClass theClass, List<String> names) { if (names != null && !names.isEmpty()) { for (String name : names) { generateImplements(theClass, name); } } } }