package com.isx.ant.jaxbtask; import java.io.*; import java.util.*; import org.xml.sax.*; import org.xml.sax.ext.DeclHandler; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; public class JAXBFileDeterminer { public static File[] findFiles(File dtd, File xjs, File destroot) throws Exception { if (!dtd.exists()) throw new Exception("DTD file " + dtd + "does not exist"); if (!xjs.exists()) throw new Exception("XJS file " + xjs + "does not exist"); if (!destroot.exists()) throw new Exception("Destination root " + destroot + "does not exist"); JAXBSearchHandler h = new JAXBSearchHandler(); SAXParserFactory factory = SAXParserFactory.newInstance(); try { factory.setValidating(false); SAXParser p = factory.newSAXParser(); p.parse(xjs, h); File tmp = File.createTempFile("jaxbtemp_",".xml", destroot); FileWriter fw = new FileWriter(tmp); fw.write(""); fw.write(System.getProperty("line.separator")); fw.write(""); fw.write(System.getProperty("line.separator") + "" + System.getProperty("line.separator") + "" + System.getProperty("line.separator")); fr.close(); fw.flush(); fw.close(); factory.setValidating(true); p = factory.newSAXParser(); p.setProperty("http://xml.org/sax/properties/declaration-handler", h); p.parse(tmp, h); tmp.delete(); String[] filenames = (String[]) h.files.toArray(new String[0]); Set files = new TreeSet(); for (int i = 0; i < filenames.length; ++i) { // System.out.println(filenames[i]); String fn = destroot.getAbsolutePath() + File.separator + h.destPackage + File.separator + filenames[i].substring(0,1).toUpperCase() + filenames[i].substring(1) + ".java"; // System.out.println(fn); files.add(new File(fn)); } return (File[]) files.toArray(new File[0]); } catch (Exception e) { e.printStackTrace(); throw e; } // return new File[0]; } public static class JAXBSearchHandler extends DefaultHandler implements DeclHandler { Set files = new TreeSet(); String destPackage = ""; public void elementDecl(java.lang.String name, java.lang.String model) throws SAXException { // System.out.println("Element : "); // System.out.println(name); // System.out.println(model); if (!model.equals("(#PCDATA)")) files.add(name); } public void attributeDecl(java.lang.String eName, java.lang.String aName, java.lang.String type, java.lang.String valueDefault, java.lang.String value) throws SAXException { } public void internalEntityDecl(java.lang.String name, java.lang.String value) throws SAXException { } public void externalEntityDecl(java.lang.String name, java.lang.String publicId, java.lang.String systemId) throws SAXException { } public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // System.out.println("qname " + qName); // System.out.println(attributes.getValue("name")); if (qName.equals("enumeration")) files.add(attributes.getValue("name")); if (qName.equals("interface")) files.add(attributes.getValue("name")); if (qName.equals("options")) { String p = attributes.getValue("package"); if (p != null && !p.equals("")) destPackage = p; } } public void endElement(String uri, String localName, String qName) throws SAXException { } } }