Index: src/org/netbeans/modules/web/taglibed/Bundle.properties =================================================================== RCS file: /cvs/web/taglibed/src/org/netbeans/modules/web/taglibed/Bundle.properties,v retrieving revision 1.6.2.4 diff -c -r1.6.2.4 Bundle.properties *** src/org/netbeans/modules/web/taglibed/Bundle.properties 11 Mar 2003 00:14:34 -0000 1.6.2.4 --- src/org/netbeans/modules/web/taglibed/Bundle.properties 15 Apr 2003 00:37:06 -0000 *************** *** 187,193 **** --- 187,206 ---- #{0}= package directory TLD_GenerateCodeAction.Exception.teiPackageReadOnly=TEI package directory {0} is not writeable. + # + #ClearCase hack for putting newly created directories into clearcase + # + MSG_PutIntoClearCase=Generating tag handlers will create new directories in your local filesystem. Do you also want these directories added to ClearCase now? \n\n\ + Note: If you are using a ClearCase dynamic view, you cannot add the directories to ClearCase later if you choose to create locally only. + MSG_PutIntoClearCaseYes=Add to ClearCase + MSG_PutIntoClearCaseNo=Create locally only + MSG_PutIntoClearCaseYes_MNEM=C + MSG_PutIntoClearCaseNo_MNEM=L + MSG_PutIntoClearCaseYes_Tooltip=Add to ClearCase + MSG_PutIntoClearCaseNo_Tooltip=Create locally only + + # Tag Generator # #{0}= tag name cvs server: Diffing src/org/netbeans/modules/web/taglibed/codegen cvs server: Diffing src/org/netbeans/modules/web/taglibed/control Index: src/org/netbeans/modules/web/taglibed/control/GenerateCodeAction.java =================================================================== RCS file: /cvs/web/taglibed/src/org/netbeans/modules/web/taglibed/control/GenerateCodeAction.java,v retrieving revision 1.15 diff -c -r1.15 GenerateCodeAction.java *** src/org/netbeans/modules/web/taglibed/control/GenerateCodeAction.java 27 Feb 2003 23:45:11 -0000 1.15 --- src/org/netbeans/modules/web/taglibed/control/GenerateCodeAction.java 15 Apr 2003 00:37:06 -0000 *************** *** 128,133 **** --- 128,134 ---- } public static void generateTagHandlers (boolean forceGenerateAll) { + IDEHelper.resetClearCaseQuestion(); selectedNodes = org.openide.windows.TopComponent.getRegistry().getActivatedNodes(); generateTagHandlers(selectedNodes, forceGenerateAll); *************** *** 266,272 **** IDEHelper.getAbsolutePath(root)); throw new TLDException(msg); } ! DataFolder df = IDEHelper.createFolder(root, dirName); pkgDirFo = df.getPrimaryFile(); //String pkgName = pkgDirFo.getPackageName (File.separatorChar); String tagClassName = tag.getTagClassName(); --- 267,280 ---- IDEHelper.getAbsolutePath(root)); throw new TLDException(msg); } ! DataFolder df = IDEHelper.findFolder(root, dirName); ! if (df == null) { ! boolean putInVCS = IDEHelper.shouldPutIntoClearCase(root); ! df = IDEHelper.createFolder(root, dirName, putInVCS); ! } ! ! //DataFolder df = IDEHelper.createFolder(root, dirName); ! pkgDirFo = df.getPrimaryFile(); //String pkgName = pkgDirFo.getPackageName (File.separatorChar); String tagClassName = tag.getTagClassName(); Index: src/org/netbeans/modules/web/taglibed/control/IDEHelper.java =================================================================== RCS file: /cvs/web/taglibed/src/org/netbeans/modules/web/taglibed/control/IDEHelper.java,v retrieving revision 1.15 diff -c -r1.15 IDEHelper.java *** src/org/netbeans/modules/web/taglibed/control/IDEHelper.java 27 Feb 2003 01:12:46 -0000 1.15 --- src/org/netbeans/modules/web/taglibed/control/IDEHelper.java 15 Apr 2003 00:37:06 -0000 *************** *** 45,50 **** --- 45,51 ---- import org.openide.NotifyDescriptor; import org.netbeans.modules.web.taglibed.TLDDataObject; + import org.netbeans.modules.web.taglibed.TLDLoader; import org.netbeans.modules.web.taglibed.model.TagAttributeInfoData; import org.netbeans.modules.web.taglibed.model.TagInfoData; import org.netbeans.modules.web.taglibed.model.TagLibraryInfoData; *************** *** 306,313 **** return folder; } ! public static DataFolder createFolder (FileObject folder, ! String name) throws IOException { DataFolder rv = null; FileObject fo = null; try { --- 307,329 ---- return folder; } ! public static DataFolder findFolder(FileObject folder, ! String name) throws IOException { ! DataFolder rv = null; ! FileObject fo = null; ! try { ! fo = findFileObject(folder, name); ! rv = DataFolder.findFolder(fo); ! } catch (IllegalArgumentException e) { ! ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, e); ! rv = null; ! } ! return rv; ! } ! ! public static DataFolder createFolder(FileObject folder, ! String name, ! boolean putToVCS) throws IOException { DataFolder rv = null; FileObject fo = null; try { *************** *** 317,323 **** // (PENDING: but it doesn't handle "..") // //fo = FileUtil.createFolder(folder, name); ! fo = findOrCreateFolder(folder, name); rv = DataFolder.findFolder(fo); } catch (IllegalArgumentException e) { ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, e); --- 333,339 ---- // (PENDING: but it doesn't handle "..") // //fo = FileUtil.createFolder(folder, name); ! fo = findOrCreateFileObject(folder, name, putToVCS); rv = DataFolder.findFolder(fo); } catch (IllegalArgumentException e) { ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, e); *************** *** 330,337 **** // taken from openide.filesystems.FileUtil, // but modified to handle '..' that go outside the current FileSystem // ! public static FileObject findOrCreateFolder (FileObject folder, String path) throws IOException { String separators; if (File.separatorChar != '/') separators = "/" + File.separatorChar; // NOI18N --- 346,354 ---- // taken from openide.filesystems.FileUtil, // but modified to handle '..' that go outside the current FileSystem // ! public static FileObject findOrCreateFileObject(FileObject folder, String path, boolean putToVCS) throws IOException { + System.out.println("findOrCreateFileObject folder= " + folder + " path = " + path + " putToVCS = " + putToVCS); String separators; if (File.separatorChar != '/') separators = "/" + File.separatorChar; // NOI18N *************** *** 371,377 **** f = folder.getParent(); } else { try { ! f = folder.createFolder (name); } catch (SyncFailedException ex) { // there might be unconsistency between the cache // and the disk, that is why --- 388,394 ---- f = folder.getParent(); } else { try { ! f = createFolderClearCaseHack(folder, name, putToVCS); } catch (SyncFailedException ex) { // there might be unconsistency between the cache // and the disk, that is why *************** *** 393,400 **** --- 410,536 ---- return folder; } + + public static FileObject findFileObject(FileObject folder, String path) + throws IOException { + String separators; + if (File.separatorChar != '/') + separators = "/" + File.separatorChar; // NOI18N + else + separators = "/"; // NOI18N + + StringTokenizer st = new StringTokenizer (path, separators); + while (st.hasMoreElements ()) { + String name = st.nextToken (); + if (name.length () > 0) { + if (name.equals(".")) { // NOI18N + // continue + } else { + FileObject f = folder.getFileObject (name); + if (f == null) { + if (name.equals("..")) { // NOI18N + if (folder.isRoot()) { + return null; + } + + // Note: what if it's root? + // then we have to absolut-ize, and mount... + f = folder.getParent(); + } else { + return null; + } + } + folder = f; + } + } + } + return folder; + } /** + * Creates a single folder on given filesystem. + * Has the following ClearCase-related behavior: if the folder is on clearcase FS, + * and the putToVCS argument is set to true, then puts the file into VCS + * + * @param folder where the new folder will be placed in + * @param name name of the new folder + * @return the new folder + * @exception IOException if the creation fails + */ + public static FileObject createFolderClearCaseHack(FileObject folder, String name, boolean putToVCS) throws IOException { + FileObject result = null; + if (putToVCS) { + String folderName = folder.getPath(); + if ((folderName.length() > 0) && !folderName.endsWith("/")) { + folderName = folderName + "/"; + } + folderName = folderName + name; + folder.getFileSystem().getRoot().setAttribute("VCS_MKDIR_ACTION", folderName); + folder.refresh(); + result = folder.getFileObject(name); + } + if (result == null) { + result = folder.createFolder(name); + } + return result; + } + + private static boolean alreadyAskedClearCaseQuestion = false; + private static boolean clearCaseAnswer = false; + public static void resetClearCaseQuestion() { + alreadyAskedClearCaseQuestion = false; + } + /** Hack - we may be putting some directories into clearcase. + */ + public static boolean shouldPutIntoClearCase(FileObject fo) throws org.openide.filesystems.FileStateInvalidException { + FileSystem fs = fo.getFileSystem(); + return shouldPutIntoClearCase(fs); + } + + /** Hack - we may be putting some directories into clearcase. + */ + public static boolean shouldPutIntoClearCase(FileSystem fs) { + System.out.println("IDEHElper:: should put into clear case? fs = " + fs); + System.out.println(" FS_DISPLAY_NAME: " + fs.getRoot().getAttribute("FS_DISPLAY_NAME")); + FileObject root = fs.getRoot(); + if ("ClearCase".equals(root.getAttribute("FS_DISPLAY_NAME"))) { // NOI18N + if (alreadyAskedClearCaseQuestion) + return clearCaseAnswer; + alreadyAskedClearCaseQuestion = true; + // ask the user + NotifyDescriptor nd = new NotifyDescriptor.Confirmation( + NbBundle.getMessage(TLDLoader.class, "MSG_PutIntoClearCase"), NotifyDescriptor.YES_NO_OPTION); + //button1 + JButton button1 = new JButton(); + button1.setText(NbBundle.getMessage(TLDLoader.class, "MSG_PutIntoClearCaseYes")); + button1.setToolTipText(NbBundle.getMessage(TLDLoader.class, "MSG_PutIntoClearCaseYes_Tooltip")); + button1.setMnemonic(NbBundle.getMessage(TLDLoader.class, "MSG_PutIntoClearCaseYes_MNEM").charAt(0)); + button1.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(TLDLoader.class, "MSG_PutIntoClearCaseYes_Tooltip")); + button1.setDefaultCapable(false); + //button2 + JButton button2 = new JButton(); + button2.setText(NbBundle.getMessage(TLDLoader.class, "MSG_PutIntoClearCaseNo")); + button2.setToolTipText(NbBundle.getMessage(TLDLoader.class, "MSG_PutIntoClearCaseNo_Tooltip")); + button2.setMnemonic(NbBundle.getMessage(TLDLoader.class, "MSG_PutIntoClearCaseNo_MNEM").charAt(0)); + button2.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(TLDLoader.class, "MSG_PutIntoClearCaseNo_Tooltip")); + button2.setDefaultCapable(false); + // display it + nd.setOptions(new JButton[] {button1, button2}); + DialogDisplayer.getDefault().notify(nd); + + if (nd.getValue() != button1) { + clearCaseAnswer = false; + return clearCaseAnswer; + } + clearCaseAnswer = true; + return clearCaseAnswer; + } + else { + return false; + } + } + + /** * Get the file object root in which to generate the tag handler classes. * Use the given root and then the tag handler generation root from the * tag library. *************** *** 424,430 **** // return a file object relative to the given parent root. // try { ! DataFolder df = IDEHelper.createFolder(parentRoot, taglibGenRoot); result = FileUtil.toFile(df.getPrimaryFile()); } catch (IOException ex) { //System.out.println("GenerateCodeACtion caught exception: " + ex); // NOI18N --- 560,571 ---- // return a file object relative to the given parent root. // try { ! // PENDING: need to first check for existing, then create if necessary. ! DataFolder df = IDEHelper.findFolder(parentRoot, taglibGenRoot); ! if (df == null) { ! boolean putInVCS = shouldPutIntoClearCase(parentRoot); ! df = IDEHelper.createFolder(parentRoot, taglibGenRoot, putInVCS); ! } result = FileUtil.toFile(df.getPrimaryFile()); } catch (IOException ex) { //System.out.println("GenerateCodeACtion caught exception: " + ex); // NOI18N *************** *** 440,447 **** if (debug) System.out.println(" absFile = " + absFile); if (absFile != null) { ! boolean success = absFile.mkdirs(); ! result = absFile; } } } --- 581,593 ---- if (debug) System.out.println(" absFile = " + absFile); if (absFile != null) { ! try { ! createDirectoryIfNecessary(absFile); ! //boolean success = absFile.mkdirs(); ! result = absFile; ! } catch (IOException ex) { ! ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, ex); ! } } } } *************** *** 469,476 **** File absFile = new File(absPath); if (absFile != null) { ! boolean success = absFile.mkdirs(); ! result = absFile; } if (result == null) return null; --- 615,627 ---- File absFile = new File(absPath); if (absFile != null) { ! //boolean success = absFile.mkdirs(); ! try { ! createDirectoryIfNecessary(absFile); ! result = absFile; ! } catch (IOException ex) { ! ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, ex); ! } } if (result == null) return null; *************** *** 485,490 **** --- 636,685 ---- } } + /** + * Ensure that the directory exists. + * If not, create it: + * If an ancestor of the directory can be found that is mounted as a filesystem, + * then create it relative to that filesystem, using the clearcase hack if appropriate; + * Otherwise use File.mkdirs() to create the directory. + * @return true if the directory exists or was able to be created. + */ + private static boolean createDirectoryIfNecessary(File f) throws IOException { + System.out.println("createdirectory oif necessary. f= " + f); + if (f.exists()) { + return true; + } + + Repository rep = Repository.getDefault(); + FileSystem ancestor = findAlreadyMountedAncestorFileSystem(rep, f); + if (ancestor != null) { + FileObject ancestorRoot = ancestor.getRoot(); + File ancestorRootFile = FileUtil.toFile(ancestorRoot); + String ancestorPath = ancestorRootFile.getCanonicalPath(); + String fp = f.getCanonicalPath(); + String rel = relativise(fp, ancestorPath); + System.out.println("relativise(ch: " + fp + ", an: " + ancestorPath + ") => " + rel); + boolean putInVCS = shouldPutIntoClearCase(ancestorRoot); + FileObject newFo = findOrCreateFileObject(ancestorRoot, rel, putInVCS); + if (newFo != null) + return true; + } + + return f.mkdirs(); + } + + private static String relativise(String child, String ancestor) { + if (child.startsWith(ancestor)) { + // Guard against returning something with a leading slash + if (ancestor.endsWith("/")) { + return child.substring(ancestor.length()); + } else { + return child.substring(ancestor.length()+1); + } + } + return null; + } + public static boolean isRelative(String directory) { // // Check for root of a filesystem. *************** *** 582,587 **** --- 777,816 ---- return null; } + /** + * Determine if this path or an ancestor is mounted. If so, return the filesystem. + * If not, return null. + */ + public static FileSystem findAlreadyMountedAncestorFileSystem(Repository rep, File file) throws IOException { + String targetFileAbs = file.getCanonicalPath(); + if (targetFileAbs.endsWith("/")) + targetFileAbs = targetFileAbs.substring(0, targetFileAbs.length()-1); + + if (debug) System.out.println("\n\nIDEHelper::findAlreadyMountedAncestorFileSystem. targetAbs = " + targetFileAbs); // NOI18N + + for(Enumeration fsen = rep.fileSystems(); fsen.hasMoreElements();) { + FileSystem fs = (FileSystem)fsen.nextElement(); + if (!fs.isHidden()) { + if (debug) System.out.println("IDEHelper::findAlreadyMountedAncestorFileSystem. testing fs: " + fs); // NOI18N + File fsFile = FileUtil.toFile(fs.getRoot()); + if (debug) System.out.println("IDEHelper::findAlreadyMountedAncestorFileSystem. fsFile: " + fsFile); // NOI18N + if (fsFile != null) { + String fsFileAbs = fsFile.getCanonicalPath(); + if (fsFileAbs.endsWith("/")) { // NOI18N + fsFileAbs = fsFileAbs.substring(0, fsFileAbs.length()-1); + } + + if (targetFileAbs.startsWith(fsFileAbs)) { + System.out.println(" Bingo."); + return fs; + } + } + } + } + System.out.println(" nope."); + return null; + } + public static FileObject saveFileAs(FileObject folderFile, String name, *************** *** 1450,1454 **** } private static final boolean debugtests = false; ! private static final boolean debug = false; } --- 1679,1683 ---- } private static final boolean debugtests = false; ! private static final boolean debug = true; }