*/ defs) {
return new FixedPropertyProvider(defs);
}
@@ -572,7 +575,7 @@
* @param providers a sequential list of property groups
* @return an evaluator
*/
- /*XXX public*/ static PropertyEvaluator sequentialPropertyEvaluator(PropertyProvider preprovider, PropertyProvider[] providers) {
+ public static PropertyEvaluator sequentialPropertyEvaluator(PropertyProvider preprovider, PropertyProvider[] providers) {
return new SequentialPropertyEvaluator(preprovider, providers);
}
Index: ant/project/src/org/netbeans/spi/project/support/ant/ReferenceHelper.java
===================================================================
RCS file: /cvs/ant/project/src/org/netbeans/spi/project/support/ant/ReferenceHelper.java,v
retrieving revision 1.5
diff -u -r1.5 ReferenceHelper.java
--- ant/project/src/org/netbeans/spi/project/support/ant/ReferenceHelper.java 3 Apr 2004 07:00:36 -0000 1.5
+++ ant/project/src/org/netbeans/spi/project/support/ant/ReferenceHelper.java 21 Apr 2004 22:49:23 -0000
@@ -83,20 +83,38 @@
static final String REFS_NS = "http://www.netbeans.org/ns/ant-project-references/1"; // NOI18N
private final AntProjectHelper h;
+ final PropertyEvaluator eval;
private final AuxiliaryConfiguration aux;
+ /** @deprecated Use the constructor that takes a property evaluator instead. */
+ public ReferenceHelper(AntProjectHelper helper, AuxiliaryConfiguration aux) {
+ this(helper, aux, helper.getStandardPropertyEvaluator());
+ }
+
/**
* Create a new reference helper.
* It needs an {@link AntProjectHelper} object in order to update references
* in project.xml
,
* as well as set project or private properties referring to the locations
* of foreign projects on disk.
+ *
+ * The property evaluator may be used in {@link #getForeignFileReferenceAsArtifact},
+ * {@link ReferenceHelper.RawReference#toAntArtifact}, or
+ * {@link #createSubprojectProvider}. Typically this would
+ * be {@link AntProjectHelper#getStandardPropertyEvaluator}. You can substitute
+ * a custom evaluator but be warned that this helper class assumes that
+ * {@link AntProjectHelper#PROJECT_PROPERTIES_PATH} and {@link AntProjectHelper#PRIVATE_PROPERTIES_PATH}
+ * have their customary meanings; specifically that they are both used when evaluating
+ * properties (such as the location of a foreign project) and that private properties
+ * can override public properties.
* @param helper an Ant project helper object representing this project's configuration
* @param aux an auxiliary configuration provider needed to store references
+ * @param eval a property evaluator
*/
- public ReferenceHelper(AntProjectHelper helper, AuxiliaryConfiguration aux) {
+ public ReferenceHelper(AntProjectHelper helper, AuxiliaryConfiguration aux, PropertyEvaluator eval) {
h = helper;
this.aux = aux;
+ this.eval = eval;
}
/**
@@ -827,7 +845,7 @@
return (AntArtifact)ProjectManager.mutex().readAccess(new Mutex.Action() {
public Object run() {
AntProjectHelper h = helper.h;
- String path = h.evaluate("project." + foreignProjectName); // NOI18N
+ String path = helper.eval.getProperty("project." + foreignProjectName); // NOI18N
if (path == null) {
// Undefined foreign project.
return null;
Index: ant/project/src/org/netbeans/spi/project/support/ant/SharabilityQueryImpl.java
===================================================================
RCS file: /cvs/ant/project/src/org/netbeans/spi/project/support/ant/SharabilityQueryImpl.java,v
retrieving revision 1.2
diff -u -r1.2 SharabilityQueryImpl.java
--- ant/project/src/org/netbeans/spi/project/support/ant/SharabilityQueryImpl.java 14 Apr 2004 09:17:47 -0000 1.2
+++ ant/project/src/org/netbeans/spi/project/support/ant/SharabilityQueryImpl.java 21 Apr 2004 22:49:23 -0000
@@ -13,6 +13,8 @@
package org.netbeans.spi.project.support.ant;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
@@ -24,9 +26,10 @@
* Standard impl of {@link SharabilityQueryImplementation}.
* @author Jesse Glick
*/
-final class SharabilityQueryImpl implements SharabilityQueryImplementation, AntProjectListener {
+final class SharabilityQueryImpl implements SharabilityQueryImplementation, PropertyChangeListener {
private final AntProjectHelper h;
+ private final PropertyEvaluator eval;
private final String[] includes;
private final String[] excludes;
/** Absolute paths of directories or files to treat as sharable (except for the excludes). */
@@ -34,12 +37,13 @@
/** Absolute paths of directories or files to treat as not sharable. */
private String[] excludePaths;
- SharabilityQueryImpl(AntProjectHelper h, String[] includes, String[] excludes) {
+ SharabilityQueryImpl(AntProjectHelper h, PropertyEvaluator eval, String[] includes, String[] excludes) {
this.h = h;
+ this.eval = eval;
this.includes = includes;
this.excludes = excludes;
computeFiles();
- h.addAntProjectListener((AntProjectListener)WeakListeners.create(AntProjectListener.class, this, h));
+ eval.addPropertyChangeListener(WeakListeners.propertyChange(this, eval));
}
/** Compute the absolute paths which are and are not sharable. */
@@ -56,7 +60,7 @@
private String[] computeFrom(String[] list) {
List/**/ result = new ArrayList(list.length);
for (int i = 0; i < list.length; i++) {
- String val = h.evaluateString(list[i]);
+ String val = eval.evaluate(list[i]);
if (val != null) {
File f = h.resolveFile(val);
result.add(f.getAbsolutePath());
@@ -97,12 +101,8 @@
return false;
}
- public void propertiesChanged(AntProjectEvent ev) {
+ public void propertyChange(PropertyChangeEvent evt) {
computeFiles();
- }
-
- public void configurationXmlChanged(AntProjectEvent ev) {
- // ignore
}
}
Index: ant/project/src/org/netbeans/spi/project/support/ant/SimpleAntArtifact.java
===================================================================
RCS file: /cvs/ant/project/src/org/netbeans/spi/project/support/ant/SimpleAntArtifact.java,v
retrieving revision 1.4
diff -u -r1.4 SimpleAntArtifact.java
--- ant/project/src/org/netbeans/spi/project/support/ant/SimpleAntArtifact.java 3 Apr 2004 06:47:56 -0000 1.4
+++ ant/project/src/org/netbeans/spi/project/support/ant/SimpleAntArtifact.java 21 Apr 2004 22:49:23 -0000
@@ -32,22 +32,24 @@
private final AntProjectHelper h;
private final String type;
private final String locationProperty;
+ private final PropertyEvaluator eval;
private final String targetName;
private final String cleanTargetName;
/**
* @see AntProjectHelper#createSimpleAntArtifact
*/
- public SimpleAntArtifact(AntProjectHelper helper, String type, String locationProperty, String targetName, String cleanTargetName) {
+ public SimpleAntArtifact(AntProjectHelper helper, String type, String locationProperty, PropertyEvaluator eval, String targetName, String cleanTargetName) {
this.h = helper;
this.type = type;
this.locationProperty = locationProperty;
+ this.eval = eval;
this.targetName = targetName;
this.cleanTargetName = cleanTargetName;
}
public URI getArtifactLocation() {
- String locationResolved = h.evaluate(locationProperty);
+ String locationResolved = eval.getProperty(locationProperty);
if (locationResolved == null) {
return URI.create("file:/UNDEFINED"); // NOI18N
}
Index: ant/project/src/org/netbeans/spi/project/support/ant/SubprojectProviderImpl.java
===================================================================
RCS file: /cvs/ant/project/src/org/netbeans/spi/project/support/ant/SubprojectProviderImpl.java,v
retrieving revision 1.2
diff -u -r1.2 SubprojectProviderImpl.java
--- ant/project/src/org/netbeans/spi/project/support/ant/SubprojectProviderImpl.java 16 Mar 2004 15:27:25 -0000 1.2
+++ ant/project/src/org/netbeans/spi/project/support/ant/SubprojectProviderImpl.java 21 Apr 2004 22:49:23 -0000
@@ -52,7 +52,7 @@
String foreignProjectName = (String)it.next();
String prop = "project." + foreignProjectName; // NOI18N
AntProjectHelper h = helper.getAntProjectHelper();
- String foreignProjectDirS = h.evaluate(prop);
+ String foreignProjectDirS = helper.eval.getProperty(prop);
if (foreignProjectDirS == null) {
// Missing for some reason. Skip it.
continue;
Index: ant/project/test/unit/src/org/netbeans/spi/project/support/ant/AntProjectHelperTest.java
===================================================================
RCS file: /cvs/ant/project/test/unit/src/org/netbeans/spi/project/support/ant/AntProjectHelperTest.java,v
retrieving revision 1.4
diff -u -r1.4 AntProjectHelperTest.java
--- ant/project/test/unit/src/org/netbeans/spi/project/support/ant/AntProjectHelperTest.java 15 Apr 2004 17:01:21 -0000 1.4
+++ ant/project/test/unit/src/org/netbeans/spi/project/support/ant/AntProjectHelperTest.java 21 Apr 2004 22:49:23 -0000
@@ -544,5 +544,61 @@
// or other general fixed metadata
// XXX try overwriting data
}
+
+ public void testCreatePropertyProvider() throws Exception {
+ PropertyProvider pp = h.getPropertyProvider(AntProjectHelper.PROJECT_PROPERTIES_PATH);
+ Map/**/ defs = pp.getProperties();
+ assertEquals("correct number of defs", 3, defs.size());
+ assertEquals("correct value", "value1", defs.get("shared.prop"));
+ // Test changes.
+ PropertyUtilsTest.TestCL l = new PropertyUtilsTest.TestCL();
+ pp.addChangeListener(l);
+ EditableProperties p = h.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH);
+ p.setProperty("foo", "bar");
+ assertFalse("no events from uncommitted changes", l.changed);
+ h.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, p);
+ assertTrue("got a change from setting a property", l.changed);
+ l.changed = false;
+ defs = pp.getProperties();
+ assertEquals("correct new size", 4, defs.size());
+ assertEquals("correct new value", "bar", defs.get("foo"));
+ // No-op changes.
+ p = p.cloneProperties();
+ p.setProperty("foo", "bar2");
+ p.setProperty("foo", "bar");
+ h.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, p);
+ assertFalse("no events from no-op changes", l.changed);
+ // Deleting a property file.
+ h.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, null);
+ assertTrue("got a change from removing a property file", l.changed);
+ l.changed = false;
+ assertEquals("now have no definitions", Collections.EMPTY_MAP, pp.getProperties());
+ // Start off with no file, then create it.
+ String path = "foo.properties";
+ pp = h.getPropertyProvider(path);
+ pp.addChangeListener(l);
+ assertEquals("no defs initially", Collections.EMPTY_MAP, pp.getProperties());
+ assertNull("no file made yet", h.getProjectDirectory().getFileObject(path));
+ p = new EditableProperties();
+ p.setProperty("one", "1");
+ p.setProperty("two", "2");
+ h.putProperties(path, p);
+ assertTrue("making the file fired a change", l.changed);
+ l.changed = false;
+ defs = pp.getProperties();
+ assertEquals("two defs", 2, defs.size());
+ assertEquals("right value #1", "1", defs.get("one"));
+ assertEquals("right value #2", "2", defs.get("two"));
+ assertNull("no file yet saved to disk", h.getProjectDirectory().getFileObject(path));
+ p.setProperty("three", "3");
+ assertFalse("no events from uncomm. change", l.changed);
+ h.putProperties(path, p);
+ assertTrue("now have changed new file", l.changed);
+ l.changed = false;
+ defs = pp.getProperties();
+ assertEquals("three defs", 3, defs.size());
+ // XXX test that saving the project fires no additional changes
+ // XXX test changes fired if file modified (or created or removed) on disk
+ }
}
Index: ant/project/test/unit/src/org/netbeans/spi/project/support/ant/PropertyUtilsTest.java
===================================================================
RCS file: /cvs/ant/project/test/unit/src/org/netbeans/spi/project/support/ant/PropertyUtilsTest.java,v
retrieving revision 1.4
diff -u -r1.4 PropertyUtilsTest.java
--- ant/project/test/unit/src/org/netbeans/spi/project/support/ant/PropertyUtilsTest.java 21 Apr 2004 15:48:57 -0000 1.4
+++ ant/project/test/unit/src/org/netbeans/spi/project/support/ant/PropertyUtilsTest.java 21 Apr 2004 22:49:23 -0000
@@ -438,7 +438,7 @@
}
- private static final class TestCL implements ChangeListener {
+ static final class TestCL implements ChangeListener {
public boolean changed = false;
Index: ant/project/test/unit/src/org/netbeans/spi/project/support/ant/ReferenceHelperTest.java
===================================================================
RCS file: /cvs/ant/project/test/unit/src/org/netbeans/spi/project/support/ant/ReferenceHelperTest.java,v
retrieving revision 1.3
diff -u -r1.3 ReferenceHelperTest.java
--- ant/project/test/unit/src/org/netbeans/spi/project/support/ant/ReferenceHelperTest.java 3 Apr 2004 07:00:35 -0000 1.3
+++ ant/project/test/unit/src/org/netbeans/spi/project/support/ant/ReferenceHelperTest.java 21 Apr 2004 22:49:23 -0000
@@ -312,7 +312,7 @@
public void testAddRemoveArtifact() throws Exception {
// Add one artifact. Check that the raw reference is there.
assertFalse("project not initially modified", pm.isModified(p));
- AntArtifact art = new SimpleAntArtifact(sisterh, "jar", "build.jar", "dojar", "clean");
+ AntArtifact art = sisterh.createSimpleAntArtifact("jar", "build.jar", "dojar", "clean");
assertTrue("added a ref to proj2.dojar", r.addReference(art));
assertTrue("project now modified", pm.isModified(p));
ReferenceHelper.RawReference[] refs = r.getRawReferences();
@@ -340,7 +340,7 @@
assertFalse("no-op add", r.addReference(art));
assertFalse("project not modified by no-op add", pm.isModified(p));
// Try another artifact from the same project.
- art = new SimpleAntArtifact(sisterh, "javadoc", "build.javadoc", "dojavadoc", "clean");
+ art = sisterh.createSimpleAntArtifact("javadoc", "build.javadoc", "dojavadoc", "clean");
assertTrue("added a ref to proj2.dojavadoc", r.addReference(art));
assertTrue("project now modified", pm.isModified(p));
refs = r.getRawReferences();
@@ -370,7 +370,7 @@
assertFalse("project not modified by no-op add", pm.isModified(p));
// Try modifying the second artifact in some way.
// Note that only changes in the type, clean target, and artifact path count as modifications.
- art = new SimpleAntArtifact(sisterh, "javadoc.html", "build.javadoc", "dojavadoc", "clean");
+ art = sisterh.createSimpleAntArtifact("javadoc.html", "build.javadoc", "dojavadoc", "clean");
assertTrue("successful modification of proj2.dojavadoc by type", r.addReference(art));
assertTrue("project modified by ref mod", pm.isModified(p));
refs = r.getRawReferences();
@@ -381,10 +381,10 @@
assertEquals("correct script location", URI.create("build.xml"), ref.getScriptLocation());
assertEquals("correct target name", "dojavadoc", ref.getTargetName());
assertEquals("correct clean target name", "clean", ref.getCleanTargetName());
- art = new SimpleAntArtifact(sisterh, "javadoc.html", "build.javadoc", "dojavadoc", "realclean");
+ art = sisterh.createSimpleAntArtifact("javadoc.html", "build.javadoc", "dojavadoc", "realclean");
assertTrue("successful modification of proj2.dojavadoc by clean target", r.addReference(art));
pm.saveProject(p);
- art = new SimpleAntArtifact(sisterh, "javadoc.html", "build.javadoc.complete", "dojavadoc", "realclean");
+ art = sisterh.createSimpleAntArtifact("javadoc.html", "build.javadoc.complete", "dojavadoc", "realclean");
assertTrue("successful modification of proj2.dojavadoc by artifact location property", r.addReference(art));
assertTrue("project modified by ref mod", pm.isModified(p));
refs = r.getRawReferences();
@@ -467,11 +467,11 @@
* @throws Exception in case of unexpected failures
*/
public void testSubprojectProviderImpl() throws Exception {
- AntArtifact art = new SimpleAntArtifact(sisterh, "jar", "build.jar", "dojar", "clean");
+ AntArtifact art = sisterh.createSimpleAntArtifact("jar", "build.jar", "dojar", "clean");
assertTrue("added a ref to proj2.dojar", r.addReference(art));
- art = new SimpleAntArtifact(sisterh, "javadoc", "build.javadoc", "dojavadoc", "clean");
+ art = sisterh.createSimpleAntArtifact("javadoc", "build.javadoc", "dojavadoc", "clean");
assertTrue("added a ref to proj2.dojavadoc", r.addReference(art));
- art = new SimpleAntArtifact(seph, "jar", "build.jar", "dojar", "clean");
+ art = seph.createSimpleAntArtifact("jar", "build.jar", "dojar", "clean");
assertTrue("added a ref to proj3.dojar", r.addReference(art));
SubprojectProvider sp = r.createSubprojectProvider();
Set/**/ subprojs = sp.getSubProjects();