blob: f58b00c0e40838b7a6871999a1050d714de8821b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.micronaut.newproject;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collections;
import java.util.NoSuchElementException;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import javax.swing.JComponent;
import javax.swing.event.ChangeListener;
import org.netbeans.api.progress.ProgressHandle;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectManager;
import org.netbeans.api.templates.TemplateRegistration;
import org.netbeans.spi.project.ActionProvider;
import org.netbeans.spi.project.ui.support.ProjectChooser;
import org.openide.WizardDescriptor;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.util.AsyncGUIJob;
import org.openide.util.Exceptions;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
import org.openide.util.Utilities;
/**
* Wizard iterator for Micronaut projects.
*
* @author Dusan Balek
*/
@NbBundle.Messages("MicronautProject_DN=Micronaut Project")
public class MicronautProjectWizardIterator implements WizardDescriptor.ProgressInstantiatingIterator<WizardDescriptor> {
@TemplateRegistration(folder = "Project/Maven2", position = 300, displayName = "#MicronautProject_DN", description = "MicronautMavenProjectDescription.html", iconBase = "org/netbeans/modules/micronaut/resources/micronaut.png")
public static class MavenMicronautProject extends MicronautProjectWizardIterator {
@Override
public void initialize(WizardDescriptor wizard) {
super.initialize(wizard);
wizard.putProperty(BUILD_TOOL, "MAVEN");
}
}
@TemplateRegistration(folder = "Project/Gradle", position = 300, displayName = "#MicronautProject_DN", description = "MicronautGradleProjectDescription.html", iconBase = "org/netbeans/modules/micronaut/resources/micronaut.png")
public static class GradleMicronautProject extends MicronautProjectWizardIterator {
@Override
public void initialize(WizardDescriptor wizard) {
super.initialize(wizard);
wizard.putProperty(BUILD_TOOL, "GRADLE");
}
}
public static final String PROJECT_NAME = "project.name";
public static final String PROJECT_LOCATION = "project.location";
public static final String SERVICE_URL = "service.url";
public static final String MAVEN_GROUP = "maven.group";
public static final String MAVEN_ARTIFACT = "maven.artifact";
public static final String APPLICATION_TYPE = "application.type";
public static final String JAVA_VERSION = "java.version";
public static final String LANGUAGE = "language";
public static final String BUILD_TOOL = "build.tool";
public static final String TEST_FRAMEWORK = "test.framework";
public static final String FEATURES = "features";
private transient int index;
private transient WizardDescriptor.Panel[] panels;
private transient WizardDescriptor wiz;
@Override
public Set instantiate(ProgressHandle handle) throws IOException {
try {
handle.start(4);
String projectName = (String) wiz.getProperty(PROJECT_NAME);
File projFile = FileUtil.normalizeFile((File) wiz.getProperty(PROJECT_LOCATION));
projFile.mkdirs();
handle.progress(1);
InputStream stream = MicronautLaunchService.getInstance().create((String) wiz.getProperty(SERVICE_URL),
(MicronautLaunchService.ApplicationType) wiz.getProperty(APPLICATION_TYPE),
(String) wiz.getProperty(MAVEN_GROUP) + '.' + (String) wiz.getProperty(MAVEN_ARTIFACT),
(String) wiz.getProperty(JAVA_VERSION),
(String) wiz.getProperty(LANGUAGE),
(String) wiz.getProperty(BUILD_TOOL),
(String) wiz.getProperty(TEST_FRAMEWORK),
(Set<MicronautLaunchService.Feature>) wiz.getProperty(FEATURES));
handle.progress(2);
FileObject projDir = FileUtil.toFileObject(projFile);
unzip(stream, projDir, projectName + '/');
handle.progress(3);
ProjectManager.getDefault().clearNonProjectCache();
Project prj = ProjectManager.getDefault().findProject(projDir);
if (prj != null) {
ActionProvider actionProvider = prj.getLookup().lookup(ActionProvider.class);
if (actionProvider != null && actionProvider.isActionEnabled(ActionProvider.COMMAND_PRIME, Lookup.EMPTY)) {
actionProvider.invokeAction(ActionProvider.COMMAND_PRIME, Lookup.EMPTY);
}
}
File parent = projFile.getParentFile();
if (parent != null && parent.exists()) {
ProjectChooser.setProjectsFolder(parent);
}
return Collections.singleton(projDir);
} catch (Exception ex) {
Exceptions.printStackTrace(ex);
} finally {
handle.finish();
}
return Collections.emptySet();
}
@Override
public Set instantiate() throws IOException {
throw new UnsupportedOperationException("Not supported.");
}
@Override
@NbBundle.Messages("LBL_WizardTitle=Micronaut Maven Project")
public void initialize(WizardDescriptor wizard) {
this.wiz = wizard;
wiz.putProperty("NewProjectWizard_Title", Bundle.LBL_WizardTitle()); //NOI18N
index = 0;
panels = new WizardDescriptor.Panel[] {
new NameAndLocationWizardPanel(),
new BasePropertiesWizardPanel(),
new FeaturesWizardPanel()
};
String[] steps = new String[] {
Bundle.LBL_NameAndLocationStep(),
Bundle.LBL_BasePropertiesStep(),
Bundle.LBL_Features()
};
for (int i = 0; i < panels.length; i++) {
JComponent jc = (JComponent) panels[i].getComponent();
jc.putClientProperty(WizardDescriptor.PROP_CONTENT_SELECTED_INDEX, i);
jc.putClientProperty(WizardDescriptor.PROP_CONTENT_DATA, steps);
}
Utilities.attachInitJob(panels[1].getComponent(), (AsyncGUIJob) panels[1].getComponent());
Utilities.attachInitJob(panels[2].getComponent(), (AsyncGUIJob) panels[2].getComponent());
}
@Override
public void uninitialize(WizardDescriptor wizard) {
}
@Override
public WizardDescriptor.Panel<WizardDescriptor> current() {
return panels[index];
}
@Override
@NbBundle.Messages({"# {0} - index", "# {1} - length", "NameFormat={0} of {1}"})
public String name() {
return Bundle.NameFormat(index + 1, panels.length);
}
@Override
public boolean hasNext() {
return index < panels.length - 1;
}
@Override
public boolean hasPrevious() {
return index > 0;
}
@Override
public void nextPanel() {
if (!hasNext()) {
throw new NoSuchElementException();
}
index++;
}
@Override
public void previousPanel() {
if (!hasPrevious()) {
throw new NoSuchElementException();
}
index--;
}
@Override
public void addChangeListener(ChangeListener l) {
}
@Override
public void removeChangeListener(ChangeListener l) {
}
private static void unzip(InputStream stream, FileObject folder, String prefix) throws IOException {
try (ZipInputStream zis = new ZipInputStream(stream)) {
ZipEntry zipEntry;
while ((zipEntry = zis.getNextEntry()) != null) {
String entryName = zipEntry.getName();
if (entryName.startsWith(prefix)) {
entryName = entryName.substring(prefix.length());
}
if (zipEntry.isDirectory()) {
FileUtil.createFolder(folder, entryName);
} else {
FileObject fo = FileUtil.createData(folder, entryName);
try (OutputStream out = fo.getOutputStream()) {
FileUtil.copy(zis, out);
}
}
}
}
}
}