/*
* 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.model;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.amazonaws.eclipse.core.model.ImportFileDataModel;
import com.amazonaws.eclipse.core.model.MavenConfigurationDataModel;
import com.amazonaws.eclipse.core.model.ProjectNameDataModel;
import com.amazonaws.eclipse.lambda.blueprint.BlueprintsProvider;
import com.amazonaws.eclipse.lambda.blueprint.ServerlessBlueprint;
import com.amazonaws.eclipse.lambda.blueprint.ServerlessBlueprintsConfig;
import com.amazonaws.eclipse.lambda.project.template.CodeTemplateManager;
import com.amazonaws.eclipse.lambda.project.template.data.PomFileTemplateData;
import com.amazonaws.eclipse.lambda.serverless.NameUtils;
import com.amazonaws.eclipse.lambda.serverless.Serverless;
import com.amazonaws.eclipse.lambda.serverless.model.transform.ServerlessFunction;
import com.amazonaws.eclipse.lambda.serverless.model.transform.ServerlessModel;
import com.amazonaws.eclipse.lambda.serverless.template.ServerlessDataModelTemplateData;
import com.amazonaws.eclipse.lambda.serverless.template.ServerlessHandlerTemplateData;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
/**
* Serverless project creation data model. It also manages all other models throughout this stage, such as
* ServerlessModel, freemarker template models.
*/
public class NewServerlessProjectDataModel {
/* These constants must be the same to the Pojo property names */
public static final String P_PACKAGE_PREFIX = "packagePrefix";
public static final String P_BLUEPRINT_NAME = "blueprintName";
public static final String P_USE_BLUEPRINT = "useBlueprint";
public static final String P_USE_SERVERLESS_TEMPLATE_FILE = "useServerlessTemplateFile";
private static final ServerlessBlueprintsConfig BLUEPRINTS_CONFIG = BlueprintsProvider.provideServerlessBlueprints();
/* Function handler section */
private final ProjectNameDataModel projectNameDataModel = new ProjectNameDataModel();
private final MavenConfigurationDataModel mavenConfigurationDataModel = new MavenConfigurationDataModel();
private final ImportFileDataModel importFileDataModel = new ImportFileDataModel();
private String packagePrefix = "com.amazonaws.serverless.demo";
private ServerlessBlueprint selectedBlueprint = BLUEPRINTS_CONFIG.getBlueprints()
.get(BLUEPRINTS_CONFIG.getDefaultBlueprint());
private String blueprintName = selectedBlueprint.getDisplayName();
private boolean useBlueprint = true;
private boolean useServerlessTemplateFile = false;
private ServerlessModel serverlessModel;
public ProjectNameDataModel getProjectNameDataModel() {
return projectNameDataModel;
}
public MavenConfigurationDataModel getMavenConfigurationDataModel() {
return mavenConfigurationDataModel;
}
public ImportFileDataModel getImportFileDataModel() {
return importFileDataModel;
}
public String getPackagePrefix() {
return packagePrefix;
}
public void setPackagePrefix(String packagePrefix) {
this.packagePrefix = packagePrefix;
}
public String getBlueprintName() {
return blueprintName;
}
public void setBlueprintName(String blueprintName) {
this.blueprintName = blueprintName;
this.selectedBlueprint = getServerlessBlueprint(blueprintName);
}
public ServerlessBlueprint getSelectedBlueprint() {
return selectedBlueprint;
}
public boolean isUseBlueprint() {
return useBlueprint;
}
public void setUseBlueprint(boolean useBlueprint) {
this.useBlueprint = useBlueprint;
}
public boolean isUseServerlessTemplateFile() {
return useServerlessTemplateFile;
}
public void setUseServerlessTemplateFile(boolean useServerlessTemplateFile) {
this.useServerlessTemplateFile = useServerlessTemplateFile;
}
public ServerlessDataModelTemplateData getServerlessDataModelTemplateData()
throws JsonParseException, JsonMappingException, IOException {
buildServerlessModel();
ServerlessDataModelTemplateData data = new ServerlessDataModelTemplateData();
data.setPackageName(NameUtils.toModelPackageName(packagePrefix));
data.setServerlessInputClassName(NameUtils.SERVERLESS_INPUT_CLASS_NAME);
data.setServerlessOutputClassName(NameUtils.SERVERLESS_OUTPUT_CLASS_NAME);
return data;
}
public List<ServerlessHandlerTemplateData> getServerlessHandlerTemplateData()
throws JsonParseException, JsonMappingException, IOException {
buildServerlessModel();
List<ServerlessHandlerTemplateData> handlers = new ArrayList<ServerlessHandlerTemplateData>();
for (ServerlessFunction function : serverlessModel.getServerlessFunctions().values()) {
ServerlessHandlerTemplateData template = new ServerlessHandlerTemplateData();
template.setPackageName(NameUtils.toHandlerPackageName(packagePrefix));
template.setClassName(NameUtils.toHandlerClassName(function.getHandler()));
template.setInputFqcn(NameUtils.toServerlessInputModelFqcn(packagePrefix));
template.setOutputFqcn(NameUtils.toServerlessOutputModelFqcn(packagePrefix));
handlers.add(template);
}
return handlers;
}
//TODO version should be modified
public PomFileTemplateData getServerlessPomTemplateData() {
PomFileTemplateData data = new PomFileTemplateData();
data.setGroupId(mavenConfigurationDataModel.getGroupId());
data.setArtifactId(mavenConfigurationDataModel.getArtifactId());
data.setVersion("1.0.0");
data.setAwsJavaSdkVersion("1.11.124");
return data;
}
private void buildServerlessModel() throws JsonParseException, JsonMappingException, IOException {
if (serverlessModel != null) return;
if (isUseBlueprint()) {
ServerlessBlueprint blueprint = getSelectedBlueprint();
File serverlessFile = CodeTemplateManager.getInstance().getServerlessSamFile(blueprint);
serverlessModel = Serverless.load(serverlessFile);
importFileDataModel.setFilePath(serverlessFile.getAbsolutePath());
} else {
serverlessModel = Serverless.load(importFileDataModel.getFilePath());
}
}
/**
* Return the ServerlessBlueprint by display name.
*/
private static ServerlessBlueprint getServerlessBlueprint(String displayName) {
for (ServerlessBlueprint blueprint : BLUEPRINTS_CONFIG.getBlueprints().values()) {
if (blueprint.getDisplayName().equals(displayName)) {
return blueprint;
}
}
return null;
}
}