January 4, 2017

Java 7 - Implement equals() and hashCode() with java.util.Objects

When using JPA you should implement equals() and hashCode() if you

  • Intend to put instances of persistent classes in a Set.
  • Intend to use reattachment of detached instances.

For JDK 7 and above, you can use the new java.util.Objects class to generate the equals and hash code values.

import java.util.Objects;

public class Fruit {

    private Long id;
    private String name;
    private int weight;

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof Fruit)) {
            return false;
        }
        Fruit fruit = (Fruit) obj;
        return Objects.equals(id, fruit.id) && Objects.equals(name, fruit.name) && Objects.equals(weight, fruit.weight);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, weight);
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

}

Test code

Fruit fruit1 = new Fruit();
fruit1.setId(78L);
fruit1.setName("apple");
fruit1.setWeight(35);

Fruit fruit2 = new Fruit();
fruit2.setId(78L);
fruit2.setName("apple");
fruit2.setWeight(35);

assertTrue(fruit1.equals(fruit2));
assertFalse("Not same instance", fruit1 == fruit2);
assertThat(fruit1, is(equalTo(fruit2)));

January 3, 2017

MySQL – Backup and Restore

Backup

# Backup a database
$ mysqldump --user=name --password database > filename.sql

# Backup a database and gzip
$ mysqldump --user=name --password database | gzip > filename.sql.gz

Restore

# Restore a database
$ mysql --default-character-set=latin1 --user=name --password database < filename.sql

# Restore a database from gzip
$ gunzip -c filename.sql.gz | mysql --default-character-set=latin1 --user=name --password database 

Internationalization (i18n) with ResourceBundle and Properties

To externalize local messages, Java have the java.util.ResourceBundle class.

Create a properties file for the default locale. Then create a new properties for each locale with the suffix _<language>_<COUNTRY>, in the same way you initialize java.util.Locale.Locale(String, String).

Example

messages.properties
messages_sv_SE.properties
messages_en_US.properties

To load the localized text, use java.util.ResourceBundle.getString(String).

Example

messages.properties

hello.label=Hello World!
hello.info=Entered number = %d and string = %s

messages_sv_SE.properties

# Använd UTF-8 encoding för icke ASCII tecken, se t.ex. http://www.utf8-chartable.de/ 
# \u00E5    å
# \u00E4    ä
# \u00F6    ö
# \u00C5    Å
# \u00C4    Ä
# \u00D6    Ö
hello.label=Hall\u00E5 v\u00E4rlden!
hello.info=Entered number = %d and string = %s

And the Java code to load them.

ResourceBundle bundle = ResourceBundle.getBundle("messages");
System.out.println("hello.label : " + bundle.getString("hello.label"));
System.out.println("hello.info : " + String.format(bundle.getString("hello.info"), 2, "en"));

Locale.setDefault(new Locale("sv", "SE"));
ResourceBundle bundleSE = ResourceBundle.getBundle("messages");
System.out.println("hello.label : " + bundleSE.getString("hello.label"));
System.out.println("hello.info : " + String.format(bundleSE.getString("hello.info"), 2, "hej"));

Output

hello.label : Hello World!
hello.info : Entered number = 2 and string = en
hello.label : Hallå världen!
hello.info : Entered number = 2 and string = hej

Java 8 - Base64

Java 8 now supports java.util.Base64.

  • Base64.getEncoder()/Base64.getDecoder() - Output is mapped to a set of characters lying in A-Za-z0-9+/.
  • Base64.getUrlEncoder()/Base64.getUrlDecoder() - Output is mapped to set of characters lying in A-Za-z0-9+_. Output is URL and filename safe.
  • Base64.getMimeEncoder()/Base64.getMimeDecoder() - Simple format, but represented in lines of 76 characters and seperated with '\r\n'.

Example

byte[] bytes = new byte[2048];
new Random().nextBytes(bytes);
System.out.println("Simple :\n" + new String(getEncoder().encode(bytes), UTF_8) + "\n");
System.out.println("URL :\n" + new String(getUrlEncoder().encode(bytes), UTF_8) + "\n");
System.out.println("MIME :\n" + new String(getMimeEncoder().encode(bytes), UTF_8) + "\n");

Output

Simple :
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

