/* * Copyright 2016 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.io.IOException; import java.util.List; 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.m2e.core.ui.internal.UpdateMavenProjectJob; import com.amazonaws.eclipse.core.maven.MavenFactory; 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.metadata.ProjectMetadataManager; import com.amazonaws.eclipse.lambda.project.metadata.ServerlessProjectMetadata; import com.amazonaws.eclipse.lambda.project.template.CodeTemplateManager; import com.amazonaws.eclipse.lambda.project.wizard.model.NewServerlessProjectDataModel; import com.amazonaws.eclipse.lambda.project.wizard.page.NewServerlessProjectWizardPageOne; import com.amazonaws.eclipse.lambda.project.wizard.util.FunctionProjectUtil; import com.amazonaws.eclipse.lambda.serverless.template.ServerlessHandlerTemplateData; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; public class NewServerlessProjectWizard extends AbstractAwsProjectWizard { private static final String DEFAULT_GROUP_ID = "com.serverless"; private static final String DEFAULT_ARTIFACT_ID = "demo"; private static final String DEFAULT_PACKAGE_NAME = MavenFactory.assumePackageName(DEFAULT_GROUP_ID, DEFAULT_ARTIFACT_ID); private final NewServerlessProjectDataModel dataModel = new NewServerlessProjectDataModel(); private NewServerlessProjectWizardPageOne pageOne; private IProject project; @Override public void addPages() { if (pageOne == null) { pageOne = new NewServerlessProjectWizardPageOne(dataModel); } addPage(pageOne); } public NewServerlessProjectWizard() { super("New AWS Serverless Maven Project"); initDataModel(); } @Override protected String getJobTitle() { return "Creating AWS Serverless Maven Project"; } @Override protected IStatus doFinish(IProgressMonitor monitor) { LambdaAnalytics.trackServerlessProjectSelection(dataModel); final String projectName = dataModel.getProjectNameDataModel().getProjectName(); final Model mavenModel = getModel(); File readmeFile = null; 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 Serverless Maven Project.", e); } try { FunctionProjectUtil.createServerlessBlueprintProject(project, dataModel); readmeFile = FunctionProjectUtil.emitServerlessReadme(project, dataModel); FunctionProjectUtil.refreshProject(project); new UpdateMavenProjectJob(new IProject[]{project}).schedule(); } catch (Exception e) { LambdaAnalytics.trackServerlessProjectCreationFailed(); LambdaPlugin.getDefault().reportException("Failed to create new Serverless project", e); } LambdaAnalytics.trackServerlessProjectCreationSucceeded(); saveMetadata(); try { IFile handlerClass = findHandlerClassFile(project, dataModel); WorkbenchUtils.selectAndReveal(handlerClass, workbench); // show in explorer WorkbenchUtils.openFileInEditor(handlerClass, workbench); // show in editor if (readmeFile != null) { WorkbenchUtils.openInternalBrowserAsEditor(readmeFile.toURI().toURL(), workbench); } } catch (Exception e) { LambdaPlugin.getDefault().logWarning( "Failed to open the start up file.", e); } return Status.OK_STATUS; } @Override public boolean performCancel() { LambdaAnalytics.trackServerlessProjectCreationCanceled(); return true; } private Model getModel() { Model model = new Model(); model.setModelVersion(MavenFactory.getMavenModelVersion()); model.setGroupId(dataModel.getMavenConfigurationDataModel().getGroupId()); model.setArtifactId(dataModel.getMavenConfigurationDataModel().getArtifactId()); model.setVersion(MavenFactory.getMavenModelVersion()); return model; } private static IFile findHandlerClassFile(IProject project, NewServerlessProjectDataModel dataModel) throws JsonParseException, JsonMappingException, IOException { IPath handlerPath = new Path(""); List<ServerlessHandlerTemplateData> templates = dataModel.getServerlessHandlerTemplateData(); if (templates == null || templates.isEmpty()) { handlerPath = handlerPath.append(CodeTemplateManager.SERVERLESS_BLUEPRINT_SAM_NAME); } else { ServerlessHandlerTemplateData template = templates.get(0); handlerPath = handlerPath.append(MavenFactory.getMavenSourceFolder()); JavaPackageName handlerPackage = JavaPackageName.parse(template.getPackageName()); for (String component : handlerPackage.getComponents()) { handlerPath = handlerPath.append(component); } handlerPath = handlerPath.append(template.getClassName() + ".java"); } return project.getFile(handlerPath); } @Override protected void initDataModel() { dataModel.getMavenConfigurationDataModel().setGroupId(DEFAULT_GROUP_ID); dataModel.getMavenConfigurationDataModel().setArtifactId(DEFAULT_ARTIFACT_ID); dataModel.setPackagePrefix(DEFAULT_PACKAGE_NAME); } private void saveMetadata() { ServerlessProjectMetadata metadata = new ServerlessProjectMetadata(); metadata.setPackagePrefix(dataModel.getPackagePrefix()); try { ProjectMetadataManager.saveServerlessProjectMetadata(project, metadata); } catch (IOException e) { LambdaPlugin.getDefault().logError(e.getMessage(), e); } } @Override protected AbstractAwsPlugin getPlugin() { return LambdaPlugin.getDefault(); } }