This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 49550
Collapse All | Expand All

(-)apichanges.xml (-1 / +15 lines)
Lines 76-82 Link Here
76
76
77
    <changes>
77
    <changes>
78
78
79
        <!-- Start here... -->
79
        <change>
80
            <api name="general"/>
81
            <summary>Make ReferencesHelper.createForeignFileReference produce relative links based on properties</summary>
82
            <version major="1" minor="3"/>
83
            <date day="9" month="12" year="2004"/>
84
            <author login="dkonecny"/>
85
            <compatibility addition="yes"/>
86
            <description>
87
              ReferenceHelper should reuse external project folders as base
88
              directories for references it creates where appropriate. The
89
              new API allows to add/remove these base folders.
90
            </description>
91
            <class package="org.netbeans.spi.project.support.ant" name="ReferenceHelper"/>
92
            <issue number="49550"/>
93
        </change>
80
94
81
    </changes>
95
    </changes>
82
96
(-)manifest.mf (-1 / +1 lines)
Lines 1-5 Link Here
1
Manifest-Version: 1.0
1
Manifest-Version: 1.0
2
OpenIDE-Module: org.netbeans.modules.project.ant/0
2
OpenIDE-Module: org.netbeans.modules.project.ant/0
3
OpenIDE-Module-Specification-Version: 1.2
3
OpenIDE-Module-Specification-Version: 1.3
4
OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/project/ant/Bundle.properties
4
OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/project/ant/Bundle.properties
5
5
(-)src/org/netbeans/spi/project/support/ant/ReferenceHelper.java (-5 / +119 lines)
Lines 19-27 Link Here
19
import java.net.URISyntaxException;
19
import java.net.URISyntaxException;
20
import java.util.ArrayList;
20
import java.util.ArrayList;
21
import java.util.Arrays;
21
import java.util.Arrays;
22
import java.util.HashSet;
22
import java.util.Iterator;
23
import java.util.Iterator;
23
import java.util.List;
24
import java.util.List;
24
import java.util.Map;
25
import java.util.Map;
26
import java.util.Set;
25
import java.util.regex.Matcher;
27
import java.util.regex.Matcher;
26
import java.util.regex.Pattern;
28
import java.util.regex.Pattern;
27
import org.netbeans.api.project.Project;
29
import org.netbeans.api.project.Project;
Lines 84-89 Link Here
84
     */
86
     */
85
    static final String REFS_NS = "http://www.netbeans.org/ns/ant-project-references/1"; // NOI18N
87
    static final String REFS_NS = "http://www.netbeans.org/ns/ant-project-references/1"; // NOI18N
86
    
88
    
89
    /** Set of property names which values can be used as additional base
90
     * directories. */
91
    private Set/*<String>*/ extraBaseDirectories = new HashSet();
92
    
87
    private final AntProjectHelper h;
93
    private final AntProjectHelper h;
88
    final PropertyEvaluator eval;
94
    final PropertyEvaluator eval;
89
    private final AuxiliaryConfiguration aux;
95
    private final AuxiliaryConfiguration aux;
Lines 218-226 Link Here
218
                    assert forProjPath != null : "These dirs are not really collocated: " + myProjDir + " & " + forProjDir;
224
                    assert forProjPath != null : "These dirs are not really collocated: " + myProjDir + " & " + forProjDir;
219
                    propertiesFile = AntProjectHelper.PROJECT_PROPERTIES_PATH;
225
                    propertiesFile = AntProjectHelper.PROJECT_PROPERTIES_PATH;
220
                } else {
226
                } else {
221
                    // Use an absolute path.
227
                    forProjPath = relativizeFileToExtraBaseFolders(forProjDir);
222
                    forProjPath = forProjDir.getAbsolutePath();
228
                    if (forProjPath != null) {
223
                    propertiesFile = AntProjectHelper.PRIVATE_PROPERTIES_PATH;
229
                        propertiesFile = AntProjectHelper.PROJECT_PROPERTIES_PATH;
230
                    } else {
231
                        // Use an absolute path.
232
                        forProjPath = forProjDir.getAbsolutePath();
233
                        propertiesFile = AntProjectHelper.PRIVATE_PROPERTIES_PATH;
234
                    }
224
                }
235
                }
225
                EditableProperties props = h.getProperties(propertiesFile);
236
                EditableProperties props = h.getProperties(propertiesFile);
226
                String forProjPathProp = "project." + forProjName; // NOI18N
237
                String forProjPathProp = "project." + forProjName; // NOI18N
Lines 643-650 Link Here
643
                        path = PropertyUtils.relativizeFile(myProjDir, file);
