/*
* Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file 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 com.amazonaws.eclipse.lambda.project.wizard;
import static com.amazonaws.eclipse.core.util.JavaProjectUtils.setDefaultJreToProjectClasspath;
import java.io.File;
import java.net.MalformedURLException;
import org.apache.maven.model.Model;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.m2e.core.ui.internal.UpdateMavenProjectJob;
import com.amazonaws.eclipse.core.maven.MavenFactory;
import com.amazonaws.eclipse.core.model.MavenConfigurationDataModel;
import com.amazonaws.eclipse.core.plugin.AbstractAwsPlugin;
import com.amazonaws.eclipse.core.plugin.AbstractAwsProjectWizard;
import com.amazonaws.eclipse.core.util.WorkbenchUtils;
import com.amazonaws.eclipse.core.validator.JavaPackageName;
import com.amazonaws.eclipse.lambda.LambdaAnalytics;
import com.amazonaws.eclipse.lambda.LambdaPlugin;
import com.amazonaws.eclipse.lambda.project.wizard.model.LambdaFunctionWizardDataModel;
import com.amazonaws.eclipse.lambda.project.wizard.page.NewLambdaJavaFunctionProjectWizardPageOne;
import com.amazonaws.eclipse.lambda.project.wizard.util.FunctionProjectUtil;
public class NewLambdaJavaFunctionProjectWizard extends AbstractAwsProjectWizard {
private static final String DEFAULT_GROUP_ID = "com.amazonaws.lambda";
private static final String DEFAULT_ARTIFACT_ID = "demo";
private final LambdaFunctionWizardDataModel dataModel = new LambdaFunctionWizardDataModel();
private NewLambdaJavaFunctionProjectWizardPageOne pageOne;
private IProject project;
@Override
public void addPages() {
if (pageOne == null) {
pageOne = new NewLambdaJavaFunctionProjectWizardPageOne(dataModel);
}
addPage(pageOne);
}
public NewLambdaJavaFunctionProjectWizard() {
super("New AWS Lambda Maven Project");
initDataModel();
}
@Override
protected IStatus doFinish(IProgressMonitor monitor) {
LambdaAnalytics.trackNewProjectAttributes(dataModel);
final String projectName = dataModel.getProjectNameDataModel().getProjectName();
final Model mavenModel = getModel();
File readmeFile = null;
try {
savePreferences(dataModel, LambdaPlugin.getDefault().getPreferenceStore());
final IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
project = root.getProject(projectName);
try {
MavenFactory.createMavenProject(project, mavenModel, monitor);
IJavaProject javaProject = JavaCore.create(project);
setDefaultJreToProjectClasspath(javaProject, monitor);
} catch (Exception e) {
LambdaPlugin.getDefault().reportException(
"Failed to create AWS Lambda Maven Project.", e);
}
FunctionProjectUtil.createLambdaBlueprintProject(project, dataModel);
if (dataModel.isShowReadmeFile()) {
readmeFile = FunctionProjectUtil.emitLambdaProjectReadme(project, dataModel.getLambdaFunctionDataModel());
}
FunctionProjectUtil.refreshProject(project);
new UpdateMavenProjectJob(new IProject[]{project}).schedule();
} catch (Exception e) {
LambdaAnalytics.trackProjectCreationFailed();
LambdaPlugin.getDefault().reportException("Failed to create new Lambda project", e);
}
LambdaAnalytics.trackProjectCreationSucceeded();
IFile handlerClass = findHandlerClassFile(project, dataModel);
WorkbenchUtils.selectAndReveal(handlerClass, workbench); // show in explorer
WorkbenchUtils.openFileInEditor(handlerClass, workbench); // show in editor
if (readmeFile != null) {
try {
WorkbenchUtils.openInternalBrowserAsEditor(readmeFile.toURI().toURL(), workbench);
} catch (MalformedURLException e) {
LambdaPlugin.getDefault().logWarning(
"Failed to open README.html for the new Lambda project", e);
}
}
return Status.OK_STATUS;
}
// Use this basic Maven model to create a simple Maven project.
private Model getModel() {
Model model = new Model();
String groupId = dataModel.getMavenConfigurationDataModel().getGroupId();
String artifactId = dataModel.getMavenConfigurationDataModel().getArtifactId();
model.setModelVersion(MavenFactory.getMavenModelVersion());
model.setGroupId(groupId);
model.setArtifactId(artifactId);
model.setVersion(MavenFactory.getMavenModelVersion());
return model;
}
@Override
public boolean performCancel() {
LambdaAnalytics.trackProjectCreationCanceled();
return true;
}
@Override
protected void initDataModel() {
MavenConfigurationDataModel mavenDataModel = dataModel.getMavenConfigurationDataModel();
mavenDataModel.setGroupId(DEFAULT_GROUP_ID);
mavenDataModel.setArtifactId(DEFAULT_ARTIFACT_ID);
dataModel.setShowReadmeFile(LambdaPlugin.getDefault().getPreferenceStore()
.getBoolean(LambdaPlugin.PREF_K_SHOW_README_AFTER_CREATE_NEW_PROJECT));
}
@Override
protected String getJobTitle() {
return "Creating AWS Lambda Maven Project";
}
private static IFile findHandlerClassFile(IProject project,
LambdaFunctionWizardDataModel dataModel) {
IPath handlerPath = new Path(MavenFactory.getMavenSourceFolder());
JavaPackageName handlerPackage = JavaPackageName.parse(
dataModel.getLambdaFunctionDataModel().getPackageName());
for (String component : handlerPackage.getComponents()) {
handlerPath = handlerPath.append(component);
}
handlerPath = handlerPath.append(dataModel.getLambdaFunctionDataModel().getClassName()
+ ".java");
return project.getFile(handlerPath);
}
private static void savePreferences(
LambdaFunctionWizardDataModel dataModel,
IPreferenceStore prefStore) {
prefStore.setValue(
LambdaPlugin.PREF_K_SHOW_README_AFTER_CREATE_NEW_PROJECT,
dataModel.isShowReadmeFile());
}
@Override
protected AbstractAwsPlugin getPlugin() {
return LambdaPlugin.getDefault();
}
}