KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > apisupport > project > ui > wizard > LibraryStartVisualPanel


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19
20 package org.netbeans.modules.apisupport.project.ui.wizard;
21
22 import java.io.File JavaDoc;
23 import java.io.IOException JavaDoc;
24 import java.util.Enumeration JavaDoc;
25 import java.util.StringTokenizer JavaDoc;
26 import java.util.jar.JarEntry JavaDoc;
27 import java.util.jar.JarFile JavaDoc;
28 import javax.swing.JFileChooser JavaDoc;
29 import javax.swing.event.DocumentEvent JavaDoc;
30 import javax.swing.event.DocumentListener JavaDoc;
31 import javax.swing.filechooser.FileFilter JavaDoc;
32 import org.netbeans.modules.apisupport.project.Util;
33 import org.netbeans.modules.apisupport.project.ui.ModuleUISettings;
34 import org.netbeans.modules.apisupport.project.ui.UIUtil;
35 import org.openide.ErrorManager;
36 import org.openide.util.NbBundle;
37
38 /**
39  * First panel of the librarywrapper module wizard.
40  *
41  * @author Milos Kleint
42  */

43 final class LibraryStartVisualPanel extends BasicVisualPanel.NewTemplatePanel {
44     
45     static final String JavaDoc PROP_LIBRARY_PATH = "LIBRARY_PATH_VALUE"; //NOI18N
46
static final String JavaDoc PROP_LICENSE_PATH = "LICENSE_PATH_VALUE"; //NOI18N
47

48     private boolean listenersAttached;
49     private final DocumentListener JavaDoc libraryDL;
50     private final DocumentListener JavaDoc licenseDL;
51     
52     /** Creates new form BasicConfVisualPanel */
53     public LibraryStartVisualPanel(final NewModuleProjectData data) {
54         super(data);
55         initComponents();
56         initAccessibility();
57         libraryDL = new UIUtil.DocumentAdapter() {
58             public void insertUpdate(DocumentEvent JavaDoc e) {
59                 checkLibraryAndLicense();
60             }
61         };
62         licenseDL = new UIUtil.DocumentAdapter() {
63             public void insertUpdate(DocumentEvent JavaDoc e) {
64                 checkLibraryAndLicense();
65             }
66         };
67     }
68     
69     private void initAccessibility() {
70         this.getAccessibleContext().setAccessibleDescription(getMessage("ACS_LibraryStartVisualPanel"));
71         browseLibraryButton.getAccessibleContext().setAccessibleDescription(getMessage("ACS_CTL_BrowseLibraries"));
72         browseLicenceButton.getAccessibleContext().setAccessibleDescription(getMessage("ACS_CTL_BrowseLicense"));
73         txtLibrary.getAccessibleContext().setAccessibleDescription(getMessage("ACS_CTL_Library"));
74         txtLicense.getAccessibleContext().setAccessibleDescription(getMessage("ACS_CTL_License"));
75     }
76     
77     private void checkLibraryAndLicense() {
78         String JavaDoc text = txtLibrary.getText().trim();
79         if (text.length() > 0) {
80             StringTokenizer JavaDoc tokens = new StringTokenizer JavaDoc(text, File.pathSeparator);
81             while (tokens.hasMoreTokens()) {
82                 String JavaDoc one = tokens.nextToken();
83                 File JavaDoc fil = new File JavaDoc(one);
84                 if (!fil.exists()) {
85                     setError(getMessage("MSG_Invalid_Library_Path"));
86                     return;
87                 }
88                 try {
89                     new JarFile JavaDoc(fil); // just checking whether the jar is valid
90
} catch (IOException JavaDoc exc) {
91                     setError(getMessage("MSG_Invalid_Library_Path"));
92                     return;
93                 }
94                 String JavaDoc badOnes = populateProjectData(getData(), text, false);
95                 if (badOnes != null) {
96                     setWarning(NbBundle.getMessage(LibraryStartVisualPanel.class, "MSG_ClassInDefaultPackage", badOnes));
97                     return;
98                 }
99             }
100         } else {
101             setError(getMessage("MSG_Library_Path_Not_Defined"));
102             return;
103         }
104         text = txtLicense.getText().trim();
105         if (text.length() > 0) {
106             File JavaDoc fil = new File JavaDoc(text);
107             if (!fil.exists()) {
108                 setError(getMessage("MSG_Invalid_License_Path"));
109                 return;
110             }
111         }
112         markValid();
113     }
114     
115     void refreshData() {
116         // XXX should be cleaned out if it is not needed
117
// String license = (String)getSettings().getProperty(PROP_LICENSE_PATH);
118
// String jars = (String)getSettings().getProperty(PROP_LIBRARY_PATH);
119

120 // String cnb = data.getCodeNameBase();
121
// codeNameBaseValue.setText(cnb);
122
// if (cnb.startsWith(EXAMPLE_BASE_NAME)) {
123
// codeNameBaseValue.select(0, EXAMPLE_BASE_NAME.length() - 1);
124
// }
125
// String dn = data.getProjectDisplayName();
126
// displayNameValue.setText(dn);
127
// checkCodeNameBase();
128
}
129     
130     /** Stores collected data into model. */
131     void storeData() {
132         String JavaDoc jars = txtLibrary.getText().trim();
133         getSettings().putProperty(PROP_LIBRARY_PATH, jars);
134         getSettings().putProperty(PROP_LICENSE_PATH, txtLicense.getText().trim());
135         populateProjectData(getData(), jars, true);
136 // // change will be fired -> update data
137
// data.setCodeNameBase(getCodeNameBaseValue());
138
// data.setProjectDisplayName(displayNameValue.getText());
139
// data.setBundle(getBundleValue());
140
// if (!libraryModule) {
141
// data.setLayer(getLayerValue());
142
// }
143
}
144     
145     static String JavaDoc populateProjectData(NewModuleProjectData data, String JavaDoc paths, boolean assignValues) {
146         if (data.getProjectName() != null && data.getCodeNameBase() != null && assignValues) {
147             return null;
148         }
149         String JavaDoc wrongOnes = null;
150         StringTokenizer JavaDoc tokens = new StringTokenizer JavaDoc(paths, File.pathSeparator);
151         boolean cutShortestPath = false;
152         boolean fileAlreadyMarked = false;
153         if (tokens.hasMoreTokens()) {
154             fileAlreadyMarked = false;
155             File JavaDoc fil = new File JavaDoc(tokens.nextToken());
156             if (!fil.exists()) {
157                 // #63438 hmm. happens when cancelling the panel? why?
158
return wrongOnes;
159             }
160             String JavaDoc name = fil.getName();
161             int inddd = name.lastIndexOf('.');
162             if (inddd > -1) {
163                 name = name.substring(0, inddd);
164             }
165             name = name.replaceAll("[0-9._-]+$", ""); // NOI18N
166
if (assignValues) {
167                 data.setProjectName(name);
168             }
169             JarFile JavaDoc jf = null;
170             String JavaDoc shortestPath = null;
171             try {
172                 jf = new JarFile JavaDoc(fil);
173                 Enumeration JavaDoc en = jf.entries();
174                 while (en.hasMoreElements()) {
175                     JarEntry JavaDoc entry = (JarEntry JavaDoc)en.nextElement();
176                     if (!entry.isDirectory() && entry.getName().endsWith(".class")) { // NOI18N
177
String JavaDoc nm = entry.getName();
178                         if (!Util.isValidJavaFQN(nm.substring(0, nm.length() - 6).replace('/', '.'))) {
179                             continue; // #72669
180
}
181                         int index = nm.lastIndexOf('/');
182                         if (index > -1) {
183                             String JavaDoc path = nm.substring(0, index);
184                             if (shortestPath != null && path.length() == shortestPath.length() && !path.equals(shortestPath)) {
185                                 cutShortestPath = true;
186                             }
187                             if (shortestPath == null || path.length() < shortestPath.length()) {
188                                 shortestPath = path;
189                                 cutShortestPath = false;
190                             }
191                         } else {
192                             // a bad, bad jar having class files in default package.
193
if (!fileAlreadyMarked) {
194                                 wrongOnes = wrongOnes == null ? fil.getName() : wrongOnes + "," + fil.getName(); // NOI18N
195
fileAlreadyMarked = true;
196                             }
197                         }
198                     }
199                 }
200             } catch (IOException JavaDoc e) {
201                 ErrorManager.getDefault().notify(ErrorManager.WARNING, e);
202             } finally {
203                 if (jf != null) {
204                     try {
205                         jf.close();
206                     } catch (IOException JavaDoc e) {
207                         Util.err.notify(ErrorManager.INFORMATIONAL, e);
208                     }
209                 }
210             }
211             if (shortestPath != null && assignValues) {
212                 shortestPath = shortestPath.replace('/', '.');
213                 if (cutShortestPath && shortestPath.indexOf('.') != shortestPath.lastIndexOf('.')) {
214                     // if there's more than one dot (meanign we don't want to cut too much to present just
215
// org or com. org.apache is probably already good enough
216
int ind = shortestPath.lastIndexOf('.');
217                     shortestPath = shortestPath.substring(0, ind);
218                 }
219                 data.setCodeNameBase(shortestPath);
220             }
221         }
222         return wrongOnes;
223     }
224     
225     public void addNotify() {
226         super.addNotify();
227         attachDocumentListeners();
228     }
229     
230     public void removeNotify() {
231         // prevent checking when the panel is not "active"
232
removeDocumentListeners();
233         super.removeNotify();
234     }
235     
236     private void attachDocumentListeners() {
237         if (!listenersAttached) {
238             txtLibrary.getDocument().addDocumentListener(libraryDL);
239             txtLicense.getDocument().addDocumentListener(licenseDL);
240             listenersAttached = true;
241         }
242     }
243     
244     private void removeDocumentListeners() {
245         if (listenersAttached) {
246             txtLibrary.getDocument().removeDocumentListener(libraryDL);
247             txtLicense.getDocument().removeDocumentListener(licenseDL);
248             listenersAttached = false;
249         }
250     }
251     
252     private static String JavaDoc getMessage(String JavaDoc key) {
253         return NbBundle.getMessage(LibraryStartVisualPanel.class, key);
254     }
255     
256     /** This method is called from within the constructor to
257      * initialize the form.
258      * WARNING: Do NOT modify this code. The content of this method is
259      * always regenerated by the Form Editor.
260      */

261     // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
262
private void initComponents() {
263         java.awt.GridBagConstraints JavaDoc gridBagConstraints;
264
265         confPanel = new javax.swing.JPanel JavaDoc();
266         lblLibrary = new javax.swing.JLabel JavaDoc();
267         txtLibrary = new javax.swing.JTextField JavaDoc();
268         lblLicense = new javax.swing.JLabel JavaDoc();
269         txtLicense = new javax.swing.JTextField JavaDoc();
270         browseLibraryButton = new javax.swing.JButton JavaDoc();
271         browseLicenceButton = new javax.swing.JButton JavaDoc();
272         filler = new javax.swing.JPanel JavaDoc();
273
274         setLayout(new java.awt.GridBagLayout JavaDoc());
275
276         confPanel.setLayout(new java.awt.GridBagLayout JavaDoc());
277
278         lblLibrary.setLabelFor(txtLibrary);
279         org.openide.awt.Mnemonics.setLocalizedText(lblLibrary, org.openide.util.NbBundle.getMessage(LibraryStartVisualPanel.class, "LBL_Library_path"));
280         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
281         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
282         gridBagConstraints.insets = new java.awt.Insets JavaDoc(1, 0, 6, 12);
283         confPanel.add(lblLibrary, gridBagConstraints);
284
285         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
286         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
287         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
288         gridBagConstraints.insets = new java.awt.Insets JavaDoc(1, 0, 6, 0);
289         confPanel.add(txtLibrary, gridBagConstraints);
290
291         lblLicense.setLabelFor(txtLicense);
292         org.openide.awt.Mnemonics.setLocalizedText(lblLicense, org.openide.util.NbBundle.getMessage(LibraryStartVisualPanel.class, "LBL_License_Path"));
293         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
294         gridBagConstraints.gridx = 0;
295         gridBagConstraints.gridy = 1;
296         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
297         gridBagConstraints.insets = new java.awt.Insets JavaDoc(0, 0, 0, 12);
298         confPanel.add(lblLicense, gridBagConstraints);
299
300         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
301         gridBagConstraints.gridx = 1;
302         gridBagConstraints.gridy = 1;
303         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
304         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
305         gridBagConstraints.weightx = 1.0;
306         confPanel.add(txtLicense, gridBagConstraints);
307
308         org.openide.awt.Mnemonics.setLocalizedText(browseLibraryButton, org.openide.util.NbBundle.getMessage(LibraryStartVisualPanel.class, "CTL_BrowseButton_o"));
309         browseLibraryButton.addActionListener(new java.awt.event.ActionListener JavaDoc() {
310             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
311                 browseLibraryButtonActionPerformed(evt);
312             }
313         });
314
315         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
316         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
317         gridBagConstraints.insets = new java.awt.Insets JavaDoc(0, 12, 6, 0);
318         confPanel.add(browseLibraryButton, gridBagConstraints);
319
320         org.openide.awt.Mnemonics.setLocalizedText(browseLicenceButton, org.openide.util.NbBundle.getMessage(LibraryStartVisualPanel.class, "CTL_BrowseButton_w"));
321         browseLicenceButton.addActionListener(new java.awt.event.ActionListener JavaDoc() {
322             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
323                 browseLicenceButtonActionPerformed(evt);
324             }
325         });
326
327         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
328         gridBagConstraints.gridx = 2;
329         gridBagConstraints.gridy = 1;
330         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
331         gridBagConstraints.insets = new java.awt.Insets JavaDoc(0, 12, 0, 0);
332         confPanel.add(browseLicenceButton, gridBagConstraints);
333
334         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
335         gridBagConstraints.gridx = 0;
336         gridBagConstraints.gridy = 2;
337         gridBagConstraints.gridwidth = 3;
338         gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
339         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
340         gridBagConstraints.weightx = 1.0;
341         gridBagConstraints.weighty = 1.0;
342         confPanel.add(filler, gridBagConstraints);
343
344         gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
345         gridBagConstraints.gridx = 0;
346         gridBagConstraints.gridy = 0;
347         gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
348         gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
349         gridBagConstraints.weightx = 1.0;
350         gridBagConstraints.weighty = 1.0;
351         gridBagConstraints.insets = new java.awt.Insets JavaDoc(4, 0, 4, 0);
352         add(confPanel, gridBagConstraints);
353
354     }// </editor-fold>//GEN-END:initComponents
355