654
                        path = PropertyUtils.relativizeFile(myProjDir, file);
644
                        assert path != null : "expected relative path from " + myProjDir + " to " + file;
655
                        assert path != null : "expected relative path from " + myProjDir + " to " + file;
645
                    } else {
656
                    } else {
646
                        propertiesFile = AntProjectHelper.PRIVATE_PROPERTIES_PATH;
657
                        path = relativizeFileToExtraBaseFolders(file);
647
                        path = file.getAbsolutePath();
658
                        if (path != null) {
659
                            propertiesFile = AntProjectHelper.PROJECT_PROPERTIES_PATH;
660
                        } else {
661
                            propertiesFile = AntProjectHelper.PRIVATE_PROPERTIES_PATH;
662
                            path = file.getAbsolutePath();
663
                        }
648
                    }
664
                    }
649
                    EditableProperties props = h.getProperties(propertiesFile);
665
                    EditableProperties props = h.getProperties(propertiesFile);
650
                    String fileID = file.getName();
666
                    String fileID = file.getName();
Lines 669-675 Link Here
669
            }
685
            }
670
        });
686
        });
671
    }
687
    }
688
    
689
    /**
690
     * Test whether file does not lie under an extra base folder and if it does
691
     * then return string in form of "${extra.base}/remaining/path"; or null.
692
     */
693
    private String relativizeFileToExtraBaseFolders(File f) {
694
        File base = FileUtil.toFile(h.getProjectDirectory());
695
        String fileToRelativize = f.getAbsolutePath();
696
        synchronized (extraBaseDirectories) {
697
            Iterator it = extraBaseDirectories.iterator();
698
            while (it.hasNext()) {
699
                String prop = (String)it.next();
700
                String path = eval.getProperty(prop);
701
                File extraBase = PropertyUtils.resolveFile(base, path);
702
                path = extraBase.getAbsolutePath();
703
                if (!path.endsWith(File.separator)) {
704
                    path += File.separator;
705
                }
706
                if (fileToRelativize.startsWith(path)) {
707
                    return "${"+prop+"}/"+fileToRelativize.substring(path.length()).replace('\\', '/'); // NOI18N
708
                }
709
            }
710
        }
711
        return null;
712
    }
672
713
714
    /**
715
     * Add extra folder which can be used as base directory (in addition to
716
     * project base folder) for creating references. Duplicate property names
717
     * are not allowed. Any newly created reference to a file lying under an
718
     * extra base directory will be based on that property and will be stored in
719
     * shared project proeprties.
720
     * @param propertyName property name which value is path to folder which
721
     * can be used as alternative project's base directory
722
     * @since 1.3
723
     */
724
    public void addExtraBaseDirectory(String propertyName) {
725
        assert propertyName != null && eval.getProperty(propertyName) != null;
726
        synchronized (extraBaseDirectories) {
727
            if (!extraBaseDirectories.add(propertyName)) {
728
                throw new IllegalArgumentException("Already extra base directory property: "+propertyName); // NOI18N
729
            }
730
        }
731
    }
732
    
733
    /**
734
     * Remove extra base directory. The base directory property had to be added
735
     * by {@link #addExtraBaseDirectory} method call. At the time when this
736
     * method is called the property must still exist and must be valid. This
737
     * method will replace all references of the extra base directory property
738
     * with its current value and if needed it may move such a property from
739
     * shared project properties into the private properties.
740
     * @param propertyName property name which was added by 
741
     * {@link #addExtraBaseDirectory} method.
742
     * @since 1.3
743
     */
744
    public void removeExtraBaseDirectory(String propertyName) {
745
        synchronized (extraBaseDirectories) {
746
            if (!extraBaseDirectories.remove(propertyName)) {
747
                throw new IllegalArgumentException("Non-existing extra base directory property: "+propertyName); // NOI18N
748
            }
749
            // substitute all references of removed extra base folder property with its value
750
            String tag = "${"+propertyName+"}"; // NOI18N
751
            // was extra base property defined in shared file or not:
752
            boolean shared = h.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH).containsKey(propertyName);
753
            String value = eval.getProperty(propertyName);
754
            EditableProperties propProj = h.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH);
755
            EditableProperties propPriv = h.getProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH);
756
            boolean modifiedProj = false;
757
            boolean modifiedPriv = false;
758
            Iterator it = propProj.entrySet().iterator();
