1 19 package org.netbeans.modules.j2ee.ejbjarproject.ui.logicalview.libraries; 20 21 22 import java.io.File ; 23 import java.io.IOException ; 24 import java.net.URL ; 25 import java.util.Iterator ; 26 import java.util.List ; 27 import java.util.ArrayList ; 28 import javax.swing.Action ; 29 import org.netbeans.api.project.FileOwnerQuery; 30 import org.netbeans.api.project.Project; 31 import org.openide.ErrorManager; 32 import org.openide.actions.EditAction; 33 import org.openide.actions.FindAction; 34 import org.openide.loaders.DataObject; 35 import org.openide.actions.OpenAction; 36 import org.openide.filesystems.FileObject; 37 import org.openide.filesystems.FileStateInvalidException; 38 import org.openide.filesystems.FileUtil; 39 import org.openide.nodes.FilterNode; 40 import org.openide.nodes.Node; 41 import org.openide.util.Lookup; 42 import org.openide.util.actions.SystemAction; 43 import org.openide.util.lookup.Lookups; 44 import org.openide.util.lookup.ProxyLookup; 45 import org.netbeans.api.java.queries.JavadocForBinaryQuery; 46 import org.netbeans.api.project.ProjectManager; 47 import org.netbeans.spi.project.support.ant.AntProjectHelper; 48 import org.netbeans.spi.project.support.ant.EditableProperties; 49 import org.netbeans.spi.project.support.ant.PropertyEvaluator; 50 import org.netbeans.spi.project.support.ant.PropertyUtils; 51 import org.netbeans.spi.project.support.ant.ReferenceHelper; 52 import org.netbeans.modules.j2ee.ejbjarproject.UpdateHelper; 53 import org.netbeans.modules.j2ee.ejbjarproject.classpath.ClassPathSupport; 54 import org.netbeans.modules.j2ee.ejbjarproject.ui.customizer.EjbJarProjectProperties; 55 56 57 64 class ActionFilterNode extends FilterNode { 65 66 private static final int MODE_ROOT = 1; 67 private static final int MODE_PACKAGE = 2; 68 private static final int MODE_FILE = 3; 69 private static final int MODE_FILE_CONTENT = 4; 70 71 private final int mode; 72 private Action [] actionCache; 73 74 85 static ActionFilterNode create (Node original, UpdateHelper helper, PropertyEvaluator eval, ReferenceHelper refHelper, 86 String classPathId, String entryId, String includedLibrariesElement) { 87 DataObject dobj = (DataObject) original.getLookup().lookup(DataObject.class); 88 assert dobj != null; 89 FileObject root = dobj.getPrimaryFile(); 90 Lookup lkp = new ProxyLookup (new Lookup[] {original.getLookup(), helper == null ? 91 Lookups.singleton (new JavadocProvider(root,root)) : 92 Lookups.fixed (new Object [] {new Removable (helper, eval, refHelper, classPathId, entryId, includedLibrariesElement), 93 new JavadocProvider(root,root)})}); 94 return new ActionFilterNode (original, helper == null ? MODE_PACKAGE : MODE_ROOT, root, lkp); 95 } 96 97 98 99 private ActionFilterNode (Node original, int mode, FileObject cpRoot, FileObject resource) { 100 this (original, mode, cpRoot, 101 new ProxyLookup(new Lookup[] {original.getLookup(),Lookups.singleton(new JavadocProvider(cpRoot,resource))})); 102 } 103 104 private ActionFilterNode (Node original, int mode) { 105 super (original, new ActionFilterChildren (original, mode, null)); 106 this.mode = mode; 107 } 108 109 private ActionFilterNode (Node original, int mode, FileObject root, Lookup lkp) { 110 super (original, new ActionFilterChildren (original, mode,root),lkp); 111 this.mode = mode; 112 } 113 114 public Action [] getActions(boolean context) { 115 Action [] result = initActions(); 116 return result; 117 } 118 119 120 public Action getPreferredAction() { 121 if (mode == MODE_FILE) { 122 Action [] actions = initActions(); 123 if (actions.length > 0 && (actions[0] instanceof OpenAction || actions[0] instanceof EditAction)) { 124 return actions[0]; 125 } 126 } 127 return null; 128 } 129 130 private Action [] initActions () { 131 if (actionCache == null) { 132 List result = new ArrayList (2); 133 if (mode == MODE_FILE) { 134 Action [] superActions = super.getActions(false); 135 for (int i=0; i<superActions.length; i++) { 136 if (superActions[i] instanceof OpenAction || superActions[i] instanceof EditAction) { 137 result.add (superActions[i]); 138 } 139 } 140 result.add (SystemAction.get(ShowJavadocAction.class)); 141 } 142 else if (mode == MODE_PACKAGE || mode == MODE_ROOT) { 143 result.add (SystemAction.get(ShowJavadocAction.class)); 144 Action [] superActions = super.getActions(false); 145 for (int i=0; i<superActions.length; i++) { 146 if (superActions[i] instanceof FindAction) { 147 result.add (superActions[i]); 148 } 149 } 150 if (mode == MODE_ROOT) { 151 result.add (SystemAction.get(RemoveClassPathRootAction.class)); 152 } 153 } 154 actionCache = (Action []) result.toArray(new Action [result.size()]); 155 } 156 return actionCache; 157 } 158 159 private static class ActionFilterChildren extends Children { 160 161 private final int mode; 162 private final FileObject cpRoot; 163 164 ActionFilterChildren (Node original, int mode, FileObject cpRooot) { 165 super (original); 166 this.mode = mode; 167 this.cpRoot = cpRooot; 168 } 169 170 protected Node[] createNodes(Node n) { 171 switch (mode) { 172 case MODE_ROOT: 173 case MODE_PACKAGE: 174 DataObject dobj = (DataObject) n.getCookie(org.openide.loaders.DataObject.class); 175 if (dobj == null) { 176 assert false : "DataNode without DataObject in Lookup"; return new Node[0]; 178 } 179 else if (dobj.getPrimaryFile().isFolder()) { 180 return new Node[] {new ActionFilterNode (n, MODE_PACKAGE,cpRoot,dobj.getPrimaryFile())}; 181 } 182 else { 183 return new Node[] {new ActionFilterNode (n, MODE_FILE,cpRoot,dobj.getPrimaryFile())}; 184 } 185 case MODE_FILE: 186 case MODE_FILE_CONTENT: 187 return new Node[] {new ActionFilterNode (n, MODE_FILE_CONTENT)}; 188 default: 189 assert false : "Unknown mode"; return new Node[0]; 191 } 192 } 193 } 194 195 private static class JavadocProvider implements ShowJavadocAction.JavadocProvider { 196 197 private final FileObject cpRoot; 198 private final FileObject resource; 199 200 JavadocProvider (FileObject cpRoot, FileObject resource) { 201 this.cpRoot = cpRoot; 202 this.resource = resource; 203 } 204 205 public boolean hasJavadoc() { 206 try { 207 return resource != null && JavadocForBinaryQuery.findJavadoc(cpRoot.getURL()).getRoots().length>0; 208 } catch (FileStateInvalidException fsi) { 209 return false; 210 } 211 } 212 213 public void showJavadoc() { 214 try { 215 String relativeName = FileUtil.getRelativePath(cpRoot,resource); 216 URL [] urls = JavadocForBinaryQuery.findJavadoc(cpRoot.getURL()).getRoots(); 217 URL pageURL; 218 if (relativeName.length()==0) { 219 pageURL = ShowJavadocAction.findJavadoc ("overview-summary.html",urls); if (pageURL == null) { 221 pageURL = ShowJavadocAction.findJavadoc ("index.html",urls); } 223 } 224 else if (resource.isFolder()) { 225 pageURL = ShowJavadocAction.findJavadoc ("package-summary.html",urls); } 228 else { 229 String javadocFileName = relativeName.substring(0,relativeName.lastIndexOf('.'))+".html"; pageURL = ShowJavadocAction.findJavadoc (javadocFileName,urls); 231 } 232 ShowJavadocAction.showJavaDoc(pageURL,relativeName.replace('/','.')); } catch (FileStateInvalidException fsi) { 234 ErrorManager.getDefault().notify (fsi); 235 } 236 } 237 } 238 239 private static class Removable implements RemoveClassPathRootAction.Removable { 240 241 private final UpdateHelper helper; 242 private final PropertyEvaluator eval; 243 private final ReferenceHelper refHelper; 244 private final String classPathId; 245 private final String entryId; 246 private final String includedLibrariesElement; 247 private final ClassPathSupport cs; 248 249 Removable (UpdateHelper helper, PropertyEvaluator eval, ReferenceHelper refHelper, String classPathId, String entryId, String includedLibrariesElement) { 250 this.helper = helper; 251 this.eval = eval; 252 this.refHelper = refHelper; 253 this.classPathId = classPathId; 254 this.includedLibrariesElement = includedLibrariesElement; 255 this.entryId = entryId; 256 257 this.cs = new ClassPathSupport( eval, refHelper, helper.getAntProjectHelper(), 258 EjbJarProjectProperties.WELL_KNOWN_PATHS, 259 EjbJarProjectProperties.LIBRARY_PREFIX, 260 EjbJarProjectProperties.LIBRARY_SUFFIX, 261 EjbJarProjectProperties.ANT_ARTIFACT_PREFIX ); 262 } 263 264 265 public boolean canRemove () { 266 EditableProperties props = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); 268 return props.getProperty (classPathId) != null; 269 } 270 271 public Project remove() { 272 275 278 boolean removed = false; 279 EditableProperties props = helper.getProperties (AntProjectHelper.PROJECT_PROPERTIES_PATH); 280 String raw = props.getProperty (classPathId); 281 List resources = cs.itemsList( raw, includedLibrariesElement ); 282 for (Iterator i = resources.iterator(); i.hasNext();) { 283 ClassPathSupport.Item item = (ClassPathSupport.Item)i.next(); 284 if (entryId.equals(EjbJarProjectProperties.getAntPropertyName(item.getReference()))) { 285 i.remove(); 286 removed = true; 287 } 288 } 289 if (removed) { 290 String [] itemRefs = cs.encodeToStrings(resources.iterator(), includedLibrariesElement); 291 props = helper.getProperties (AntProjectHelper.PROJECT_PROPERTIES_PATH); props.setProperty(classPathId, itemRefs); 293 helper.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, props); 294 295 EditableProperties privateProps = helper.getProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH); 297 ArrayList l = new ArrayList (); 298 l.addAll(resources); 299 EjbJarProjectProperties.storeLibrariesLocations(l.iterator(), privateProps); 300 helper.putProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH, privateProps); 301 302 return FileOwnerQuery.getOwner(helper.getAntProjectHelper().getProjectDirectory()); 303 } else { 304 return null; 305 } 306 } 307 } 308 } 309 | Popular Tags |