PropsToXML
takes a standard Java properties
* file, and converts it into an XML format. This makes properties
* like enhydra.classpath.separator
"groupbable" by
* "enhydra", "classpath", and by the key name, "separator", which
* the standard Java java.util.Properties
class does
* not allow.
*/
public class Main {
/**
* This will take the supplied properties file, and * convert that file to an XML representation, which is * then output to the supplied XML do*****ent filename.
* * @param propertiesFilename file to read in as Java properties. * @param xmlFilename file to output XML representation to. * @throwsIOException
- when errors occur.
*/
public void convert(String propertiesFilename, String xmlFilename)
throws IOException {
// Get Java Properties object
FileInputStream input = new FileInputStream(propertiesFilename);
Properties props = new Properties();
props.load(input);
// Convert to XML
convertToXML(props, xmlFilename);
}
/**
* This will handle the detail of conversion from a Java
* Properties
object to an XML do*****ent.
Properties
object to use as input.
* @param xmlFilename file to output XML to.
* @throws IOException
- when errors occur.
*/
private void convertToXML(Properties props, String xmlFilename)
throws IOException {
// Create a new JDOM Do*****ent with a root element "properties"
Element root = new Element("properties");
Do*****ent doc = new Do*****ent(root);
// Get the property names
Enumeration propertyNames = props.propertyNames();
while (propertyNames.hasMoreElements()) {
String propertyName = (String)propertyNames.nextElement();
String propertyValue = props.getProperty(propertyName);
createXMLRepresentation(root, propertyName, propertyValue);
}
// Output do*****ent to supplied filename
XMLOutputter outputter = new XMLOutputter(" ", true);
FileOutputStream output = new FileOutputStream(xmlFilename);
outputter.output(doc, output);
}
/**
* This will convert a single property and its value to * an XML element and textual value.
* * @param root JDOM rootElement
to add children to.
* @param propertyName name to base element creation on.
* @param propertyValue value to use for property.
*/
private void createXMLRepresentation(Element root,
String propertyName,
String propertyValue) {
/*
Element element = new Element(propertyName);
element.setText(propertyValue);
root.addContent(element);
*/
int split;
String name = propertyName;
Element current = root;
Element test = null;
while ((split = name.indexOf(".")) != -1) {
String subName = name.substring(0, split);
name = name.substring(split+1);
// Check for existing element
if ((test = current.getChild(subName)) == null) {
Element subElement = new Element(subName);
current.addContent(subElement);
current = subElement;
} else {
current = test;
}
}
// When out of loop, what's left is the final element's name
Element last = new Element(name);
// last.setText(propertyValue);
last.setAttribute("value", propertyValue);
current.addContent(last);
}
/**
* Provide a static entry point for running.
*/ public static void main(String[] args) { if (args.length != 2) { System.out.println("Usage: java javaxml2.PropsToXML " + "[properties file] [XML file for output]"); System.exit(0); } try { PropsToXML propsToXML = new PropsToXML(); propsToXML.convert(args[0], args[1]); } catch (Exception e) { e.printStackTrace(); } } } /* Java and XML, Second Edition * Solutions to Real-World Problems * By Brett McLaughlin * Second Edition August 2001 * ISBN: 0-596-00197-5 * http://www.oreilly.com/catalog/javaxml2/ */