/*
* Copyright (c) 2016 ingenieux Labs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License 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 br.com.ingenieux.mojo.apigateway;
import com.amazonaws.services.apigateway.AmazonApiGatewayClient;
import com.amazonaws.services.apigateway.model.GetRestApisRequest;
import com.amazonaws.services.apigateway.model.GetRestApisResult;
import com.amazonaws.services.apigateway.model.RestApi;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import java.util.Optional;
import br.com.ingenieux.mojo.aws.AbstractAWSMojo;
import static com.fasterxml.jackson.core.JsonParser.Feature;
import static java.lang.String.format;
import static org.apache.commons.lang.StringUtils.isBlank;
import static org.apache.commons.lang.StringUtils.isNotBlank;
public abstract class AbstractAPIGatewayMojo extends AbstractAWSMojo<AmazonApiGatewayClient> {
protected static final ObjectMapper YAML_OBJECT_MAPPER =
new ObjectMapper(
new YAMLFactory().enable(Feature.ALLOW_COMMENTS).enable(Feature.ALLOW_YAML_COMMENTS).enable(JsonGenerator.Feature.STRICT_DUPLICATE_DETECTION))
.enable(SerializationFeature.INDENT_OUTPUT)
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
//https://github.com/ingenieux/beanstalker/issues/87 - Decouple the serialization of AWS responses to avoid warning mgs
.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
@Parameter(property = "project", required = true)
protected MavenProject curProject;
@Parameter(property = "apigateway.restApiName", required = true, defaultValue = "${project.artifactId}")
protected String restApiName;
/**
* Derived from restApiName
*/
protected String restApiId;
@Parameter(property = "apigateway.stageName", required = true, defaultValue = "dev")
protected String stageName;
/**
* Endpoint URL - Internal Usage.
*/
protected String endpointUrl;
protected void lookupIds() throws Exception {
if (null != restApiId) {
updateEndpoint();
return;
}
GetRestApisRequest req = new GetRestApisRequest();
String position = "";
do {
final GetRestApisResult apiList = getService().getRestApis(req);
final Optional<RestApi> api = apiList.getItems().stream().filter(restApi -> restApi.getName().equals(restApiName)).findFirst();
if (api.isPresent()) {
getLog().info("Using api: " + api.get());
this.restApiId = api.get().getId();
break;
}
position = apiList.getPosition();
req.setPosition(position);
} while (isNotBlank(position));
if (isBlank(restApiId)) return;
updateEndpoint();
}
protected void updateEndpoint() {
String propertyName = "apigateway.endpoint.url";
String propertyValue = format("https://%s.execute-api.%s.amazonaws.com/%s", restApiId, regionName, stageName);
getLog().info("Setting property: " + propertyName + "=" + propertyValue);
session.getSystemProperties().put(propertyName, propertyValue);
this.endpointUrl = propertyValue;
}
}