/* * Copyright 2010-2012 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.upload.wizard; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Display; import com.amazonaws.eclipse.core.plugin.AbstractAwsJobWizard; import com.amazonaws.eclipse.lambda.LambdaAnalytics; import com.amazonaws.eclipse.lambda.LambdaPlugin; import com.amazonaws.eclipse.lambda.project.metadata.LambdaFunctionProjectMetadata; import com.amazonaws.eclipse.lambda.project.metadata.ProjectMetadataManager; import com.amazonaws.eclipse.lambda.upload.wizard.model.UploadFunctionWizardDataModel; import com.amazonaws.eclipse.lambda.upload.wizard.page.FunctionConfigurationPage; import com.amazonaws.eclipse.lambda.upload.wizard.page.TargetFunctionSelectionPage; import com.amazonaws.eclipse.lambda.upload.wizard.util.UploadFunctionUtil; public class UploadFunctionWizard extends AbstractAwsJobWizard { private final IProject project; private UploadFunctionWizardDataModel dataModel; public UploadFunctionWizard(IProject project) { super("Upload Function to AWS Lambda"); this.project = project; initDataModel(); } @Override public void addPages() { addPage(new TargetFunctionSelectionPage(dataModel)); addPage(new FunctionConfigurationPage(dataModel)); } @Override public boolean performCancel() { LambdaAnalytics.trackUploadCanceled(); return true; } @Override protected void initDataModel() { // Load valid request handler classes List<String> handlerClasses = new ArrayList<String>(); handlerClasses.addAll(UploadFunctionUtil.findValidHandlerClass(project)); handlerClasses.addAll(UploadFunctionUtil.findValidStreamHandlerClass(project)); if (handlerClasses.isEmpty()) { MessageDialog.openError( Display.getCurrent().getActiveShell(), "Invalid AWS Lambda Project", "No Lambda function handler class is found in the project. " + "You need to have at least one concrete class that implements the " + "com.amazonaws.services.lambda.runtime.RequestHandler interface."); return; } // Load existing lambda project metadata LambdaFunctionProjectMetadata md = null; try { md = ProjectMetadataManager.loadLambdaProjectMetadata(project); } catch (IOException e) { LambdaPlugin.getDefault().logInfo( "Ignoring the existing metadata for project [" + project.getName() + "] since the content is invalid."); } dataModel = new UploadFunctionWizardDataModel(project, handlerClasses, md); } @Override protected IStatus doFinish(IProgressMonitor monitor) { LambdaAnalytics.trackMetrics(dataModel.isCreatingNewFunction(), dataModel.getRequestHandlerImplementerClasses().size()); monitor.beginTask("Uploading AWS Lambda Function Project [" + project.getName() + "]", 100); long startTime = System.currentTimeMillis(); try { UploadFunctionUtil.performFunctionUpload(dataModel, monitor, 100); } catch (Exception e) { LambdaPlugin.getDefault().reportException( "Failed to upload project to Lambda", e); LambdaAnalytics.trackUploadFailed(); return Status.OK_STATUS; } LambdaPlugin.getDefault().getProjectChangeTracker() .markProjectAsNotDirty(project); LambdaAnalytics.trackUploadSucceeded(); LambdaAnalytics.trackUploadTotalTime(System.currentTimeMillis() - startTime); monitor.done(); return Status.OK_STATUS; } @Override protected String getJobTitle() { return "Uploading function code to Lambda"; } }