1 19 20 package org.netbeans.bluej; 21 22 import java.beans.PropertyChangeEvent ; 23 import java.beans.PropertyChangeListener ; 24 import java.beans.PropertyChangeSupport ; 25 import java.io.File ; 26 import java.io.IOException ; 27 import javax.swing.Icon ; 28 import javax.swing.ImageIcon ; 29 import org.netbeans.api.java.classpath.ClassPath; 30 import org.netbeans.api.java.classpath.GlobalPathRegistry; 31 import org.netbeans.api.java.project.JavaProjectConstants; 32 import org.netbeans.api.project.Project; 33 import org.netbeans.api.project.ProjectInformation; 34 import org.netbeans.api.project.ProjectManager; 35 import org.netbeans.api.project.ant.AntArtifact; 36 import org.netbeans.bluej.api.BluejOpenCloseCallback; 37 import org.netbeans.bluej.classpath.ClassPathProviderImpl; 38 import org.netbeans.bluej.options.BlueJSettings; 39 import org.netbeans.spi.project.AuxiliaryConfiguration; 40 import org.netbeans.spi.project.SubprojectProvider; 41 import org.netbeans.spi.project.ant.AntArtifactProvider; 42 import org.netbeans.spi.project.support.ant.AntProjectEvent; 43 import org.netbeans.spi.project.support.ant.AntProjectHelper; 44 import org.netbeans.spi.project.support.ant.AntProjectListener; 45 import org.netbeans.spi.project.support.ant.EditableProperties; 46 import org.netbeans.spi.project.support.ant.GeneratedFilesHelper; 47 import org.netbeans.spi.project.support.ant.ProjectXmlSavedHook; 48 import org.netbeans.spi.project.support.ant.PropertyEvaluator; 49 import org.netbeans.spi.project.support.ant.PropertyUtils; 50 import org.netbeans.spi.project.support.ant.ReferenceHelper; 51 import org.netbeans.spi.project.ui.PrivilegedTemplates; 52 import org.netbeans.spi.project.ui.ProjectOpenedHook; 53 import org.netbeans.spi.project.ui.RecommendedTemplates; 54 import org.openide.ErrorManager; 55 import org.openide.filesystems.FileObject; 56 import org.openide.util.Lookup; 57 import org.openide.util.Mutex; 58 import org.openide.util.Utilities; 59 import org.openide.util.lookup.Lookups; 60 import org.w3c.dom.Element ; 61 import org.w3c.dom.Text ; 62 import org.w3c.dom.Node ; 63 import org.w3c.dom.NodeList ; 64 65 69 public final class BluejProject implements Project, AntProjectListener { 70 71 private static final Icon BLUEJ_PROJECT_ICON = new ImageIcon (Utilities.loadImage("org/netbeans/bluej/resources/bluejproject.png")); 73 private static final String PROP_BLUEJ_HOME = "bluej.userlib"; 75 public static final String J2SE_PROJECT_NAME = "j2se.project.name"; public static final String JAVA_PLATFORM = "platform.active"; 79 public static final String DIST_DIR = "dist.dir"; public static final String DIST_JAR = "dist.jar"; public static final String JAVAC_CLASSPATH = "javac.classpath"; public static final String RUN_CLASSPATH = "run.classpath"; public static final String RUN_JVM_ARGS = "run.jvmargs"; public static final String RUN_WORK_DIR = "work.dir"; public static final String DEBUG_CLASSPATH = "debug.classpath"; public static final String JAR_COMPRESS = "jar.compress"; public static final String MAIN_CLASS = "main.class"; public static final String JAVAC_SOURCE = "javac.source"; public static final String JAVAC_TARGET = "javac.target"; public static final String JAVAC_TEST_CLASSPATH = "javac.test.classpath"; public static final String JAVAC_DEBUG = "javac.debug"; public static final String JAVAC_DEPRECATION = "javac.deprecation"; public static final String JAVAC_COMPILER_ARG = "javac.compilerargs"; public static final String RUN_TEST_CLASSPATH = "run.test.classpath"; public static final String BUILD_DIR = "build.dir"; public static final String BUILD_CLASSES_DIR = "build.classes.dir"; public static final String BUILD_TEST_CLASSES_DIR = "build.test.classes.dir"; public static final String BUILD_TEST_RESULTS_DIR = "build.test.results.dir"; public static final String BUILD_CLASSES_EXCLUDES = "build.classes.excludes"; public static final String DIST_JAVADOC_DIR = "dist.javadoc.dir"; public static final String NO_DEPENDENCIES="no.dependencies"; public static final String DEBUG_TEST_CLASSPATH = "debug.test.classpath"; 105 106 public static final String JAVADOC_PRIVATE="javadoc.private"; public static final String JAVADOC_NO_TREE="javadoc.notree"; public static final String JAVADOC_USE="javadoc.use"; public static final String JAVADOC_NO_NAVBAR="javadoc.nonavbar"; public static final String JAVADOC_NO_INDEX="javadoc.noindex"; public static final String JAVADOC_SPLIT_INDEX="javadoc.splitindex"; public static final String JAVADOC_AUTHOR="javadoc.author"; public static final String JAVADOC_VERSION="javadoc.version"; public static final String JAVADOC_WINDOW_TITLE="javadoc.windowtitle"; public static final String JAVADOC_ENCODING="javadoc.encoding"; public static final String JAVADOC_ADDITIONALPARAM="javadoc.additionalparam"; 118 public static final String APPLICATION_ARGS = "application.args"; public static final String JAVADOC_PREVIEW="javadoc.preview"; 122 123 private final AuxiliaryConfiguration aux; 124 private final AntProjectHelper helper; 125 private final PropertyEvaluator eval; 126 private final ReferenceHelper refHelper; 127 private final GeneratedFilesHelper genFilesHelper; 128 private final Lookup lookup; 129 private final UpdateHelper updateHelper; 130 134 135 BluejProject(AntProjectHelper helper) throws IOException { 136 this.helper = helper; 137 eval = createEvaluator(); 138 aux = helper.createAuxiliaryConfiguration(); 139 refHelper = new ReferenceHelper(helper, aux, eval); 140 genFilesHelper = new GeneratedFilesHelper(helper); 141 this.updateHelper = new UpdateHelper (this, this.helper, this.aux, this.genFilesHelper, 142 UpdateHelper.createDefaultNotifier()); 143 144 lookup = createLookup(aux); 145 helper.addAntProjectListener(this); 146 } 147 148 149 153 public FileObject getProjectDirectory() { 154 return helper.getProjectDirectory(); 155 } 156 157 public String toString() { 158 return "BluejProject[" + getProjectDirectory() + "]"; } 160 161 private PropertyEvaluator createEvaluator() { 162 return helper.getStandardPropertyEvaluator(); 165 } 166 167 PropertyEvaluator evaluator() { 168 return eval; 169 } 170 171 ReferenceHelper getReferenceHelper () { 172 return this.refHelper; 173 } 174 175 public UpdateHelper getUpdateHelper() { 176 return this.updateHelper; 177 } 178 179 public Lookup getLookup() { 180 return lookup; 181 } 182 183 public AntProjectHelper getAntProjectHelper() { 184 return helper; 185 } 186 187 private Lookup createLookup(AuxiliaryConfiguration aux) { 188 SubprojectProvider spp = refHelper.createSubprojectProvider(); 189 return Lookups.fixed(new Object [] { 190 new Info(), 191 aux, 192 helper.createCacheDirectoryProvider(), 193 spp, 194 new BluejActionProvider( this, getUpdateHelper()), 195 new BluejLogicalViewProvider(this), 196 new BJClassPathExtender(this), 197 new CustomizerProviderImpl(this, evaluator(), getUpdateHelper()), 198 new ClassPathProviderImpl(this), 201 new SFBQueryImpl(this, helper, evaluator()), 202 new AntArtifactProviderImpl(), 204 new ProjectXmlSavedHookImpl(), 205 new ProjectOpenedHookImpl(), 206 new BluejUnitTestForSourceQuery(this), 207 new BluejSources (this), 209 new BluejFileBuiltQuery(this.helper, evaluator()), new RecommendedTemplatesImpl(), 212 this }); 217 } 218 219 public void configurationXmlChanged(AntProjectEvent ev) { 220 if (ev.getPath().equals(AntProjectHelper.PROJECT_XML_PATH)) { 221 Info info = (Info)getLookup().lookup(ProjectInformation.class); 223 info.firePropertyChange(ProjectInformation.PROP_NAME); 224 info.firePropertyChange(ProjectInformation.PROP_DISPLAY_NAME); 225 } 226 } 227 228 public void propertiesChanged(AntProjectEvent ev) { 229 } 231 232 234 260 262 public void setName(final String name) { 263 ProjectManager.mutex().writeAccess(new Mutex.Action() { 264 public Object run() { 265 Element data = helper.getPrimaryConfigurationData(true); 266 NodeList nl = data.getElementsByTagNameNS(BluejProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); Element nameEl; 269 if (nl.getLength() == 1) { 270 nameEl = (Element ) nl.item(0); 271 NodeList deadKids = nameEl.getChildNodes(); 272 while (deadKids.getLength() > 0) { 273 nameEl.removeChild(deadKids.item(0)); 274 } 275 } else { 276 nameEl = data.getOwnerDocument().createElementNS(BluejProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); 277 data.insertBefore(nameEl, data.getChildNodes().item(0)); 278 } 279 nameEl.appendChild(data.getOwnerDocument().createTextNode(name)); 280 helper.putPrimaryConfigurationData(data, true); 281 return null; 282 } 283 }); 284 } 285 286 287 288 289 291 private final class Info implements ProjectInformation { 292 293 private final PropertyChangeSupport pcs = new PropertyChangeSupport (this); 294 295 Info() {} 296 297 void firePropertyChange(String prop) { 298 pcs.firePropertyChange(prop, null, null); 299 } 300 301 public String getName() { 302 return PropertyUtils.getUsablePropertyName(getProjectDirectory().getName()); 303 } 304 305 public String getDisplayName() { 306 return (String ) ProjectManager.mutex().readAccess(new Mutex.Action() { 307 public Object run() { 308 Element data = updateHelper.getPrimaryConfigurationData(true); 309 NodeList nl = data.getElementsByTagNameNS(BluejProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); if (nl.getLength() == 1) { 312 nl = nl.item(0).getChildNodes(); 313 if (nl.getLength() == 1 && nl.item(0).getNodeType() == Node.TEXT_NODE) { 314 return ((Text ) nl.item(0)).getNodeValue() + " " + getProjectDirectory().getName(); } 316 } 317 return getProjectDirectory().getName(); } 319 }); 320 } 321 322 public Icon getIcon() { 323 return BLUEJ_PROJECT_ICON; 324 } 325 326 public Project getProject() { 327 return BluejProject.this; 328 } 329 330 public void addPropertyChangeListener(PropertyChangeListener listener) { 331 pcs.addPropertyChangeListener(listener); 332 } 333 334 public void removePropertyChangeListener(PropertyChangeListener listener) { 335 pcs.removePropertyChangeListener(listener); 336 } 337 338 } 339 340 private static final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook { 341 342 ProjectXmlSavedHookImpl() {} 343 344 protected void projectXmlSaved() throws IOException { 345 } 359 360 } 361 362 public static File getUserLibPath(File bjHome) { 363 364 File userlib; 365 if (Utilities.getOperatingSystem() == Utilities.OS_MAC) { 366 userlib = new File (bjHome.getParentFile(), bjHome.getName() + ".app/Contents/Resources/Java/userlib"); 367 } else { 368 userlib = new File (new File (bjHome, "lib"), "userlib"); 369 } 370 return userlib; 371 } 372 373 private final class ProjectOpenedHookImpl extends ProjectOpenedHook implements PropertyChangeListener { 374 375 ProjectOpenedHookImpl() {} 376 377 protected void projectOpened() { 378 ProjectManager.mutex().writeAccess(new Mutex.Action() { 380 public Object run() { 381 EditableProperties ep = updateHelper.getProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH); 382 File buildProperties = new File (System.getProperty("netbeans.user"), "build.properties"); ep.setProperty("user.properties.file", buildProperties.getAbsolutePath()); File bjHome = BlueJSettings.getDefault().getHome(); 385 if (bjHome != null) { 386 387 ep.setProperty(PROP_BLUEJ_HOME, getUserLibPath(bjHome).getAbsolutePath()); 388 ep.setComment(PROP_BLUEJ_HOME, new String [] { 389 "## the bluej.userlib property is reset everytime the project is opened in netbeans according to the", 390 "## setting in the IDE that point to the location of the bluej installation's userlib directory.", 391 "## It is required to find and use the libraries located in BLUEJ_HOME/lib/userlib when building the project" 392 }, true); 393 } else { 394 ep.remove(PROP_BLUEJ_HOME); 395 } 396 ep.setProperty("bluej.config.libraries", BlueJSettings.getDefault().getUserLibrariesAsClassPath()); ep.setComment("bluej.config.libraries", new String [] { "## classpath entry that is composed from content of bluej.userlib.*.location properties in the user home's bluej.properties file..", 399 "## rebuilt on every opening of the project in netbeans" 400 }, true); 401 updateHelper.putProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH, ep); 402 try { 403 ProjectManager.getDefault().saveProject(BluejProject.this); 404 } catch (IOException e) { 405 ErrorManager.getDefault().notify(e); 406 } 407 return null; 408 } 409 }); 410 BlueJSettings.getDefault().addPropertyChangeListener(this); 411 412 429 ClassPathProviderImpl cpProvider = (ClassPathProviderImpl)lookup.lookup(ClassPathProviderImpl.class); 431 GlobalPathRegistry.getDefault().register(ClassPath.BOOT, cpProvider.getBootPath()); 432 GlobalPathRegistry.getDefault().register(ClassPath.SOURCE, cpProvider.getSourcePath()); 433 GlobalPathRegistry.getDefault().register(ClassPath.COMPILE, cpProvider.getCompileTimeClasspath()); 434 435 440 BluejOpenCloseCallback callback = (BluejOpenCloseCallback) Lookup.getDefault().lookup(BluejOpenCloseCallback.class); 446 if (callback != null) { 447 callback.projectOpened(BluejProject.this); 448 } 449 } 450 451 protected void projectClosed() { 452 BlueJSettings.getDefault().removePropertyChangeListener(this); 453 try { 455 ProjectManager.getDefault().saveProject(BluejProject.this); 456 } catch (IOException e) { 457 ErrorManager.getDefault().notify(e); 458 } 459 BluejOpenCloseCallback callback = (BluejOpenCloseCallback) Lookup.getDefault().lookup(BluejOpenCloseCallback.class); 460 if (callback != null) { 461 callback.projectClosed(BluejProject.this); 462 } 463 464 ClassPathProviderImpl cpProvider = (ClassPathProviderImpl)lookup.lookup(ClassPathProviderImpl.class); 466 GlobalPathRegistry.getDefault().unregister(ClassPath.BOOT, cpProvider.getBootPath()); 467 GlobalPathRegistry.getDefault().unregister(ClassPath.SOURCE, cpProvider.getSourcePath()); 468 GlobalPathRegistry.getDefault().unregister(ClassPath.COMPILE, cpProvider.getCompileTimeClasspath()); 469 } 474 475 public void propertyChange(PropertyChangeEvent evt) { 476 ProjectManager.mutex().writeAccess(new Mutex.Action() { 477 public Object run() { 478 EditableProperties ep = updateHelper.getProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH); 479 File bjHome = BlueJSettings.getDefault().getHome(); 480 if (bjHome != null) { 481 ep.setProperty(PROP_BLUEJ_HOME, getUserLibPath(bjHome).getAbsolutePath()); 482 } else { 483 ep.remove(PROP_BLUEJ_HOME); 484 } 485 updateHelper.putProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH, ep); 486 try { 487 ProjectManager.getDefault().saveProject(BluejProject.this); 488 } catch (IOException e) { 489 ErrorManager.getDefault().notify(e); 490 } 491 return null; 492 } 493 }); 494 } 495 496 } 497 498 499 503 private final class AntArtifactProviderImpl implements AntArtifactProvider { 504 505 public AntArtifact[] getBuildArtifacts() { 506 return new AntArtifact[] { 507 helper.createSimpleAntArtifact(JavaProjectConstants.ARTIFACT_TYPE_JAR, "dist.jar", evaluator(), "jar", "clean"), }; 509 } 510 511 } 512 513 private static final class RecommendedTemplatesImpl implements RecommendedTemplates, PrivilegedTemplates { 514 RecommendedTemplatesImpl() { 515 } 516 517 519 private static final String [] APPLICATION_TYPES = new String [] { 520 "java-classes", "java-main-class", "java-forms", "gui-java-application", "java-beans", "oasis-XML-catalogs", "XML", "ant-script", "ant-task", "junit", "simple-files", "bluej" }; 538 539 private static final String [] PRIVILEGED_NAMES = new String [] { 540 "Templates/Bluej/StdClass.java", "Templates/Bluej/MainClass.java", "Templates/Classes/Package", "Templates/Bluej/Interface.java", "Templates/Bluej/Enum.java", "Templates/Bluej/Abstract.java", "Templates/Bluej/UnitTest.java", 548 }; 549 550 public String [] getRecommendedTypes() { 551 return APPLICATION_TYPES; 552 } 553 554 public String [] getPrivilegedTemplates() { 555 return PRIVILEGED_NAMES; 556 } 557 558 } 559 560 } | Popular Tags |