Added ability to get default charge definitions for a pattern.
diff --git a/api/src/main/java/io/mifos/portfolio/api/v1/client/PortfolioManager.java b/api/src/main/java/io/mifos/portfolio/api/v1/client/PortfolioManager.java
index b68ff20..8e11724 100644
--- a/api/src/main/java/io/mifos/portfolio/api/v1/client/PortfolioManager.java
+++ b/api/src/main/java/io/mifos/portfolio/api/v1/client/PortfolioManager.java
@@ -45,6 +45,14 @@
   List<Pattern> getAllPatterns();
 
   @RequestMapping(
+          value = "/patterns/{patternpackage}/charges/",
+          method = RequestMethod.GET,
+          produces = MediaType.ALL_VALUE,
+          consumes = MediaType.APPLICATION_JSON_VALUE
+  )
+  List<ChargeDefinition> getAllDefaultChargeDefinitionsForPattern(@PathVariable("patternpackage") final String patternPackage);
+
+  @RequestMapping(
       value = "/products/",
       method = RequestMethod.GET,
       produces = MediaType.ALL_VALUE,
diff --git a/component-test/src/main/java/io/mifos/portfolio/TestPatterns.java b/component-test/src/main/java/io/mifos/portfolio/TestPatterns.java
index a3e83c9..b46f6e6 100644
--- a/component-test/src/main/java/io/mifos/portfolio/TestPatterns.java
+++ b/component-test/src/main/java/io/mifos/portfolio/TestPatterns.java
@@ -15,6 +15,8 @@
  */
 package io.mifos.portfolio;
 
+import io.mifos.core.api.util.NotFoundException;
+import io.mifos.portfolio.api.v1.domain.ChargeDefinition;
 import io.mifos.portfolio.api.v1.domain.Pattern;
 import org.junit.Assert;
 import org.junit.Test;
@@ -31,4 +33,17 @@
     Assert.assertNotNull(allPatterns);
     Assert.assertTrue(allPatterns.size() > 0);
   }
+
+  @Test
+  public void shouldReturnDefaultCharges() {
+    final List<ChargeDefinition> chargeDefinitions =
+            portfolioManager.getAllDefaultChargeDefinitionsForPattern("io.mifos.individuallending.api.v1");
+    Assert.assertNotNull(chargeDefinitions);
+    Assert.assertTrue(chargeDefinitions.size() > 0);
+  }
+
+  @Test(expected = NotFoundException.class)
+  public void shouldNotReturnDefaultChargesForNonExistentPackage() {
+    portfolioManager.getAllDefaultChargeDefinitionsForPattern("io.mifos.nonexistentproduct.api.v1");
+  }
 }
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/service/PatternService.java b/service/src/main/java/io/mifos/portfolio/service/internal/service/PatternService.java
index cb33897..2d40f29 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/service/PatternService.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/service/PatternService.java
@@ -15,6 +15,8 @@
  */
 package io.mifos.portfolio.service.internal.service;
 
+import io.mifos.core.lang.ServiceException;
+import io.mifos.portfolio.api.v1.domain.ChargeDefinition;
 import io.mifos.portfolio.api.v1.domain.Pattern;
 import io.mifos.products.spi.PatternFactory;
 import io.mifos.portfolio.service.internal.pattern.PatternFactoryRegistry;
@@ -48,4 +50,10 @@
   {
     return patternFactoryRegistry.getPatternFactoryForPackage(identifier).map(PatternFactory::pattern);
   }
+
+  public List<ChargeDefinition> findDefaultChargeDefinitions(final String patternPackage) {
+    return patternFactoryRegistry.getPatternFactoryForPackage(patternPackage)
+            .orElseThrow(() -> ServiceException.notFound("Pattern with package " + patternPackage + " doesn't exist."))
+            .charges();
+  }
 }
diff --git a/service/src/main/java/io/mifos/portfolio/service/rest/PatternRestController.java b/service/src/main/java/io/mifos/portfolio/service/rest/PatternRestController.java
index 89ebe69..408453b 100644
--- a/service/src/main/java/io/mifos/portfolio/service/rest/PatternRestController.java
+++ b/service/src/main/java/io/mifos/portfolio/service/rest/PatternRestController.java
@@ -17,15 +17,14 @@
 
 import io.mifos.anubis.annotation.AcceptedTokenType;
 import io.mifos.anubis.annotation.Permittable;
+import io.mifos.core.lang.ServiceException;
 import io.mifos.portfolio.api.v1.PermittableGroupIds;
+import io.mifos.portfolio.api.v1.domain.ChargeDefinition;
 import io.mifos.portfolio.api.v1.domain.Pattern;
 import io.mifos.portfolio.service.internal.service.PatternService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -51,7 +50,22 @@
   )
   public
   @ResponseBody
-  List<Pattern> getAllEntities() {
+  List<Pattern> getAllPatterns() {
     return this.patternService.findAllEntities();
   }
+
+  @Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.PRODUCT_MANAGEMENT)
+  @RequestMapping(
+          value = "/{patternpackage}/charges/",
+          method = RequestMethod.GET,
+          consumes = MediaType.ALL_VALUE,
+          produces = MediaType.APPLICATION_JSON_VALUE
+  )
+  public
+  @ResponseBody
+  List<ChargeDefinition> getAllDefaultChargeDefinitionsForPattern(@PathVariable("patternpackage") final String patternPackage) {
+    final Pattern pattern = this.patternService.findByIdentifier(patternPackage)
+            .orElseThrow(() -> ServiceException.notFound("Pattern with package " + patternPackage + " doesn't exist."));
+    return this.patternService.findDefaultChargeDefinitions(patternPackage);
+  }
 }