1 19 20 package org.netbeans.modules.java.j2seproject.classpath; 21 22 import java.beans.PropertyChangeListener ; 23 import java.beans.PropertyChangeEvent ; 24 import java.io.File ; 25 import java.net.URL ; 26 import java.util.Arrays ; 27 import java.util.Collections ; 28 import java.util.HashSet ; 29 import java.util.List ; 30 import java.util.Set ; 31 import org.netbeans.modules.java.j2seproject.J2SEProject; 32 import org.netbeans.modules.java.j2seproject.J2SEProjectUtil; 33 import org.netbeans.spi.project.support.ant.EditableProperties; 34 import org.openide.filesystems.FileObject; 35 import org.openide.filesystems.FileUtil; 36 import org.openide.modules.SpecificationVersion; 37 import org.netbeans.junit.NbTestCase; 38 import org.netbeans.api.project.ProjectManager; 39 import org.netbeans.api.project.TestUtil; 40 import org.netbeans.api.java.classpath.ClassPath; 41 import org.netbeans.api.project.FileOwnerQuery; 42 import org.netbeans.api.project.Project; 43 import org.netbeans.spi.project.support.ant.AntProjectHelper; 44 import org.netbeans.modules.java.j2seproject.J2SEProjectGenerator; 45 import org.netbeans.modules.java.j2seproject.SourceRootsTest; 46 import org.netbeans.modules.java.j2seproject.ui.customizer.J2SEProjectProperties; 47 import org.openide.util.Mutex; 48 49 public class SourcePathImplementationTest extends NbTestCase { 50 51 public SourcePathImplementationTest(String testName) { 52 super(testName); 53 } 54 55 private FileObject scratch; 56 private FileObject projdir; 57 private FileObject sources; 58 private ProjectManager pm; 59 private AntProjectHelper helper; 60 private J2SEProject pp; 61 62 protected void setUp() throws Exception { 63 super.setUp(); 64 scratch = TestUtil.makeScratchDir(this); 65 projdir = scratch.createFolder("proj"); 66 J2SEProjectGenerator.setDefaultSourceLevel(new SpecificationVersion ("1.4")); helper = J2SEProjectGenerator.createProject(FileUtil.toFile(projdir),"proj",null,null); J2SEProjectGenerator.setDefaultSourceLevel(null); 69 pm = ProjectManager.getDefault(); 70 pp = pm.findProject(projdir).getLookup().lookup(J2SEProject.class); 71 sources = projdir.getFileObject("src"); 72 } 73 74 protected void tearDown() throws Exception { 75 scratch = null; 76 projdir = null; 77 pm = null; 78 super.tearDown(); 79 } 80 81 public void testSourcePathImplementation () throws Exception { 82 ClassPathProviderImpl cpProvider = pp.getLookup().lookup(ClassPathProviderImpl.class); 83 ClassPath[] cps = cpProvider.getProjectClassPaths(ClassPath.SOURCE); 84 ClassPath cp = cps[0]; 85 FileObject[] roots = cp.getRoots(); 86 assertNotNull ("Roots can not be null",roots); 87 assertEquals("There must be one source root", 1, roots.length); 88 assertEquals("There must be src root",roots[0],sources); 89 TestListener tl = new TestListener(); 90 cp.addPropertyChangeListener (tl); 91 FileObject newRoot = SourceRootsTest.addSourceRoot(helper, projdir,"src.other.dir","other"); 92 assertTrue("Classpath must fire PROP_ENTRIES and PROP_ROOTS", tl.getEvents().containsAll(Arrays.asList(ClassPath.PROP_ENTRIES, ClassPath.PROP_ROOTS))); 93 roots = cp.getRoots(); 94 assertNotNull ("Roots can not be null",roots); 95 assertEquals("There must be two source roots", 2, roots.length); 96 assertEquals("There must be src root",roots[0],sources); 97 assertEquals("There must be other root",roots[1],newRoot); 98 cp.removePropertyChangeListener(tl); 99 } 100 101 public void testWSClientSupport () throws Exception { 102 ClassPathProviderImpl cpProvider = pp.getLookup().lookup(ClassPathProviderImpl.class); 103 ClassPath[] cps = cpProvider.getProjectClassPaths(ClassPath.SOURCE); 104 ClassPath cp = cps[0]; 105 List <ClassPath.Entry> entries = cp.entries(); 106 assertNotNull ("Entries can not be null", entries); 107 assertEquals ("There must be 3 src entries",3, entries.size()); 108 assertEquals("There must be src root", entries.get(0).getRoot(), sources); 109 String buildDir = (String ) J2SEProjectUtil.getEvaluatedProperty(pp,"${build.dir}"); 110 assertNotNull ("There is no build.dir property", buildDir); 111 File f = new File (new File (pp.getAntProjectHelper().resolveFile(buildDir),"generated"),"wsclient"); 112 URL url = f.toURI().toURL(); 113 if (!f.exists()) { 114 url = new URL (url.toExternalForm() + "/"); 115 } 116 assertEquals("There must be WSClient entry", entries.get(1).getURL(), url); 117 118 f = new File (pp.getAntProjectHelper().resolveFile(buildDir),"generated/wsimport/client"); 119 url = f.toURI().toURL(); 120 if (!f.exists()) { 121 url = new URL (url.toExternalForm() + "/"); 122 } 123 assertEquals("There must be WSImportClient entry", entries.get(2).getURL(), url); 124 125 ProjectManager.mutex().writeAccess(new Mutex.ExceptionAction<Void >() { 126 public Void run() throws Exception { 127 EditableProperties ep = pp.getAntProjectHelper().getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); 128 ep.put("build.dir","build2"); pp.getAntProjectHelper().putProperties (AntProjectHelper.PROJECT_PROPERTIES_PATH,ep); 130 ProjectManager.getDefault().saveProject(pp); 131 return null; 132 } 133 }); 134 entries = cp.entries(); 135 assertNotNull ("Entries can not be null", entries); 136 assertEquals ("There must be 3 src entries",3, entries.size()); 137 assertEquals("There must be src root", entries.get(0).getRoot(), sources); 138 buildDir = (String ) J2SEProjectUtil.getEvaluatedProperty(pp,"${build.dir}"); 139 assertNotNull ("There is no build.dir property", buildDir); 140 f = new File (new File (pp.getAntProjectHelper().resolveFile(buildDir),"generated"),"wsclient"); 141 url = f.toURI().toURL(); 142 if (!f.exists()) { 143 url = new URL (url.toExternalForm() + "/"); 144 } 145 assertEquals("There must be WSClient entry", entries.get(1).getURL(), url); 146 147 f = new File (pp.getAntProjectHelper().resolveFile(buildDir),"generated/wsimport/client"); 148 url = f.toURI().toURL(); 149 if (!f.exists()) { 150 url = new URL (url.toExternalForm() + "/"); 151 } 152 assertEquals("There must be WSImportClient entry", entries.get(2).getURL(), url); 153 } 154 155 public void testIncludesExcludes() throws Exception { 156 ClassPath cp = pp.getLookup().lookup(ClassPathProviderImpl.class).getProjectSourcesClassPath(ClassPath.SOURCE); 157 assertEquals(Collections.singletonList(sources), Arrays.asList(cp.getRoots())); 158 FileObject objectJava = FileUtil.createData(sources, "java/lang/Object.java"); 159 FileObject jcJava = FileUtil.createData(sources, "javax/swing/JComponent.java"); 160 FileObject doc = FileUtil.createData(sources, "javax/swing/doc-files/index.html"); 161 assertTrue(cp.contains(objectJava)); 162 assertTrue(cp.contains(objectJava.getParent())); 163 assertTrue(cp.contains(jcJava)); 164 assertTrue(cp.contains(jcJava.getParent())); 165 assertTrue(cp.contains(doc)); 166 assertTrue(cp.contains(doc.getParent())); 167 TestListener tl = new TestListener(); 168 cp.addPropertyChangeListener(tl); 169 EditableProperties ep = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); 170 ep.setProperty(J2SEProjectProperties.INCLUDES, "javax/swing/"); 171 ep.setProperty(J2SEProjectProperties.EXCLUDES, "**/doc-files/"); 172 helper.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, ep); 173 pm.saveProject(pp); 174 assertEquals(Collections.singleton(ClassPath.PROP_INCLUDES), tl.getEvents()); 175 assertFalse(cp.contains(objectJava)); 176 assertFalse(cp.contains(objectJava.getParent())); 177 assertTrue(cp.contains(jcJava)); 178 assertTrue(cp.contains(jcJava.getParent())); 179 assertTrue(cp.contains(jcJava.getParent().getParent())); 180 assertFalse(cp.contains(doc)); 181 assertFalse(cp.contains(doc.getParent())); 182 } 183 184 public void testIncludesFiredJustOnce() throws Exception { 185 File src1 = new File (getWorkDir(), "src1"); 186 src1.mkdir(); 187 File src2 = new File (getWorkDir(), "src2"); 188 src2.mkdir(); 189 AntProjectHelper h = J2SEProjectGenerator.createProject(new File (getWorkDir(), "prj"), "test", new File [] {src1, src2}, new File [0], null); 190 Project p = ProjectManager.getDefault().findProject(h.getProjectDirectory()); 191 FileOwnerQuery.markExternalOwner(src1.toURI(), p, FileOwnerQuery.EXTERNAL_ALGORITHM_TRANSIENT); 192 ClassPath cp = ClassPath.getClassPath(FileUtil.toFileObject(src1), ClassPath.SOURCE); 193 assertNotNull(cp); 194 assertEquals(2, cp.getRoots().length); 195 ClassPath.Entry cpe2 = cp.entries().get(1); 196 assertEquals(src2.toURI().toURL(), cpe2.getURL()); 197 assertTrue(cpe2.includes("stuff/")); 198 assertTrue(cpe2.includes("whatever/")); 199 class L implements PropertyChangeListener { 200 int cnt; 201 public void propertyChange(PropertyChangeEvent e) { 202 if (ClassPath.PROP_INCLUDES.equals(e.getPropertyName())) { 203 cnt++; 204 } 205 } 206 } 207 L l = new L (); 208 cp.addPropertyChangeListener(l); 209 EditableProperties ep = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); 210 ep.setProperty(J2SEProjectProperties.INCLUDES, "whatever/"); 211 h.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, ep); 212 ProjectManager.getDefault().saveProject(p); 213 assertEquals(1, l.cnt); 214 assertFalse(cpe2.includes("stuff/")); 215 assertTrue(cpe2.includes("whatever/")); 216 ep.setProperty(J2SEProjectProperties.INCLUDES, "whateverelse/"); 217 h.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, ep); 218 ProjectManager.getDefault().saveProject(p); 219 assertEquals(2, l.cnt); 220 assertFalse(cpe2.includes("stuff/")); 221 assertFalse(cpe2.includes("whatever/")); 222 ep.remove(J2SEProjectProperties.INCLUDES); 223 h.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, ep); 224 ProjectManager.getDefault().saveProject(p); 225 assertEquals(3, l.cnt); 226 assertTrue(cpe2.includes("stuff/")); 227 assertTrue(cpe2.includes("whatever/")); 228 } 229 230 private static class TestListener implements PropertyChangeListener { 231 private Set <String > events = new HashSet <String >(); 232 233 public void propertyChange(PropertyChangeEvent evt) { 234 String propName = evt.getPropertyName(); 235 if (propName != null) { 236 this.events.add (propName); 237 } 238 } 239 240 public Set <String > getEvents () { 241 return Collections.unmodifiableSet(this.events); 242 } 243 } 244 } 245 | Popular Tags |