package org.objectstyle.wolips.eomodeler.factories;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.Set;
import org.objectstyle.wolips.baseforplugins.util.URLUtils;
import org.objectstyle.wolips.eomodeler.core.model.AbstractEOClassLoader;
import org.objectstyle.wolips.eomodeler.core.model.EOModel;
public class SimpleManifestEOClassLoaderFactory extends AbstractEOClassLoader {
@Override
protected void fillInDevelopmentClasspath(Set<URL> classpathUrls) throws Exception {
// DO NOTHING
}
@Override
protected void fillInModelClasspath(EOModel model, Set<URL> classpathUrls) throws Exception {
File modelFolder = URLUtils.cheatAndTurnIntoFile(model.getModelURL()).getParentFile();
fillInClasspathURLs(new File(modelFolder, "EntityModeler.classpath"), classpathUrls);
fillInClasspathURLs(new File(modelFolder, ".EntityModeler.classpath"), classpathUrls);
for (File modelParentFolder = modelFolder.getParentFile(); modelParentFolder != null; modelParentFolder = modelParentFolder.getParentFile()) {
fillInClasspathURLs(new File(modelParentFolder, "EntityModeler.classpath"), classpathUrls);
fillInClasspathURLs(new File(modelParentFolder, ".EntityModeler.classpath"), classpathUrls);
}
fillInClasspathURLs(new File(System.getProperty("user.home"), "EntityModeler.classpath"), classpathUrls);
fillInClasspathURLs(new File(System.getProperty("user.home"), ".EntityModeler.classpath"), classpathUrls);
fillInClasspathURLs(new File(System.getProperty("user.home") + "/Library", "EntityModeler.classpath"), classpathUrls);
fillInClasspathURLs(new File(System.getProperty("user.home") + "/Library", ".EntityModeler.classpath"), classpathUrls);
fillInClasspathURLs(new File(System.getProperty("user.home") + "/Library/Preferences", "EntityModeler.classpath"), classpathUrls);
fillInClasspathURLs(new File(System.getProperty("user.home") + "/Library/Preferences", ".EntityModeler.classpath"), classpathUrls);
}
protected void addClasspathURL(File manifestItem, final Set<URL> classpathUrls) throws IOException {
File searchFolder = manifestItem.getCanonicalFile();
if (searchFolder != null && searchFolder.exists()) {
if (searchFolder.getName().endsWith(".framework")) {
File javaFolder = new File(searchFolder, "Resources/Java");
if (javaFolder.exists()) {
classpathUrls.add(javaFolder.toURL());
File[] jarFiles = javaFolder.listFiles();
for (File jarFile : jarFiles) {
if (jarFile.getName().toLowerCase().endsWith(".jar")) {
System.out.println("SimpleManifestEOClassLoaderFactory.fillInClasspathURLs: jar = " + jarFile);
classpathUrls.add(jarFile.toURL());
}
}
}
} else {
classpathUrls.add(searchFolder.toURL());
}
}
}
protected void fillInClasspathURLs(File manifestFile, final Set<URL> classpathUrls) throws IOException {
if (manifestFile.exists()) {
System.out.println("SimpleManifestEOClassLoaderFactory.fillInClasspathURLs: Manifest = " + manifestFile + " ...");
BufferedReader manifestReader = new BufferedReader(new FileReader(manifestFile));
try {
String searchFolderPath;
while ((searchFolderPath = manifestReader.readLine()) != null) {
if (searchFolderPath.contains("*")) {
SimpleManifestUtilities.fillInSearchFolders(manifestFile.getParentFile(), searchFolderPath, new SimpleManifestUtilities.SearchFolderDelegate() {
public void fileMatched(File file) throws IOException {
addClasspathURL(file, classpathUrls);
}
});
}
else {
addClasspathURL(new File(searchFolderPath), classpathUrls);
}
}
} finally {
manifestReader.close();
}
}
}
}