package org.objectstyle.wolips.eomodeler.factories;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import org.objectstyle.woenvironment.plist.WOLPropertyListSerialization;
import org.objectstyle.wolips.eomodeler.core.model.AbstractManifestEOModelGroupFactory;
import org.objectstyle.wolips.eomodeler.core.model.EOModelException;
import org.objectstyle.wolips.eomodeler.core.model.ManifestSearchFolder;
public class BundleEOModelGroupFactory extends AbstractManifestEOModelGroupFactory {
public static Properties propertiesFromFile(File propertiesFile) throws IOException {
Properties properties = null;
if (propertiesFile.exists()) {
properties = new Properties();
InputStream is = new BufferedInputStream(new FileInputStream(propertiesFile));
try {
properties.load(is);
} finally {
is.close();
}
}
return properties;
}
protected int fillInSearchFolders(File bundleFolder, String searchFolderPath, final List<ManifestSearchFolder> manifestSearchFolders) throws IOException {
int count = SimpleManifestUtilities.fillInSearchFolders(bundleFolder, searchFolderPath, new SimpleManifestUtilities.SearchFolderDelegate() {
public void fileMatched(File file) throws IOException {
manifestSearchFolders.add(new ManifestSearchFolder(file.getAbsoluteFile()));
}
});
return count;
}
protected void fillInSearchFolders(File bundleFolder, final List<ManifestSearchFolder> manifestSearchFolders, List<File> frameworkSearchFolders, Set<String> loadedBundles) throws IOException {
System.out.println("BundleEOModelGroupFactory.fillInSearchFolders: Searching " + bundleFolder + " ...");
if (new File(bundleFolder, "pom.xml").exists()) {
fillInSearchFolders(bundleFolder, "src" + File.separator + "main" + File.separator + "resources" + File.separator + "*.eomodeld", manifestSearchFolders);
fillInSearchFolders(bundleFolder, "src" + File.separator + "test" + File.separator + "resources" + File.separator + "*.eomodeld", manifestSearchFolders);
} else {
if (new File(bundleFolder, "Resources").exists()) {
fillInSearchFolders(bundleFolder, "Resources" + File.separator + "*.eomodeld", manifestSearchFolders);
} else if (new File(bundleFolder, "Contents" + File.separator + "Resources").exists()) {
fillInSearchFolders(bundleFolder, "Contents" + File.separator + "Resources" + File.separator + "*.eomodeld", manifestSearchFolders);
}
}
Properties buildProperties = BundleEOModelGroupFactory.propertiesFromFile(new File(bundleFolder, "build.properties"));
if (buildProperties != null) {
String dependenciesStr = buildProperties.getProperty("dependencies");
if (dependenciesStr != null && dependenciesStr.trim().length() > 0) {
for (String dependency : dependenciesStr.trim().split(",")) {
if (!loadedBundles.contains(dependency)) {
System.out.println("BundleEOModelGroupFactory.fillInSearchFolders: " + bundleFolder + " depends on " + dependency + ":");
boolean resolvedDependency = false;
for (File frameworkSearchFolder : frameworkSearchFolders) {
File dependencyBundleFolder = new File(frameworkSearchFolder, dependency);
if (dependencyBundleFolder.exists()) {
fillInSearchFolders(dependencyBundleFolder, manifestSearchFolders, frameworkSearchFolders, loadedBundles);
resolvedDependency = true;
break;
}
dependencyBundleFolder = new File(frameworkSearchFolder, dependency + ".framework");
if (dependencyBundleFolder.exists()) {
fillInSearchFolders(dependencyBundleFolder, manifestSearchFolders, frameworkSearchFolders, loadedBundles);
resolvedDependency = true;
break;
}
dependencyBundleFolder = new File(frameworkSearchFolder, dependency + ".woa");
if (dependencyBundleFolder.exists()) {
fillInSearchFolders(dependencyBundleFolder, manifestSearchFolders, frameworkSearchFolders, loadedBundles);
resolvedDependency = true;
break;
}
}
if (!resolvedDependency) {
System.out.println("BundleEOModelGroupFactory.fillInSearchFolders: Couldn't resolve the dependency '" + dependency + "'.");
}
loadedBundles.add(dependency);
}
}
}
}
}
@Override
public List<ManifestSearchFolder> getSearchFolders(File selectedModelFolder) throws IOException, EOModelException {
final List<ManifestSearchFolder> manifestSearchFolders = new LinkedList<ManifestSearchFolder>();
List<File> frameworkSearchFolders = new LinkedList<File>();
File buildPropertiesFile = null;
for (File buildPropertiesFolder = selectedModelFolder; buildPropertiesFile == null && buildPropertiesFolder != null; buildPropertiesFolder = buildPropertiesFolder.getParentFile()) {
File possibleBuildPropertiesFile = new File(buildPropertiesFolder, "build.properties");
if (possibleBuildPropertiesFile.exists()) {
buildPropertiesFile = possibleBuildPropertiesFile;
}
}
String woPropertiesPath = System.getenv("EntityModelerNSGlobalPropertiesPath");
if (woPropertiesPath == null) {
woPropertiesPath = System.getProperty("user.home") + File.separator + "WebObjects.properties";
}
Properties woProperties = propertiesFromFile(new File(woPropertiesPath));
if (woProperties != null) {
try {
@SuppressWarnings("unchecked")
List<String> nsProjectSearchPaths = (List<String>) WOLPropertyListSerialization.propertyListFromString(woProperties.getProperty("NSProjectSearchPath"));
if (nsProjectSearchPaths != null) {
for (String nsProjectSearchPath : nsProjectSearchPaths) {
File nsProjectSearchFolder = new File(nsProjectSearchPath);
if (nsProjectSearchFolder.exists()) {
frameworkSearchFolders.add(nsProjectSearchFolder);
}
}
}
} catch (Throwable t) {
throw new EOModelException("Failed to parse NSProjectSearchPath.", t);
}
}
File frameworkPathsManifestFile = null;
for (File frameworkPathsManifestFolder = selectedModelFolder; frameworkPathsManifestFile == null && frameworkPathsManifestFolder != null; frameworkPathsManifestFolder = frameworkPathsManifestFolder.getParentFile()) {
File possibleFrameworkPathsManifestFile = new File(frameworkPathsManifestFolder, ".EntityModeler.frameworkpath");
if (possibleFrameworkPathsManifestFile.exists()) {
frameworkPathsManifestFile = possibleFrameworkPathsManifestFile;
}
}
if (frameworkPathsManifestFile != null) {
BufferedReader frameworkPathsManifestReader = new BufferedReader(new FileReader(frameworkPathsManifestFile));
try {
String frameworkPath;
while ((frameworkPath = frameworkPathsManifestReader.readLine()) != null) {
File frameworkFolder = new File(frameworkPath);
if (!frameworkFolder.isAbsolute()) {
frameworkFolder = new File(frameworkPathsManifestFile.getCanonicalFile().getParentFile(), frameworkPath);
}
if (frameworkFolder.exists()) {
frameworkSearchFolders.add(frameworkFolder);
}
}
} finally {
frameworkPathsManifestReader.close();
}
}
if (buildPropertiesFile != null && frameworkSearchFolders.size() > 0) {
System.out.println("BundleEOModelGroupFactory.getSearchFolders: " + selectedModelFolder);
Set<String> loadedBundles = new HashSet<String>();
fillInSearchFolders(buildPropertiesFile.getParentFile(), manifestSearchFolders, frameworkSearchFolders, loadedBundles);
}
return manifestSearchFolders;
}
}