356     private void browseLicenceButtonActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_browseLicenceButtonActionPerformed
357
JFileChooser JavaDoc chooser = new JFileChooser JavaDoc(ModuleUISettings.getDefault().getLastChosenLibraryLocation());
358         chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
359         chooser.setMultiSelectionEnabled(false);
360         if (txtLicense.getText().trim().length() > 0) {
361             chooser.setSelectedFile(new File JavaDoc(txtLicense.getText().trim()));
362         }
363         int ret = chooser.showDialog(this, getMessage("LBL_Select"));
364         if (ret == JFileChooser.APPROVE_OPTION) {
365             txtLicense.setText(chooser.getSelectedFile().getAbsolutePath());
366             ModuleUISettings.getDefault().setLastChosenLibraryLocation(txtLicense.getText());
367         }
368     }//GEN-LAST:event_browseLicenceButtonActionPerformed
369

370     private void browseLibraryButtonActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_browseLibraryButtonActionPerformed
371
JFileChooser JavaDoc chooser = new JFileChooser JavaDoc(ModuleUISettings.getDefault().getLastChosenLibraryLocation());
372         File JavaDoc[] olds = convertStringToFiles(txtLibrary.getText().trim());
373         chooser.setSelectedFiles(olds);
374         chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
375         chooser.setMultiSelectionEnabled(true);
376         chooser.addChoosableFileFilter(new JarZipFilter());
377         int ret = chooser.showDialog(this, getMessage("LBL_Select"));
378         if (ret == JFileChooser.APPROVE_OPTION) {
379             File JavaDoc[] files = chooser.getSelectedFiles();
380             String JavaDoc path = "";
381             for (int i = 0; i < files.length; i++) {
382                 path = path + files[i] + ( i == files.length - 1 ? "" : File.pathSeparator);
383             }
384             txtLibrary.setText(path);
385             ModuleUISettings.getDefault().setLastChosenLibraryLocation(files[0].getParentFile().getAbsolutePath());
386         }
387     }//GEN-LAST:event_browseLibraryButtonActionPerformed
388