759
            while (it.hasNext()) {
760
                Map.Entry entry = (Map.Entry)it.next();
761
                String val = (String)entry.getValue();
762
                int index;
763
                if ((index = val.indexOf(tag)) != -1) {
764
                    val = val.substring(0, index) +value + val.substring(index+tag.length());
765
                    if (shared) {
766
                        // substitute extra base folder property with its value
767
                        entry.setValue(val);
768
                        modifiedProj = true;
769
                    } else {
770
                        // move property to private properties file
771
                        it.remove();
772
                        propPriv.put(entry.getKey(), val);
773
                        modifiedPriv = true;
774
                        modifiedProj = true;
775
                    }
776
                }
777
            }
778
            if (modifiedProj) {
779
                h.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, propProj);
780
            }
781
            if (modifiedPriv) {
782
                h.putProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH, propPriv);
783
            }
784
        }
785
    }
786
    
673
    /**
787
    /**
674
     * Find reference ID (e.g. something you can then pass to RawReference 
788
     * Find reference ID (e.g. something you can then pass to RawReference 
675
     * as foreignProjectName) for the given property base name, prefix and path.
789
     * as foreignProjectName) for the given property base name, prefix and path.
(-)test/unit/src/org/netbeans/spi/project/support/ant/ReferenceHelperTest.java (+41 lines)
Lines 702-705 Link Here
702
        assertNull("wrong target name, will not be found", art);
702
        assertNull("wrong target name, will not be found", art);
703
    }
703
    }
704
704
705
    public void testAddRemoveExtraBaseDirectory() throws Exception {
706
        // test foreign file reference for non-collocated jar under extra base folder
707
        FileObject nonCollocatedLib = scratch.getFileObject("separate").createFolder("jars").createData("mylib.jar");
708
        File f = FileUtil.toFile(nonCollocatedLib);
709
        EditableProperties props = h.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH);
710
        props.setProperty("externalSourceRoot", "../separate");
711
        h.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, props);
712
        r.addExtraBaseDirectory("externalSourceRoot");
713
        String ref = r.createForeignFileReference(f, "jar");
714
        assertEquals("foreign file reference created", "${file.reference.mylib.jar}", ref);
715
        String refval = h.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH).getProperty(ref.substring(2, ref.length()-1));
716
        assertEquals("reference is using extra base folder", "${externalSourceRoot}/jars/mylib.jar", refval);
717
        assertEquals("reference is correctly evaluated", f, h.resolveFile(h.getStandardPropertyEvaluator().evaluate(refval)));
718
        // test removal of extra base folder
719
        r.removeExtraBaseDirectory("externalSourceRoot");
720
        refval = h.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH).getProperty(ref.substring(2, ref.length()-1));
721
        assertEquals("reference does not contain extra base folder", "../separate/jars/mylib.jar", refval);
722
        assertEquals("reference is correctly evaluated", f, h.resolveFile(refval));
723
724
        // the same test as above but with extra base folder defined in PRIVATE props
725
        nonCollocatedLib = scratch.createFolder("separate2").createFolder("jars").createData("mylib2.jar");
726
        f = FileUtil.toFile(nonCollocatedLib);
727
        props = h.getProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH);
728
        String absolutePath = FileUtil.toFile(scratch.getFileObject("separate2")).getAbsolutePath();
729
        props.setProperty("externalSourceRootAbsolute", absolutePath);
730
        h.putProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH, props);
731
        r.addExtraBaseDirectory("externalSourceRootAbsolute");
732
        ref = r.createForeignFileReference(f, "jar");
733
        assertEquals("foreign file reference created", "${file.reference.mylib2.jar}", ref);
734
        refval = h.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH).getProperty(ref.substring(2, ref.length()-1));
735
        assertEquals("reference is using extra base folder", "${externalSourceRootAbsolute}/jars/mylib2.jar", refval);
736
        assertEquals("reference is correctly evaluated", f, h.resolveFile(h.getStandardPropertyEvaluator().evaluate(refval)));
737
        r.removeExtraBaseDirectory("externalSourceRootAbsolute");
738
        refval = h.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH).getProperty(ref.substring(2, ref.length()-1));
739
        assertNull("reference was removed from PROJECT_PROPERTIES_PATH", refval);
740
        refval = h.getProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH).getProperty(ref.substring(2, ref.length()-1));
741
        assertNotNull("reference was moved to PRIVATE_PROPERTIES_PATH", refval);
742
        assertEquals("reference does not contain extra base folder", absolutePath+"/jars/mylib2.jar", refval);
743
        assertEquals("reference is correctly evaluated", f, h.resolveFile(h.getStandardPropertyEvaluator().evaluate(refval)));
744
    }
745
    
705
}
746
}

Return to bug 49550