Merge pull request #10 from aasaru/generate_rsa_key

Add convenicence method to print out RSA keys.
diff --git a/README.md b/README.md
index 0d097d2..edca939 100644
--- a/README.md
+++ b/README.md
@@ -22,3 +22,20 @@
 
 ## License
 See [LICENSE](LICENSE) file.
+
+## Usage
+
+### Generate and print RSA keys
+
+You can use this library to generate and print RSA keys.
+
+You can either generate application-<env>.properties file for Spring applications like this:
+
+`java -cp build/libs/lang-0.1.0-BUILD-SNAPSHOT.jar  org.apache.fineract.cn.lang.security.RsaKeyPairFactory SPRING > application-dev.properties`
+
+Or you can generate them and import as operation system variables (Unix):
+```
+java -cp build/libs/lang-0.1.0-BUILD-SNAPSHOT.jar  org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > env.vars.txt
+source env.vars.txt
+echo $PUBLIC_KEY_TIMESTAMP
+```
diff --git a/src/main/java/org/apache/fineract/cn/lang/DateConverter.java b/src/main/java/org/apache/fineract/cn/lang/DateConverter.java
index a378a64..bd200a9 100644
--- a/src/main/java/org/apache/fineract/cn/lang/DateConverter.java
+++ b/src/main/java/org/apache/fineract/cn/lang/DateConverter.java
@@ -28,19 +28,16 @@
 public interface DateConverter {
   @Nonnull
   static Long toEpochMillis(@Nonnull final LocalDateTime localDateTime) {
-    Assert.notNull(localDateTime, "LocalDateTime must be given.");
     return localDateTime.toInstant(ZoneOffset.UTC).toEpochMilli();
   }
 
   @Nonnull
   static Long toEpochDay(@Nonnull final LocalDate localDate) {
-    Assert.notNull(localDate, "LocalDate must be given.");
     return localDate.toEpochDay();
   }
 
   @Nonnull
   static LocalDateTime fromEpochMillis(@Nonnull final Long epochMillis) {
-    Assert.notNull(epochMillis, "Epoch milliseconds must be given.");
     return LocalDateTime.from(Instant.ofEpochMilli(epochMillis).atZone(ZoneOffset.UTC));
   }
 
@@ -51,19 +48,16 @@
 
   @Nonnull
   static String toIsoString(@Nonnull final LocalDateTime localDateTime) {
-    Assert.notNull(localDateTime, "LocalDateTime must be given.");
     return localDateTime.format(DateTimeFormatter.ISO_DATE_TIME) + "Z";
   }
 
   @Nonnull
   static LocalDateTime fromIsoString(@Nonnull final String isoDateTimeString) {
-    Assert.notNull(isoDateTimeString, "ISO date time must be given.");
     return LocalDateTime.from(Instant.parse(isoDateTimeString).atZone(ZoneOffset.UTC));
   }
 
   @Nonnull
   static LocalDate dateFromIsoString(@Nonnull final String isoDateString) {
-    Assert.notNull(isoDateString, "ISO date time must be given.");
     final int zIndex = isoDateString.indexOf("Z");
     final String shortenedString = isoDateString.substring(0, zIndex);
     return LocalDate.from(DateTimeFormatter.ISO_LOCAL_DATE.parse(shortenedString));
@@ -71,13 +65,11 @@
 
   @Nonnull
   static String toIsoString(@Nonnull final LocalDate localDate) {
-    Assert.notNull(localDate, "LocalDateTime must be given.");
     return localDate.format(DateTimeFormatter.ISO_DATE) + "Z";
   }
 
   @Nonnull
   static LocalDate toLocalDate(@Nonnull final LocalDateTime localDateTime) {
-    Assert.notNull(localDateTime, "LocalDateTime must be given.");
     return localDateTime.toLocalDate();
   }
 }
diff --git a/src/main/java/org/apache/fineract/cn/lang/DateRange.java b/src/main/java/org/apache/fineract/cn/lang/DateRange.java
index 789eff7..adce114 100644
--- a/src/main/java/org/apache/fineract/cn/lang/DateRange.java
+++ b/src/main/java/org/apache/fineract/cn/lang/DateRange.java
@@ -40,8 +40,6 @@
   private final @Nonnull LocalDate end;
 
   public DateRange(final @Nonnull LocalDate start, final @Nonnull LocalDate end) {
-    Assert.notNull(start, "Range start must be given.");
-    Assert.notNull(start, "Range end must be given.");
     this.start = start;
     this.end = end;
   }
@@ -84,4 +82,4 @@
       }
     }
   }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/apache/fineract/cn/lang/TenantContextHolder.java b/src/main/java/org/apache/fineract/cn/lang/TenantContextHolder.java