URL :
KoogbGxCpjqSlWfn78lUtpKmKYAJY6AwfzvB42RGRezOMaegQk-n3-IeIKMFfC_G1MmZWWLIhqQGD3DEiA58yH_XHUuBhLT4XzFoVIwt8Rfqy0vITcNT8AJxacn-QHrmAV9OMQzrVppW8Y9cv3eT4lSjhb3hca-0C3hc0IMcjUcuA6fgTZe8HksCNiL81LSB5no3rPixLcgw-VI7Ni-x-XSkvraxFZUCdbmcKkQhPlhGaOYws9U01G9iF2scXz8lVGek_yrnXnM9IIMUv6oH5XJyx171Z1ZvPmWL3ZyCAgPkohS6rA04RsPGK5M20t_TN-jE6eMATIsFcTkPBIk3iU4f7bqwqIMeWWZ785c7lf-6BmjiaioK4aH9qh4CMzosT6R6-rOh9mMFVFlIdY7mi_Pv4J25VJsh46VNtytb4CW513nPuGjdRwPDuxaGxnl4LfGmscLatBYPEvH4d87FVPFr5bzCwKyBQdcJPSMUPVCIGWufvhY4il6yJ-jDtArrcZ7rQFucL5vih73cy0zT4ncgV-umhhHAfEkUc06JRtJHBqXEEQrknLxRb0Cg6-1HQ5zS27oAKIoKR249PKOx4JWyZmXzMFmr2rm1E-ihtsaFiEgP_vdNgh3yxjUWTse5D5nJ0RhdoK76n4LFjXeqnbAcp2m40GbCvWNZbUhy4nqAVMHdGBwjbQ9h6Jiee4gRhfKTmPREModnUe_Kos2WIkUzXMKRaXCbwMlwu8wENpycfI6SANlvhoynpPjYu8j30JUGN6Pr0kLo2G-z7oG6juLMegLwX0xlEPSTWwKPxRMmnWuzdD_CiBRS_Jt92rT7FatOhhuQS6jLoLX7HHjemGIpTTKuVYFRCCB47xhf7ElK-9oEnKcfqgv-ewGH_0cNMCjtvvzee3A6h9IUAkrfYGh06yPSICGjER321YYNQMhSM-LvkMg0GVUo7n6fz3D7q6Y2FeB2WI-PeoMBwoK8XR9_cTOgyNcLuNLU8Pq-GE8hUtiFLvpLzTB5YpzHYCR7_xjIeuT6v4j1JqNkQrI24DANUHnmtAOkEKyjg4WC1bXwda1iGo2FblIJViZJz2oODjs-Pndf9XpA8UuMz-R4YgRRiXGDe2QGS-Tj7gQYFp5IUll4FmXKckRcr53ffmeq4dnWY2NdDusOu0svDktkRjxzVXA4-DE6lPBO89Cqobo_M1_JhEE5Jv0LhEYkVIEVnk64dxo3MW4eLMPFIx4bFm5B1Wa0mn0ZMINzEKpM3E73W9MzOWCjkcJhfUE7cl3Lzcis6EI8VQfwfF0XJAyaQSFgXhDaFtyr1eNpAeE8w4tU3EZ1hWZNGT1YbLS-SJl3zENs74O3neqf_rw6wLjNaAuczZVV472QSZlDl8VHqof9ObRpgLzVN93CdGbq_VZKkENZvpAyl2f728N_LB7cx4o2aZdfMtGPP6BZfFHKogaWiDh3l8YZB26WanAIgQEXn7QZZ3Q82wjrz4fCT9qPY2BJdsrOUIjib6v3QhQmz_Y7zVH9Vql36fiOy8sf0WsuSov2IR8eJ7QCzUJULrQ1OrSd-XRgl6ve9ChafmGxKwZBycQzd4Ma092uau_YQ9mdL_6pnTEpBmBf0rHjmuUKakWSbfNIWvaY6wjIO7hvyLopiHECLEpbky5TqhGx2NIc7nd9wAaNEBbKaU60GPXU5fHsw5j5gmKOSYEAtHQeTfPkTH8zqrPoY07ZRJpm5C-4K5yN9ALeq6gMi-acESyismazE_wywDa9_EqAaLVhKzBOuqXD99ucrMoRY0qdoKa5xPv7Ox-7ciOP4IkHO_VDkydnGKBLeGcaRRSJfZAdWc7lUjKs9Y_nwXf8WmbRa9N8VFQD_rQ9LVw4qdLXR68Sj8JAaaK-6aJuVSSZJnZHD8_Kq_4WrmrAvs2JKPKBxSu16XaMvogf1KGBs3s-zL80jlBGTDr5JbU-J2xgiOO7F4377hyh4jBs_IRdxc2aUgQIATJH1hfDtL3aLTwjdPI4xi5Zgoxj0hD_noB75kjk7gvOiM3kzxZFAG7OMyIhdu8Cy9qrPCOKtOJBSEW1ZnCWYvqWniGt23Xo3zmUJTo5pF-xHJqRQNxlnJSfnEglSoQlnFHnln8mJr4g47yg89vSfdCprOJbhyf28fM6MdzsNhIgHXeZ2erT-ZMuhsvkBFR-r53M8RjR405nx2tZhFzpdcbjVkOSjyfzkqwaQYpJarzoos5-ouLMAzgTL7w9FrbZIny82EWTrQjqI81ZxKZTCaZBpmwkNby9XHpVGMeQ9yiaX5RI0UBwUltstbRWiWGeLX5EQ1EOY939SwBXCk0IpuywGyfac2O1GRkedWlm2flSxzua3QxeCflVLyCOdsSjpZJEFkVt1DlO8wxvCeQfYf80g6EBxX1xY4dGAwMUb6Sqzd6MwLdP25VEcN2mkfDQsRbzjvts1rICY7Wsu8fcMLPHvlI4HK-kgfG6Q5QwpLr60VQwi5loaNFBKt0rIAZ1y8lc1WCmQc8UZPnLi4zHC_8QIEN4CnVcfWX7OW54Y3HSlqatMbk_yEhGqckn5ISj-kA_fAmHzf7q2q-Zwmi0WvtR_UxkM_1zigzeCGnhoYe5YHVbjcq0PK8s0iIIxxSUTrWZzPqji8I5UHw4NCIU4R0fP__TgB8XleV2bkg3gYknmNBHtY6-rSz6lQ3RUG4GnUlJL7JSaFwb4yDjK0wtk7XF8f6cwMMEKT0xtWvMp6A=

