package org.objectstyle.wolips.variables; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Platform; import org.objectstyle.woenvironment.frameworks.Root; import org.objectstyle.woenvironment.frameworks.Version; import org.objectstyle.woenvironment.plist.ToHellWithProperties; public class BuildProperties { private IProject _project; private Properties _properties; private boolean _dirty; private long _version; public BuildProperties(IProject project) { _project = project; _version = -1; load(); } public boolean isDirty() { return _dirty; } public IProject getProject() { return _project; } public IFile getBuildPropertiesEclipseFile() { IFile file = _project.getFile("build.properties"); return file; } public File getBuildPropertiesFile() { File file = getBuildPropertiesEclipseFile().getLocation().toFile(); return file; } public long getModificationStamp() { File file = getBuildPropertiesFile(); if (_version == -1 && file.exists()) { _version = file.lastModified(); } return _version; } public synchronized void setProperties(Properties properties) { if (!_properties.equals(properties)) { _properties = properties; _dirty = true; } } public synchronized Properties getProperties() { Properties cloneProperties = new Properties(); cloneProperties.putAll(_properties); return cloneProperties; } public synchronized boolean getBoolean(String key, boolean defaultValue) { String strValue = get(key); boolean value; if (strValue == null) { value = defaultValue; } else { value = "true".equalsIgnoreCase(strValue); } return value; } public synchronized String get(String key) { return get(key, null); } public synchronized String get(String key, String defaultValue) { String value = _properties.getProperty(key, defaultValue); return value; } public synchronized void remove(String key) { put(key, null); } public synchronized void put(String key, boolean value) { put(key, Boolean.valueOf(value).toString()); } public synchronized void put(String key, String value) { if (value == null) { if (_properties.containsKey(key)) { _properties.remove(key); _dirty = true; } } else { String oldValue = get(key); if (!value.equals(oldValue)) { _properties.setProperty(key, value); _dirty = true; } } } protected void load() { try { boolean dirty; Properties properties = new Properties(); File file = getBuildPropertiesFile(); if (file.exists()) { InputStream inputStream = new FileInputStream(file); try { properties.load(inputStream); } finally { inputStream.close(); } dirty = false; } else { dirty = true; } synchronized (this) { _dirty = dirty; _properties = properties; } } catch (Exception e) { throw new RuntimeException("Failed to load the build properties for the project '" + _project + "'.", e); } } public synchronized void save() throws CoreException, IOException { Properties properties = new ToHellWithProperties(); properties.putAll(_properties); if (!_dirty) { return; } File file = getBuildPropertiesFile(); FileOutputStream fos = new FileOutputStream(file); try { properties.store(fos, null); } finally { fos.close(); } ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { getBuildPropertiesEclipseFile().refreshLocal(IResource.DEPTH_ONE, monitor); } }, null); _dirty = false; } public String getName() { String projectName = get("project.name"); // MS: compatibility with old build.properties if (projectName == null || projectName.length() == 0) { projectName = get("framework.name"); } if (projectName == null || projectName.length() == 0) { projectName = _project.getName(); } return projectName; } public void setName(String name) { put("project.name", name); put("project.name.lowercase", name.toLowerCase()); } public boolean getWebXML() { return getBoolean("webXML", false); } public void setWebXML(boolean webXML) { put("webXML", webXML); } public boolean isServletDeployment() { return getBoolean("servletDeployment", false); } public void setServletDeployment(boolean servletDeployment) { if (servletDeployment) { put("servletDeployment", servletDeployment); } else { remove("servletDeployment"); } } public String getWebXML_CustomContent(boolean convertNullValueToEmptyString) { return get("webXML_CustomContent", convertNullValueToEmptyString ? "" : null); } /** * @param webXML_CustomContent * webxml custom content */ public void setWebXML_CustomContent(String webXML_CustomContent) { put("webXML_CustomContent", webXML_CustomContent); } public String getEOGeneratorArgs(boolean convertNullValueToEmptyString) { return get("eogeneratorArgs", convertNullValueToEmptyString ? "" : null); } public void setEOGeneratorArgs(String eogeneratorArgs) { put("eogeneratorArgs", eogeneratorArgs); } public String getPrincipalClass() { return getPrincipalClass(false); } /** * @param convertNullValueToEmptyString * @return principalClass. */ public String getPrincipalClass(boolean convertNullValueToEmptyString) { return get("principalClass", convertNullValueToEmptyString ? "" : null); } /** * @param principalClass * the principalClass for the Info.plist */ public void setPrincipalClass(String principalClass) { put("principalClass", (principalClass == null) ? "" : principalClass); } public boolean isEmbed(Root root) { String shortName = root.getShortName(); return getBoolean("embed." + shortName, false); } public void setEmbed(Root root, boolean embed) { String shortName = root.getShortName(); if (!embed) { remove("embed." + shortName); } else { put("embed." + shortName, embed); } } public String getCustomInfoPListContent() { return getCustomInfoPListContent(false); } /** * @param convertNullValueToEmptyString * @return The CustomContent for the Info.plist */ public String getCustomInfoPListContent(boolean convertNullValueToEmptyString) { return get("customInfoPListContent", convertNullValueToEmptyString ? "" : null); } /** * @param customInfoPListContent * The CustomContent for the Info.plist */ public void setCustomInfoPListContent(String customInfoPListContent) { put("customInfoPListContent", (customInfoPListContent == null) ? "" : customInfoPListContent); } public String getEOAdaptorClassName() { return getEOAdaptorClassName(false); } /** * @param convertNullValueToEmptyString * @return The EOAdaptorClassName for the Info.plist */ public String getEOAdaptorClassName(boolean convertNullValueToEmptyString) { return get("eoAdaptorClassName", convertNullValueToEmptyString ? "" : null); } /** * @param eoAdaptorClassName * the eoadaptorclassname for the Info.plist */ public void setEOAdaptorClassName(String eoAdaptorClassName) { put("eoAdaptorClassName", (eoAdaptorClassName == null) ? "" : eoAdaptorClassName); } public String getProjectFrameworkFolder() { return get("projectFrameworkFolder"); } public void setProjectFrameworkFolder(String projectFrameworkFolder) { put("projectFrameworkFolder", projectFrameworkFolder); } public void setJavaClient(boolean javaClient) { if (javaClient) { put("javaClient", javaClient); } else { remove("javaClient"); } } public boolean isJavaClient() { return getBoolean("javaClient", false); } public void setJavaWebStart(boolean javaWebStart) { if (javaWebStart) { put("javaWebStart", javaWebStart); } else { remove("javaWebStart"); } } public boolean isJavaWebStart() { return getBoolean("javaWebStart", false); } public boolean hasValidProjectType() { String projectType = get("project.type"); return "application".equals(projectType) || "framework".equals(projectType); } public boolean isFramework() { boolean isFramework = false; String projectType = get("project.type"); if (projectType != null) { isFramework = "framework".equals(projectType); } else { // MS: compatibility with old build.properties String frameworkName = get("framework.name"); if (frameworkName != null) { isFramework = true; } } return isFramework; } public void setFramework(boolean framework) { if (framework) { put("project.type", "framework"); } else { put("project.type", "application"); } } public String getBundleType() { return isFramework() ? "FMWK" : "APPL"; } private boolean _defaultsInitialized; private Version _woVersionDefault; private Version _versionDefault; private String _inlineBindingPrefixDefault; private String _inlineBindingSuffixDefault; private boolean _wellFormedTemplateRequiredDefault; public void _copyDefaultsFrom(BuildProperties props) { if (props._defaultsInitialized) { _woVersionDefault = props._woVersionDefault; _inlineBindingPrefixDefault = props._inlineBindingPrefixDefault; _inlineBindingSuffixDefault = props._inlineBindingSuffixDefault; _wellFormedTemplateRequiredDefault = props._wellFormedTemplateRequiredDefault; _defaultsInitialized = true; } } protected synchronized void ensureDefaultsInitialized() { if (!_defaultsInitialized) { _defaultsInitialized = true; _woVersionDefault = new Version(VariablesPlugin.getDefault().getGlobalVariables().getString("wo.version", "5.3.3")); _inlineBindingPrefixDefault = VariablesPlugin.getDefault().getGlobalVariables().getString("component.inlineBindingPrefix", "["); _inlineBindingSuffixDefault = VariablesPlugin.getDefault().getGlobalVariables().getString("component.inlineBindingSuffix", "]"); // MS: This is pretty hacky -- Technically this plugin doesn't depend on the Bindings preference plugin, and I don't want to add it because it brings in a bunch // of JDT dependencies that we don't want here, but I can't move the preferences out of the plugin easily without changing their key name. _wellFormedTemplateRequiredDefault = VariablesPlugin.getDefault().getGlobalVariables().getBoolean("component.wellFormedTemplateRequired", "yes".equals(Platform.getPreferencesService().getString("org.objectstyle.wolips.bindings", "WellFormedTemplate", null, null))); BuildPropertiesAdapterFactory.initializeBuildPropertiesDefaults(this); } } public void setWOVersionDefault(Version woVersionDefault) { _woVersionDefault = woVersionDefault; } public Version getWOVersionDefault() { ensureDefaultsInitialized(); return _woVersionDefault; } public void setVersionDefault(Version versionDefault) { _versionDefault = versionDefault; } public Version getVersionDefault() { ensureDefaultsInitialized(); return _versionDefault; } public void setVersion(Version version) { if (version != null) { put("version", version.getVersionStr()); } else { remove("version"); } } public Version getVersion() { Version versionDefault = getVersionDefault(); return new Version(get("version", versionDefault == null ? null : versionDefault.getVersionStr())); } public void setWOVersion(Version woVersion) { if (woVersion != null) { put("wo.version", woVersion.getVersionStr()); } else { remove("wo.version"); } } public Version getWOVersion() { Version woVersionDefault = getWOVersionDefault(); return new Version(get("wo.version", woVersionDefault == null ? null : woVersionDefault.getVersionStr())); } public void setInlineBindingPrefixDefault(String inlineBindingPrefixDefault) { _inlineBindingPrefixDefault = inlineBindingPrefixDefault; } public String getInlineBindingPrefixDefault() { ensureDefaultsInitialized(); return _inlineBindingPrefixDefault; } public void setInlineBindingPrefix(String inlineBindingPrefix) { if (inlineBindingPrefix != null) { put("component.inlineBindingPrefix", inlineBindingPrefix); } else { remove("component.inlineBindingPrefix"); } } public String getInlineBindingPrefix() { return get("component.inlineBindingPrefix", getInlineBindingPrefixDefault()); } public void setInlineBindingSuffixDefault(String inlineBindingSuffixDefault) { _inlineBindingSuffixDefault = inlineBindingSuffixDefault; } public String getInlineBindingSuffixDefault() { ensureDefaultsInitialized(); return _inlineBindingSuffixDefault; } public void setInlineBindingSuffix(String inlineBindingSuffix) { if (inlineBindingSuffix != null) { put("component.inlineBindingSuffix", inlineBindingSuffix); } else { remove("component.inlineBindingSuffix"); } } public String getInlineBindingSuffix() { return get("component.inlineBindingSuffix", getInlineBindingSuffixDefault()); } public void setWellFormedTemplateRequiredDefault(boolean wellFormedTemplateRequiredDefault) { _wellFormedTemplateRequiredDefault = wellFormedTemplateRequiredDefault; } public boolean getWellFormedTemplateRequiredDefault() { ensureDefaultsInitialized(); return _wellFormedTemplateRequiredDefault; } public void setWellFormedTemplateRequired(Boolean wellFormedTemplateRequired) { if (wellFormedTemplateRequired == null) { remove("component.wellFormedTemplateRequired"); } else { put("component.wellFormedTemplateRequired", wellFormedTemplateRequired.booleanValue()); } } public boolean isWellFormedTemplateRequired() { boolean wellFormedTemplateRequired = getBoolean("component.wellFormedTemplateRequired", getWellFormedTemplateRequiredDefault()); return wellFormedTemplateRequired; } public boolean isBuildFolderRequired() { return getWOVersion().isAtLeastVersion(5, 6); } }