1 19 package org.netbeans.bluej.export; 20 21 import java.awt.Component ; 22 import java.awt.Dialog ; 23 import java.awt.event.ActionEvent ; 24 import java.io.File ; 25 import java.io.IOException ; 26 import java.io.InputStream ; 27 import java.io.OutputStream ; 28 import java.lang.reflect.InvocationTargetException ; 29 import java.lang.reflect.Method ; 30 import java.net.URL ; 31 import java.text.MessageFormat ; 32 import java.util.Iterator ; 33 import javax.swing.AbstractAction ; 34 import javax.swing.JComponent ; 35 import javax.swing.SwingUtilities ; 36 import org.netbeans.api.java.classpath.ClassPath; 37 import org.netbeans.api.progress.ProgressHandle; 38 import org.netbeans.api.progress.ProgressHandleFactory; 39 import org.netbeans.api.project.Project; 40 import org.netbeans.api.project.ProjectInformation; 41 import org.netbeans.api.project.ProjectManager; 42 import org.netbeans.api.project.ui.OpenProjects; 43 import org.netbeans.bluej.BluejProject; 44 import org.netbeans.bluej.UpdateHelper; 45 import org.netbeans.spi.java.project.classpath.ProjectClassPathExtender; 46 import org.netbeans.spi.project.support.ant.AntProjectHelper; 47 import org.netbeans.spi.project.support.ant.EditableProperties; 48 import org.openide.DialogDisplayer; 49 import org.openide.WizardDescriptor; 50 import org.openide.filesystems.FileLock; 51 import org.openide.filesystems.FileObject; 52 import org.openide.filesystems.FileUtil; 53 import org.openide.filesystems.URLMapper; 54 import org.openide.util.Lookup; 55 import org.openide.util.NbBundle; 56 import org.openide.util.RequestProcessor; 57 import org.openide.windows.TopComponent; 58 import org.openide.windows.WindowManager; 59 60 public final class ConvertToJ2SEAction extends AbstractAction { 61 62 private BluejProject project; 63 private WizardDescriptor.Panel[] panels; 64 65 public ConvertToJ2SEAction(BluejProject project) { 66 putValue(NAME, getName()); 67 this.project = project; 68 } 69 70 public void actionPerformed(ActionEvent e) { 71 72 final WizardDescriptor wizardDescriptor = new WizardDescriptor(getPanels()); 73 wizardDescriptor.setTitleFormat(new MessageFormat ("{0}")); wizardDescriptor.setTitle(org.openide.util.NbBundle.getMessage(ConvertToJ2SEAction.class, "TITLE_Convert")); 76 Dialog dialog = DialogDisplayer.getDefault().createDialog(wizardDescriptor); 77 dialog.setVisible(true); 78 dialog.toFront(); 79 boolean cancelled = wizardDescriptor.getValue() != WizardDescriptor.FINISH_OPTION; 80 if (!cancelled) { 81 final ProgressHandle handle = ProgressHandleFactory.createHandle(org.openide.util.NbBundle.getMessage(ConvertToJ2SEAction.class, "Progress_Display")); 82 handle.start(10); 83 RequestProcessor.getDefault().post(new Runnable () { 84 public void run() { 85 try { 86 doExport((File )wizardDescriptor.getProperty("NewProjectLocation"), handle); } catch (ClassNotFoundException ex) { 88 ex.printStackTrace(); 89 } catch (InvocationTargetException ex) { 90 ex.printStackTrace(); 91 } catch (IOException ex) { 92 ex.printStackTrace(); 93 } catch (NoSuchMethodException ex) { 94 ex.printStackTrace(); 95 } catch (IllegalAccessException ex) { 96 ex.printStackTrace(); 97 } 98 } 99 }); 100 } 101 } 102 103 104 108 private WizardDescriptor.Panel[] getPanels() { 109 if (panels == null) { 110 panels = new WizardDescriptor.Panel[] { 111 new ExportWizardPanel1(project.getProjectDirectory()) 112 }; 113 String [] steps = new String [panels.length]; 114 for (int i = 0; i < panels.length; i++) { 115 Component c = panels[i].getComponent(); 116 steps[i] = c.getName(); 120 if (c instanceof JComponent ) { JComponent jc = (JComponent ) c; 122 jc.putClientProperty("WizardPanel_contentSelectedIndex", new Integer (i)); jc.putClientProperty("WizardPanel_contentData", steps); jc.putClientProperty("WizardPanel_autoWizardStyle", Boolean.TRUE); jc.putClientProperty("WizardPanel_contentDisplayed", Boolean.TRUE); jc.putClientProperty("WizardPanel_contentNumbered", Boolean.TRUE); } 133 } 134 } 135 return panels; 136 } 137 138 public String getName() { 139 return NbBundle.getMessage(ConvertToJ2SEAction.class, "CTL_ConvertToJ2SEAction"); } 141 142 143 146 private void doExport(File file, ProgressHandle handle) throws IOException , ClassNotFoundException , NoSuchMethodException , IllegalAccessException , InvocationTargetException { 147 if (!file.exists()) { 148 file.mkdirs(); 149 } 150 handle.progress(1); 151 ProjectInformation info = (ProjectInformation)project.getLookup().lookup(ProjectInformation.class); 152 ClassLoader loader = (ClassLoader )Lookup.getDefault().lookup(ClassLoader .class); 153 Class j2seclazz = loader.loadClass("org.netbeans.modules.java.j2seproject.J2SEProjectGenerator"); Method createMethod = j2seclazz.getMethod("createProject", new Class [] { File .class, String .class, String .class, String .class 156 }); 157 createMethod.invoke(null, new Object [] { 158 file, info.getName(), null, null 159 }); 160 handle.progress(5); 161 162 163 FileObject root = FileUtil.toFileObject(file); 164 Project j2seproject = ProjectManager.getDefault().findProject(root); 165 FileObject originRoot = project.getProjectDirectory(); 167 FileObject targetTestRoot = root.getFileObject("test"); FileObject targetSrcRoot = root.getFileObject("src"); splitSources(originRoot, targetSrcRoot, targetTestRoot); 170 handle.progress(7); 171 ClassPath path = ClassPath.getClassPath(project.getProjectDirectory(), ClassPath.COMPILE); 172 ProjectClassPathExtender extender = (ProjectClassPathExtender)j2seproject.getLookup().lookup(ProjectClassPathExtender.class); 173 Iterator it = path.entries().iterator(); 174 FileObject libsFolder = root.getFileObject("libs"); if (it.hasNext() && libsFolder == null) { 176 libsFolder = root.createFolder("libs"); } 178 while (it.hasNext()) { 179 ClassPath.Entry entry = (ClassPath.Entry) it.next(); 180 URL url = FileUtil.getArchiveFile(entry.getURL()); 181 FileObject fo = URLMapper.findFileObject(url); 182 if (fo != null) { 183 if (fo.getName().indexOf("junit") == -1) { FileObject createdOne = FileUtil.copyFile(fo, libsFolder, fo.getName()); 186 extender.addArchiveFile(createdOne); 187 } 188 } 189 } 190 UpdateHelper updateHelper = project.getUpdateHelper(); 192 EditableProperties ep = updateHelper.getProperties (AntProjectHelper.PROJECT_PROPERTIES_PATH); 193 String mainClass = (String )ep.get ("main.class"); 195 if (mainClass != null) { 196 FileObject fo = j2seproject.getProjectDirectory().getFileObject(AntProjectHelper.PROJECT_PROPERTIES_PATH); 197 EditableProperties eds = new EditableProperties(); 198 InputStream instr = null; 199 OutputStream outstr = null; 200 FileLock lock = null; 201 try { 202 instr = fo.getInputStream(); 203 eds.load(instr); 204 instr.close(); 205 instr = null; 206 eds.setProperty("main.class", mainClass); 207 if (ep.getProperty("application.args") != null) { 208 eds.setProperty("application.args", ep.getProperty("application.args")); 209 } 210 if (ep.getProperty("work.dir") != null) { 211 eds.setProperty("work.dir", ep.getProperty("work.dir")); 212 } 213 if (ep.getProperty("run.jvmargs") != null) { 214 eds.setProperty("run.jvmargs", ep.getProperty("run.jvmargs")); 215 } 216 lock = fo.lock(); 217 outstr = fo.getOutputStream(lock); 218 eds.store(outstr); 219 } catch (IOException ex) { 220 221 } finally { 222 if (instr != null) { 223 instr.close(); 224 } 225 if (outstr != null) { 226 outstr.close(); 227 } 228 if (lock != null) { 229 lock.releaseLock(); 230 } 231 } 232 } 233 234 handle.progress(9); 235 OpenProjects.getDefault().open(new Project[] { j2seproject }, false); 236 SwingUtilities.invokeLater(new Runnable () { 237 public void run() { 238 TopComponent tc = WindowManager.getDefault().findTopComponent("projectTabLogical_tc"); if (tc != null) { 240 tc.open(); 241 tc.requestActive(); 242 } 243 } 244 }); 245 handle.finish(); 246 247 } 248 249 private void splitSources(FileObject originRoot, FileObject targetSrcRoot, FileObject targetTestRoot) throws IOException { 250 FileObject[] sourceFOs = originRoot.getChildren(); 251 for (int i = 0; i < sourceFOs.length; i++) { 252 if (sourceFOs[i].isData()) { 253 if ("java".equals(sourceFOs[i].getExt())) { boolean test = sourceFOs[i].getName().endsWith("Test"); FileUtil.copyFile(sourceFOs[i], test ? targetTestRoot : targetSrcRoot, sourceFOs[i].getName()); 256 } 257 } else if (sourceFOs[i].getFileObject("bluej.pkg") != null) { FileObject childTargetSrc = targetSrcRoot.createFolder(sourceFOs[i].getName()); 260 FileObject childTargetTest = targetTestRoot.createFolder(sourceFOs[i].getName()); 261 splitSources(sourceFOs[i], childTargetSrc, childTargetTest); 262 } 263 } 264 } 265 266 267 } 268 | Popular Tags |