Making acquisition of latest signatures easier through convenience function for use in provisioner.
diff --git a/api/src/main/java/io/mifos/anubis/api/v1/client/Anubis.java b/api/src/main/java/io/mifos/anubis/api/v1/client/Anubis.java
index 6f7ce43..078c3f0 100644
--- a/api/src/main/java/io/mifos/anubis/api/v1/client/Anubis.java
+++ b/api/src/main/java/io/mifos/anubis/api/v1/client/Anubis.java
@@ -55,6 +55,11 @@
           produces = {MediaType.ALL_VALUE})
   ApplicationSignatureSet getSignatureSet(@PathVariable("timestamp") String timestamp);
 
+  @RequestMapping(value = "/signatures/_latest", method = RequestMethod.GET,
+          consumes = {MediaType.APPLICATION_JSON_VALUE},
+          produces = {MediaType.ALL_VALUE})
+  ApplicationSignatureSet getLatestSignatureSet();
+
   @RequestMapping(value = "/signatures/{timestamp}", method = RequestMethod.DELETE,
           consumes = {MediaType.APPLICATION_JSON_VALUE},
           produces = {MediaType.ALL_VALUE})
@@ -65,6 +70,11 @@
           produces = {MediaType.ALL_VALUE})
   Signature getApplicationSignature(@PathVariable("timestamp") String timestamp);
 
+  @RequestMapping(value = "/signatures/_latest/application", method = RequestMethod.GET,
+          consumes = {MediaType.APPLICATION_JSON_VALUE},
+          produces = {MediaType.ALL_VALUE})
+  Signature getLatestApplicationSignature();
+
   @RequestMapping(value = "/initialize", method = RequestMethod.POST,
           consumes = {MediaType.APPLICATION_JSON_VALUE},
           produces = {MediaType.ALL_VALUE})
diff --git a/component-test/src/main/java/TestAnubisKeyRotation.java b/component-test/src/main/java/TestAnubisKeyRotation.java
index ef47af1..ce61cf9 100644
--- a/component-test/src/main/java/TestAnubisKeyRotation.java
+++ b/component-test/src/main/java/TestAnubisKeyRotation.java
@@ -122,6 +122,11 @@
         Assert.assertTrue(signatureSets.contains(identityManagerKeyPair.getTimestamp()));
         Assert.assertTrue(signatureSets.contains(identityManagerKeyPair2.getTimestamp()));
       }
+      final ApplicationSignatureSet latestSignatureSet = anubis.getLatestSignatureSet();
+      Assert.assertEquals(identityManagerKeyPair2.getTimestamp(), latestSignatureSet.getTimestamp());
+
+      final Signature latestApplicationSignature = anubis.getLatestApplicationSignature();
+      Assert.assertEquals(latestSignatureSet.getApplicationSignature(), latestApplicationSignature);
 
       //Get the newly created signature set, and test that it's contents are correct.
       final ApplicationSignatureSet signatureSet2 = anubis.getSignatureSet(identityManagerKeyPair2.getTimestamp());
diff --git a/library/src/main/java/io/mifos/anubis/controller/SignatureRestController.java b/library/src/main/java/io/mifos/anubis/controller/SignatureRestController.java
index af81fe2..33f1248 100644
--- a/library/src/main/java/io/mifos/anubis/controller/SignatureRestController.java
+++ b/library/src/main/java/io/mifos/anubis/controller/SignatureRestController.java
@@ -27,6 +27,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.Optional;
 
 /**
  * @author Myrle Krantz
@@ -65,6 +66,19 @@
   }
 
   @Permittable(AcceptedTokenType.SYSTEM)
+  @RequestMapping(value = "/signatures/_latest", method = RequestMethod.GET,
+          consumes = {MediaType.ALL_VALUE},
+          produces = {MediaType.APPLICATION_JSON_VALUE})
+  public
+  @ResponseBody ResponseEntity<ApplicationSignatureSet> getLatestSignatureSet()
+  {
+    final Optional<String> timestamp = getMostRecentTimestamp();
+    return timestamp.flatMap(tenantSignatureRepository::getSignatureSet)
+            .map(ResponseEntity::ok)
+            .orElseThrow(() -> ServiceException.notFound("No valid signature found."));
+  }
+
+  @Permittable(AcceptedTokenType.SYSTEM)
   @RequestMapping(value = "/signatures/{timestamp}", method = RequestMethod.DELETE,
           consumes = {MediaType.ALL_VALUE},
           produces = {MediaType.APPLICATION_JSON_VALUE})
@@ -86,4 +100,22 @@
             .map(ResponseEntity::ok)
             .orElseThrow(() -> ServiceException.notFound("Signature for timestamp '" + timestamp + "' not found."));
   }
+
+  @Permittable(AcceptedTokenType.SYSTEM)
+  @RequestMapping(value = "/signatures/_latest/application", method = RequestMethod.GET,
+          consumes = {MediaType.ALL_VALUE},
+          produces = {MediaType.APPLICATION_JSON_VALUE})
+  public
+  @ResponseBody ResponseEntity<Signature> getLatestApplicationSignature()
+  {
+    final Optional<String> timestamp = getMostRecentTimestamp();
+    return timestamp.flatMap(tenantSignatureRepository::getApplicationSignature)
+            .map(ResponseEntity::ok)
+            .orElseThrow(() -> ServiceException.notFound("No valid signature found."));
+  }
+
+  private Optional<String> getMostRecentTimestamp() {
+    return tenantSignatureRepository.getAllSignatureSetKeyTimestamps().stream()
+            .max(String::compareTo);
+  }
 }
\ No newline at end of file