index f90aab0..c9f8c15 100644
--- a/src/main/java/org/apache/fineract/cn/lang/TenantContextHolder.java
+++ b/src/main/java/org/apache/fineract/cn/lang/TenantContextHolder.java
@@ -42,7 +42,6 @@
   }
 
   public static void setIdentifier(@Nonnull final String identifier) {
-    Assert.notNull(identifier, "A tenant identifier must be given.");
     Assert.hasLength(identifier, "A tenant identifier must have at least one character.");
     Assert.isNull(TenantContextHolder.THREAD_LOCAL.get(), "Tenant identifier already set.");
     TenantContextHolder.THREAD_LOCAL.set(identifier);
diff --git a/src/main/java/org/apache/fineract/cn/lang/security/RsaKeyPairFactory.java b/src/main/java/org/apache/fineract/cn/lang/security/RsaKeyPairFactory.java
index 4b816ed..d76bb2f 100644
--- a/src/main/java/org/apache/fineract/cn/lang/security/RsaKeyPairFactory.java
+++ b/src/main/java/org/apache/fineract/cn/lang/security/RsaKeyPairFactory.java
@@ -39,6 +39,26 @@
   private RsaKeyPairFactory() {
   }
 
+  public static void main(String[] args) {
+    KeyPairHolder keyPair = RsaKeyPairFactory.createKeyPair();
+
+    String style = (args != null && args.length > 0) ?args[0] :"";
+    if ("SPRING".equalsIgnoreCase(style)) {
+      System.out.println("system.publicKey.exponent=" + keyPair.getPublicKeyExp());
+      System.out.println("system.publicKey.modulus=" + keyPair.getPublicKeyMod());
+      System.out.println("system.publicKey.timestamp=" + keyPair.getTimestamp());
+      System.out.println("system.privateKey.modulus=" + keyPair.getPrivateKeyMod());
+      System.out.println("system.privateKey.exponent=" + keyPair.getPrivateKeyExp());
+    }
+    else if ("UNIX".equalsIgnoreCase(style)) {
+      System.out.println("PUBLIC_KEY_EXPONENT=" + keyPair.getPublicKeyExp());
+      System.out.println("PUBLIC_KEY_MODULUS=" + keyPair.getPublicKeyMod());
+      System.out.println("PUBLIC_KEY_TIMESTAMP=" + keyPair.getTimestamp());
+      System.out.println("PRIVATE_KEY_MODULUS=" + keyPair.getPrivateKeyMod());
+      System.out.println("PRIVATE_KEY_EXPONENT=" + keyPair.getPrivateKeyExp());
+    }
+  }
+
   public static KeyPairHolder createKeyPair() {
     try {
       final KeyFactory keyFactory = KeyFactory.getInstance("RSA");
@@ -116,4 +136,4 @@
       return privateKey.getPrivateExponent();
     }
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/fineract/cn/lang/security/RsaKeyPairFactoryTest.java b/src/test/java/org/apache/fineract/cn/lang/security/RsaKeyPairFactoryTest.java
index 3d104c7..52a60f9 100644
--- a/src/test/java/org/apache/fineract/cn/lang/security/RsaKeyPairFactoryTest.java
+++ b/src/test/java/org/apache/fineract/cn/lang/security/RsaKeyPairFactoryTest.java
@@ -18,13 +18,29 @@
  */
 package org.apache.fineract.cn.lang.security;
 
+import static junit.framework.TestCase.assertTrue;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
+import org.junit.After;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 
 public class RsaKeyPairFactoryTest {
 
-  public RsaKeyPairFactoryTest() {
-    super();
+  private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
+  private final PrintStream originalOut = System.out;
+
+  @Before
+  public void setUpStreams() {
+    System.setOut(new PrintStream(outContent));
+  }
+
+  @After
+  public void restoreStreams() {
+    System.setOut(originalOut);
   }
 
   @Test
@@ -36,4 +52,29 @@
     Assert.assertNotNull(keyPairHolder.publicKey());
     Assert.assertNotNull(keyPairHolder.privateKey());
   }
+
+  @Test
+  public void shouldPrintSpringStyle() {
+    RsaKeyPairFactory.main(new String[]{"SPRING"});
+
+    String systemOutput = outContent.toString();
+    assertTrue(systemOutput.contains("system.publicKey.exponent="));
+    assertTrue(systemOutput.contains("system.publicKey.modulus="));
+    assertTrue(systemOutput.contains("system.publicKey.timestamp="));
+    assertTrue(systemOutput.contains("system.privateKey.modulus="));
+    assertTrue(systemOutput.contains("system.privateKey.exponent="));
+  }
+
+  @Test
+  public void shouldPrintUnixStyle() {
+    RsaKeyPairFactory.main(new String[]{"UNIX"});
+
+    String systemOutput = outContent.toString();
+    assertTrue(systemOutput.contains("PUBLIC_KEY_EXPONENT="));
+    assertTrue(systemOutput.contains("PUBLIC_KEY_MODULUS="));
+    assertTrue(systemOutput.contains("PUBLIC_KEY_TIMESTAMP="));
+    assertTrue(systemOutput.contains("PRIVATE_KEY_MODULUS="));
+    assertTrue(systemOutput.contains("PRIVATE_KEY_EXPONENT="));
+  }
+
 }