[
  {
    "path": ".gitignore",
    "content": ".idea/\ntarget/\n*.iml\n.DS_Store\n\n# Compiled class file\n*.class\n\n# Log file\n*.log\n\n# BlueJ files\n*.ctxt\n\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\n\n# Package Files #\n*.jar\n*.war\n*.nar\n*.ear\n*.zip\n*.tar.gz\n*.rar\n\n# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml\nhs_err_pid*\n"
  },
  {
    "path": "README.md",
    "content": "# AWS Java Samples\nA repository of basic AWS samples to get you started connecting to various AWS Services using the V1 and V2 SDKs.\n\n## Assumptions:\n\nMuch of this code is intentionally not commented, as variables and methods are named in such a way that it should be fairly straightforward to understand what is happening.\n\nThis does assume a basic knowledge of Java.\n\nThis also assumes you have created an AWS account. Basic information on what you need to do in the UI is documented in each of the samples.\n\n## Important:\n\nRemember to add your own credentials into the AWS Shared package ([how-to](https://aws.amazon.com/premiumsupport/knowledge-center/create-access-key/)).\n\nYou can run the test [InitTest](src/test/java/InitTest.java) to confirm that you have at least changed all the values (although it does not validate them).\n\nEach section contains a brief comment detailing the steps you need to take in the AWS Web UI to get set up. The program won't run unless you do these tasks.\n\n## SDK V1 Samples \n(V1 Is still supported and widely used):\n\n* [Amazon SQS - Simple Queue Service](src/main/java/com/waynecovell/awsJavaSamples/V1SDK/SQS/SQS_Start.java)\n* [Amazon SNS - Simple Notification Service](src/main/java/com/waynecovell/awsJavaSamples/V1SDK/SNS/SNS_Start.java)\n* [Amazon SES - Simple Email Service](src/main/java/com/waynecovell/awsJavaSamples/V1SDK/SES/SES_Start.java)\n* [Amazon RDS - Relational Database Service](src/main/java/com/waynecovell/awsJavaSamples/V1SDK/RDS/RDS_Start.java)\n* [Amazon SM - Secrets Manager](src/main/java/com/waynecovell/awsJavaSamples/V1SDK/SM/SM_Start.java)\n\n## SDK V2 Samples:\n\n* [Amazon SM - Secrets Manager](src/main/java/com/waynecovell/awsJavaSamples/V2SDK/SM/SM_Start.java)\n* [Amazon S3 - S3](src/main/java/com/waynecovell/awsJavaSamples/V2SDK/S3/S3_Start.java)\n\n## Don't forget to star this repository if you find it useful :-)\n"
  },
  {
    "path": "pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0\n                      http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>com.infinityworks.wayne</groupId>\n    <artifactId>aws-sample</artifactId>\n    <packaging>jar</packaging>\n    <version>1.0-SNAPSHOT</version>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <configuration>\n                    <source>8</source>\n                    <target>8</target>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n    <name>AWS Samples</name>\n    <url>http://maven.apache.org</url>\n\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <!-- For AWS V2 SDK -->\n                <groupId>software.amazon.awssdk</groupId>\n                <artifactId>bom</artifactId>\n                <version>2.5.25</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.postgresql</groupId>\n            <artifactId>postgresql</artifactId>\n            <version>42.2.5</version>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework</groupId>\n            <artifactId>spring-jdbc</artifactId>\n            <version>5.0.8.RELEASE</version>\n        </dependency>\n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n            <version>4.11</version>\n            <scope>test</scope>\n        </dependency>\n        <!-- AWS SDK V2 -->\n        <dependency>\n            <groupId>software.amazon.awssdk</groupId>\n            <artifactId>secretsmanager</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>software.amazon.awssdk</groupId>\n            <artifactId>s3</artifactId>\n        </dependency>\n        <!-- AWS SDK V1 -->\n        <dependency>\n            <groupId>com.amazonaws</groupId>\n            <artifactId>amazon-sqs-java-messaging-lib</artifactId>\n            <version>1.0.4</version>\n            <type>jar</type>\n        </dependency>\n        <dependency>\n            <groupId>com.amazonaws</groupId>\n            <artifactId>aws-lambda-java-events</artifactId>\n            <version>1.3.0</version>\n        </dependency>\n        <dependency>\n            <groupId>com.amazonaws</groupId>\n            <artifactId>aws-java-sdk-s3</artifactId>\n            <version>1.11.534</version>\n        </dependency>\n        <dependency>\n            <groupId>com.amazonaws</groupId>\n            <artifactId>aws-java-sdk-rds</artifactId>\n            <version>1.11.327</version>\n        </dependency>\n        <dependency>\n            <groupId>com.amazonaws</groupId>\n            <artifactId>aws-java-sdk-ses</artifactId>\n            <version>1.11.327</version>\n        </dependency>\n        <dependency>\n            <groupId>com.amazonaws</groupId>\n            <artifactId>aws-java-sdk-sns</artifactId>\n            <version>1.11.327</version>\n        </dependency>\n        <dependency>\n            <groupId>com.amazonaws</groupId>\n            <artifactId>aws-java-sdk-secretsmanager</artifactId>\n            <version>1.11.327</version>\n        </dependency>\n    </dependencies>\n</project>"
  },
  {
    "path": "src/main/java/com/wazcov/awsJavaSamples/AwsShared/AWSSharedUtils.java",
    "content": "package com.wazcov.awsJavaSamples.AwsShared;\n\nimport com.amazonaws.auth.BasicAWSCredentials;\nimport com.amazonaws.regions.Regions;\nimport software.amazon.awssdk.auth.credentials.AwsBasicCredentials;\n\n/*\n    Enter your own credentials here\n */\npublic class AWSSharedUtils {\n    public static Regions region = Regions.EU_WEST_1; //e.g Regions.US_EAST_1;\n    public static String receiverEmailAddress = \"XXX\";\n    public static String accessKey = \"xxx\";\n    public static String secretKey = \"xxx\";\n\n    //V1 SDK\n    public static BasicAWSCredentials creds = new BasicAWSCredentials(accessKey, secretKey);\n    //V2 SDK\n    public static AwsBasicCredentials basicCredentials = AwsBasicCredentials.create(accessKey, secretKey);\n}\n"
  },
  {
    "path": "src/main/java/com/wazcov/awsJavaSamples/V1SDK/Lambda/Lambda_Start.java",
    "content": "package com.wazcov.awsJavaSamples.V1SDK.Lambda;\n\nimport com.amazonaws.services.lambda.runtime.events.S3Event;\nimport com.amazonaws.services.s3.AmazonS3;\nimport com.amazonaws.services.s3.AmazonS3Client;\n\nimport java.net.URLDecoder;\n\n/*\n    This is an example function for processing data from an S3 Bucket in AWS Lambda.\n\n    1) Upload a .jar file containing a class like this one to AWS Lambda.\n    2) Set an S3 Trigger of \"Event type: ObjectCreated\" TODO: Add infrastructure code to build this\n    3) Set the Handler to match \"com.wazcov.awsJavaSamples.V1SDK.Lambda.Lambda_Start::testCode\"\n    4) Upload a file with text in it to S3\n    5) Check CloudWatch logs for the System.out statements\n */\n\npublic class Lambda_Start {\n    public static void testCode(S3Event s3Event) throws Exception {\n\n        StringBuilder stringBuilder = new StringBuilder();\n\n        s3Event.getRecords().forEach(e -> {\n            try {\n                String bucket = e.getS3().getBucket().getName();\n\n                String key = e.getS3().getObject().getKey().replace('+', ' ');\n                key = URLDecoder.decode(key, \"UTF-8\");\n\n                AmazonS3 s3Client = AmazonS3Client.builder().build();\n                s3Client.getObjectAsString(bucket, key);\n                stringBuilder.append(s3Client.getObjectAsString(bucket, key));\n\n            } catch (Exception ex) {\n                System.out.println(ex.toString());\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/wazcov/awsJavaSamples/V1SDK/RDS/RDS_Start.java",
    "content": "package com.wazcov.awsJavaSamples.V1SDK.RDS;\n\nimport com.wazcov.awsJavaSamples.AwsShared.AWSSharedUtils;\nimport com.amazonaws.auth.AWSStaticCredentialsProvider;\nimport com.amazonaws.services.rds.AmazonRDS;\nimport com.amazonaws.services.rds.AmazonRDSClientBuilder;\nimport com.amazonaws.services.rds.model.CreateDBInstanceRequest;\nimport com.amazonaws.services.rds.model.DBInstance;\nimport com.amazonaws.services.rds.model.DescribeDBInstancesResult;\nimport com.amazonaws.services.rds.model.Endpoint;\n\nimport java.io.IOException;\nimport java.sql.Connection;\nimport java.sql.DriverManager;\nimport java.sql.PreparedStatement;\nimport java.sql.ResultSet;\nimport java.sql.Statement;\nimport java.util.List;\nimport java.util.UUID;\n\npublic class RDS_Start {\n\n     /*\n        To Use AWS com.waynecovell.awsJavaSamples.V1SDK.RDS, you need to ensure you have the following:\n\n        - A user created in AWS IAM\n        - Appropriate user, region, etc details updated in in AWSSharedUtils\n        - AmazonRDSFullAccess Group assigned to that user in IAM\n     */\n\n    private static AmazonRDS client;\n    private static Statement statement;\n    private static Connection connection;\n    private static String jdbcUrl;\n\n    public static void main(String[] args) throws IOException {\n        try {\n            DriverManager.registerDriver(new org.postgresql.Driver());\n            connectToAwsRds();\n            createDatabase();\n\n            /*\n            If we run the following commands straight away, it returns a null database\n             so we must run the create script, then the others a few minutes afterwards\n             */\n\n\n            /*\n            TODO You currently have to edit the default VPC to allow traffic from anywhere on all ports.\n                There should be a way to do this programmatically\n             */\n\n/*            listDatabases();\n            createDatabaseTable();\n            insertDatabaseData();\n            validateDatabaseData();*/\n        } catch (Exception e) {\n            System.out.println(\"Problem managing database \" + e.toString());\n            e.printStackTrace();\n        }\n    }\n\n    private static void connectToAwsRds() {\n        client = AmazonRDSClientBuilder\n                .standard()\n                .withCredentials(new AWSStaticCredentialsProvider(AWSSharedUtils.creds))\n                .withRegion(AWSSharedUtils.region).build();\n    }\n\n    private static void listDatabases() {\n        //When listing, make sure you are using the region where you created the database, by editing it in AWSSharedUtils\n        DescribeDBInstancesResult result = client.describeDBInstances();\n        List<DBInstance> instances = result.getDBInstances();\n        DBInstance instance = instances.get(0); //If you have multiple databases, this just gets the first one\n        // Information about each com.waynecovell.awsJavaSamples.V1SDK.RDS instance\n        String identifier = instance.getDBInstanceIdentifier();\n        String engine = instance.getEngine();\n        String status = instance.getDBInstanceStatus();\n        Endpoint endpoint = instance.getEndpoint();\n\n        engine += engine == \"postgres\" ? \"ql\" : \"\"; //The JDBC connection string needs \"postgresql\" yet amazon just return \"postgres\"\n        jdbcUrl = \"jdbc:\" + engine + \"ql://\" + endpoint.getAddress() + \":\" + endpoint.getPort() + \"/\" + identifier;\n\n        System.out.println(\"Database exists: \" + jdbcUrl);\n    }\n\n    private static void validateDatabaseData() throws Exception {\n        String sql = \"SELECT  count(*) as count FROM awstest\";\n        ResultSet resultSet = statement.executeQuery(sql);\n        while (resultSet.next()) {\n            String count = resultSet.getString(\"count\");\n            System.out.println(\"Total Records: \" + count);\n        }\n        System.out.println(\"Validated database data\");\n    }\n\n    private static void insertDatabaseData() throws Exception {\n        PreparedStatement preparedStatement = connection.prepareStatement(\"INSERT INTO awstest (content) VALUES (?)\");\n        String content = \"\" + UUID.randomUUID();\n        preparedStatement.setString(1, content);\n        preparedStatement.executeUpdate();\n        System.out.println(\"Inserted database data\");\n    }\n\n    private static void createDatabaseTable() throws Exception {\n        connection = DriverManager.getConnection(jdbcUrl, \"fred\", \"fredfred123\");\n        statement = connection.createStatement();\n        String sql = \"CREATE TABLE IF NOT EXISTS awstest (id SERIAL PRIMARY KEY, content VARCHAR(80))\";\n        statement.executeUpdate(sql);\n        System.out.println(\"Added db table\");\n    }\n\n    private static void createDatabase() {\n        CreateDBInstanceRequest request = new CreateDBInstanceRequest();\n        request.setDBInstanceIdentifier(\"awsjava\");\n        request.setDBInstanceClass(\"db.t2.micro\");\n        request.setEngine(\"postgres\");\n        request.setMultiAZ(false);\n        request.setPort(5432);\n        request.setMasterUsername(\"fred\");\n        request.setMasterUserPassword(\"fredfred123\");\n        request.setDBName(\"awsjava\");\n        request.setStorageType(\"gp2\");\n        request.setAllocatedStorage(10);\n\n        client.createDBInstance(request);\n        System.out.println(\"Created database\");\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/wazcov/awsJavaSamples/V1SDK/SES/SES_Start.java",
    "content": "package com.wazcov.awsJavaSamples.V1SDK.SES;\n\nimport com.wazcov.awsJavaSamples.AwsShared.AWSSharedUtils;\nimport com.amazonaws.auth.AWSStaticCredentialsProvider;\nimport com.amazonaws.services.simpleemail.AmazonSimpleEmailService;\nimport com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientBuilder;\nimport com.amazonaws.services.simpleemail.model.Body;\nimport com.amazonaws.services.simpleemail.model.Content;\nimport com.amazonaws.services.simpleemail.model.Destination;\nimport com.amazonaws.services.simpleemail.model.Message;\nimport com.amazonaws.services.simpleemail.model.SendEmailRequest;\n\nimport java.io.IOException;\n\npublic class SES_Start {\n\n    /*\n        To Use AWS com.waynecovell.awsJavaSamples.V1SDK.SES, you need to ensure you have the following:\n\n        - A user created in AWS IAM\n        - Appropriate user, region, etc details updated in in AWSSharedUtils\n        - AmazonSESFullAccess Group assigned to that user in IAM\n        - Two valid, email addresses, both verified in AWS com.waynecovell.awsJavaSamples.V1SDK.SES\n        - A valid configuration set, created in AWS com.waynecovell.awsJavaSamples.V1SDK.SES ( I selected CloudWatch with a tag of a:1)\n     */\n\n    private static final String fromAddress = \"wayne.covell@infinityworks.com\";\n    private static final String toAddress = AWSSharedUtils.receiverEmailAddress;\n    private static final String configSet = \"MyConfig\";\n\n    private static final String subject = \"Amazon com.waynecovell.awsJavaSamples.V1SDK.SES test (AWS SDK for Java)\";\n    private static final String htmlBody = \"<h1>Amazon com.waynecovell.awsJavaSamples.V1SDK.SES test (AWS SDK for Java)</h1>\"\n            + \"<p>This email was sent with <a href='https://aws.amazon.com/ses/'>\"\n            + \"Amazon com.waynecovell.awsJavaSamples.V1SDK.SES</a> using the <a href='https://aws.amazon.com/sdk-for-java/'>\"\n            + \"AWS SDK for Java</a>\";\n\n    private static final String nonHtmlClientBody = \"This email was sent through Amazon com.waynecovell.awsJavaSamples.V1SDK.SES \"\n            + \"using the AWS SDK for Java.\";\n\n    public static void main(String[] args) throws IOException {\n\n        try {\n            AmazonSimpleEmailService client = AmazonSimpleEmailServiceClientBuilder\n                            .standard()\n                            .withCredentials(new AWSStaticCredentialsProvider(AWSSharedUtils.creds))\n                            .withRegion(AWSSharedUtils.region).build();\n\n            SendEmailRequest request = new SendEmailRequest()\n                    .withDestination(\n                            new Destination().withToAddresses(toAddress))\n                    .withMessage(new Message()\n                            .withBody(new Body()\n                                    .withHtml(new Content()\n                                            .withCharset(\"UTF-8\").withData(htmlBody))\n                                    .withText(new Content()\n                                            .withCharset(\"UTF-8\").withData(nonHtmlClientBody)))\n                            .withSubject(new Content()\n                                    .withCharset(\"UTF-8\").withData(subject)))\n                    .withSource(fromAddress)\n                    .withConfigurationSetName(configSet);\n            client.sendEmail(request);\n            System.out.println(\"Email sent!\");\n        } catch (Exception ex) {\n            System.out.println(\"The email was not sent. Error message: \"\n                    + ex.getMessage());\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/wazcov/awsJavaSamples/V1SDK/SM/SM_Start.java",
    "content": "package com.wazcov.awsJavaSamples.V1SDK.SM;\n\nimport com.amazonaws.auth.AWSStaticCredentialsProvider;\nimport com.amazonaws.services.secretsmanager.AWSSecretsManager;\nimport com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder;\nimport com.amazonaws.services.secretsmanager.model.CreateSecretRequest;\nimport com.amazonaws.services.secretsmanager.model.GetSecretValueRequest;\nimport com.amazonaws.services.secretsmanager.model.GetSecretValueResult;\nimport com.amazonaws.services.secretsmanager.model.ListSecretsRequest;\nimport com.amazonaws.services.secretsmanager.model.ListSecretsResult;\nimport com.amazonaws.util.IOUtils;\nimport com.wazcov.awsJavaSamples.AwsShared.AWSSharedUtils;\n\nimport java.io.InputStream;\nimport java.nio.ByteBuffer;\nimport java.security.KeyFactory;\nimport java.security.PublicKey;\nimport java.security.spec.X509EncodedKeySpec;\n\npublic class SM_Start {\n\n    private static final String region = \"us-east-2\";\n    private static AWSSecretsManager client = null;\n    private static final String STRING_KEY_NAME = \"StringKeyX\";\n    private static final String BINARY_FILE_KEY_NAME = \"FileKeyX\";\n\n    public static void main(String[] args) {\n\n        SM_Start secretsManagerApplication = new SM_Start();\n\n        try {\n            secretsManagerApplication.setupSecretManager();\n\n            //Example Storing Key String\n            secretsManagerApplication.createSecretString();\n            secretsManagerApplication.getSecretStringValue();\n\n            //Example Storing Key Binary\n            secretsManagerApplication.createSecretFromFile();\n            secretsManagerApplication.getSecretFileValue();\n\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    private void setupSecretManager() {\n        client = AWSSecretsManagerClientBuilder.standard()\n                .withRegion(region)\n                .withCredentials(new AWSStaticCredentialsProvider(AWSSharedUtils.creds))\n                .build();\n    }\n\n    private void createSecretString() {\n        CreateSecretRequest createSecretRequest = new CreateSecretRequest().withName(STRING_KEY_NAME).withSecretString(\"Hello World\");\n        client.createSecret(createSecretRequest);\n        System.out.println(\"Stored Secret String\");\n    }\n\n    private void getSecretStringValue() {\n        ListSecretsRequest listSecretsRequest = new ListSecretsRequest();\n        ListSecretsResult secretsResult = client.listSecrets(listSecretsRequest);\n        secretsResult.getSecretList().forEach(e -> System.out.println(\"Retrieved: \" + e.getName()));\n\n        GetSecretValueRequest getSecretValueRequest = new GetSecretValueRequest().withSecretId(STRING_KEY_NAME);\n        GetSecretValueResult secretValueResult = client.getSecretValue(getSecretValueRequest);\n        String secretString = secretValueResult.getSecretString();\n\n        System.out.println(\"Retrieved String Value: \" + secretString);\n    }\n\n    private void createSecretFromFile() throws Exception {\n        InputStream publicKeyStream = this.getClass().getClassLoader().getResourceAsStream(\"publicKeyFile\");\n        byte[] targetArray = IOUtils.toByteArray(publicKeyStream);\n        ByteBuffer secretBinaryByteBuffer = ByteBuffer.wrap(targetArray);\n\n        CreateSecretRequest createSecretRequest = new CreateSecretRequest().withName(BINARY_FILE_KEY_NAME).withSecretBinary(secretBinaryByteBuffer);\n        client.createSecret(createSecretRequest);\n\n        System.out.println(\"Stored Secret File\");\n    }\n\n    private void getSecretFileValue() throws Exception {\n        GetSecretValueRequest getSecretValueRequest = new GetSecretValueRequest().withSecretId(BINARY_FILE_KEY_NAME);\n        GetSecretValueResult secretValueResult = client.getSecretValue(getSecretValueRequest);\n        ByteBuffer secretBinaryByteBuffer = secretValueResult.getSecretBinary();\n\n        byte[] bytes = new byte[secretBinaryByteBuffer.capacity()];\n        secretBinaryByteBuffer.get(bytes, 0, bytes.length);\n\n        X509EncodedKeySpec spec = new X509EncodedKeySpec(bytes);\n        KeyFactory kf = KeyFactory.getInstance(\"RSA\");\n        PublicKey binary = kf.generatePublic(spec);\n\n        System.out.println(\"Retrieved Secret Binary:\");\n        System.out.println(binary.toString());\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/wazcov/awsJavaSamples/V1SDK/SNS/SNS_Start.java",
    "content": "package com.wazcov.awsJavaSamples.V1SDK.SNS;\n\nimport com.wazcov.awsJavaSamples.AwsShared.AWSSharedUtils;\nimport com.amazonaws.auth.AWSStaticCredentialsProvider;\nimport com.amazonaws.auth.BasicAWSCredentials;\nimport com.amazonaws.services.sns.AmazonSNS;\nimport com.amazonaws.services.sns.AmazonSNSClient;\nimport com.amazonaws.services.sns.model.CreateTopicRequest;\nimport com.amazonaws.services.sns.model.CreateTopicResult;\nimport com.amazonaws.services.sns.model.PublishRequest;\nimport com.amazonaws.services.sns.model.PublishResult;\nimport com.amazonaws.services.sns.model.SubscribeRequest;\n\npublic class SNS_Start {\n\n    /*\n        To Use AWS com.waynecovell.awsJavaSamples.V1SDK.SNS, you need to ensure you have the following:\n\n        - A user created in AWS IAM\n        - Appropriate user, region, etc details updated in in AWSSharedUtils\n        - AmazonSNSFullAccess Group assigned to that user in IAM\n        - A valid email address, specified below (after subscribing you have to confirm with your email)\n\n        Create A Topic method shows how one could create a topic programmatically, however you could create\n        this in the AWS UI and hard-code it.\n     */\n\n    private static AmazonSNS amazonSNSClient = null;\n\n    public static void main(String[] args) {\n        openSNSConnection();\n        String arn = createATopic();\n        subscribeToATopic(arn);\n        publishToATopic(arn);\n    }\n\n    public static void openSNSConnection() {\n        BasicAWSCredentials creds = AWSSharedUtils.creds;\n        amazonSNSClient = AmazonSNSClient.builder()\n                .withCredentials(new AWSStaticCredentialsProvider(creds))\n                .withRegion(AWSSharedUtils.region)\n                .build();\n    }\n\n    public static String createATopic() {\n        final CreateTopicRequest createTopicRequest = new CreateTopicRequest(\"MyTopic\");\n        final CreateTopicResult createTopicResponse = amazonSNSClient.createTopic(createTopicRequest);\n        System.out.println(\"TopicArn:\" + createTopicResponse.getTopicArn());\n        System.out.println(\"CreateTopicRequest: \" + amazonSNSClient.getCachedResponseMetadata(createTopicRequest));\n        return createTopicResponse.getTopicArn();\n    }\n\n    public static void subscribeToATopic(String topicArn) {\n        final SubscribeRequest subscribeRequest = new SubscribeRequest(topicArn, \"email\", AWSSharedUtils.receiverEmailAddress);\n        amazonSNSClient.subscribe(subscribeRequest);\n\n        System.out.println(\"SubscribeRequest: \" + amazonSNSClient.getCachedResponseMetadata(subscribeRequest));\n        System.out.println(\"To confirm the subscription, check your email.\");\n    }\n\n    public static void publishToATopic(String topicArn) {\n        try {\n            Thread.sleep(30000); //You have 30 seconds to confirm the subscription in your email account\n        }catch(InterruptedException ie){}\n\n        final String msg = \"If you receive this message, publishing a message to an Amazon com.waynecovell.awsJavaSamples.V1SDK.SNS topic works.\";\n        final PublishRequest publishRequest = new PublishRequest(topicArn, msg);\n        final PublishResult publishResponse = amazonSNSClient.publish(publishRequest);\n\n        System.out.println(\"MessageId: \" + publishResponse.getMessageId());\n        //Now check your email for a notification\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/wazcov/awsJavaSamples/V1SDK/SQS/SQS_Start.java",
    "content": "package com.wazcov.awsJavaSamples.V1SDK.SQS;\n\nimport com.wazcov.awsJavaSamples.AwsShared.AWSSharedUtils;\nimport com.amazon.sqs.javamessaging.ProviderConfiguration;\nimport com.amazon.sqs.javamessaging.SQSConnection;\nimport com.amazon.sqs.javamessaging.SQSConnectionFactory;\nimport com.amazonaws.auth.AWSStaticCredentialsProvider;\nimport com.amazonaws.auth.BasicAWSCredentials;\nimport com.amazonaws.services.sqs.AmazonSQSClientBuilder;\n\nimport javax.jms.Message;\nimport javax.jms.MessageConsumer;\nimport javax.jms.MessageProducer;\nimport javax.jms.Queue;\nimport javax.jms.Session;\nimport javax.jms.TextMessage;\n\npublic class SQS_Start {\n\n    /*\n        To Use AWS com.waynecovell.awsJavaSamples.V1SDK.SQS, you need to ensure you have the following:\n\n        - A user created in AWS IAM\n        - Appropriate user, region, etc details updated in in AWSSharedUtils\n        - AmazonSQSFullAccess Group assigned to that user in IAM\n        - A queue created in the UI for com.waynecovell.awsJavaSamples.V1SDK.SQS, with the same name used below\n        - A region specified in AWSSharedUtils that matches the region you created the aformetnioned queue in, in AWS UI.\n     */\n\n    private static SQSConnection connection = null;\n    private static Session session = null;\n    private static Queue queue = null;\n\n    public static void main(String[] args) {\n        try {\n            openQueueConnection();\n            sendMessageOnAQueue();\n            receiveMessagesFromAQueue();\n            closeQueueConnection();\n        }\n        catch(Exception e) {\n            System.out.println(e.toString());\n        }\n    }\n\n    private static void closeQueueConnection() throws Exception {\n        connection.close();\n    }\n\n    public static void receiveMessagesFromAQueue() throws Exception {\n        MessageConsumer consumer = session.createConsumer(queue);\n        connection.start();\n        Message receivedMessage = consumer.receive(1000);\n        if (receivedMessage != null) {\n            System.out.println(\"Received: \" + ((TextMessage) receivedMessage).getText());\n        }\n    }\n\n    public static void sendMessageOnAQueue() throws Exception {\n        MessageProducer producer = session.createProducer(queue);\n        TextMessage message = session.createTextMessage(\"Hello World!\");\n        producer.send(message);\n        System.out.println(\"JMS Message \" + message.getJMSMessageID());\n    }\n\n    public static void openQueueConnection() throws Exception {\n        //Get these credentials from IAM in the AWS Web UI\n        BasicAWSCredentials creds = AWSSharedUtils.creds;\n        SQSConnectionFactory connectionFactory = new SQSConnectionFactory(\n                new ProviderConfiguration(),\n                AmazonSQSClientBuilder.standard()\n                        .withCredentials(new AWSStaticCredentialsProvider(creds))\n                        .withRegion(AWSSharedUtils.region).build()\n        );\n        connection = connectionFactory.createConnection();\n        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);\n        queue = session.createQueue(\"MyQueue\");\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/wazcov/awsJavaSamples/V2SDK/S3/S3_Start.java",
    "content": "package com.wazcov.awsJavaSamples.V2SDK.S3;\n\nimport com.wazcov.awsJavaSamples.AwsShared.AWSSharedUtils;\nimport software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;\nimport software.amazon.awssdk.core.sync.RequestBody;\nimport software.amazon.awssdk.services.s3.S3Client;\nimport software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;\nimport software.amazon.awssdk.services.s3.model.CreateBucketRequest;\nimport software.amazon.awssdk.services.s3.model.ListBucketsRequest;\nimport software.amazon.awssdk.services.s3.model.ListBucketsResponse;\nimport software.amazon.awssdk.services.s3.model.ListObjectsV2Request;\nimport software.amazon.awssdk.services.s3.model.ListObjectsV2Response;\nimport software.amazon.awssdk.services.s3.model.PutObjectRequest;\n\nimport java.nio.ByteBuffer;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\npublic class S3_Start {\n\n    private static final String BUCKET_NAME = \"testing\";\n    private static S3Client client = null;\n\n    public static void main(String[] args) {\n        setupS3();\n        createBucket(BUCKET_NAME);\n        if (listBuckets().contains(BUCKET_NAME)) {\n            System.out.println(\"Bucket Exists\");\n            uploadToS3(BUCKET_NAME, \"Sample_File.txt\");\n            listObjectsInS3Bucket(BUCKET_NAME);\n        }\n    }\n\n    private static void setupS3() {\n        client = S3Client.builder().credentialsProvider(StaticCredentialsProvider.create(AWSSharedUtils.basicCredentials)).build();\n    }\n\n    private static void createBucket(String bucket_name) {\n        CreateBucketRequest createBucketRequest = CreateBucketRequest\n                .builder()\n                .bucket(bucket_name)\n                .createBucketConfiguration(CreateBucketConfiguration.builder()\n                        .locationConstraint(AWSSharedUtils.region.getName())\n                        .build())\n                .build();\n        client.createBucket(createBucketRequest);\n        System.out.println(\"Created Bucket\");\n    }\n\n    private static List<String> listBuckets() {\n        ListBucketsRequest listBucketsRequest = ListBucketsRequest.builder().build();\n        ListBucketsResponse listBucketsResponse = client.listBuckets(listBucketsRequest);\n        List<String> buckets = listBucketsResponse.buckets().stream().map(x -> x.name()).collect(Collectors.toList());\n        System.out.println(\"Listing Buckets\");\n        return buckets;\n    }\n\n    private static void uploadToS3(String bucket_name, String key_name) {\n        try {\n            client.putObject(PutObjectRequest.builder()\n                    .bucket(bucket_name)\n                    .key(key_name)\n                    .build(), RequestBody.fromByteBuffer(ByteBuffer.wrap(\"Hello World\".getBytes())));\n            System.out.println(\"Uploaded File\");\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    private static void listObjectsInS3Bucket(String bucket_name) {\n        ListObjectsV2Request listObjectsV2Request = ListObjectsV2Request.builder().bucket(bucket_name).build();\n        ListObjectsV2Response listObjectsV2Response;\n        listObjectsV2Response = client.listObjectsV2(listObjectsV2Request);\n        listObjectsV2Response.contents().stream().map(x -> x.key()).forEach(e -> System.out.println(e));\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/wazcov/awsJavaSamples/V2SDK/SM/SM_Start.java",
    "content": "package com.wazcov.awsJavaSamples.V2SDK.SM;\n\nimport com.amazonaws.util.IOUtils;\nimport com.wazcov.awsJavaSamples.AwsShared.AWSSharedUtils;\nimport software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;\nimport software.amazon.awssdk.core.SdkBytes;\nimport software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;\nimport software.amazon.awssdk.services.secretsmanager.model.CreateSecretRequest;\nimport software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest;\nimport software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse;\nimport software.amazon.awssdk.services.secretsmanager.model.ListSecretsRequest;\nimport software.amazon.awssdk.services.secretsmanager.model.ListSecretsResponse;\n\nimport java.io.InputStream;\nimport java.nio.ByteBuffer;\nimport java.security.KeyFactory;\nimport java.security.PublicKey;\nimport java.security.spec.X509EncodedKeySpec;\n\npublic class SM_Start {\n\n    private static SecretsManagerClient client = null;\n    private static final String STRING_KEY_NAME = \"StringKeyX\";\n    private static final String BINARY_FILE_KEY_NAME = \"FileKeyX\";\n\n    public static void main(String[] args) {\n\n        SM_Start secretsManagerApplication = new SM_Start();\n\n        try {\n            secretsManagerApplication.setupSecretManager();\n\n            //Example Storing Key String\n            secretsManagerApplication.createSecretString();\n            secretsManagerApplication.getSecretStringValue();\n\n            //Example Storing Key Binary\n            secretsManagerApplication.createSecretFromFile();\n            secretsManagerApplication.getSecretFileValue();\n\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    private void setupSecretManager() {\n        client = SecretsManagerClient.builder().credentialsProvider(StaticCredentialsProvider.create(AWSSharedUtils.basicCredentials)).build();\n    }\n\n    private void createSecretString() {\n        CreateSecretRequest createSecretRequest = CreateSecretRequest.builder().name(STRING_KEY_NAME).secretString(\"Hello World\").build();\n        client.createSecret(createSecretRequest);\n        System.out.println(\"Stored Secret String\");\n    }\n\n    private void getSecretStringValue() {\n        ListSecretsRequest listSecretsRequest = ListSecretsRequest.builder().build();\n        ListSecretsResponse listSecretsResponse = client.listSecrets(listSecretsRequest);\n\n        listSecretsResponse.secretList().forEach(e -> System.out.println(\"Retrieved: \" + e.name()));\n\n        GetSecretValueRequest getSecretValueRequest = GetSecretValueRequest.builder().secretId(STRING_KEY_NAME).build();\n        GetSecretValueResponse secretValueResponse = client.getSecretValue(getSecretValueRequest);\n        String secretString = secretValueResponse.secretString();\n\n        System.out.println(\"Retrieved String Value: \" + secretString);\n    }\n\n    private void createSecretFromFile() throws Exception {\n        InputStream publicKeyStream = this.getClass().getClassLoader().getResourceAsStream(\"publicKeyFile\");\n        byte[] targetArray = IOUtils.toByteArray(publicKeyStream);\n        ByteBuffer secretBinaryByteBuffer = ByteBuffer.wrap(targetArray);\n\n        CreateSecretRequest createSecretRequest = CreateSecretRequest.builder().name(BINARY_FILE_KEY_NAME).secretBinary(SdkBytes.fromByteBuffer(secretBinaryByteBuffer)).build();\n        client.createSecret(createSecretRequest);\n\n        System.out.println(\"Stored Secret File\");\n    }\n\n    private void getSecretFileValue() throws Exception {\n        GetSecretValueRequest getSecretValueRequest = GetSecretValueRequest.builder().secretId(BINARY_FILE_KEY_NAME).build();\n        GetSecretValueResponse secretValueResponse = client.getSecretValue(getSecretValueRequest);\n\n        ByteBuffer secretBinaryByteBuffer = secretValueResponse.secretBinary().asByteBuffer();\n\n        byte[] bytes = new byte[secretBinaryByteBuffer.capacity()];\n        secretBinaryByteBuffer.get(bytes, 0, bytes.length);\n\n        X509EncodedKeySpec spec = new X509EncodedKeySpec(bytes);\n        KeyFactory kf = KeyFactory.getInstance(\"RSA\");\n        PublicKey binary = kf.generatePublic(spec);\n\n        System.out.println(\"Retrieved Secret Binary:\");\n        System.out.println(binary.toString());\n    }\n}\n"
  },
  {
    "path": "src/test/java/CredentialsTest.java",
    "content": "import com.wazcov.awsJavaSamples.AwsShared.AWSSharedUtils;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertNotEquals;\nimport static org.junit.Assert.assertNotNull;\n\npublic class CredentialsTest {\n\n    /*\n        Run this test to confirm you have changed all of the appropriate settings\n\n        It doesn't check your settings are correct however.\n     */\n\n    @Test\n    public void checkCredsAreSet() {\n        assertNotEquals(AWSSharedUtils.creds.getAWSAccessKeyId(), \"XXX\");\n        assertNotEquals(AWSSharedUtils.creds.getAWSSecretKey(), \"XXX\");\n        assertNotEquals(AWSSharedUtils.basicCredentials.accessKeyId(), \"XXX\");\n        assertNotEquals(AWSSharedUtils.basicCredentials.secretAccessKey(), \"XXX\");\n        assertNotEquals(AWSSharedUtils.receiverEmailAddress, \"XXX\");\n        assertNotNull(AWSSharedUtils.region);\n\n    }\n}\n"
  }
]