Java tutorial
/** * Copyright 2015 Zalando SE * * 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 org.zalando.stups.fullstop; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.auth.AWSCredentialsProviderChain; import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; import com.amazonaws.services.cloudtrail.processinglibrary.configuration.ProcessingConfiguration; import com.amazonaws.services.cloudtrail.processinglibrary.configuration.PropertiesFileConfiguration; import com.amazonaws.services.cloudtrail.processinglibrary.model.CloudTrailEventMetadata; import com.amazonaws.services.cloudtrail.processinglibrary.utils.LibraryUtils; /** * @author jbellmann */ public class ExtPropertiesFileConfiguration implements ProcessingConfiguration { /* configuration file property names */ public static final String ACCESS_KEY = "accessKey"; public static final String SECRET_KEY = "secretKey"; public static final String SQS_URL = "sqsUrl"; public static final String SQS_REGION = "sqsRegion"; public static final String VISIBILITY_TIMEOUT = "visibilityTimeout"; public static final String S3_REGION = "s3Region"; public static final String THREAD_COUNT = "threadCount"; public static final String THREAD_TERMINATION_DELAY_SECONDS = "threadTerminationDelaySeconds"; public static final String MAX_EVENTS_PER_EMIT = "maxEventsPerEmit"; public static final String ENABLE_RAW_EVENT_INFO = "enableRawEventInfo"; private static final String ERROR_CREDENTIALS_PROVIDER_NULL = "CredentialsProvider is null. Either put your " + "access key and secret key in the configuration file in your class path, or spcify it in the " + "ProcessingConfiguration object."; /** * The <a href= * "http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/AWSCredentialsProvider.html" >AWS * credentials provider</a> used to obtain credentials. */ private AWSCredentialsProvider awsCredentialsProvider; /** * The SQS Queue URL used to receive events. * * <p>The Queue must be subscribed to AWS CloudTrail. */ private String sqsUrl = null; /** * The SQS region to use. * * <p>If not specified, the default SQS region ( {@value ProcessingConfiguration#DEFAULT_SQS_REGION}) will be used. */ private String sqsRegion = DEFAULT_SQS_REGION; /** * A period of time, in seconds, during which Amazon SQS prevents other consuming components from receiving and * processing messages that are currently being processed by the CloudTrail Processing Library on your behalf. */ private int visibilityTimeout = DEFAULT_VISIBILITY_TIMEOUT; /** * The S3 endpoint specific to a region. * * <p>If not specified, the default S3 region will be used. */ private String s3Region = DEFAULT_S3_REGION; /** * The number of threads used to download log files from S3 in parallel. * * <p>Callbacks can be invoked from any thread. */ private int threadCount = DEFAULT_THREAD_COUNT; /** * The time allowed, in seconds, for threads to shut down after AWSCloudTrailEventProcessingExecutor.stop() is * called. * * <p>Any threads still running beyond this time will be forcibly terminated. */ private int threadTerminationDelaySeconds = DEFAULT_THREAD_TERMINATION_DELAY_SECONDS; /** * The maximum number of AWSCloudTrailClientEvents sent to a single invocation of processEvents(). */ private int maxEventsPerEmit = DEFAULT_MAX_EVENTS_PER_EMIT; /** * Whether to include raw event information in {@link CloudTrailEventMetadata}. */ private boolean enableRawEventInfo = DEFAULT_ENABLE_RAW_EVENT_INFO; public static ExtPropertiesFileConfiguration fromClasspath(final String propertiesFile) { // load properties from configuration properties file Properties prop = ExtPropertiesFileConfiguration.loadProperty(propertiesFile); return new ExtPropertiesFileConfiguration(prop); } public ExtPropertiesFileConfiguration(final Properties prop) { this(prop, new DefaultAWSCredentialsProviderChain()); } /** * Creates a {@link PropertiesFileConfiguration} from values provided in a classpath properties file. * * @param prop the classpath properties file to load. * @param credentialProvider credential provider. */ public ExtPropertiesFileConfiguration(final Properties prop, final AWSCredentialsProviderChain credentialProvider) { this.sqsUrl = prop.getProperty(SQS_URL); LibraryUtils.checkArgumentNotNull(this.sqsUrl, "Cannot find SQS URL in properties file."); String accessKey = prop.getProperty(ACCESS_KEY); String secretKey = prop.getProperty(SECRET_KEY); if (accessKey != null && secretKey != null) { this.awsCredentialsProvider = new SimplePropertiesCredentials(prop); } else { this.awsCredentialsProvider = credentialProvider; } this.s3Region = prop.getProperty(S3_REGION); this.visibilityTimeout = this.getIntProperty(prop, VISIBILITY_TIMEOUT); this.sqsRegion = prop.getProperty(SQS_REGION); this.threadCount = this.getIntProperty(prop, THREAD_COUNT); this.threadTerminationDelaySeconds = this.getIntProperty(prop, THREAD_TERMINATION_DELAY_SECONDS); this.maxEventsPerEmit = this.getIntProperty(prop, MAX_EVENTS_PER_EMIT); this.enableRawEventInfo = this.getBooleanProperty(prop, ENABLE_RAW_EVENT_INFO); } /** * {@inheritDoc} */ public AWSCredentialsProvider getAwsCredentialsProvider() { return awsCredentialsProvider; } /** * {@inheritDoc} */ public String getSqsUrl() { return sqsUrl; } /** * {@inheritDoc} */ public String getSqsRegion() { return sqsRegion; } /** * {@inheritDoc} */ public int getVisibilityTimeout() { return visibilityTimeout; } /** * {@inheritDoc} */ public String getS3Region() { return s3Region; } /** * {@inheritDoc} */ public int getThreadCount() { return threadCount; } /** * {@inheritDoc} */ public int getThreadTerminationDelaySeconds() { return threadTerminationDelaySeconds; } /** * {@inheritDoc} */ public int getMaxEventsPerEmit() { return maxEventsPerEmit; } /** * {@inheritDoc} */ public boolean isEnableRawEventInfo() { return enableRawEventInfo; } /** * {@inheritDoc} */ @Override public void validate() { LibraryUtils.checkArgumentNotNull(this.getAwsCredentialsProvider(), ERROR_CREDENTIALS_PROVIDER_NULL); LibraryUtils.checkArgumentNotNull(this.getSqsUrl(), "SQS URL is null."); LibraryUtils.checkArgumentNotNull(this.getSqsRegion(), "SQS Region is null."); LibraryUtils.checkArgumentNotNull(this.getVisibilityTimeout(), "Visibility Timeout is null."); LibraryUtils.checkArgumentNotNull(this.getS3Region(), "S3 Region is null."); LibraryUtils.checkArgumentNotNull(this.getThreadCount(), "Thread Count is null."); LibraryUtils.checkArgumentNotNull(this.getThreadTerminationDelaySeconds(), "Thread Termination Delay Seconds is null."); LibraryUtils.checkArgumentNotNull(this.getMaxEventsPerEmit(), "Maximum Events Per Emit is null."); LibraryUtils.checkArgumentNotNull(this.isEnableRawEventInfo(), "Is Enable Raw Event Information is null."); } /** * Load properties from a classpath property file. * * @param propertiesFile the classpath properties file to read. * * @return a <a href= "http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html" >Properties</a> object * containing the properties set in the file. */ protected static Properties loadProperty(final String propertiesFile) { Properties prop = new Properties(); try { InputStream in = ExtPropertiesFileConfiguration.class.getResourceAsStream(propertiesFile); prop.load(in); in.close(); } catch (IOException e) { throw new IllegalStateException("Cannot load property file at " + propertiesFile, e); } return prop; } /** * Convert a string representation of a property to an integer type. * * @param prop the property class * @param name a name to evaluate in the property file. * * @return an integer representation of the value associated with the property name. */ private int getIntProperty(final Properties prop, final String name) { String propertyValue = prop.getProperty(name); return Integer.parseInt(propertyValue); } /** * Convert a string representation of a property to a boolean type. * * @param prop the property class * @param name a name to evaluate in the property file. * * @return a boolean representation of the value associated with the property name. */ private Boolean getBooleanProperty(final Properties prop, final String name) { String propertyValue = prop.getProperty(name); return Boolean.parseBoolean(propertyValue); } }