/*
* 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.core.maven;
import java.util.List;
import java.util.Properties;
import org.apache.maven.archetype.catalog.Archetype;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Model;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.project.ProjectImportConfiguration;
import com.amazonaws.util.StringUtils;
/**
* A helper class used to perform common Maven related operations.
*/
@SuppressWarnings("restriction")
public class MavenFactory {
private static final String MAVEN_SOURCE_FOLDER = "src/main/java";
private static final String MAVEN_TEST_FOLDER = "src/test/java";
private static final String MAVEN_SOURCE_RESOURCES_FOLDER = "src/main/resources";
private static final String MAVEN_TEST_RESOURCES_FOLDER = "src/test/resources";
private static String MAVEN_MODEL_VERSION = "4.0.0";
private static String AWS_JAVA_SDK_GROUP_NAME = "com.amazonaws";
private static String AWS_JAVA_SDK_ARTIFACT_NAME = "aws-java-sdk";
private static String AWS_JAVA_SDK_ARTIFACT_TYPE = "jar";
private static String DEFAULT_AWS_JAVA_SDK_VERSION = "1.11.66";
private static String AWS_JAVA_SDK_BOM_GROUP_NAME = "com.amazonaws";
private static String AWS_JAVA_SDK_BOM_ARTIFACT_NAME = "aws-java-sdk-bom";
private static String AWS_JAVA_SDK_BOM_ARTIFACT_TYPE = "pom";
private static String DEFAULT_AWS_JAVA_SDK_BOM_VERSION = "1.11.66";
private static String AMAZON_KINESIS_CLIENT_GROUP_NAME = "com.amazonaws";
private static String AMAZON_KINESIS_CLIENT_ARTIFACT_NAME = "amazon-kinesis-client";
private static String AMAZON_KINESIS_CLIENT_ARTIFACT_TYPE = "jar";
private static String JUNIT_GROUP_NAME = "junit";
private static String JUNIT_ARTIFACT_NAME = "junit";
private static String JUNIT_ARTIFACT_TYPE = "jar";
private static String DEFAULT_JUNIT_VERSION = "4.11";
private static String AWS_LAMBDA_JAVA_CORE_GROUP_NAME = "com.amazonaws";
private static String AWS_LAMBDA_JAVA_CORE_ARTIFACT_NAME = "aws-lambda-java-core";
private static String AWS_LAMBDA_JAVA_CORE_ARTIFACT_TYPE = "jar";
private static String DEFAULT_AWS_LAMBDA_JAVA_CORE_VERSION = "1.1.0";
private static String AWS_LAMBDA_JAVA_EVENTS_GROUP_NAME = "com.amazonaws";
private static String AWS_LAMBDA_JAVA_EVENTS_ARTIFACT_NAME = "aws-lambda-java-events";
private static String AWS_LAMBDA_JAVA_EVENTS_ARTIFACT_TYPE = "jar";
private static String DEFAULT_AWS_LAMBDA_JAVA_EVENTS_VERSION = "1.3.0";
private static final String[] MAVEN_FOLDERS = {MAVEN_SOURCE_FOLDER, MAVEN_TEST_FOLDER, MAVEN_SOURCE_RESOURCES_FOLDER, MAVEN_TEST_RESOURCES_FOLDER};
public static void createMavenProject(final IProject project, final Model model, IProgressMonitor monitor) throws CoreException {
MavenPlugin.getProjectConfigurationManager().createSimpleProject(
project, null, model, MavenFactory.MAVEN_FOLDERS,
new ProjectImportConfiguration(), monitor);
}
public static List<IProject> createArchetypeProject(String archetypeGroupId, String archetypeArtifactId, String archetypeVersion,
String groupId, String artifactId, String version, String packageName, IProgressMonitor monitor) throws CoreException {
Archetype archetype = new Archetype();
archetype.setGroupId(archetypeGroupId);
archetype.setArtifactId(archetypeArtifactId);
archetype.setVersion(archetypeVersion);
return MavenPlugin.getProjectConfigurationManager().createArchetypeProjects(null, archetype,
groupId, artifactId, version, packageName,
new Properties(), new ProjectImportConfiguration(), monitor);
}
public static String getMavenSourceFolder() {
return MAVEN_SOURCE_FOLDER;
}
public static String getMavenTestFolder() {
return MAVEN_TEST_FOLDER;
}
public static String getMavenResourceFolder() {
return MAVEN_SOURCE_RESOURCES_FOLDER;
}
public static String getMavenTestResourceFolder() {
return MAVEN_TEST_RESOURCES_FOLDER;
}
public static String getMavenModelVersion() {
return MAVEN_MODEL_VERSION;
}
public static Dependency getLatestAwsBomDependency() {
return getLatestArtifactDependency(AWS_JAVA_SDK_BOM_GROUP_NAME, AWS_JAVA_SDK_BOM_ARTIFACT_NAME, "import", AWS_JAVA_SDK_BOM_ARTIFACT_TYPE, DEFAULT_AWS_JAVA_SDK_BOM_VERSION);
}
public static Dependency getLatestAwsSdkDependency(String scope) {
return getLatestArtifactDependency(AWS_JAVA_SDK_GROUP_NAME, AWS_JAVA_SDK_ARTIFACT_NAME, scope, AWS_JAVA_SDK_ARTIFACT_TYPE, DEFAULT_AWS_JAVA_SDK_VERSION);
}
public static Dependency getAwsJavaSdkDependency(String version, String scope) {
return createArtifactDependency(AWS_JAVA_SDK_GROUP_NAME, AWS_JAVA_SDK_ARTIFACT_NAME, version, scope, AWS_JAVA_SDK_ARTIFACT_TYPE);
}
public static Dependency getAmazonKinesisClientDependency(String version, String scope) {
return createArtifactDependency(AMAZON_KINESIS_CLIENT_GROUP_NAME, AMAZON_KINESIS_CLIENT_ARTIFACT_NAME,
version, scope, AMAZON_KINESIS_CLIENT_ARTIFACT_TYPE);
}
public static Dependency getAwsLambdaJavaEventsDependency(String version, String scope) {
return createArtifactDependency(AWS_LAMBDA_JAVA_EVENTS_GROUP_NAME, AWS_LAMBDA_JAVA_EVENTS_ARTIFACT_NAME,
version, scope, AWS_LAMBDA_JAVA_EVENTS_ARTIFACT_TYPE);
}
public static Dependency getAwsLambdaJavaEventsDependency() {
return getAwsLambdaJavaEventsDependency(DEFAULT_AWS_LAMBDA_JAVA_EVENTS_VERSION, "compile");
}
public static Dependency getAwsLambdaJavaCoreDependency(String version, String scope) {
return createArtifactDependency(AWS_LAMBDA_JAVA_CORE_GROUP_NAME, AWS_LAMBDA_JAVA_CORE_ARTIFACT_NAME,
version, scope, AWS_LAMBDA_JAVA_CORE_ARTIFACT_TYPE);
}
public static Dependency getAwsLambdaJavaCoreDependency() {
return getAwsLambdaJavaCoreDependency(DEFAULT_AWS_LAMBDA_JAVA_CORE_VERSION, "compile");
}
public static Dependency getJunitDependency(String version, String scope) {
return createArtifactDependency(JUNIT_GROUP_NAME, JUNIT_ARTIFACT_NAME, version, scope, JUNIT_ARTIFACT_TYPE);
}
public static Dependency getJunitDependency() {
return getJunitDependency(DEFAULT_JUNIT_VERSION, "test");
}
private static Dependency getLatestArtifactDependency(String groupId, String artifactId, String scope, String type, String defaultVersion) {
String version = getLatestArtifactVersion(groupId, artifactId);
if (version == null) {
if (defaultVersion == null) {
throw new RuntimeException(
String.format("The latest version of %s cannot be fetched either from remote Maven repository or the local", artifactId));
}
version = defaultVersion;
}
return createArtifactDependency(groupId, artifactId, version, scope, type);
}
private static Dependency createArtifactDependency(
String groupId, String artifactId, String version, String scope, String type) {
Dependency dependency = new Dependency();
dependency.setGroupId(groupId);
dependency.setArtifactId(artifactId);
dependency.setVersion(version);
dependency.setScope(scope);
dependency.setType(type);
return dependency;
}
/**
* Access the default remote Maven repository to fetch the latest version for the specified artifact.
* If the repository is not available or no such an artifact, access the local repository instead.
*/
public static String getLatestArtifactVersion(String groupId, String artifactId) {
String remoteLatestVersion = MavenRepositories.getRemoteMavenRepository().getLatestVersion(groupId, artifactId);
return remoteLatestVersion == null ? MavenRepositories.getDefaultLocalMavenRepository().getLatestVersion(groupId, artifactId)
: remoteLatestVersion;
}
/**
* Assume package name from the group id and artifact id: concatenating them with a dot '.'.
* Return null if the parameter is not valid.
*/
public static String assumePackageName(String groupId, String artifactId) {
return StringUtils.isNullOrEmpty(groupId) || StringUtils.isNullOrEmpty(artifactId)
? null : groupId + "." + artifactId;
}
}