Lines 140-159
Link Here
|
140 |
private final Set/*<String>*/ modifiedMetadataPaths = new HashSet(); |
140 |
private final Set/*<String>*/ modifiedMetadataPaths = new HashSet(); |
141 |
|
141 |
|
142 |
/** |
142 |
/** |
143 |
* Properties loaded from metadata files on disk. |
|
|
144 |
* Keys are project-relative paths such as {@link #PROJECT_PROPERTIES_PATH}. |
145 |
* Values are loaded properties objects, or null if the file did not exist. |
146 |
* If the key does not exist then it needs to be checked on disk. |
147 |
*/ |
148 |
private final Map/*<String,EditableProperties|null>*/ properties = new HashMap(); |
149 |
|
150 |
/** |
151 |
* Registered listeners. |
143 |
* Registered listeners. |
152 |
* Access must be directly synchronized. |
144 |
* Access must be directly synchronized. |
153 |
*/ |
145 |
*/ |
154 |
private final List/*<AntProjectListener>*/ listeners = new ArrayList(); |
146 |
private final List/*<AntProjectListener>*/ listeners = new ArrayList(); |
155 |
|
147 |
|
156 |
// XXX lock any loaded files while the project is modified, to prevent manual editing, |
148 |
/** |
|
|
149 |
* List of loaded properties. |
150 |
*/ |
151 |
private final ProjectProperties properties; |
152 |
|
153 |
// XXX lock any loaded XML files while the project is modified, to prevent manual editing, |
157 |
// and reload any modified files if the project is unmodified |
154 |
// and reload any modified files if the project is unmodified |
158 |
|
155 |
|
159 |
private AntProjectHelper(FileObject dir, Document projectXml, ProjectState state, AntBasedProjectType type) { |
156 |
private AntProjectHelper(FileObject dir, Document projectXml, ProjectState state, AntBasedProjectType type) { |
Lines 165-170
Link Here
|
165 |
assert type != null; |
162 |
assert type != null; |
166 |
this.projectXml = projectXml; |
163 |
this.projectXml = projectXml; |
167 |
assert projectXml != null; |
164 |
assert projectXml != null; |
|
|
165 |
properties = new ProjectProperties(dir); |
168 |
} |
166 |
} |
169 |
|
167 |
|
170 |
/** |
168 |
/** |
Lines 463-493
Link Here
|
463 |
saveXml(privateXml, path); |
461 |
saveXml(privateXml, path); |
464 |
} else { |
462 |
} else { |
465 |
// All else is assumed to be a properties file. |
463 |
// All else is assumed to be a properties file. |
466 |
FileObject f = dir.getFileObject(path); |
464 |
properties.write(path); |
467 |
assert properties.containsKey(path); |
|
|
468 |
EditableProperties p = (EditableProperties)properties.get(path); |
469 |
if (p != null) { |
470 |
// Supposed to create/modify the file. |
471 |
if (f == null) { |
472 |
f = FileUtil.createData(dir, path); |
473 |
} |
474 |
FileLock lock = f.lock(); |
475 |
try { |
476 |
OutputStream os = f.getOutputStream(lock); |
477 |
try { |
478 |
p.store(os); |
479 |
} finally { |
480 |
os.close(); |
481 |
} |
482 |
} finally { |
483 |
lock.releaseLock(); |
484 |
} |
485 |
} else { |
486 |
// We are supposed to remove any existing file. |
487 |
if (f != null) { |
488 |
f.delete(); |
489 |
} |
490 |
} |
491 |
} |
465 |
} |
492 |
// As metadata files are saved, take them off the modified list. |
466 |
// As metadata files are saved, take them off the modified list. |
493 |
it.remove(); |
467 |
it.remove(); |
Lines 508-558
Link Here
|
508 |
* @return a set of properties |
482 |
* @return a set of properties |
509 |
*/ |
483 |
*/ |
510 |
public EditableProperties getProperties(String path) { |
484 |
public EditableProperties getProperties(String path) { |
511 |
EditableProperties p = getPropertiesOrNull(path); |
485 |
if (path.equals(AntProjectHelper.PROJECT_XML_PATH) || path.equals(AntProjectHelper.PRIVATE_XML_PATH)) { |
512 |
if (p != null) { |
486 |
throw new IllegalArgumentException("Attempt to load properties from a project XML file"); // NOI18N |
513 |
return p; |
|
|
514 |
} else { |
515 |
return new EditableProperties(true); |
516 |
} |
487 |
} |
517 |
} |
488 |
return properties.getProperties(path); |
518 |
|
|
|
519 |
/** |
520 |
* Like {@link #getProperties} but a missing or broken file results |
521 |
* in a null return rather than an empty properties object. |
522 |
*/ |
523 |
private EditableProperties getPropertiesOrNull(String path) { |
524 |
if (path.equals(PROJECT_XML_PATH) || path.equals(PRIVATE_XML_PATH)) { |
525 |
throw new IllegalArgumentException("Attempt to load/store properties from a project XML file"); // NOI18N |
526 |
} |
527 |
if (properties.containsKey(path)) { |
528 |
// In cache. |
529 |
EditableProperties p = (EditableProperties)properties.get(path); |
530 |
if (p == null) { |
531 |
return null; |
532 |
} else { |
533 |
return p.cloneProperties(); |
534 |
} |
535 |
} |
536 |
// Not in cache. |
537 |
FileObject fo = dir.getFileObject(path); |
538 |
if (fo != null) { |
539 |
try { |
540 |
InputStream is = fo.getInputStream(); |
541 |
try { |
542 |
EditableProperties p = new EditableProperties(true); |
543 |
p.load(is); |
544 |
properties.put(path, p); |
545 |
return p.cloneProperties(); |
546 |
} finally { |
547 |
is.close(); |
548 |
} |
549 |
} catch (IOException e) { |
550 |
ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, e); |
551 |
} |
552 |
} |
553 |
// Broken or missing. |
554 |
properties.put(path, null); |
555 |
return null; |
556 |
} |
489 |
} |
557 |
|
490 |
|
558 |
/** |
491 |
/** |
Lines 569-580
Link Here
|
569 |
* @param props a set of properties to store, or null to delete any existing properties file there |
502 |
* @param props a set of properties to store, or null to delete any existing properties file there |
570 |
*/ |
503 |
*/ |
571 |
public void putProperties(String path, EditableProperties props) { |
504 |
public void putProperties(String path, EditableProperties props) { |
572 |
if (Utilities.compareObjects(props, getPropertiesOrNull(path))) { |
505 |
if (path.equals(AntProjectHelper.PROJECT_XML_PATH) || path.equals(AntProjectHelper.PRIVATE_XML_PATH)) { |
573 |
// No change. |
506 |
throw new IllegalArgumentException("Attempt to store properties from a project XML file"); // NOI18N |
574 |
return; |
507 |
} |
|
|
508 |
if (properties.putProperties(path, props)) { |
509 |
modifying(path); |
575 |
} |
510 |
} |
576 |
properties.put(path, props.cloneProperties()); |
511 |
} |
577 |
modifying(path); |
512 |
|
|
|
513 |
/** |
514 |
* Get a property provider that works with loadable project properties. |
515 |
* Its current values should match {@link #getProperties}, and calls to |
516 |
* {@link #putProperties} should cause it to fire changes. |
517 |
* @param path a relative URI in the project directory, e.g. |
518 |
* {@link #PROJECT_PROPERTIES_PATH} or {@link #PRIVATE_PROPERTIES_PATH} |
519 |
* @return a property provider implementation |
520 |
*/ |
521 |
public PropertyProvider getPropertyProvider(String path) { |
522 |
if (path.equals(AntProjectHelper.PROJECT_XML_PATH) || path.equals(AntProjectHelper.PRIVATE_XML_PATH)) { |
523 |
throw new IllegalArgumentException("Attempt to store properties from a project XML file"); // NOI18N |
524 |
} |
525 |
return properties.getPropertyProvider(path); |
578 |
} |
526 |
} |
579 |
|
527 |
|
580 |
/** |
528 |
/** |
Lines 717-722
Link Here
|
717 |
return new ExtensibleMetadataProviderImpl(this); |
665 |
return new ExtensibleMetadataProviderImpl(this); |
718 |
} |
666 |
} |
719 |
|
667 |
|
|
|
668 |
/** @deprecated Use the variant that accepts a property evaluator instead. */ |
669 |
public FileBuiltQueryImplementation createGlobFileBuiltQuery(String[] from, String[] to) throws IllegalArgumentException { |
670 |
return createGlobFileBuiltQuery(getStandardPropertyEvaluator(), from, to); |
671 |
} |
672 |
|
720 |
/** |
673 |
/** |
721 |
* Create an implementation of {@link FileBuiltQuery} that works with files |
674 |
* Create an implementation of {@link FileBuiltQuery} that works with files |
722 |
* within the project based on simple glob pattern mappings. |
675 |
* within the project based on simple glob pattern mappings. |
Lines 728-734
Link Here
|
728 |
* glob pattern - this must include exactly one asterisk (<code>*</code>) |
681 |
* glob pattern - this must include exactly one asterisk (<code>*</code>) |
729 |
* representing a variable portion of a source file path (always slash-separated |
682 |
* representing a variable portion of a source file path (always slash-separated |
730 |
* and relative to the project directory) and may include some Ant property |
683 |
* and relative to the project directory) and may include some Ant property |
731 |
* references which will be resolved as per {@link AntProjectHelper#evaluateString}. |
684 |
* references which will be resolved as per the property evaluator. |
732 |
* A file is considered out of date if there is no file represented by the |
685 |
* A file is considered out of date if there is no file represented by the |
733 |
* matching target pattern (which has the same format), or the target file is older |
686 |
* matching target pattern (which has the same format), or the target file is older |
734 |
* than the source file, or the source file is modified as per |
687 |
* than the source file, or the source file is modified as per |
Lines 753-758
Link Here
|
753 |
* <li><samp>${test.build.classes.dir}/*.class</samp> |
706 |
* <li><samp>${test.build.classes.dir}/*.class</samp> |
754 |
* </ol> |
707 |
* </ol> |
755 |
* </div> |
708 |
* </div> |
|
|
709 |
* @param a property evaluator to interpret the patterns with |
756 |
* @param from a list of glob patterns for source files |
710 |
* @param from a list of glob patterns for source files |
757 |
* @param to a matching list of glob patterns for built files |
711 |
* @param to a matching list of glob patterns for built files |
758 |
* @return a query implementation |
712 |
* @return a query implementation |
Lines 760-767
Link Here
|
760 |
* have zero or multiple asterisks, |
714 |
* have zero or multiple asterisks, |
761 |
* or the arrays are not of equal lengths |
715 |
* or the arrays are not of equal lengths |
762 |
*/ |
716 |
*/ |
763 |
public FileBuiltQueryImplementation createGlobFileBuiltQuery(String[] from, String[] to) throws IllegalArgumentException { |
717 |
public FileBuiltQueryImplementation createGlobFileBuiltQuery(PropertyEvaluator eval, String[] from, String[] to) throws IllegalArgumentException { |
764 |
return new GlobFileBuiltQuery(this, from, to); |
718 |
return new GlobFileBuiltQuery(this, eval, from, to); |
|
|
719 |
} |
720 |
|
721 |
/** @deprecated Use the variant that accepts a PropertyEvaluator instead. */ |
722 |
public AntArtifact createSimpleAntArtifact(String type, String locationProperty, String targetName, String cleanTargetName) { |
723 |
return createSimpleAntArtifact(type, locationProperty, getStandardPropertyEvaluator(), targetName, cleanTargetName); |
765 |
} |
724 |
} |
766 |
|
725 |
|
767 |
/** |
726 |
/** |
Lines 770-783
Link Here
|
770 |
* @param type the type of artifact, e.g. {@link AntArtifact#TYPE_JAR} |
729 |
* @param type the type of artifact, e.g. {@link AntArtifact#TYPE_JAR} |
771 |
* @param locationProperty an Ant property name giving the project-relative |
730 |
* @param locationProperty an Ant property name giving the project-relative |
772 |
* location of the artifact, e.g. <samp>dist.jar</samp> |
731 |
* location of the artifact, e.g. <samp>dist.jar</samp> |
|
|
732 |
* @param eval a way to evaluate the location property (e.g. {@link #getStandardPropertyEvaluator}) |
773 |
* @param targetName the name of an Ant target which will build the artifact, |
733 |
* @param targetName the name of an Ant target which will build the artifact, |
774 |
* e.g. <samp>jar</samp> |
734 |
* e.g. <samp>jar</samp> |
775 |
* @param cleanTargetName the name of an Ant target which will delete the artifact |
735 |
* @param cleanTargetName the name of an Ant target which will delete the artifact |
776 |
* (and maybe other build products), e.g. <samp>clean</samp> |
736 |
* (and maybe other build products), e.g. <samp>clean</samp> |
777 |
* @return an artifact |
737 |
* @return an artifact |
778 |
*/ |
738 |
*/ |
779 |
public AntArtifact createSimpleAntArtifact(String type, String locationProperty, String targetName, String cleanTargetName) { |
739 |
public AntArtifact createSimpleAntArtifact(String type, String locationProperty, PropertyEvaluator eval, String targetName, String cleanTargetName) { |
780 |
return new SimpleAntArtifact(this, type, locationProperty, targetName, cleanTargetName); |
740 |
return new SimpleAntArtifact(this, type, locationProperty, eval, targetName, cleanTargetName); |
|
|
741 |
} |
742 |
|
743 |
/** @deprecated Use the variant that takes a property evaluator instead. */ |
744 |
public SharabilityQueryImplementation createSharabilityQuery(String[] sourceRoots, String[] buildDirectories) { |
745 |
return createSharabilityQuery(getStandardPropertyEvaluator(), sourceRoots, buildDirectories); |
781 |
} |
746 |
} |
782 |
|
747 |
|
783 |
/** |
748 |
/** |
Lines 816-822
Link Here
|
816 |
* Typical usage would be: |
781 |
* Typical usage would be: |
817 |
* </p> |
782 |
* </p> |
818 |
* <pre> |
783 |
* <pre> |
819 |
* helper.createSharabilityQuery(new String[] {"${src.dir}", "${test.src.dir}"}, |
784 |
* helper.createSharabilityQuery(helper.getStandardPropertyEvaluator(), |
|
|
785 |
* new String[] {"${src.dir}", "${test.src.dir}"}, |
820 |
* new String[] {"${build.dir}", "${dist.dir}"}) |
786 |
* new String[] {"${build.dir}", "${dist.dir}"}) |
821 |
* </pre> |
787 |
* </pre> |
822 |
* <p> |
788 |
* <p> |
Lines 837-855
Link Here
|
837 |
* this implementation in your project lookup and may return <code>UNKNOWN</code>. |
803 |
* this implementation in your project lookup and may return <code>UNKNOWN</code>. |
838 |
* </p> |
804 |
* </p> |
839 |
* </div> |
805 |
* </div> |
|
|
806 |
* @param eval a property evaluator to interpret paths with |
840 |
* @param sourceRoots a list of additional paths to treat as sharable |
807 |
* @param sourceRoots a list of additional paths to treat as sharable |
841 |
* @param buildDirectories a list of paths to treat as not sharable |
808 |
* @param buildDirectories a list of paths to treat as not sharable |
842 |
* @return a sharability query implementation suitable for the project lookup |
809 |
* @return a sharability query implementation suitable for the project lookup |
843 |
* @see Project#getLookup |
810 |
* @see Project#getLookup |
844 |
*/ |
811 |
*/ |
845 |
public SharabilityQueryImplementation createSharabilityQuery(String[] sourceRoots, String[] buildDirectories) { |
812 |
public SharabilityQueryImplementation createSharabilityQuery(PropertyEvaluator eval, String[] sourceRoots, String[] buildDirectories) { |
846 |
String[] includes = new String[sourceRoots.length + 1]; |
813 |
String[] includes = new String[sourceRoots.length + 1]; |
847 |
System.arraycopy(sourceRoots, 0, includes, 0, sourceRoots.length); |
814 |
System.arraycopy(sourceRoots, 0, includes, 0, sourceRoots.length); |
848 |
includes[sourceRoots.length] = ""; // NOI18N |
815 |
includes[sourceRoots.length] = ""; // NOI18N |
849 |
String[] excludes = new String[buildDirectories.length + 1]; |
816 |
String[] excludes = new String[buildDirectories.length + 1]; |
850 |
System.arraycopy(buildDirectories, 0, excludes, 0, buildDirectories.length); |
817 |
System.arraycopy(buildDirectories, 0, excludes, 0, buildDirectories.length); |
851 |
excludes[buildDirectories.length] = "nbproject/private"; // NOI18N |
818 |
excludes[buildDirectories.length] = "nbproject/private"; // NOI18N |
852 |
return new SharabilityQueryImpl(this, includes, excludes); |
819 |
return new SharabilityQueryImpl(this, eval, includes, excludes); |
853 |
} |
820 |
} |
854 |
|
821 |
|
855 |
/** |
822 |
/** |
Lines 870-879
Link Here
|
870 |
* @see #PRIVATE_PROPERTIES_PATH |
837 |
* @see #PRIVATE_PROPERTIES_PATH |
871 |
* @see PropertyUtils#getGlobalProperties |
838 |
* @see PropertyUtils#getGlobalProperties |
872 |
* @see #PROJECT_PROPERTIES_PATH |
839 |
* @see #PROJECT_PROPERTIES_PATH |
|
|
840 |
* @deprecated Please use {@link #getStandardPropertyEvaluator} instead. |
873 |
*/ |
841 |
*/ |
874 |
public String evaluate(String prop) { |
842 |
public String evaluate(String prop) { |
875 |
// XXX could be cached |
843 |
return getStandardPropertyEvaluator().getProperty(prop); |
876 |
return PropertyUtils.evaluate(prop, makeEvalPredefs(), makeEvalDefs()); |
|
|
877 |
} |
844 |
} |
878 |
|
845 |
|
879 |
/** |
846 |
/** |
Lines 885-894
Link Here
|
885 |
* @see #PRIVATE_PROPERTIES_PATH |
852 |
* @see #PRIVATE_PROPERTIES_PATH |
886 |
* @see PropertyUtils#getGlobalProperties |
853 |
* @see PropertyUtils#getGlobalProperties |
887 |
* @see #PROJECT_PROPERTIES_PATH |
854 |
* @see #PROJECT_PROPERTIES_PATH |
|
|
855 |
* @deprecated Please use {@link #getStandardPropertyEvaluator} instead. |
888 |
*/ |
856 |
*/ |
889 |
public Map/*<String,String>*/ evaluateAll() { |
857 |
public Map/*<String,String>*/ evaluateAll() { |
890 |
// XXX could be cached |
858 |
return getStandardPropertyEvaluator().getProperties(); |
891 |
return PropertyUtils.evaluateAll(makeEvalPredefs(), makeEvalDefs()); |
|
|
892 |
} |
859 |
} |
893 |
|
860 |
|
894 |
/** |
861 |
/** |
Lines 901-955
Link Here
|
901 |
* @see #PRIVATE_PROPERTIES_PATH |
868 |
* @see #PRIVATE_PROPERTIES_PATH |
902 |
* @see PropertyUtils#getGlobalProperties |
869 |
* @see PropertyUtils#getGlobalProperties |
903 |
* @see #PROJECT_PROPERTIES_PATH |
870 |
* @see #PROJECT_PROPERTIES_PATH |
|
|
871 |
* @deprecated Please use {@link #getStandardPropertyEvaluator} instead. |
904 |
*/ |
872 |
*/ |
905 |
public String evaluateString(String text) { |
873 |
public String evaluateString(String text) { |
906 |
return PropertyUtils.evaluateString(text, makeEvalPredefs(), makeEvalDefs()); |
874 |
return getStandardPropertyEvaluator().evaluate(text); |
907 |
} |
875 |
} |
908 |
|
876 |
|
|
|
877 |
private PropertyProvider stockPropertyPreprovider = null; |
878 |
|
909 |
/** |
879 |
/** |
910 |
* Create stock predefs: ${basedir} and system properties. |
880 |
* Get a property provider which defines <code>basedir</code> according to |
|
|
881 |
* the project directory and also copies all system properties in the current VM. |
882 |
* @return a stock property provider for initial Ant-related definitions |
883 |
* @see PropertyUtils#sequentialPropertyEvaluator |
911 |
*/ |
884 |
*/ |
912 |
private Map/*<String,String>*/ makeEvalPredefs() { |
885 |
public PropertyProvider getStockPropertyPreprovider() { |
913 |
Map/*<String,String>*/ m = new HashMap(); |
886 |
if (stockPropertyPreprovider == null) { |
914 |
Properties p = System.getProperties(); |
887 |
Map/*<String,String>*/ m = new HashMap(); |
915 |
synchronized (p) { |
888 |
Properties p = System.getProperties(); |
916 |
m.putAll(p); |
889 |
synchronized (p) { |
|
|
890 |
m.putAll(p); |
891 |
} |
892 |
m.put("basedir", FileUtil.toFile(dir).getAbsolutePath()); // NOI18N |
893 |
stockPropertyPreprovider = PropertyUtils.fixedPropertyProvider(m); |
917 |
} |
894 |
} |
918 |
m.put("basedir", FileUtil.toFile(dir).getAbsolutePath()); // NOI18N |
895 |
return stockPropertyPreprovider; |
919 |
return m; |
|
|
920 |
} |
896 |
} |
921 |
|
897 |
|
|
|
898 |
private PropertyEvaluator standardPropertyEvaluator = null; |
899 |
|
922 |
/** |
900 |
/** |
923 |
* Create stock defs: private project props, global user build props, shared project props. |
901 |
* Get a property evaluator that can evaluate properties according to the default |
|
|
902 |
* file layout for Ant-based projects. |
903 |
* First, {@link #getStockPropertyPreprovider stock properties} are predefined. |
904 |
* Then {@link #PRIVATE_PROPERTIES_PATH} is loaded via {@link #getPropertyProvider}, |
905 |
* then global definitions from {@link PropertyUtils#globalPropertyProvider} |
906 |
* (though these may be overridden using the property <code>user.properties.file</code> |
907 |
* in <code>private.properties</code>), then {@link #PROJECT_PROPERTIES_PATH}. |
908 |
* @return a standard property evaluator |
924 |
*/ |
909 |
*/ |
925 |
private List/*<Map<String,String>>*/ makeEvalDefs() { |
910 |
public PropertyEvaluator getStandardPropertyEvaluator() { |
926 |
Map/*<String,String>*/ privprops = getProperties(PRIVATE_PROPERTIES_PATH); |
911 |
if (standardPropertyEvaluator == null) { |
927 |
// XXX not very efficient... |
912 |
PropertyEvaluator findUserPropertiesFile = PropertyUtils.sequentialPropertyEvaluator( |
928 |
String userPropsFile = PropertyUtils.evaluate("user.properties.file", makeEvalPredefs(), Collections.singletonList(privprops)); |
913 |
getStockPropertyPreprovider(), |
929 |
Map/*<String,String>*/ globprops; |
914 |
new PropertyProvider[] { |
930 |
if (userPropsFile != null) { |
915 |
getPropertyProvider(PRIVATE_PROPERTIES_PATH), |
931 |
globprops = new Properties(); |
916 |
} |
932 |
File f = resolveFile(userPropsFile); |
917 |
); |
933 |
if (f.isFile() && f.canRead()) { |
918 |
String userPropertiesFile = findUserPropertiesFile.getProperty("user.properties.file"); // NOI18N |
934 |
try { |
919 |
PropertyProvider globalProperties; |
935 |
InputStream is = new FileInputStream(f); |
920 |
if (userPropertiesFile != null) { |
|
|
921 |
// XXX listen to changes in this, maybe... |
922 |
// (both in findUserPropertiesFile and in this file on disk) |
923 |
Properties globprops = new Properties(); |
924 |
File f = resolveFile(userPropertiesFile); |
925 |
if (f.isFile() && f.canRead()) { |
936 |
try { |
926 |
try { |
937 |
((Properties)globprops).load(is); |
927 |
InputStream is = new FileInputStream(f); |
938 |
} finally { |
928 |
try { |
939 |
is.close(); |
929 |
globprops.load(is); |
|
|
930 |
} finally { |
931 |
is.close(); |
932 |
} |
933 |
} catch (IOException e) { |
934 |
ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, e); |
940 |
} |
935 |
} |
941 |
} catch (IOException e) { |
|
|
942 |
ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, e); |
943 |
} |
936 |
} |
|
|
937 |
globalProperties = PropertyUtils.fixedPropertyProvider(globprops); |
938 |
} else { |
939 |
globalProperties = PropertyUtils.globalPropertyProvider(); |
944 |
} |
940 |
} |
945 |
} else { |
941 |
standardPropertyEvaluator = PropertyUtils.sequentialPropertyEvaluator( |
946 |
globprops = PropertyUtils.getGlobalProperties(); |
942 |
getStockPropertyPreprovider(), |
|
|
943 |
new PropertyProvider[] { |
944 |
getPropertyProvider(PRIVATE_PROPERTIES_PATH), |
945 |
globalProperties, |
946 |
getPropertyProvider(PROJECT_PROPERTIES_PATH), |
947 |
} |
948 |
); |
947 |
} |
949 |
} |
948 |
return Arrays.asList(new Map/*<String,String>*/[] { |
950 |
return standardPropertyEvaluator; |
949 |
privprops, |
|
|
950 |
globprops, |
951 |
getProperties(PROJECT_PROPERTIES_PATH), |
952 |
}); |
953 |
} |
951 |
} |
954 |
|
952 |
|
955 |
/** |
953 |
/** |