package org.objectstyle.wolips.jrebel.utils; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.util.Enumeration; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaModelException; import org.w3c.dom.Document; public class WOProjectUtils { private static final XPath xpath = XPathFactory.newInstance().newXPath(); private static final XPathExpression xp_bundleName, xp_bundleVersion; private static final DocumentBuilderFactory _builderFactory = DocumentBuilderFactory.newInstance(); private WOProjectUtils() { //Utility class } static { _builderFactory.setValidating(false); _builderFactory.setNamespaceAware(false); _builderFactory.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); try { xp_bundleName = xpath.compile("//plist/dict/string[preceding-sibling::key/text()=\"CFBundleName\"]"); xp_bundleVersion = xpath.compile("//plist/dict/string[preceding-sibling::key/text()=\"CFBundleShortVersionString\"]"); } catch (XPathExpressionException e) { throw new RuntimeException(e); } } public static boolean isWOApplication(IJavaProject project) { try { return (project.findType("com.webobjects.appserver.WOApplication", (IProgressMonitor)null) != null); } catch (JavaModelException e) { e.printStackTrace(); } return false; } public static String woVersion(IJavaProject project) { URLClassLoader classLoader = new WOProjectClassLoader(null, project); try { Enumeration<URL> urls = classLoader.getResources("Resources/Info.plist"); DocumentBuilder docBuilder = _builderFactory.newDocumentBuilder(); while (urls.hasMoreElements()) { URL url = urls.nextElement(); try { docBuilder.reset(); Document doc = docBuilder.parse(url.toString()); String frameworkName = xp_bundleName.evaluate(doc); if ("WebObjects Framework".equals(frameworkName)) { return xp_bundleVersion.evaluate(doc); } } catch (Throwable e) { // Skip and move on } } } catch (IOException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } return null; } }