MIME :
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

Java 8 - Streams

What is Stream?

A sequence of elements supporting sequential and parallel aggregate operations.

How to create?

The java.util.Collection interface has two methods:

  • stream()
  • parallelStream() - supports parallel computing.

How to use?

The java.util.stream.Stream interface has several methods, here are the most common used.

filter

List<String> strings = Arrays.asList(new String[] { "foo", "bar", "", "code" });
String[] rtn = strings.stream().filter(s -> !s.isEmpty()).toArray(String[]::new);
assertThat(new String[] { "foo", "bar", "code" }, is(equalTo(rtn)));

map

List<String> strings = Arrays.asList(new String[] { "foo", "bar", "code" });
String[] rtn = strings.stream().map(String::toUpperCase).toArray(String[]::new);
assertThat(new String[] { "FOO", "BAR", "CODE" }, is(equalTo(rtn)));

sorted

List<String> strings = Arrays.asList(new String[] { "foo", "bar", "code" });
String[] rtn = strings.stream().sorted().toArray(String[]::new);
assertThat(new String[] { "bar", "code", "foo" }, is(equalTo(rtn)));

forEach

List<String> strings = Arrays.asList(new String[] { "foo", "bar", "code" });
strings.stream().forEach(s -> System.out.println(" >> " + s));

collect

List<String> strings = Arrays.asList(new String[] { "foo", "bar", "code" });
List<String> rtn = strings.stream().collect(toList());
assertThat(strings, is(equalTo(rtn)));

java.util.stream.Collectors

Collectors are used of collecting result from Stream operations, but there are several useful methods in the java.util.stream.Collectors interface. Here some of them.

toList()/toSet()

List<String> strings = Arrays.asList(new String[] { "foo", "bar", "code" });
List<String> rtn = strings.stream().collect(toList());
Set<String> rtn1 = strings.stream().collect(toSet());

groupingBy

Map<String, List<String>> rtn1 = Stream.of("foo", "bar", "code", "foo", "bar").collect(groupingBy(identity()));
System.out.println("groupingBy : " + rtn1);
// {bar=[bar, bar], code=[code], foo=[foo, foo]}

Map<String, Long> rtn2 = Stream.of("foo", "bar", "code", "foo", "bar").collect(groupingBy(identity(), counting()));
System.out.println("groupingBy : " + rtn2);
// {bar=2, code=1, foo=2}

January 2, 2017

Java 8 - Lambda Expressions

Syntax

parameter -> expression body
  • Optional type declaration − No need to declare the type of a parameter. The compiler can inference the same from the value of the parameter.
  • Optional parenthesis around parameter − No need to declare a single parameter in parenthesis. For multiple parameters, parentheses are required.
  • Optional curly braces − No need to use curly braces in expression body if the body contains a single statement.
  • Optional return keyword − The compiler automatically returns the value if the body has a single expression to return the value. Curly braces are required to indicate that expression returns a value.

Examples

Old inner class

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println(" >> Hello from thread");
    }
}).start();

With lambda expression

new Thread(() -> System.out.println(" >> Hello from lambda thread")).start();

Old inner class

List<String> strings1 = Arrays.asList(new String[] { "foo", "bar" });
Collections.sort(strings1, new Comparator<String>() {

    @Override
    public int compare(String s1, String s2) {
        return s1.compareTo(s2);
    }
});
assertThat(Arrays.asList(new String[] { "bar", "foo" }), is(equalTo(strings1)));

With lambda expression

List<String> strings2 = Arrays.asList(new String[] { "foo", "bar" });
Collections.sort(strings2, (s1, s2) -> s1.compareTo(s2));
assertThat(Arrays.asList(new String[] { "bar", "foo" }), is(equalTo(strings2)));

December 13, 2016

Create PublicKey and PrivateKey in Java 8

import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.PublicKey;
import java.security.PrivateKey;

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(2048, SecureRandom.getInstanceStrong());
KeyPair keyPair = keyPairGen.genKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();

See also sun.security.tools.keytool.CertAndKeyGen.