diff --git a/pom.xml b/pom.xml index bfb84d6..4226a09 100644 --- a/pom.xml +++ b/pom.xml @@ -33,17 +33,22 @@ + + 8.5.16 + 1.11.259 + + com.amazonaws aws-java-sdk-dynamodb - 1.10.63 + ${awsVersion} true org.apache.tomcat tomcat-catalina - 8.0.1 + ${tomcatVersion} provided @@ -61,7 +66,7 @@ com.amazonaws aws-java-sdk-test-utils - 1.10.63 + ${awsVersion} test @@ -73,13 +78,13 @@ org.apache.tomcat.embed tomcat-embed-core - 8.0.1 + ${tomcatVersion} test org.apache.tomcat.embed tomcat-embed-jasper - 8.0.1 + ${tomcatVersion} test diff --git a/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/DynamoDBSessionManager.java b/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/DynamoDBSessionManager.java index 4b0086b..e24996b 100644 --- a/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/DynamoDBSessionManager.java +++ b/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/DynamoDBSessionManager.java @@ -16,17 +16,14 @@ import com.amazonaws.AmazonClientException; import com.amazonaws.ClientConfiguration; -import com.amazonaws.auth.AWSCredentialsProvider; -import com.amazonaws.auth.BasicAWSCredentials; -import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; -import com.amazonaws.auth.PropertiesCredentials; -import com.amazonaws.internal.StaticCredentialsProvider; -import com.amazonaws.regions.RegionUtils; +import com.amazonaws.auth.*; +import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.services.dynamodb.sessionmanager.converters.SessionConverter; import com.amazonaws.services.dynamodb.sessionmanager.util.DynamoUtils; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; -import com.amazonaws.services.dynamodbv2.util.Tables; import com.amazonaws.util.StringUtils; import org.apache.catalina.LifecycleException; @@ -42,26 +39,30 @@ */ public class DynamoDBSessionManager extends PersistentManagerBase { + private static final Log LOGGER = LogFactory.getLog(DynamoDBSessionManager.class); + public static final String DEFAULT_TABLE_NAME = "Tomcat_SessionState"; - private static final String USER_AGENT = "DynamoSessionManager/2.0.1"; - private static final String name = "AmazonDynamoDBSessionManager"; - private static final String info = name + "/2.0.1"; + private static final String AWS_REGION = "us-east-1"; + private static final String USER_AGENT = "DynamoSessionManager/2.0.5"; + private static final String NAME = "AmazonDynamoDBSessionManager"; + private static final String INFO = NAME + "/2.0.5"; - private String regionId = "us-east-1"; + // aws dynamo behaviors + private String tableName = DEFAULT_TABLE_NAME; + private String regionId = AWS_REGION; private String endpoint; + private long readCapacityUnits = 10; + private long writeCapacityUnits = 5; + private boolean deleteCorruptSessions = false; + // aws credentials private File credentialsFile; private String accessKey; private String secretKey; - private long readCapacityUnits = 10; - private long writeCapacityUnits = 5; - private boolean createIfNotExist = true; - private String tableName = DEFAULT_TABLE_NAME; + // local network config private String proxyHost; private Integer proxyPort; - private boolean deleteCorruptSessions = false; - private static final Log logger = LogFactory.getLog(DynamoDBSessionManager.class); public DynamoDBSessionManager() { setSaveOnRestart(true); @@ -71,12 +72,12 @@ public DynamoDBSessionManager() { } public String getInfo() { - return info; + return INFO; } @Override public String getName() { - return name; + return NAME; } public void setRegionId(String regionId) { @@ -111,10 +112,6 @@ public void setWriteCapacityUnits(int writeCapacityUnits) { this.writeCapacityUnits = writeCapacityUnits; } - public void setCreateIfNotExist(boolean createIfNotExist) { - this.createIfNotExist = createIfNotExist; - } - public void setProxyHost(String proxyHost) { this.proxyHost = proxyHost; } @@ -129,24 +126,24 @@ public void setDeleteCorruptSessions(boolean deleteCorruptSessions) { @Override protected void initInternal() throws LifecycleException { - AmazonDynamoDBClient dynamoClient = createDynamoClient(); + AmazonDynamoDB dynamoClient = createDynamoClient(); initDynamoTable(dynamoClient); DynamoSessionStorage sessionStorage = createSessionStorage(dynamoClient); setStore(new DynamoDBSessionStore(sessionStorage, deleteCorruptSessions)); new ExpiredSessionReaperExecutor(new ExpiredSessionReaper(sessionStorage)); } - private AmazonDynamoDBClient createDynamoClient() { - AWSCredentialsProvider credentialsProvider = initCredentials(); - ClientConfiguration clientConfiguration = initClientConfiguration(); - AmazonDynamoDBClient dynamoClient = new AmazonDynamoDBClient(credentialsProvider, clientConfiguration); - if (this.regionId != null) { - dynamoClient.setRegion(RegionUtils.getRegion(this.regionId)); - } + private AmazonDynamoDB createDynamoClient() { + final String region = regionId != null ? regionId : AWS_REGION; + final AmazonDynamoDBClientBuilder dynamoClient = AmazonDynamoDBClient + .builder() + .withCredentials(initCredentials()) + .withClientConfiguration(initClientConfiguration()) + .withRegion(region); if (this.endpoint != null) { - dynamoClient.setEndpoint(this.endpoint); + dynamoClient.setEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpoint, region)); } - return dynamoClient; + return dynamoClient.build(); } private AWSCredentialsProvider initCredentials() { @@ -156,17 +153,17 @@ private AWSCredentialsProvider initCredentials() { if (credentialsInContextConfigAreValid()) { throw new AmazonClientException("Incomplete AWS security credentials specified in context.xml."); } - logger.debug("Using AWS access key ID and secret key from context.xml"); - return new StaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)); + LOGGER.debug("Using AWS access key ID and secret key from context.xml"); + return new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)); } // Use any explicitly specified credentials properties file next if (credentialsFile != null) { try { - logger.debug("Reading security credentials from properties file: " + credentialsFile); + LOGGER.debug("Reading security credentials from properties file: " + credentialsFile); PropertiesCredentials credentials = new PropertiesCredentials(credentialsFile); - logger.debug("Using AWS credentials from file: " + credentialsFile); - return new StaticCredentialsProvider(credentials); + LOGGER.debug("Using AWS credentials from file: " + credentialsFile); + return new AWSStaticCredentialsProvider(credentials); } catch (Exception e) { throw new AmazonClientException( "Unable to read AWS security credentials from file specified in context.xml: " @@ -178,12 +175,12 @@ private AWSCredentialsProvider initCredentials() { // Fall back to the default credentials chain provider if credentials weren't explicitly set AWSCredentialsProvider defaultChainProvider = new DefaultAWSCredentialsProviderChain(); if (defaultChainProvider.getCredentials() == null) { - logger.debug("Loading security credentials from default credentials provider chain."); + LOGGER.debug("Loading security credentials from default credentials provider chain."); throw new AmazonClientException("Unable to find AWS security credentials. " + "Searched JVM system properties, OS env vars, and EC2 instance roles. " + "Specify credentials in Tomcat's context.xml file or put them in one of the places mentioned above."); } - logger.debug("Using default AWS credentials provider chain to load credentials"); + LOGGER.debug("Using default AWS credentials provider chain to load credentials"); return defaultChainProvider; } @@ -205,38 +202,27 @@ private boolean credentialsInContextConfigAreValid() { private ClientConfiguration initClientConfiguration() { ClientConfiguration clientConfiguration = new ClientConfiguration(); - clientConfiguration.setUserAgent(USER_AGENT); + clientConfiguration.setUserAgentPrefix(USER_AGENT); // Attempt to use an explicit proxy configuration if (proxyHost != null || proxyPort != null) { - logger.debug("Reading proxy settings from context.xml"); + LOGGER.debug("Reading proxy settings from context.xml"); if (proxyHost == null || proxyPort == null) { throw new AmazonClientException("Incomplete proxy settings specified in context.xml." + " Both proxy hot and proxy port needs to be specified"); } - logger.debug("Using proxy host and port from context.xml"); + LOGGER.debug("Using proxy host and port from context.xml"); clientConfiguration.withProxyHost(proxyHost).withProxyPort(proxyPort); } return clientConfiguration; } - private void initDynamoTable(AmazonDynamoDBClient dynamo) { - boolean tableExists = Tables.doesTableExist(dynamo, this.tableName); - - if (!tableExists && !createIfNotExist) { - throw new AmazonClientException("Session table '" + tableName + "' does not exist, " - + "and automatic table creation has been disabled in context.xml"); - } - - if (!tableExists) { - DynamoUtils.createSessionTable(dynamo, this.tableName, this.readCapacityUnits, this.writeCapacityUnits); - } - - Tables.waitForTableToBecomeActive(dynamo, this.tableName); + private void initDynamoTable(AmazonDynamoDB dynamo) { + DynamoUtils.createSessionTable(dynamo, this.tableName, this.readCapacityUnits, this.writeCapacityUnits); } - private DynamoSessionStorage createSessionStorage(AmazonDynamoDBClient dynamoClient) { + private DynamoSessionStorage createSessionStorage(AmazonDynamoDB dynamoClient) { DynamoDBMapper dynamoMapper = DynamoUtils.createDynamoMapper(dynamoClient, tableName); return new DynamoSessionStorage(dynamoMapper, getSessionConverter()); } diff --git a/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/DynamoDBSessionStore.java b/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/DynamoDBSessionStore.java index b548b65..69a692d 100644 --- a/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/DynamoDBSessionStore.java +++ b/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/DynamoDBSessionStore.java @@ -34,7 +34,7 @@ public class DynamoDBSessionStore extends StoreBase { private static final Log logger = LogFactory.getLog(DynamoDBSessionStore.class); private static final String name = "AmazonDynamoDBSessionStore"; - private static final String info = name + "/1.0"; + private static final String info = name + "/2.0"; private final Set sessionIds = Collections.synchronizedSet(new HashSet()); private final DynamoSessionStorage sessionStorage; @@ -58,8 +58,8 @@ public String getStoreName() { @Override public void clear() throws IOException { synchronized (sessionIds) { - final Set sessionsToDelete = new HashSet(sessionIds); - new Thread("dynamodb-session-manager-clear") { + final Set sessionsToDelete = new HashSet<>(sessionIds); + new Thread("dynamo-db-session-manager-clear") { @Override public void run() { for (String sessionId : sessionsToDelete) { diff --git a/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/DynamoSessionStorage.java b/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/DynamoSessionStorage.java index 2f4760f..0f9204c 100644 --- a/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/DynamoSessionStorage.java +++ b/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/DynamoSessionStorage.java @@ -96,25 +96,25 @@ private Iterator getIteratorSafe(Iterable iterable) { */ private class SessionConverterIterator implements Iterator { - private final Iterator sessionItemterator; + private final Iterator sessionItemIterator; private SessionConverterIterator(Iterator sessionItemIterator) { - this.sessionItemterator = sessionItemIterator; + this.sessionItemIterator = sessionItemIterator; } @Override public boolean hasNext() { - return sessionItemterator.hasNext(); + return sessionItemIterator.hasNext(); } @Override public Session next() { - return sessionConverter.toSession(sessionItemterator.next()); + return sessionConverter.toSession(sessionItemIterator.next()); } @Override public void remove() { - sessionItemterator.remove(); + sessionItemIterator.remove(); } } diff --git a/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/ExpiredSessionReaperExecutor.java b/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/ExpiredSessionReaperExecutor.java index 8f880fc..e54e148 100644 --- a/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/ExpiredSessionReaperExecutor.java +++ b/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/ExpiredSessionReaperExecutor.java @@ -27,7 +27,7 @@ public class ExpiredSessionReaperExecutor { private static final int REAP_FREQUENCY_HOURS = 12; private static final int MAX_JITTER_HOURS = 5; - private static final String THREAD_NAME = "dynamo-session-manager-expired-sesion-reaper"; + private static final String THREAD_NAME = "dynamo-db-session-manager-expired-sesion-reaper"; private final ScheduledThreadPoolExecutor executor; diff --git a/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/util/DynamoUtils.java b/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/util/DynamoUtils.java index 85a01ee..a08df68 100644 --- a/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/util/DynamoUtils.java +++ b/src/main/java/com/amazonaws/services/dynamodb/sessionmanager/util/DynamoUtils.java @@ -14,8 +14,9 @@ */ package com.amazonaws.services.dynamodb.sessionmanager.util; +import com.amazonaws.AmazonClientException; import com.amazonaws.services.dynamodb.sessionmanager.DynamoSessionItem; -import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig.TableNameOverride; @@ -25,10 +26,11 @@ import com.amazonaws.services.dynamodbv2.model.KeyType; import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput; import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType; +import com.amazonaws.services.dynamodbv2.util.TableUtils; public class DynamoUtils { - public static void createSessionTable(AmazonDynamoDBClient dynamo, + public static void createSessionTable(AmazonDynamoDB dynamo, String tableName, long readCapacityUnits, long writeCapacityUnits) { @@ -44,14 +46,25 @@ public static void createSessionTable(AmazonDynamoDBClient dynamo, request.setProvisionedThroughput(new ProvisionedThroughput().withReadCapacityUnits(readCapacityUnits) .withWriteCapacityUnits(writeCapacityUnits)); - dynamo.createTable(request); + boolean created = TableUtils.createTableIfNotExists(dynamo, request); + + if(created) { + try { + TableUtils.waitUntilActive(dynamo, tableName); + } catch (InterruptedException e) { + throw new AmazonClientException(e.getMessage(), e); + } + } } /** * Create a new DynamoDBMapper with table name override */ - public static DynamoDBMapper createDynamoMapper(AmazonDynamoDBClient dynamoDbClient, String tableName) { - return new DynamoDBMapper(dynamoDbClient, new DynamoDBMapperConfig(new TableNameOverride(tableName))); + public static DynamoDBMapper createDynamoMapper(AmazonDynamoDB dynamoDbClient, String tableName) { + final DynamoDBMapperConfig.Builder builder = DynamoDBMapperConfig + .builder() + .withTableNameOverride(new TableNameOverride(tableName)); + return new DynamoDBMapper(dynamoDbClient, builder.build()); } } diff --git a/src/test/java/com/amazonaws/services/dynamodb/sessionmanager/CustomAsserts.java b/src/test/java/com/amazonaws/services/dynamodb/sessionmanager/CustomAsserts.java index c3bcca6..9318786 100644 --- a/src/test/java/com/amazonaws/services/dynamodb/sessionmanager/CustomAsserts.java +++ b/src/test/java/com/amazonaws/services/dynamodb/sessionmanager/CustomAsserts.java @@ -43,7 +43,7 @@ public static void assertSessionDataEquals(HttpSession expectedSession, HttpSess } private static SortedSet toSortedSet(Enumeration enumeration) { - SortedSet list = new TreeSet(); + SortedSet list = new TreeSet<>(); while (enumeration.hasMoreElements()) { list.add(enumeration.nextElement()); } diff --git a/src/test/java/com/amazonaws/services/dynamodb/sessionmanager/DynamoDBSessionManagerIntegrationTest.java b/src/test/java/com/amazonaws/services/dynamodb/sessionmanager/DynamoDBSessionManagerIntegrationTest.java index 96358cf..62283f4 100644 --- a/src/test/java/com/amazonaws/services/dynamodb/sessionmanager/DynamoDBSessionManagerIntegrationTest.java +++ b/src/test/java/com/amazonaws/services/dynamodb/sessionmanager/DynamoDBSessionManagerIntegrationTest.java @@ -15,9 +15,15 @@ package com.amazonaws.services.dynamodb.sessionmanager; import com.amazonaws.AmazonServiceException; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; +import com.amazonaws.services.dynamodbv2.model.DeleteTableRequest; import com.amazonaws.services.dynamodbv2.model.DescribeTableRequest; import com.amazonaws.services.dynamodbv2.model.TableDescription; +import com.amazonaws.services.dynamodbv2.util.TableUtils; +import com.amazonaws.test.AWSIntegrationTestBase; import com.amazonaws.test.AWSTestBase; import org.apache.catalina.Context; @@ -38,13 +44,13 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -public class DynamoDBSessionManagerIntegrationTest extends AWSTestBase { +public class DynamoDBSessionManagerIntegrationTest extends AWSIntegrationTestBase { private static final String SESSION_ID = "1234"; private static final int MAX_IDLE_BACKUP_SECONDS = 1; private static final String ATTR_NAME = "someAttr"; - private static AmazonDynamoDBClient dynamo; + private static AmazonDynamoDB dynamo; private static Tomcat tomcat; private static Context webapp; @@ -54,7 +60,7 @@ public class DynamoDBSessionManagerIntegrationTest extends AWSTestBase { @BeforeClass public static void setupFixture() throws Exception { setUpCredentials(); - dynamo = new AmazonDynamoDBClient(credentials); + dynamo = AmazonDynamoDBClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(getCredentials())).withRegion("us-east-1").build(); String workingDir = System.getProperty("java.io.tmpdir"); File webappDirectory = Files.createTempDirectory(Paths.get(workingDir), null).toFile(); @@ -78,7 +84,7 @@ public void setup() { @After public void tearDown() { - dynamo.deleteTable(sessionTableName); + TableUtils.deleteTableIfExists(dynamo, new DeleteTableRequest(sessionTableName)); } @AfterClass @@ -175,8 +181,8 @@ public void swappedOutSessionsDoNotReplaceActiveSessionDuringProcessExpires() th } private void configureWithExplicitCredentials(DynamoDBSessionManager sessionManager) { - sessionManager.setAwsAccessKey(credentials.getAWSAccessKeyId()); - sessionManager.setAwsSecretKey(credentials.getAWSSecretKey()); + sessionManager.setAwsAccessKey(getCredentials().getAWSAccessKeyId()); + sessionManager.setAwsSecretKey(getCredentials().getAWSSecretKey()); sessionManager.setTable(sessionTableName); webapp.setManager(sessionManager); } diff --git a/src/test/java/com/amazonaws/services/dynamodb/sessionmanager/SessionStorageIntegrationTestBase.java b/src/test/java/com/amazonaws/services/dynamodb/sessionmanager/SessionStorageIntegrationTestBase.java index 1ae21f5..1001e44 100644 --- a/src/test/java/com/amazonaws/services/dynamodb/sessionmanager/SessionStorageIntegrationTestBase.java +++ b/src/test/java/com/amazonaws/services/dynamodb/sessionmanager/SessionStorageIntegrationTestBase.java @@ -19,35 +19,39 @@ import java.util.List; +import com.amazonaws.auth.AWSCredentialsProvider; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; +import com.amazonaws.services.dynamodbv2.model.DeleteTableRequest; +import com.amazonaws.services.dynamodbv2.util.TableUtils; +import com.amazonaws.test.AWSIntegrationTestBase; import org.junit.After; import org.junit.AfterClass; import org.junit.BeforeClass; import com.amazonaws.services.dynamodb.sessionmanager.converters.SessionConverter; import com.amazonaws.services.dynamodb.sessionmanager.util.DynamoUtils; -import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.FailedBatch; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBScanExpression; -import com.amazonaws.services.dynamodbv2.util.Tables; -import com.amazonaws.test.AWSTestBase; /** * Base class for tests interacting directly with DynamoDB. Creates a unique table per test class */ -public class SessionStorageIntegrationTestBase extends AWSTestBase { +public class SessionStorageIntegrationTestBase extends AWSIntegrationTestBase { - private static AmazonDynamoDBClient dynamoClient; + private static AmazonDynamoDB dynamoClient; private static DynamoDBMapper dynamoMapper; private static String tableName; @BeforeClass public static final void baseSetupFixture() throws Exception { setUpCredentials(); - dynamoClient = new AmazonDynamoDBClient(credentials); + dynamoClient = AmazonDynamoDBClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(getCredentials())).withRegion("us-east-1").build(); tableName = getUniqueTableName(); DynamoUtils.createSessionTable(dynamoClient, tableName, 10L, 10L); - Tables.waitForTableToBecomeActive(dynamoClient, tableName); dynamoMapper = DynamoUtils.createDynamoMapper(dynamoClient, tableName); } @@ -65,7 +69,7 @@ public void baseTearDown() { @AfterClass public static final void baseTearDownFixture() { - dynamoClient.deleteTable(tableName); + TableUtils.deleteTableIfExists(dynamoClient, new DeleteTableRequest(tableName)); } private static String getUniqueTableName() { diff --git a/src/test/java/com/amazonaws/services/dynamodb/sessionmanager/converters/TestSessionFactory.java b/src/test/java/com/amazonaws/services/dynamodb/sessionmanager/converters/TestSessionFactory.java index 94dc562..0fdea37 100644 --- a/src/test/java/com/amazonaws/services/dynamodb/sessionmanager/converters/TestSessionFactory.java +++ b/src/test/java/com/amazonaws/services/dynamodb/sessionmanager/converters/TestSessionFactory.java @@ -120,7 +120,7 @@ public final TestStandardSession createTestStandardSession() { } private static Map getDefaultSessionAttributes() { - Map sessionData = new HashMap(); + Map sessionData = new HashMap<>(); sessionData.put("someAttribute", new CustomSessionClass("customData")); return sessionData; }