package org.objectstyle.wolips.eomodeler.factories; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.LinkedHashSet; import java.util.Set; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathFactory; import org.objectstyle.woenvironment.plist.PropertyListParserException; import org.objectstyle.wolips.baseforplugins.util.StringUtils; import org.objectstyle.wolips.baseforplugins.util.URLUtils; import org.objectstyle.wolips.eomodeler.core.model.AbstractEOClassLoader; import org.objectstyle.wolips.eomodeler.core.model.EOModel; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public class IDEAProjectEOClassLoaderFactory extends AbstractEOClassLoader { @Override protected void fillInDevelopmentClasspath(Set<URL> classpathUrls) throws Exception { // DO NOTHING } @Override protected void fillInModelClasspath(EOModel model, Set<URL> classpathUrls) throws Exception { Set<File> ideaProjectFiles = new LinkedHashSet<File>(); try { File modelFolder = URLUtils.cheatAndTurnIntoFile(model.getModelURL()).getParentFile(); IDEAProjectEOModelGroupFactory.findIdeaProjectFilesInFolder(modelFolder, ideaProjectFiles); } catch (PropertyListParserException e) { e.printStackTrace(); throw new IOException("Failed to parse '.EntityModeler.plist'. " + StringUtils.getErrorMessage(e)); } if (!ideaProjectFiles.isEmpty()) { for (File ideaProjectFile : ideaProjectFiles) { System.out.println("IDEAProjectEOClassLoaderFactory.fillInModelClasspath: Project = " + ideaProjectFile); String ideaProjectPath = ideaProjectFile.getParentFile().getAbsolutePath(); try { XPathExpression ideaLibrariesExpression = XPathFactory.newInstance().newXPath().compile("project/component[@name='libraryTable']/library"); XPathExpression ideaClassesRootExpression = XPathFactory.newInstance().newXPath().compile("CLASSES/root"); Document ideaProjectDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(ideaProjectFile); NodeList ideaLibraryNodes = (NodeList) ideaLibrariesExpression.evaluate(ideaProjectDocument, XPathConstants.NODESET); for (int ideaLibraryNum = 0; ideaLibraryNum < ideaLibraryNodes.getLength(); ideaLibraryNum++) { Element ideaLibraryElement = (Element) ideaLibraryNodes.item(ideaLibraryNum); NodeList rootNodes = (NodeList) ideaClassesRootExpression.evaluate(ideaLibraryElement, XPathConstants.NODESET); for (int rootNodeNum = 0; rootNodeNum < rootNodes.getLength(); rootNodeNum++) { Element rootNodeElement = (Element) rootNodes.item(rootNodeNum); URL rootUrl; String rootUrlStr = rootNodeElement.getAttribute("url"); rootUrlStr = rootUrlStr.replaceAll("\\$PROJECT_DIR\\$", ideaProjectPath); if (rootUrlStr.startsWith("jar://")) { rootUrlStr = rootUrlStr.replaceFirst("^jar://", ""); rootUrlStr = rootUrlStr.replaceFirst("!/$", ""); rootUrl = new File(rootUrlStr).getCanonicalFile().toURL(); } else { rootUrl = new URL(rootUrlStr); } System.out.println("IDEAProjectEOClassLoaderFactory.fillInModelClasspath: " + rootUrl); classpathUrls.add(rootUrl); } } } catch (Exception e) { e.printStackTrace(); } } } } }