package schemacompile; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import org.xml.sax.InputSource; import com.sun.codemodel.JClass; import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JDefinedClass; import com.sun.codemodel.JPackage; import com.sun.tools.xjc.api.S2JJAXBModel; import com.sun.tools.xjc.api.SchemaCompiler; import com.sun.tools.xjc.api.XJC; public class SchemaCompile { private SchemaCompiler sc; public SchemaCompile(String xsdFilePath){ sc = XJC.createSchemaCompiler(); File file = new File(xsdFilePath); sc.parseSchema(new InputSource(file.toURI().toString())); S2JJAXBModel model = sc.bind(); List<JClass> classesToProcess = new ArrayList<JClass>(); JCodeModel cm = model.generateCode(null, null); Iterator<JPackage> packages = cm.packages(); while (packages.hasNext()) { JPackage pkg = packages.next(); Iterator<JDefinedClass> classes = pkg.classes(); while (classes.hasNext()) { JDefinedClass cls = classes.next(); classesToProcess.add(cls); } } // Look for Inner Classes and add them ArrayList<JDefinedClass> innerClasses = new ArrayList<JDefinedClass>(); for (int i = 0; i < classesToProcess.size(); i++) { innerClasses.addAll(getInnerClasses(classesToProcess.get(i))); } classesToProcess.addAll(innerClasses); try { cm.build(new File(".")); } catch (IOException e) { e.printStackTrace(); } List<Class> cs = new ArrayList<Class>(); for (JClass c: classesToProcess){ System.out.println(c.fullName()); try { cs.add(Class.forName(c.fullName())); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } private HashSet<JDefinedClass> getInnerClasses(JClass jClass) { // Check this xjcClass for inner classes. If one is found, search that one too. HashSet<JDefinedClass> classesToReturn = new HashSet<JDefinedClass>(); Iterator<JDefinedClass> it = ((JDefinedClass) jClass).classes(); while (it.hasNext()) { JDefinedClass innerClass = it.next(); classesToReturn.add(innerClass); classesToReturn.addAll(getInnerClasses(innerClass)); } return classesToReturn; } }