<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Java Archives - Program Easily</title>
	<atom:link href="https://programeasily.com/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>https://programeasily.com/category/java/</link>
	<description>Program Easily helps people to learn about software programs in a easy manner.</description>
	<lastBuildDate>Fri, 18 Nov 2022 16:28:40 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.1</generator>

<image>
	<url>https://i0.wp.com/programeasily.com/wp-content/uploads/2020/12/cropped-logo.png?fit=32%2C32&#038;ssl=1</url>
	<title>Java Archives - Program Easily</title>
	<link>https://programeasily.com/category/java/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">187075990</site>	<item>
		<title>AWS S3 Client &#8211; Local Stack &#8211; Test Container</title>
		<link>https://programeasily.com/2022/11/18/aws-s3-client-local-stack-test-container/</link>
					<comments>https://programeasily.com/2022/11/18/aws-s3-client-local-stack-test-container/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Fri, 18 Nov 2022 16:27:13 +0000</pubDate>
				<category><![CDATA[J-unit]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[localstack]]></category>
		<category><![CDATA[test container]]></category>
		<guid isPermaLink="false">https://programeasily.com/?p=1676</guid>

					<description><![CDATA[<p>Test Container Test container is a third party Java library which offers to test or validate anything that can run in a Docker container. For Example, we can create lightweight database instances of  MySQL, PostgreSQL or Oracle database to test our data access layer code (DAO , Repositories). Similarly we can test our AWS cloud services like server less apps without actually using the cloud. We can do this with the help of LocalStack, a fully functional local AWS cloud...</p>
<p class="read-more"><a class="btn btn-default" href="https://programeasily.com/2022/11/18/aws-s3-client-local-stack-test-container/"> Read More<span class="screen-reader-text">  Read More</span></a></p>
<p>The post <a rel="nofollow" href="https://programeasily.com/2022/11/18/aws-s3-client-local-stack-test-container/">AWS S3 Client &#8211; Local Stack &#8211; Test Container</a> appeared first on <a rel="nofollow" href="https://programeasily.com">Program Easily</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Test Container</h2>
<p>Test container is a third party Java library which offers to test or validate anything that can run in a Docker container. For Example, we can create lightweight database instances of  MySQL, PostgreSQL or Oracle database to test our data access layer code (DAO , Repositories). <strong>Similarly we can test our AWS cloud services like server less apps without actually using the cloud.</strong> We can do this with the help of <a href="http://localstack.cloud/">LocalStack,</a> a fully functional local AWS cloud stack.</p>
<h2>Local Stack</h2>
<p><a href="https://localstack.cloud/">LocalStack</a> is a cloud service emulator. We can able to run AWS applications like Lambda, S3 entirely on your laptop or machine without connecting to a remote cloud provider.</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-1954" src="https://i0.wp.com/programeasily.com/wp-content/uploads/2022/11/Snapshot_38.png?resize=640%2C360&#038;ssl=1" alt="AWS S3 Client with Local Stack and Test Container" width="640" height="360" srcset="https://i0.wp.com/programeasily.com/wp-content/uploads/2022/11/Snapshot_38.png?w=1920&amp;ssl=1 1920w, https://i0.wp.com/programeasily.com/wp-content/uploads/2022/11/Snapshot_38.png?resize=300%2C169&amp;ssl=1 300w, https://i0.wp.com/programeasily.com/wp-content/uploads/2022/11/Snapshot_38.png?resize=1024%2C576&amp;ssl=1 1024w, https://i0.wp.com/programeasily.com/wp-content/uploads/2022/11/Snapshot_38.png?resize=768%2C432&amp;ssl=1 768w, https://i0.wp.com/programeasily.com/wp-content/uploads/2022/11/Snapshot_38.png?resize=1536%2C864&amp;ssl=1 1536w, https://i0.wp.com/programeasily.com/wp-content/uploads/2022/11/Snapshot_38.png?resize=480%2C270&amp;ssl=1 480w, https://i0.wp.com/programeasily.com/wp-content/uploads/2022/11/Snapshot_38.png?w=1280&amp;ssl=1 1280w" sizes="(max-width: 640px) 100vw, 640px" data-recalc-dims="1" /></p>
<h2>Why It is needed ?</h2>
<p>We can able to connect to AWS services like S3 from Java using their SDK&#8217;s. But here the problem is, if we wants to validate our code then we are need to connect cloud sandboxes using AWS SAM or anything like that. And While we access the cloud services, It is billable as well. Secondly we can not write unit test or integration test for this sources in a efficient way which would be a another downside of it. So In this article, we are going to learn to write unit testing for AWS S3 services with the help of Local stack and Test containers. Let&#8217;s dive into that. Cheers.</p>
<h2>Prerequisite</h2>
<ul>
<li>Java</li>
<li>Maven</li>
<li>Docker</li>
</ul>
<h2>Create a Spring initializer project</h2>
<p>First, I am creating basic spring initializer project with Spring boot starter, Spring boot test and <strong>AWS SDK maven dependencies</strong>.</p>
<pre><code class="language-java">&lt;dependency&gt;
            &lt;groupId&gt;com.amazonaws&lt;/groupId&gt;
            &lt;artifactId&gt;aws-java-sdk&lt;/artifactId&gt;
            &lt;version&gt;1.11.163&lt;/version&gt;
&lt;/dependency&gt;</code></pre>
<h2>Creating AWS S3 Client</h2>
<p>Second, now I am creating AWS S3 client with simple upload object functionality. Here I am validating whether the bucket is exist or not, followed by uploading an object into the S3 storage system.</p>
<pre><code class="language-java">package awsservicestutorial.client;

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ObjectMetadata;

import java.io.IOException;
import java.io.InputStream;
import java.net.URLConnection;
import java.nio.file.Files;
import java.nio.file.Path;

public class AwsS3Client {

    private final AmazonS3 amazonS3;

    public AwsS3Client(final AmazonS3 amazonS3) {
        this.amazonS3 = amazonS3;
    }

    public void uploadObject(final String bucketName, final Path path) throws IOException {

        isBucketExists(bucketName);

        final String filename = path.getFileName().toString();

        final ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentType(URLConnection.guessContentTypeFromName(filename));
        metadata.setSSEAlgorithm("AES256");
        metadata.setContentLength(Files.size(path));

        try(final InputStream stream = Files.newInputStream(path)){
            amazonS3.putObject(bucketName, filename, stream, metadata);
        }
    }

    private void isBucketExists(final String bucketName) {
        if(!amazonS3.doesBucketExist(bucketName)) {
            throw new IllegalStateException(String.format("Bucket %s does not exist", bucketName));
        }
    }

}</code></pre>
<h2>Local Stack and Test Container Dependencies</h2>
<p>Add the following dependency to your <code>pom.xml</code> for using local stack and test container libraries.</p>
<pre><code class="language-apacheconf">        &lt;dependency&gt;
            &lt;groupId&gt;org.testcontainers&lt;/groupId&gt;
            &lt;artifactId&gt;localstack&lt;/artifactId&gt;
            &lt;version&gt;1.17.6&lt;/version&gt;
            &lt;scope&gt;test&lt;/scope&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.testcontainers&lt;/groupId&gt;
            &lt;artifactId&gt;junit-jupiter&lt;/artifactId&gt;
            &lt;version&gt;1.17.6&lt;/version&gt;
            &lt;scope&gt;test&lt;/scope&gt;
        &lt;/dependency&gt;</code></pre>
<p>Here I am using Junit-5 for unit testing the application. It is up to to decide whether Junit 5 or 4. We can do this with Junit 4 as well.</p>
<h2>AWS S3 Client &#8211; Local Stack &#8211; Test Container &#8211; Create Unit Test</h2>
<p>Creating unit test with local stack is really very simple. we just need to create local stack instance. This instance can act as AWS S3 services with the help of test container and docker. It will create a exact AWS mock in local or in our CI environment. This will reduce a lot money, since we don&#8217;t need to interact AWS cloud services during local development and testing.</p>
<pre><code class="language-java">package awsservicestutorial;

import awsservicestutorial.client.AwsS3Client;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.testcontainers.containers.localstack.LocalStackContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.DockerImageName;

import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;

@Testcontainers(disabledWithoutDocker = true)
@ExtendWith(SpringExtension.class)
class AwsServicesTutorialApplicationTests {
    private static final String BUCKET_NAME = "test-bucket";
    @Container
    public final static LocalStackContainer LOCAL_STACK_CONTAINER =
            new LocalStackContainer(DockerImageName.parse("localstack/localstack:0.12.16"))
                    .withServices(LocalStackContainer.Service.S3).withEnv("DEFAULT_REGION", "us-east-1");
    private AmazonS3 amazonS3 = AmazonS3ClientBuilder.standard()
            .withEndpointConfiguration(LOCAL_STACK_CONTAINER.getEndpointConfiguration(LocalStackContainer.Service.S3))
            .withCredentials(LOCAL_STACK_CONTAINER.getDefaultCredentialsProvider()).build();

    private AwsS3Client awsS3Client;

    @BeforeEach
    public void beforeEach() throws IOException, InterruptedException {
        LOCAL_STACK_CONTAINER.execInContainer("awslocal", "s3", "mb", "s3://" + BUCKET_NAME);
        awsS3Client = new AwsS3Client(amazonS3);
    }

    @AfterEach
    public void afterEach() throws IOException, InterruptedException {
        LOCAL_STACK_CONTAINER.execInContainer("awslocal", "s3", "rb", "s3://" + BUCKET_NAME, "--force");
    }

    /**
     * First assert whether localstack is running!
     */
    @Test
    public void test_isLocalstackRunning() {
        Assertions.assertTrue(LOCAL_STACK_CONTAINER.isRunning());
    }

    @Test
    public void test_uploadObjectSuccess() throws URISyntaxException, IOException {

        awsS3Client.uploadObject(BUCKET_NAME, createPath());
        Assertions.assertTrue(amazonS3.doesObjectExist(BUCKET_NAME, "sample.csv"));
    }

    @Test
    public void tes_uploadObjectError() throws IOException, InterruptedException {

        LOCAL_STACK_CONTAINER.execInContainer("awslocal", "s3", "rb", "s3://" + BUCKET_NAME, "--force");
        Assertions.assertThrows(IllegalStateException.class, () -&gt; awsS3Client.uploadObject(BUCKET_NAME, createPath()));
    }

    private Path createPath() throws URISyntaxException {
        return Optional.ofNullable(ClassLoader.getSystemResource("sample.csv").toURI())
                .map(Paths::get)
                .orElseThrow(IllegalArgumentException::new);
    }

}
</code></pre>
<ul>
<li>First, I am validating whether the local or CI machine having docker environment.</li>
<li>Second, <strong>@Container creates the local stack container instance and mimic the AWS S3 as we are providing S3 as a service here. </strong>If you are using Junit-4, then you must use @ClassRule annotation here.</li>
<li>During <code>beforeEach()</code> method, we are just creating the bucket in the S3 where as <code>afterEach()</code> method deletes the bucket after each test execution.</li>
<li>You will need to create sample.csv file under test/resources directory for uploading into local stack S3.</li>
<li>During upload test, once the file upload has been done, we can assert that using <code>amazonS3.doesObjectExist</code> method, whether the file has been successfully uploaded or not.</li>
<li>And also we are validating after deleting the the bucket, whether it is throwing <code>IllegalStateException</code> exception or not.</li>
<li><strong>Finally In this way, we tested our AWS S3 client class effectively without connecting into AWS services.</strong></li>
</ul>
<h2>AWS S3 Client &#8211; Local Stack &#8211; Test Container &#8211; Code Sample</h2>
<ul>
<li><a href="https://github.com/programeasily/aws-services-tutorial/blob/main/src/main/java/awsservicestutorial/client/AwsS3Client.java">https://github.com/programeasily/aws-services-tutorial/blob/main/src/main/java/awsservicestutorial/client/AwsS3Client.java</a></li>
<li><a href="https://github.com/programeasily/aws-services-tutorial/blob/main/src/test/java/awsservicestutorial/AwsServicesTutorialApplicationTests.java">https://github.com/programeasily/aws-services-tutorial/blob/main/src/test/java/awsservicestutorial/AwsServicesTutorialApplicationTests.java</a></li>
<li><a href="https://github.com/programeasily/aws-services-tutorial">https://github.com/programeasily/aws-services-tutorial</a></li>
</ul>
<p>The post <a rel="nofollow" href="https://programeasily.com/2022/11/18/aws-s3-client-local-stack-test-container/">AWS S3 Client &#8211; Local Stack &#8211; Test Container</a> appeared first on <a rel="nofollow" href="https://programeasily.com">Program Easily</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://programeasily.com/2022/11/18/aws-s3-client-local-stack-test-container/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1676</post-id>	</item>
		<item>
		<title>String in Java &#8211; String Literal, String Pool, String Objects</title>
		<link>https://programeasily.com/2022/09/01/string-in-java/</link>
					<comments>https://programeasily.com/2022/09/01/string-in-java/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Thu, 01 Sep 2022 04:49:00 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[core java]]></category>
		<category><![CDATA[string]]></category>
		<guid isPermaLink="false">https://programeasily.com/?p=1672</guid>

					<description><![CDATA[<p>         String is a special non primitive data type in java if we compare with any others. But why! In String, we are having string pool as well as heap memory to store the values. The strings are immutable by nature. String is an object which contains sequence of character&#8217;s. String is not belong to primitive data type whereas we can create object using java.lang.String. There are two ways to create the string in Java.    ...</p>
<p class="read-more"><a class="btn btn-default" href="https://programeasily.com/2022/09/01/string-in-java/"> Read More<span class="screen-reader-text">  Read More</span></a></p>
<p>The post <a rel="nofollow" href="https://programeasily.com/2022/09/01/string-in-java/">String in Java &#8211; String Literal, String Pool, String Objects</a> appeared first on <a rel="nofollow" href="https://programeasily.com">Program Easily</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>         String is a special non primitive data type in java if we compare with any others. But why! In String, we are having string pool as well as heap memory to store the values. The strings are immutable by nature. String is an object which contains sequence of character&#8217;s. String is not belong to primitive data type whereas we can create object using <em>java.lang.String</em>. There are two ways to create the string in Java.</p>
<p>             1. By Literal in Java</p>
<p>             2. By New Keyword</p>
<h2>String Literal in Java</h2>
<p>String Literals are very special in Java. We can create String object using double quotes as followed,</p>
<pre><code class="language-java">String message = "Hello ! I am a string";</code></pre>
<p>The above code calls the intern() method of string first. Then the intern checks whether the same object is exists in pool or not!. If it is exist, it will return the same object reference. Otherwise It will create the new object in the pool and return the new object reference. Ultimately the string literal should be fast if we compare with new keyword since it will not create the new objects every time.</p>
<p><img decoding="async" class="wp-image-1704 size-large aligncenter" src="https://i0.wp.com/programeasily.com/wp-content/uploads/2022/09/untitled_page.png?resize=640%2C277&#038;ssl=1" alt="String Literal" width="640" height="277" srcset="https://i0.wp.com/programeasily.com/wp-content/uploads/2022/09/untitled_page.png?resize=1024%2C443&amp;ssl=1 1024w, https://i0.wp.com/programeasily.com/wp-content/uploads/2022/09/untitled_page.png?resize=300%2C130&amp;ssl=1 300w, https://i0.wp.com/programeasily.com/wp-content/uploads/2022/09/untitled_page.png?resize=768%2C333&amp;ssl=1 768w, https://i0.wp.com/programeasily.com/wp-content/uploads/2022/09/untitled_page.png?resize=1536%2C665&amp;ssl=1 1536w, https://i0.wp.com/programeasily.com/wp-content/uploads/2022/09/untitled_page.png?w=1725&amp;ssl=1 1725w, https://i0.wp.com/programeasily.com/wp-content/uploads/2022/09/untitled_page.png?w=1280&amp;ssl=1 1280w" sizes="(max-width: 640px) 100vw, 640px" data-recalc-dims="1" /></p>
<h2>By New Keyword</h2>
<p>We can create String object using new keyword as followed,</p>
<pre><code class="language-java">String message = new String("Hello ! I am a string");</code></pre>
<p>The above code creates two string objects. It will create one object in Heap Memory directly and other in String Pool Area. And the reference will points to heap memory object.</p>
<p><img decoding="async" class="aligncenter wp-image-1717 size-full" src="https://i0.wp.com/programeasily.com/wp-content/uploads/2022/09/heap-1.png?resize=640%2C360&#038;ssl=1" alt="new of string in java" width="640" height="360" srcset="https://i0.wp.com/programeasily.com/wp-content/uploads/2022/09/heap-1.png?w=1064&amp;ssl=1 1064w, https://i0.wp.com/programeasily.com/wp-content/uploads/2022/09/heap-1.png?resize=300%2C169&amp;ssl=1 300w, https://i0.wp.com/programeasily.com/wp-content/uploads/2022/09/heap-1.png?resize=1024%2C576&amp;ssl=1 1024w, https://i0.wp.com/programeasily.com/wp-content/uploads/2022/09/heap-1.png?resize=768%2C432&amp;ssl=1 768w" sizes="(max-width: 640px) 100vw, 640px" data-recalc-dims="1" /></p>
<h3>Caution in String Compare</h3>
<p>We have to use equals method of string to compare two strings always, not ==. Because == compares only the memory locations. But the equals method compare the memory location as well as the content of the stored objects.</p>
<pre><code class="language-java">String a = "Hello";
String b = "Hello";

// since literals re-use existing objects from the pool
System.out.println(a == b) // true

String c = new String("Hello");

// new keyword always creates new objects in the heap
// And == compares the memory locations not the exact
// content of the objects
System.out.println(a == c) // false

// Always use equals for comparison
// String class equals method checks the content of the 
// object as well
System.out.println(a.equals(c)) // true</code></pre>
<h2>Why String is Immutable</h2>
<p>The rule to create any <a href="https://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html">immutable object</a> is, it&#8217;s state can not be changed after it is created. And String class designed to follow this rule. Even we could create N number of objects by following this rule. Let&#8217;s come to the point, why string is immutable ? The most correct answer is probably: Because the java language authors or designers figured it was a good idea. So that It will provide lot of benefits to us, Let&#8217;s see one by one.</p>
<h3>Security</h3>
<p>We have been mostly using string object in network connections, database connection URLs, usernames/passwords and etc. It it were mutable, we can change these parameters and runtime And which creates security issues.</p>
<h4>Synchronization And Concurrency</h4>
<p>We can say an object is thread safe, when multiple threads are operating on it but none of them is able to corrupt its state and object hold the same state for every thread at any point in time. Making String immutable automatically makes them thread safe by default thereby solving the synchronization issues.</p>
<h4>Caching</h4>
<p>when compiler optimizes your String objects, it sees that if two objects have same value (a=&#8221;test&#8221;, and b=&#8221;test&#8221;) and thus you need only one string object (for both a and b, these two will point to the same object)</p>
<h4>Hash Code Caching</h4>
<p>String object caches its hash code at the time of object creation which makes it the great candidate for hashing related operations because hash code doesn&#8217;t need to be calculated again which save us some time. This is why String is mostly used as <code>Hash Map</code> keys</p>
<h4>Class Loading</h4>
<p>We have been using String as an arguments for class loading. If mutable, it could result in wrong class being loaded (because mutable objects change their state).</p>
<h2>Summary</h2>
<ol>
<li>
<p>Usually we design classes as immutable for them being thread safe and to optimize performance and memory consumption.</p>
</li>
<li>
<p>Security and Efficiency to be the primary design goals, then immutable strings are a means to meet those goals.</p>
</li>
<li>
<p>immutable objects in java are like copy-by-value, you can have 2 references to a String, but you should consider them 2 separate Strings since it&#8217;s immutable, and working with one of them won&#8217;t affect the other.</p>
</li>
</ol>
<h3>You May Also Like</h3>
<ul>
<li><a href="https://programeasily.com/2022/01/04/java-8-interview-questions-for-experienced/">Java 8 Interview Questions for Experienced</a></li>
</ul>
<p>The post <a rel="nofollow" href="https://programeasily.com/2022/09/01/string-in-java/">String in Java &#8211; String Literal, String Pool, String Objects</a> appeared first on <a rel="nofollow" href="https://programeasily.com">Program Easily</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://programeasily.com/2022/09/01/string-in-java/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1672</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/

Page Caching using disk: enhanced 
Minified using disk
Database Caching using disk (Request-wide modification query)

Served from: programeasily.com @ 2025-06-20 07:54:32 by W3 Total Cache
-->