package org.rzo.yajsw.config.jnlp;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.vfs.FileObject;
import org.rzo.yajsw.util.VFSUtils;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class JnlpSupport
{
Document _doc = null;
public JnlpSupport(String file) throws ParserConfigurationException, SAXException, IOException
{
FileObject fo = VFSUtils.resolveFile(".", file);
if (fo == null || !fo.exists())
throw new FileNotFoundException(file);
InputStream in = fo.getContent().getInputStream();
_doc = parseJnlp(in);
in.close();
}
public PropertiesConfiguration toConfiguration(String defaultsFile) throws ConfigurationException, IOException
{
int i = 1;
PropertiesConfiguration jnlpConf = new PropertiesConfiguration();
List jars = getJars(_doc);
for (Iterator it = jars.listIterator(); it.hasNext();)
{
jnlpConf.setProperty("wrapper.java.classpath." + i++, it.next());
}
jnlpConf.setProperty("wrapper.base", getCodebase(_doc));
jnlpConf.setProperty("wrapper.java.app.mainclass", getMainClass(_doc));
i = 1;
for (Iterator it = getArguments(_doc).listIterator(); it.hasNext();)
{
jnlpConf.setProperty("wrapper.app.parameter." + i++, it.next());
}
i = 1;
List props = getResourceProperties(_doc);
for (Iterator it = props.listIterator(); it.hasNext();)
{
jnlpConf.setProperty("wrapper.java.additional." + i++, it.next());
}
i = 1;
List resources = getResources(_doc);
for (Iterator it = resources.listIterator(); it.hasNext();)
{
jnlpConf.setProperty("wrapper.resource." + i++, it.next());
}
if (defaultsFile == null || "".equals(defaultsFile))
return jnlpConf;
// jnlpConf.addProperty("include", defaultsFile);
if (defaultsFile != null)
{
PropertiesConfiguration defaultsConf = new PropertiesConfiguration();
FileObject fo = VFSUtils.resolveFile(".", defaultsFile);
InputStream in = fo.getContent().getInputStream();
defaultsConf.load(in);
in.close();
for (Iterator it = defaultsConf.getKeys(); it.hasNext();)
{
String key = (String) it.next();
if (jnlpConf.containsKey(key))
System.out.println("configuration conflict: " + key);
else
jnlpConf.addProperty(key, defaultsConf.getProperty(key));
}
}
return jnlpConf;
}
private Document parseJnlp(InputStream in) throws ParserConfigurationException, SAXException, IOException
{
Document doc = null;
// Get Document Builder Factory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// Turn off validation, and turn off namespaces
factory.setValidating(false);
factory.setNamespaceAware(false);
DocumentBuilder builder = factory.newDocumentBuilder();
doc = builder.parse(in);
return doc;
}
private static List getJars(Document doc)
{
ArrayList result = new ArrayList();
NodeList args = doc.getElementsByTagName("jar");
for (int i = 0; i < args.getLength(); i++)
{
result.add(args.item(i).getAttributes().getNamedItem("href").getTextContent());
}
return result;
}
private static List getResources(Document doc)
{
ArrayList result = new ArrayList();
NodeList args = doc.getElementsByTagName("icon");
for (int i = 0; i < args.getLength(); i++)
{
result.add(args.item(i).getAttributes().getNamedItem("href").getTextContent());
}
return result;
}
private static List getResourceProperties(Document doc)
{
ArrayList result = new ArrayList();
NodeList args = doc.getElementsByTagName("property");
for (int i = 0; i < args.getLength(); i++)
{
String key = args.item(i).getAttributes().getNamedItem("name").getTextContent();
String value = args.item(i).getAttributes().getNamedItem("value").getTextContent();
result.add("-D" + key + "=" + value);
}
return result;
}
private static List getArguments(Document doc)
{
ArrayList result = new ArrayList();
NodeList args = doc.getElementsByTagName("argument");
for (int i = 0; i < args.getLength(); i++)
{
result.add(args.item(i).getTextContent());
}
return result;
}
private static Object getMainClass(Document doc)
{
return doc.getElementsByTagName("application-desc").item(0).getAttributes().getNamedItem("main-class").getTextContent();
}
private static String getCodebase(Document doc)
{
return doc.getElementsByTagName("jnlp").item(0).getAttributes().getNamedItem("codebase").getTextContent();
}
}