389     static File JavaDoc[] convertStringToFiles(String JavaDoc path) {
390         StringTokenizer JavaDoc tok = new StringTokenizer JavaDoc(path, File.pathSeparator);
391         File JavaDoc[] olds = new File JavaDoc[tok.countTokens()];
392         for (int i = 0; i < olds.length; i++) {
393             olds[i] = new File JavaDoc(tok.nextToken());
394         }
395         return olds;
396     }
397     
398     // Variables declaration - do not modify//GEN-BEGIN:variables
399
private javax.swing.JButton JavaDoc browseLibraryButton;
400     private javax.swing.JButton JavaDoc browseLicenceButton;
401     private javax.swing.JPanel JavaDoc confPanel;
402     private javax.swing.JPanel JavaDoc filler;
403     private javax.swing.JLabel JavaDoc lblLibrary;
404     private javax.swing.JLabel JavaDoc lblLicense;
405     private javax.swing.JTextField JavaDoc txtLibrary;
406     private javax.swing.JTextField JavaDoc txtLicense;
407     // End of variables declaration//GEN-END:variables
408

409     private static final class JarZipFilter extends FileFilter JavaDoc {
410         public boolean accept(File JavaDoc pathname) {
411             return pathname.isDirectory() || pathname.getName().endsWith("zip") || pathname.getName().endsWith("jar"); // NOI18N
412
}
413         public String JavaDoc getDescription() {
414             return getMessage("LibraryStartVisualPanel_jar_zip_filter");
415         }
416     }
417     
418 }
419
Popular Tags