diff --git a/web.client.samples/src/org/netbeans/modules/web/client/samples/AngularJSPhoneCat.java b/web.client.samples/src/org/netbeans/modules/web/client/samples/AngularJSPhoneCat.java --- a/web.client.samples/src/org/netbeans/modules/web/client/samples/AngularJSPhoneCat.java +++ b/web.client.samples/src/org/netbeans/modules/web/client/samples/AngularJSPhoneCat.java @@ -44,7 +44,8 @@ import org.netbeans.api.templates.TemplateRegistration; import org.netbeans.modules.web.client.samples.wizard.iterator.OnlineSampleWizardIterator; -import org.netbeans.modules.web.clientproject.spi.SiteTemplateImplementation; +import org.netbeans.modules.web.client.samples.wizard.iterator.OnlineSiteTemplate; +import org.netbeans.modules.web.clientproject.createprojectapi.CreateProjectProperties; import org.openide.filesystems.FileObject; import org.openide.util.NbBundle; @@ -65,9 +66,8 @@ public class AngularJSPhoneCat extends OnlineSampleWizardIterator { @Override - protected SiteTemplateImplementation getSiteTemplate() { + protected OnlineSiteTemplate getSiteTemplate() { return new AngularJSTemplate( - "ANGULAR-SAMPLE", getProjectName(), getProjectZipURL(), "angular-angular-phonecat-step-11-0-g9aebada.zip"); // NOI18N @@ -85,19 +85,19 @@ private static class AngularJSTemplate extends OnlineSiteTemplate { - public AngularJSTemplate(String id, String name, String url, String zipName) { - super(id, name, url, zipName); + public AngularJSTemplate(String name, String url, String zipName) { + super(name, url, zipName); } @Override - public void configure(SiteTemplateImplementation.ProjectProperties projectProperties) { + public void configure(CreateProjectProperties projectProperties) { projectProperties.setSiteRootFolder("app"); // NOI18N projectProperties.setTestFolder("test"); // NOI18N projectProperties.setConfigFolder("config"); // NOI18N } @Override - protected FileObject getTargetDir(FileObject projectDir, ProjectProperties projectProperties) { + protected FileObject getTargetDir(FileObject projectDir, CreateProjectProperties projectProperties) { return projectDir; } } diff --git a/web.client.samples/src/org/netbeans/modules/web/client/samples/BackboneHelloWorld.java b/web.client.samples/src/org/netbeans/modules/web/client/samples/BackboneHelloWorld.java --- a/web.client.samples/src/org/netbeans/modules/web/client/samples/BackboneHelloWorld.java +++ b/web.client.samples/src/org/netbeans/modules/web/client/samples/BackboneHelloWorld.java @@ -44,7 +44,7 @@ import org.netbeans.api.templates.TemplateRegistration; import org.netbeans.modules.web.client.samples.wizard.iterator.OnlineSampleWizardIterator; -import org.netbeans.modules.web.clientproject.spi.SiteTemplateImplementation; +import org.netbeans.modules.web.client.samples.wizard.iterator.OnlineSiteTemplate; import org.openide.util.NbBundle; /** @@ -64,8 +64,8 @@ public class BackboneHelloWorld extends OnlineSampleWizardIterator { @Override - protected SiteTemplateImplementation getSiteTemplate() { - return new OnlineSiteTemplate("BACKBONE-HELLO-WORLD", getProjectName(), getProjectZipURL(), "hello-backbonejs-gh-pages.zip"); // NOI18N + protected OnlineSiteTemplate getSiteTemplate() { + return new OnlineSiteTemplate(getProjectName(), getProjectZipURL(), "hello-backbonejs-gh-pages.zip"); // NOI18N } @Override diff --git a/web.client.samples/src/org/netbeans/modules/web/client/samples/BackboneJQueryMobile.java b/web.client.samples/src/org/netbeans/modules/web/client/samples/BackboneJQueryMobile.java --- a/web.client.samples/src/org/netbeans/modules/web/client/samples/BackboneJQueryMobile.java +++ b/web.client.samples/src/org/netbeans/modules/web/client/samples/BackboneJQueryMobile.java @@ -44,7 +44,7 @@ import org.netbeans.api.templates.TemplateRegistration; import org.netbeans.modules.web.client.samples.wizard.iterator.OnlineSampleWizardIterator; -import org.netbeans.modules.web.clientproject.spi.SiteTemplateImplementation; +import org.netbeans.modules.web.client.samples.wizard.iterator.OnlineSiteTemplate; import org.openide.util.NbBundle; /** @@ -64,8 +64,8 @@ public class BackboneJQueryMobile extends OnlineSampleWizardIterator { @Override - protected SiteTemplateImplementation getSiteTemplate() { - return new OnlineSiteTemplate("BACKBONE-JQUERY-MOBILE", getProjectName(), getProjectZipURL(), "backbone-jquerymobile-master.zip"); // NOI18N + protected OnlineSiteTemplate getSiteTemplate() { + return new OnlineSiteTemplate(getProjectName(), getProjectZipURL(), "backbone-jquerymobile-master.zip"); // NOI18N } @Override diff --git a/web.client.samples/src/org/netbeans/modules/web/client/samples/BackboneWineCellar.java b/web.client.samples/src/org/netbeans/modules/web/client/samples/BackboneWineCellar.java --- a/web.client.samples/src/org/netbeans/modules/web/client/samples/BackboneWineCellar.java +++ b/web.client.samples/src/org/netbeans/modules/web/client/samples/BackboneWineCellar.java @@ -44,7 +44,8 @@ import org.netbeans.api.templates.TemplateRegistration; import org.netbeans.modules.web.client.samples.wizard.iterator.OnlineSampleWizardIterator; -import org.netbeans.modules.web.clientproject.spi.SiteTemplateImplementation; +import org.netbeans.modules.web.client.samples.wizard.iterator.OnlineSiteTemplate; +import org.netbeans.modules.web.clientproject.createprojectapi.CreateProjectProperties; import org.openide.filesystems.FileObject; import org.openide.util.NbBundle; @@ -65,8 +66,8 @@ public class BackboneWineCellar extends OnlineSampleWizardIterator { @Override - protected SiteTemplateImplementation getSiteTemplate() { - return new BackboneWineCellarTemplate("BACKBONE-WINE-CELLAR", getProjectName(), getProjectZipURL(), "backbone-cellar-master.zip"); // NOI18N + protected OnlineSiteTemplate getSiteTemplate() { + return new BackboneWineCellarTemplate(getProjectName(), getProjectZipURL(), "backbone-cellar-master.zip"); // NOI18N } @Override @@ -81,17 +82,17 @@ private static class BackboneWineCellarTemplate extends OnlineSiteTemplate { - public BackboneWineCellarTemplate(String id, String name, String url, String zipName) { - super(id, name, url, zipName); + public BackboneWineCellarTemplate(String name, String url, String zipName) { + super(name, url, zipName); } @Override - public void configure(SiteTemplateImplementation.ProjectProperties projectProperties) { + public void configure(CreateProjectProperties projectProperties) { projectProperties.setSiteRootFolder("bootstrap"); // NOI18N } @Override - protected FileObject getTargetDir(FileObject projectDir, ProjectProperties projectProperties) { + protected FileObject getTargetDir(FileObject projectDir, CreateProjectProperties projectProperties) { return projectDir; } } diff --git a/web.client.samples/src/org/netbeans/modules/web/client/samples/EmberJSTrek.java b/web.client.samples/src/org/netbeans/modules/web/client/samples/EmberJSTrek.java --- a/web.client.samples/src/org/netbeans/modules/web/client/samples/EmberJSTrek.java +++ b/web.client.samples/src/org/netbeans/modules/web/client/samples/EmberJSTrek.java @@ -44,7 +44,7 @@ import org.netbeans.api.templates.TemplateRegistration; import org.netbeans.modules.web.client.samples.wizard.iterator.OnlineSampleWizardIterator; -import org.netbeans.modules.web.clientproject.spi.SiteTemplateImplementation; +import org.netbeans.modules.web.client.samples.wizard.iterator.OnlineSiteTemplate; import org.openide.util.NbBundle; /** @@ -64,8 +64,8 @@ public class EmberJSTrek extends OnlineSampleWizardIterator { @Override - protected SiteTemplateImplementation getSiteTemplate() { - return new OnlineSiteTemplate("EMBER-JS-TREK", getProjectName(), getProjectZipURL(), "trek-ember-tutorial-master.zip"); // NOI18N + protected OnlineSiteTemplate getSiteTemplate() { + return new OnlineSiteTemplate(getProjectName(), getProjectZipURL(), "trek-ember-tutorial-master.zip"); // NOI18N } @Override diff --git a/web.client.samples/src/org/netbeans/modules/web/client/samples/KnockoutJSGameList.java b/web.client.samples/src/org/netbeans/modules/web/client/samples/KnockoutJSGameList.java --- a/web.client.samples/src/org/netbeans/modules/web/client/samples/KnockoutJSGameList.java +++ b/web.client.samples/src/org/netbeans/modules/web/client/samples/KnockoutJSGameList.java @@ -44,7 +44,8 @@ import org.netbeans.api.templates.TemplateRegistration; import org.netbeans.modules.web.client.samples.wizard.iterator.OnlineSampleWizardIterator; -import org.netbeans.modules.web.clientproject.spi.SiteTemplateImplementation; +import org.netbeans.modules.web.client.samples.wizard.iterator.OnlineSiteTemplate; +import org.netbeans.modules.web.clientproject.createprojectapi.CreateProjectProperties; import org.openide.filesystems.FileObject; import org.openide.util.NbBundle; @@ -65,8 +66,8 @@ public class KnockoutJSGameList extends OnlineSampleWizardIterator { @Override - protected SiteTemplateImplementation getSiteTemplate() { - return new KnockoutJSGameListTemplate("KNOCKOUT-JS-GAME-LIST", getProjectName(), getProjectZipURL(), "KnockoutJS.Tips-master.zip"); // NOI18N + protected OnlineSiteTemplate getSiteTemplate() { + return new KnockoutJSGameListTemplate(getProjectName(), getProjectZipURL(), "KnockoutJS.Tips-master.zip"); // NOI18N } @Override @@ -86,17 +87,17 @@ private static class KnockoutJSGameListTemplate extends OnlineSiteTemplate { - public KnockoutJSGameListTemplate(String id, String name, String url, String zipName) { - super(id, name, url, zipName); + public KnockoutJSGameListTemplate(String name, String url, String zipName) { + super(name, url, zipName); } @Override - public void configure(SiteTemplateImplementation.ProjectProperties projectProperties) { + public void configure(CreateProjectProperties projectProperties) { projectProperties.setSiteRootFolder("src"); // NOI18N } @Override - protected FileObject getTargetDir(FileObject projectDir, SiteTemplateImplementation.ProjectProperties projectProperties) { + protected FileObject getTargetDir(FileObject projectDir, CreateProjectProperties projectProperties) { return projectDir; } } diff --git a/web.client.samples/src/org/netbeans/modules/web/client/samples/wizard/iterator/OnlineSampleWizardIterator.java b/web.client.samples/src/org/netbeans/modules/web/client/samples/wizard/iterator/OnlineSampleWizardIterator.java --- a/web.client.samples/src/org/netbeans/modules/web/client/samples/wizard/iterator/OnlineSampleWizardIterator.java +++ b/web.client.samples/src/org/netbeans/modules/web/client/samples/wizard/iterator/OnlineSampleWizardIterator.java @@ -48,22 +48,11 @@ import java.util.LinkedHashSet; import java.util.Set; import org.netbeans.api.progress.ProgressHandle; -import org.netbeans.api.project.FileOwnerQuery; -import org.netbeans.api.project.ProjectManager; +import org.netbeans.api.project.Project; import org.netbeans.modules.web.client.samples.wizard.WizardConstants; import org.netbeans.modules.web.client.samples.wizard.ui.OnlineSamplePanel; -import org.netbeans.modules.web.clientproject.ClientSideProject; -import org.netbeans.modules.web.clientproject.ClientSideProjectConstants; -import org.netbeans.modules.web.clientproject.ClientSideProjectType; -import org.netbeans.modules.web.clientproject.sites.OnlineSites; -import org.netbeans.modules.web.clientproject.sites.SiteHelper; -import org.netbeans.modules.web.clientproject.spi.ClientProjectExtender; -import org.netbeans.modules.web.clientproject.spi.SiteTemplateImplementation; -import org.netbeans.modules.web.clientproject.spi.SiteTemplateImplementation.ProjectProperties; -import org.netbeans.modules.web.clientproject.util.ClientSideProjectUtilities; -import org.netbeans.spi.project.support.ant.AntProjectHelper; -import org.netbeans.spi.project.support.ant.EditableProperties; -import org.netbeans.spi.project.support.ant.ProjectGenerator; +import org.netbeans.modules.web.clientproject.createprojectapi.ClientSideProjectGenerator; +import org.netbeans.modules.web.clientproject.createprojectapi.CreateProjectProperties; import org.netbeans.spi.project.ui.support.ProjectChooser; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; @@ -71,11 +60,7 @@ import org.openide.WizardDescriptor.Panel; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; -import org.openide.util.Lookup; import org.openide.util.NbBundle; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; /** * @@ -89,23 +74,11 @@ protected OnlineSampleWizardIterator() { } - protected abstract SiteTemplateImplementation getSiteTemplate(); + protected abstract OnlineSiteTemplate getSiteTemplate(); protected abstract String getProjectName(); protected abstract String getProjectZipURL(); - public static class OnlineSiteTemplate extends OnlineSites { - - public OnlineSiteTemplate(String id, String name, String url, String zipName) { - this(id, name, "", url, zipName); // NOI18N - } - - public OnlineSiteTemplate(String id, String name, String description, String url, String zipName) { - super(id, name, description, url, new File(SiteHelper.getJsLibsDirectory(), zipName)); - } - } - - @Override protected Panel[] createPanels(WizardDescriptor wizard) { wizard.putProperty(WizardConstants.SAMPLE_PROJECT_NAME, getProjectName()); @@ -132,7 +105,8 @@ */ @NbBundle.Messages({ - "OnlineSampleWizardIterator.creatingProject=Creating project..." + "OnlineSampleWizardIterator.creatingProject=Creating project...", + "OnlineSampleWizardIterator.applyingTemplate=Applying template..." }) @Override public Set instantiate(ProgressHandle handle) throws IOException { @@ -148,23 +122,28 @@ } final FileObject projectDirFO = FileUtil.toFileObject(projectDir); - AntProjectHelper projectHelper = ProjectGenerator.createProject(projectDirFO, ClientSideProjectType.TYPE); - setProjectName(projectHelper, name); + CreateProjectProperties props = new CreateProjectProperties(); + props.setProjectDir(projectDirFO); + props.setProjectName(name); + + OnlineSiteTemplate siteTemplate = getSiteTemplate(); + if (siteTemplate != null) { + siteTemplate.configure(props); + } + + Project project = ClientSideProjectGenerator.createProject(props); // Always open top dir as a project: files.add(projectDirFO); - ClientSideProject project = (ClientSideProject) FileOwnerQuery.getOwner(projectHelper.getProjectDirectory()); + if (siteTemplate != null) { + handle.progress(Bundle.OnlineSampleWizardIterator_applyingTemplate()); + applySiteTemplate(project.getProjectDirectory(), props, siteTemplate, handle); + } - // Setting start file - EditableProperties properties = projectHelper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); - properties.put(ClientSideProjectConstants.PROJECT_START_FILE, getStartFile()); - projectHelper.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, properties); - - FileObject siteRoot = instantiate(handle, descriptor, project); - - // start file - FileObject startFile = siteRoot.getFileObject(getStartFile()); // NOI18N + FileObject siteRoot = project.getProjectDirectory().getFileObject(props.getSiteRootFolder()); + assert siteRoot != null; + FileObject startFile = siteRoot.getFileObject(getStartFile()); if (startFile != null) { files.add(startFile); } @@ -182,87 +161,20 @@ return "index.html"; } - private void setProjectName(final AntProjectHelper projectHelper, final String name) { - ProjectManager.mutex().writeAccess(new Runnable() { - @Override - public void run() { - Element data = projectHelper.getPrimaryConfigurationData(true); - Document document = data.getOwnerDocument(); - NodeList nameList = data.getElementsByTagNameNS(ClientSideProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); // NOI18N - Element nameElement; - if (nameList.getLength() == 1) { - nameElement = (Element) nameList.item(0); - NodeList deadKids = nameElement.getChildNodes(); - while (deadKids.getLength() > 0) { - nameElement.removeChild(deadKids.item(0)); - } - } else { - nameElement = document.createElementNS(ClientSideProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); // NOI18N - data.insertBefore(nameElement, data.getChildNodes().item(0)); - } - nameElement.appendChild(document.createTextNode(name)); - projectHelper.putPrimaryConfigurationData(data, true); - } - }); - } - - @NbBundle.Messages({ - "OnlineSampleWizardIterator.applyingTemplate=Applying template..." - }) - private FileObject instantiate(ProgressHandle handle, WizardDescriptor wizardDescriptor, ClientSideProject project) throws IOException { - AntProjectHelper projectHelper = project.getProjectHelper(); - SiteTemplateImplementation siteTemplate = getSiteTemplate(); - - ProjectProperties projectProperties = new ProjectProperties(); - projectProperties.setSiteRootFolder(ClientSideProjectConstants.DEFAULT_SITE_ROOT_FOLDER); - projectProperties.setTestFolder(ClientSideProjectConstants.DEFAULT_TEST_FOLDER); - projectProperties.setConfigFolder(ClientSideProjectConstants.DEFAULT_CONFIG_FOLDER); - - if (siteTemplate != null) { - siteTemplate.configure(projectProperties); - initProject(project, projectProperties); - - handle.progress(Bundle.OnlineSampleWizardIterator_applyingTemplate()); - applySiteTemplate(projectHelper.getProjectDirectory(), projectProperties, siteTemplate, handle); - } else { - // init standard project - initProject(project, projectProperties); - } - - // get application dir: - FileObject siteRootDir = project.getSiteRootFolder(); - assert siteRootDir != null; - - // apply extenders - //no extenders for online samples -// for (ClientProjectExtender extender : Lookup.getDefault().lookupAll(ClientProjectExtender.class)) { -// extender.apply(project.getProjectDirectory(), siteRootDir, (String) wizardDescriptor.getProperty(LIBRARIES_PATH)); -// } - - return siteRootDir; - } - - private void initProject(ClientSideProject project, SiteTemplateImplementation.ProjectProperties properties) throws IOException { - ClientSideProjectUtilities.initializeProject(project, - properties.getSiteRootFolder(), - properties.getTestFolder(), - properties.getConfigFolder()); - } - @NbBundle.Messages({ "# {0} - template name", "OnlineSampleWizardIterator.error.applyingSiteTemplate=Cannot apply template \"{0}\"." }) private void applySiteTemplate( final FileObject projectDir, - final SiteTemplateImplementation.ProjectProperties projectProperties, - final SiteTemplateImplementation siteTemplate, + final CreateProjectProperties props, + final OnlineSiteTemplate siteTemplate, final ProgressHandle handle) { assert !EventQueue.isDispatchThread(); final String templateName = siteTemplate.getName(); try { - siteTemplate.apply(projectDir, projectProperties, handle); + siteTemplate.apply(projectDir, props, handle); } catch (IOException ex) { errorOccured(Bundle.OnlineSampleWizardIterator_error_applyingSiteTemplate(templateName)); } diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/sites/OnlineSites.java b/web.client.samples/src/org/netbeans/modules/web/client/samples/wizard/iterator/OnlineSiteTemplate.java copy from web.clientproject/src/org/netbeans/modules/web/clientproject/sites/OnlineSites.java copy to web.client.samples/src/org/netbeans/modules/web/client/samples/wizard/iterator/OnlineSiteTemplate.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/sites/OnlineSites.java +++ b/web.client.samples/src/org/netbeans/modules/web/client/samples/wizard/iterator/OnlineSiteTemplate.java @@ -39,75 +39,52 @@ * * Portions Copyrighted 2012 Sun Microsystems, Inc. */ -package org.netbeans.modules.web.clientproject.sites; +package org.netbeans.modules.web.client.samples.wizard.iterator; +import org.netbeans.modules.web.clientproject.api.sites.SiteHelper; import java.awt.EventQueue; import java.io.File; import java.io.IOException; -import java.util.Collection; import java.util.logging.Logger; import org.netbeans.api.progress.ProgressHandle; -import org.netbeans.modules.web.clientproject.spi.SiteTemplateImplementation; -import org.netbeans.modules.web.clientproject.util.FileUtilities; +import org.netbeans.modules.web.clientproject.api.network.NetworkException; +import org.netbeans.modules.web.clientproject.api.network.NetworkSupport; +import org.netbeans.modules.web.clientproject.createprojectapi.CreateProjectProperties; import org.openide.filesystems.FileObject; -import org.openide.util.NbBundle; -import org.openide.util.lookup.ServiceProvider; -public abstract class OnlineSites implements SiteTemplateImplementation { +public class OnlineSiteTemplate { - private static final Logger LOGGER = Logger.getLogger(OnlineSites.class.getName()); + private static final Logger LOGGER = Logger.getLogger(OnlineSiteTemplate.class.getName()); private final String name; private final String url; private final File libFile; - private final String description; - private final String id; - - - protected OnlineSites(String id, String name, String description, String url, File libFile) { - this.id = id; + public OnlineSiteTemplate(String name, String url, String zipName) { this.name = name; - this.description = description; this.url = url; - this.libFile = libFile; + this.libFile = new File(SiteHelper.getJsLibsDirectory(), zipName); } - @Override - public String getId() { - return id; - } - - @Override public String getName() { return name; } - @Override - public String getDescription() { - return description; - } - - @Override public boolean isPrepared() { return libFile.isFile(); } - @Override - public void prepare() throws IOException { + public void prepare() throws NetworkException, IOException, InterruptedException { assert !EventQueue.isDispatchThread(); assert !isPrepared(); - SiteHelper.download(url, libFile, null); + NetworkSupport.download(url, libFile); } - @Override - public void configure(ProjectProperties projectProperties) { - // noop by default + public void configure(CreateProjectProperties projectProperties) { } - @Override - public final void apply(FileObject projectDir, ProjectProperties projectProperties, ProgressHandle handle) throws IOException { + public final void apply(FileObject projectDir, CreateProjectProperties projectProperties, ProgressHandle handle) throws IOException { assert !EventQueue.isDispatchThread(); if (!isPrepared()) { // not correctly prepared, user has to know about it already @@ -117,125 +94,8 @@ SiteHelper.unzipProjectTemplate(getTargetDir(projectDir, projectProperties), libFile, handle); } - protected FileObject getTargetDir(FileObject projectDir, ProjectProperties projectProperties) { + protected FileObject getTargetDir(FileObject projectDir, CreateProjectProperties projectProperties) { // by default, extract template to site root return projectDir.getFileObject(projectProperties.getSiteRootFolder()); } - - @Override - public Collection supportedLibraries() { - return SiteHelper.stripRootFolder(FileUtilities.listJsFilesFromZipFile(libFile)); - } - - //~ Inner classes - - @ServiceProvider(service=SiteTemplateImplementation.class, position=150) - public static class SiteAngularJsSeed extends OnlineSites { - - private static final String SITE_ROOT_FOLDER = "app"; // NOI18N - private static final String TEST_FOLDER = "test"; // NOI18N - private static final String CONFIG_FOLDER = "config"; // NOI18N - - - @NbBundle.Messages({"SiteAngularJsSeed.name=AngularJS Seed", - "SiteAngularJsSeed.description=Site template for AngularJS projects."}) - public SiteAngularJsSeed() { - super("ANGULAR", Bundle.SiteAngularJsSeed_name(), Bundle.SiteAngularJsSeed_description(), // NOI18N - "https://github.com/angular/angular-seed/zipball/master", // NOI18N - new File(SiteHelper.getJsLibsDirectory(), "angularjs-seed.zip")); // NOI18N - } - - @Override - public void configure(ProjectProperties projectProperties) { - projectProperties.setSiteRootFolder(SITE_ROOT_FOLDER) - .setTestFolder(TEST_FOLDER) - .setConfigFolder(CONFIG_FOLDER); - } - - @Override - protected FileObject getTargetDir(FileObject projectDir, ProjectProperties projectProperties) { - return projectDir; - } - - } - - @NbBundle.Messages("SiteInitializr.description=Site template from initializr.com.") - @ServiceProvider(service=SiteTemplateImplementation.class, position=200) - public static class BootstrapSiteInitializr extends OnlineSites { - - @NbBundle.Messages("BootstrapSiteInitializr.name=Initializr: Bootstrap") - public BootstrapSiteInitializr() { - super("BOOTSTRAP", Bundle.BootstrapSiteInitializr_name(), // NOI18N - Bundle.SiteInitializr_description(), - "http://www.initializr.com/builder?boot-hero&jquerydev&h5bp-iecond&h5bp-chromeframe&h5bp-analytics&h5bp-favicon&h5bp-appletouchicons&modernizrrespond&izr-emptyscript&boot-css&boot-scripts", // NOI18N - new File(SiteHelper.getJsLibsDirectory(), "initializr-bootstrap-latest.zip")); // NOI18N - } - - } - - @ServiceProvider(service=SiteTemplateImplementation.class, position=210) - public static class ClassicSiteInitializr extends OnlineSites { - - @NbBundle.Messages("ClassicSiteInitializr.name=Initializr: Classic") - public ClassicSiteInitializr() { - super("INIT.CLASSIC", Bundle.ClassicSiteInitializr_name(), // NOI18N - Bundle.SiteInitializr_description(), - "http://www.initializr.com/builder?h5bp-content&modernizr&jquerydev&h5bp-iecond&h5bp-chromeframe&h5bp-analytics&h5bp-htaccess&h5bp-favicon&h5bp-appletouchicons&h5bp-scripts&h5bp-robots&h5bp-humans&h5bp-404&h5bp-adobecrossdomain&h5bp-css&h5bp-csshelpers&h5bp-mediaqueryprint&h5bp-mediaqueries", // NOI18N - new File(SiteHelper.getJsLibsDirectory(), "initializr-classic-latest.zip")); // NOI18N - } - - } - - @ServiceProvider(service=SiteTemplateImplementation.class, position=220) - public static class ResponsiveSiteInitializr extends OnlineSites { - - @NbBundle.Messages("ResponsiveSiteInitializr.name=Initializr: Responsive") - public ResponsiveSiteInitializr() { - super("INIT.RESP", Bundle.ResponsiveSiteInitializr_name(), // NOI18N - Bundle.SiteInitializr_description(), - "http://www.initializr.com/builder?izr-responsive&jquerydev&h5bp-iecond&h5bp-chromeframe&h5bp-analytics&h5bp-favicon&h5bp-appletouchicons&modernizrrespond&h5bp-css&h5bp-csshelpers&h5bp-mediaqueryprint&izr-emptyscript", // NOI18N - new File(SiteHelper.getJsLibsDirectory(), "initializr-responsive-latest.zip")); // NOI18N - } - - } - - @ServiceProvider(service=SiteTemplateImplementation.class, position=300) - public static class SiteHtml5BoilerplateV4 extends OnlineSites { - - @NbBundle.Messages({"SiteHtml5BoilerplateV4.name=HTML5 Boilerplate v4.0.0", - "SiteHtml5BoilerplateV4.description=Site template from html5boilerplate.com. Version: 4.0.0"}) - public SiteHtml5BoilerplateV4() { - super("INIT.BOILER4", Bundle.SiteHtml5BoilerplateV4_name(), Bundle.SiteHtml5BoilerplateV4_description(), // NOI18N - "https://github.com/h5bp/html5-boilerplate/zipball/v4.0.0", // NOI18N - new File(SiteHelper.getJsLibsDirectory(), "html5-boilerplate-400.zip")); // NOI18N - } - - } - - @ServiceProvider(service=SiteTemplateImplementation.class, position=320) - public static class SiteHtml5BoilerplateV3 extends OnlineSites { - - @NbBundle.Messages({"SiteHtml5Boilerplate.name=HTML5 Boilerplate v3.0.2", - "SiteHtml5Boilerplate.description=Site template from html5boilerplate.com. Version: 3.0.2"}) - public SiteHtml5BoilerplateV3() { - super("INIT.BOILER3", Bundle.SiteHtml5Boilerplate_name(), Bundle.SiteHtml5Boilerplate_description(), // NOI18N - "https://github.com/h5bp/html5-boilerplate/zipball/v3.0.2", // NOI18N - new File(SiteHelper.getJsLibsDirectory(), "html5-boilerplate-302.zip")); // NOI18N - } - - } - - @ServiceProvider(service=SiteTemplateImplementation.class, position=400) - public static class SiteTwitterBootstrap extends OnlineSites { - - @NbBundle.Messages({"SiteTwitterBootstrap.name=Twitter Bootstrap", - "SiteTwitterBootstrap.description=Site template from twitter.github.com/bootstrap"}) - public SiteTwitterBootstrap() { - super("TWITTER", Bundle.SiteTwitterBootstrap_name(), Bundle.SiteTwitterBootstrap_description(), // NOI18N - "http://twitter.github.com/bootstrap/assets/bootstrap.zip", // NOI18N - new File(SiteHelper.getJsLibsDirectory(), "twitter-bootstrap.zip")); // NOI18N - } - - } - } diff --git a/web.client.samples/src/org/netbeans/modules/web/client/samples/wizard/iterator/SampleWizardIterator.java b/web.client.samples/src/org/netbeans/modules/web/client/samples/wizard/iterator/SampleWizardIterator.java --- a/web.client.samples/src/org/netbeans/modules/web/client/samples/wizard/iterator/SampleWizardIterator.java +++ b/web.client.samples/src/org/netbeans/modules/web/client/samples/wizard/iterator/SampleWizardIterator.java @@ -44,7 +44,6 @@ import java.io.BufferedReader; import java.io.FileInputStream; -import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; diff --git a/web.client.samples/src/org/netbeans/modules/web/client/samples/wizard/ui/OnlineSampleVisualPanel.java b/web.client.samples/src/org/netbeans/modules/web/client/samples/wizard/ui/OnlineSampleVisualPanel.java --- a/web.client.samples/src/org/netbeans/modules/web/client/samples/wizard/ui/OnlineSampleVisualPanel.java +++ b/web.client.samples/src/org/netbeans/modules/web/client/samples/wizard/ui/OnlineSampleVisualPanel.java @@ -53,14 +53,15 @@ import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandleFactory; import org.netbeans.modules.web.client.samples.wizard.WizardConstants; +import org.netbeans.modules.web.client.samples.wizard.iterator.OnlineSiteTemplate; import org.netbeans.modules.web.clientproject.api.network.NetworkException; import org.netbeans.modules.web.clientproject.api.network.NetworkSupport; -import org.netbeans.modules.web.clientproject.spi.SiteTemplateImplementation; -import org.netbeans.modules.web.clientproject.util.ValidationUtilities; +import org.netbeans.modules.web.clientproject.api.util.ValidationUtilities; import org.netbeans.spi.project.ui.support.ProjectChooser; import org.openide.WizardDescriptor; import org.openide.filesystems.FileChooserBuilder; import org.openide.filesystems.FileUtil; +import org.openide.util.Exceptions; import org.openide.util.NbBundle; /** @@ -184,7 +185,7 @@ public String prepareTemplate() { assert !EventQueue.isDispatchThread(); - final SiteTemplateImplementation siteTemplate = (SiteTemplateImplementation) descriptor.getProperty(WizardConstants.SAMPLE_TEMPLATE); + final OnlineSiteTemplate siteTemplate = (OnlineSiteTemplate) descriptor.getProperty(WizardConstants.SAMPLE_TEMPLATE); final String templateName = siteTemplate.getName(); if (siteTemplate.isPrepared()) { @@ -202,6 +203,8 @@ if (!NetworkSupport.showNetworkErrorDialog(ex.getFailedRequests())) { return Bundle.SiteTemplateWizard_error_preparing(templateName); } + } catch (InterruptedException ex) { + return Bundle.SiteTemplateWizard_error_preparing(templateName); } } } catch (IOException ex) { diff --git a/web.clientproject.api/manifest.mf b/web.clientproject.api/manifest.mf --- a/web.clientproject.api/manifest.mf +++ b/web.clientproject.api/manifest.mf @@ -1,5 +1,5 @@ Manifest-Version: 1.0 OpenIDE-Module: org.netbeans.modules.web.clientproject.api OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/web/clientproject/api/Bundle.properties -OpenIDE-Module-Specification-Version: 1.36 +OpenIDE-Module-Specification-Version: 1.37 diff --git a/web.clientproject.api/nbproject/project.xml b/web.clientproject.api/nbproject/project.xml --- a/web.clientproject.api/nbproject/project.xml +++ b/web.clientproject.api/nbproject/project.xml @@ -208,6 +208,7 @@ org.netbeans.modules.web.clientproject.api.network org.netbeans.modules.web.clientproject.api.util org.netbeans.modules.web.clientproject.api.validation + org.netbeans.modules.web.clientproject.api.sites org.netbeans.modules.web.clientproject.spi org.netbeans.modules.web.clientproject.spi.platform diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/sites/SiteHelper.java b/web.clientproject.api/src/org/netbeans/modules/web/clientproject/api/sites/SiteHelper.java rename from web.clientproject/src/org/netbeans/modules/web/clientproject/sites/SiteHelper.java rename to web.clientproject.api/src/org/netbeans/modules/web/clientproject/api/sites/SiteHelper.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/sites/SiteHelper.java +++ b/web.clientproject.api/src/org/netbeans/modules/web/clientproject/api/sites/SiteHelper.java @@ -39,7 +39,7 @@ * * Portions Copyrighted 2012 Sun Microsystems, Inc. */ -package org.netbeans.modules.web.clientproject.sites; +package org.netbeans.modules.web.clientproject.api.sites; import java.awt.EventQueue; import java.io.File; diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/util/ValidationUtilities.java b/web.clientproject.api/src/org/netbeans/modules/web/clientproject/api/util/ValidationUtilities.java rename from web.clientproject/src/org/netbeans/modules/web/clientproject/util/ValidationUtilities.java rename to web.clientproject.api/src/org/netbeans/modules/web/clientproject/api/util/ValidationUtilities.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/util/ValidationUtilities.java +++ b/web.clientproject.api/src/org/netbeans/modules/web/clientproject/api/util/ValidationUtilities.java @@ -39,7 +39,7 @@ * * Portions Copyrighted 2012 Sun Microsystems, Inc. */ -package org.netbeans.modules.web.clientproject.util; +package org.netbeans.modules.web.clientproject.api.util; import java.io.File; diff --git a/web.clientproject/nbproject/project.xml b/web.clientproject/nbproject/project.xml --- a/web.clientproject/nbproject/project.xml +++ b/web.clientproject/nbproject/project.xml @@ -300,11 +300,7 @@ org.netbeans.modules.web.client.samples - org.netbeans.modules.web.clientproject - org.netbeans.modules.web.clientproject.sites - org.netbeans.modules.web.clientproject.util - + org.netbeans.modules.web.clientproject.createprojectapi diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/createprojectapi/ClientSideProjectGenerator.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/createprojectapi/ClientSideProjectGenerator.java new file mode 100644 --- /dev/null +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/createprojectapi/ClientSideProjectGenerator.java @@ -0,0 +1,89 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Contributor(s): + * + * Portions Copyrighted 2013 Sun Microsystems, Inc. + */ +package org.netbeans.modules.web.clientproject.createprojectapi; + +import java.io.IOException; +import org.netbeans.api.annotations.common.NonNull; +import org.netbeans.api.project.FileOwnerQuery; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ProjectManager; +import org.netbeans.modules.web.clientproject.ClientSideProject; +import org.netbeans.modules.web.clientproject.spi.SiteTemplateImplementation.ProjectProperties; +import org.netbeans.modules.web.clientproject.util.ClientSideProjectUtilities; +import org.netbeans.spi.project.support.ant.AntProjectHelper; +import org.openide.util.Parameters; + +public final class ClientSideProjectGenerator { + + private ClientSideProjectGenerator() { + } + + /** + * Creates a new empty Web Client Side project according to the given {@link ProjectProperties}. + * + * @param properties used for project setup + * @return project + * @throws IOException in case something went wrong + */ + @NonNull + public static Project createProject(@NonNull CreateProjectProperties properties) throws IOException { + Parameters.notNull("properties", properties); + + AntProjectHelper h = ClientSideProjectUtilities.setupProject(properties.getProjectDir(), properties.getProjectName()); + + ProjectManager.getDefault().clearNonProjectCache(); + Project project = FileOwnerQuery.getOwner(h.getProjectDirectory()); + assert project != null; + + ClientSideProject clientSideProject = project.getLookup().lookup(ClientSideProject.class); + if (clientSideProject == null) { + throw new IllegalStateException("HTML5 project needed but found " + project.getClass().getName()); //NOI18N + } + + ClientSideProjectUtilities.initializeProject(clientSideProject, + properties.getSiteRootFolder(), + properties.getTestFolder(), + properties.getConfigFolder()); + return project; + } + +} diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/createprojectapi/CreateProjectProperties.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/createprojectapi/CreateProjectProperties.java new file mode 100644 --- /dev/null +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/createprojectapi/CreateProjectProperties.java @@ -0,0 +1,185 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Contributor(s): + * + * Portions Copyrighted 2013 Sun Microsystems, Inc. + */ +package org.netbeans.modules.web.clientproject.createprojectapi; + +import org.netbeans.api.annotations.common.CheckForNull; +import org.netbeans.api.annotations.common.NonNull; +import org.netbeans.api.annotations.common.NullAllowed; +import org.netbeans.modules.web.clientproject.ClientSideProjectConstants; +import org.openide.filesystems.FileObject; +import org.openide.util.Parameters; + +public final class CreateProjectProperties { + + private FileObject projectDir; + private String projectName; + private String siteRootFolder; + private String testFolder; + private String configFolder; + + public CreateProjectProperties() { + setSiteRootFolder(ClientSideProjectConstants.DEFAULT_SITE_ROOT_FOLDER); + setTestFolder(ClientSideProjectConstants.DEFAULT_TEST_FOLDER); + setConfigFolder(ClientSideProjectConstants.DEFAULT_CONFIG_FOLDER); + } + + /** + * Get project directory, usually relative path. + * + * @return project directory, usually relative path; never returns + * {@code null} or empty string + */ + @NonNull + public FileObject getProjectDir() { + return projectDir; + } + + /** + * Set project directory, never {@code null}. + * + * @param projectDir project directory, never {@code null} + * @return itself + */ + @NonNull + public CreateProjectProperties setProjectDir(@NonNull FileObject projectDir) { + Parameters.notNull("projectDir", projectDir); + this.projectDir = projectDir; + return this; + } + + /** + * Get project name. + * + * @return project name; never returns {@code null} or empty string + */ + @NonNull + public String getProjectName() { + return projectName; + } + + /** + * Set project name, never {@code null} or empty string. + * + * @param projectName project name, never {@code null} or empty string + * @return itself + */ + @NonNull + public CreateProjectProperties setProjectName(@NonNull String projectName) { + Parameters.notEmpty("projectName", projectName); + this.projectName = projectName; + return this; + } + + /** + * Get Site Root folder, usually relative path. + * + * @return Site Root folder, usually relative path; never returns + * {@code null} or empty string + */ + @NonNull + public String getSiteRootFolder() { + return siteRootFolder; + } + + /** + * Set Site Root folder, never {@code null} or empty string. + * + * @param siteRootFolder Site Root folder, never {@code null} or empty + * string + * @return itself + */ + @NonNull + public CreateProjectProperties setSiteRootFolder(@NonNull String siteRootFolder) { + Parameters.notEmpty("siteRootFolder", siteRootFolder); + this.siteRootFolder = siteRootFolder; + return this; + } + + /** + * Get Test folder, usually relative path. + * + * @return Test folder, usually relative path; can be {@code null} if no + * Test folder is present + */ + @CheckForNull + public String getTestFolder() { + return testFolder; + } + + /** + * Set Test folder, can be {@code null} if there are no tests available. + * + * @param testFolder Test folder, can be {@code null} if there is no test folder + * available + * @return itself + */ + @NonNull + public CreateProjectProperties setTestFolder(@NullAllowed String testFolder) { + Parameters.notEmpty("testFolder", testFolder); + this.testFolder = testFolder; + return this; + } + + /** + * Get Config folder, usually relative path. + * + * @return Config folder, usually relative path; can be {@code null} if no + * Config folder is present + */ + @CheckForNull + public String getConfigFolder() { + return configFolder; + } + + /** + * Set Config folder, can be {@code null} if there is no config available. + * + * @param configFolder Config folder, can be {@code null} if there is no + * config available + * @return itself + */ + @NonNull + public CreateProjectProperties setConfigFolder(@NullAllowed String configFolder) { + this.configFolder = configFolder; + return this; + } +} diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/sites/OnlineSites.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/sites/OnlineSites.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/sites/OnlineSites.java +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/sites/OnlineSites.java @@ -41,6 +41,7 @@ */ package org.netbeans.modules.web.clientproject.sites; +import org.netbeans.modules.web.clientproject.api.sites.SiteHelper; import java.awt.EventQueue; import java.io.File; import java.io.IOException; diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/sites/SiteMobileBoilerplate.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/sites/SiteMobileBoilerplate.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/sites/SiteMobileBoilerplate.java +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/sites/SiteMobileBoilerplate.java @@ -41,6 +41,7 @@ */ package org.netbeans.modules.web.clientproject.sites; +import org.netbeans.modules.web.clientproject.api.sites.SiteHelper; import java.awt.EventQueue; import java.io.File; import java.io.IOException; diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/sites/SiteZip.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/sites/SiteZip.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/sites/SiteZip.java +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/sites/SiteZip.java @@ -41,6 +41,7 @@ */ package org.netbeans.modules.web.clientproject.sites; +import org.netbeans.modules.web.clientproject.api.sites.SiteHelper; import java.awt.EventQueue; import java.io.File; import java.io.IOException; diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/wizard/ExistingClientSideProject.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/wizard/ExistingClientSideProject.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/wizard/ExistingClientSideProject.java +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/wizard/ExistingClientSideProject.java @@ -58,7 +58,7 @@ import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.netbeans.modules.web.clientproject.util.ClientSideProjectUtilities; -import org.netbeans.modules.web.clientproject.util.ValidationUtilities; +import org.netbeans.modules.web.clientproject.api.util.ValidationUtilities; import org.openide.awt.Mnemonics; import org.openide.filesystems.FileChooserBuilder; import org.openide.filesystems.FileUtil; diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/wizard/NewClientSideProject.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/wizard/NewClientSideProject.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/wizard/NewClientSideProject.java +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/wizard/NewClientSideProject.java @@ -47,7 +47,7 @@ import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.netbeans.modules.web.clientproject.util.ClientSideProjectUtilities; -import org.netbeans.modules.web.clientproject.util.ValidationUtilities; +import org.netbeans.modules.web.clientproject.api.util.ValidationUtilities; import org.netbeans.spi.project.ui.support.ProjectChooser; import org.openide.filesystems.FileChooserBuilder; import org.openide.filesystems.FileUtil;