Details
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/CatalogJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/CatalogJson.java
index 112f24b..79a2b8b 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/CatalogJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/CatalogJson.java
@@ -947,7 +947,7 @@ public class CatalogJson {
this.number = number;
}
- public DurationJson(final Duration duration) throws CurrencyValueNull {
+ public DurationJson(final Duration duration) {
this(duration.getUnit(), duration.getNumber());
}
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueConditionJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueConditionJson.java
new file mode 100644
index 0000000..672452f
--- /dev/null
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueConditionJson.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
+ *
+ * The Billing Project licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.killbill.billing.jaxrs.json;
+
+import org.killbill.billing.catalog.api.CurrencyValueNull;
+import org.killbill.billing.jaxrs.json.CatalogJson.DurationJson;
+import org.killbill.billing.overdue.api.OverdueCondition;
+import org.killbill.billing.util.tag.ControlTagType;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class OverdueConditionJson {
+
+ private final DurationJson timeSinceEarliestUnpaidInvoiceEqualsOrExceeds;
+ private final ControlTagType controlTagInclusion;
+ private final ControlTagType controlTagExclusion;
+
+ @JsonCreator
+ public OverdueConditionJson(@JsonProperty("timeSinceEarliestUnpaidInvoiceEqualsOrExceeds") final DurationJson timeSinceEarliestUnpaidInvoiceEqualsOrExceeds,
+ @JsonProperty("controlTagInclusion") final ControlTagType controlTagInclusion,
+ @JsonProperty("controlTagExclusion") final ControlTagType controlTagExclusion) {
+ this.timeSinceEarliestUnpaidInvoiceEqualsOrExceeds = timeSinceEarliestUnpaidInvoiceEqualsOrExceeds;
+ this.controlTagInclusion = controlTagInclusion;
+ this.controlTagExclusion = controlTagExclusion;
+ }
+
+ public OverdueConditionJson(final OverdueCondition overdueCondition) {
+ this.timeSinceEarliestUnpaidInvoiceEqualsOrExceeds = new DurationJson(overdueCondition.getTimeSinceEarliestUnpaidInvoiceEqualsOrExceeds());
+ this.controlTagInclusion = overdueCondition.getInclusionControlTagType();
+ this.controlTagExclusion = overdueCondition.getExclusionControlTagType();
+ }
+
+ public DurationJson getTimeSinceEarliestUnpaidInvoiceEqualsOrExceeds() {
+ return timeSinceEarliestUnpaidInvoiceEqualsOrExceeds;
+ }
+
+ public ControlTagType getControlTagInclusion() {
+ return controlTagInclusion;
+ }
+
+ public ControlTagType getControlTagExclusion() {
+ return controlTagExclusion;
+ }
+
+ @Override
+ public String toString() {
+ return "OverdueConditionJson{" +
+ "timeSinceEarliestUnpaidInvoiceEqualsOrExceeds=" + timeSinceEarliestUnpaidInvoiceEqualsOrExceeds +
+ ", controlTagInclusion=" + controlTagInclusion +
+ ", controlTagExclusion=" + controlTagExclusion +
+ '}';
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof OverdueConditionJson)) {
+ return false;
+ }
+
+ final OverdueConditionJson that = (OverdueConditionJson) o;
+
+ if (timeSinceEarliestUnpaidInvoiceEqualsOrExceeds != null ? !timeSinceEarliestUnpaidInvoiceEqualsOrExceeds.equals(that.timeSinceEarliestUnpaidInvoiceEqualsOrExceeds) : that.timeSinceEarliestUnpaidInvoiceEqualsOrExceeds != null) {
+ return false;
+ }
+ if (controlTagInclusion != that.controlTagInclusion) {
+ return false;
+ }
+ return controlTagExclusion == that.controlTagExclusion;
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = timeSinceEarliestUnpaidInvoiceEqualsOrExceeds != null ? timeSinceEarliestUnpaidInvoiceEqualsOrExceeds.hashCode() : 0;
+ result = 31 * result + (controlTagInclusion != null ? controlTagInclusion.hashCode() : 0);
+ result = 31 * result + (controlTagExclusion != null ? controlTagExclusion.hashCode() : 0);
+ return result;
+ }
+}
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueJson.java
new file mode 100644
index 0000000..5dc7aec
--- /dev/null
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueJson.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
+ *
+ * The Billing Project licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.killbill.billing.jaxrs.json;
+
+import java.util.List;
+
+import org.killbill.billing.catalog.api.CurrencyValueNull;
+import org.killbill.billing.overdue.api.OverdueApiException;
+import org.killbill.billing.overdue.api.OverdueConfig;
+import org.killbill.billing.overdue.api.OverdueState;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+
+public class OverdueJson {
+
+ private final Integer initialReevaluationIntervalDays;
+ private final List<OverdueStateConfigJson> overdueStates;
+
+ @JsonCreator
+ public OverdueJson(@JsonProperty("initialReevaluationInterval") final Integer initialReevaluationInterval,
+ @JsonProperty("overdueStates") final List<OverdueStateConfigJson> overdueStates) {
+ this.initialReevaluationIntervalDays = initialReevaluationInterval;
+ this.overdueStates = overdueStates;
+ }
+
+ public OverdueJson(final OverdueConfig overdueConfig) {
+ this.initialReevaluationIntervalDays = overdueConfig.getOverdueStatesAccount().getInitialReevaluationInterval() != null ?
+ overdueConfig.getOverdueStatesAccount().getInitialReevaluationInterval().getDays() : null;
+ this.overdueStates = ImmutableList.copyOf(Iterables.transform(ImmutableList.copyOf(overdueConfig.getOverdueStatesAccount().getStates()), new Function<OverdueState, OverdueStateConfigJson>() {
+ @Override
+ public OverdueStateConfigJson apply(final OverdueState input) {
+ return new OverdueStateConfigJson(input);
+ }
+ }));
+ }
+
+ public Integer getInitialReevaluationInterval() {
+ return initialReevaluationIntervalDays;
+ }
+
+ public List<OverdueStateConfigJson> getOverdueStates() {
+ return overdueStates;
+ }
+
+ @Override
+ public String toString() {
+ return "OverdueJson{" +
+ "initialReevaluationIntervalDays=" + initialReevaluationIntervalDays +
+ ", overdueStates=" + overdueStates +
+ '}';
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof OverdueJson)) {
+ return false;
+ }
+
+ final OverdueJson that = (OverdueJson) o;
+
+ if (initialReevaluationIntervalDays != null ? !initialReevaluationIntervalDays.equals(that.initialReevaluationIntervalDays) : that.initialReevaluationIntervalDays != null) {
+ return false;
+ }
+ return overdueStates != null ? overdueStates.equals(that.overdueStates) : that.overdueStates == null;
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = initialReevaluationIntervalDays != null ? initialReevaluationIntervalDays.hashCode() : 0;
+ result = 31 * result + (overdueStates != null ? overdueStates.hashCode() : 0);
+ return result;
+ }
+}
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueStateConfigJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueStateConfigJson.java
new file mode 100644
index 0000000..d385446
--- /dev/null
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/OverdueStateConfigJson.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
+ *
+ * The Billing Project licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.killbill.billing.jaxrs.json;
+
+import org.killbill.billing.catalog.api.CurrencyValueNull;
+import org.killbill.billing.overdue.api.OverdueApi;
+import org.killbill.billing.overdue.api.OverdueApiException;
+import org.killbill.billing.overdue.api.OverdueCancellationPolicy;
+import org.killbill.billing.overdue.api.OverdueState;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class OverdueStateConfigJson {
+
+ private final String name;
+ private final Boolean isClearState;
+ private final OverdueConditionJson condition;
+ private final String externalMessage;
+ private final Boolean blockChanges;
+ private final Boolean disableEntitlement;
+ private final OverdueCancellationPolicy subscriptionCancellationPolicy;
+ private final Integer autoReevaluationIntervalDays;
+
+ @JsonCreator
+ public OverdueStateConfigJson(@JsonProperty("name") final String name,
+ @JsonProperty("isClearState") final Boolean isClearState,
+ @JsonProperty("condition") final OverdueConditionJson condition,
+ @JsonProperty("externalMessage") final String externalMessage,
+ @JsonProperty("blockChanges") final Boolean blockChanges,
+ @JsonProperty("disableEntitlement") final Boolean disableEntitlement,
+ @JsonProperty("subscriptionCancellationPolicy") final OverdueCancellationPolicy subscriptionCancellationPolicy,
+ @JsonProperty("autoReevaluationIntervalDays") final Integer autoReevaluationInterval) {
+ this.name = name;
+ this.isClearState = isClearState;
+ this.condition = condition;
+ this.externalMessage = externalMessage;
+ this.blockChanges = blockChanges;
+ this.disableEntitlement = disableEntitlement;
+ this.subscriptionCancellationPolicy = subscriptionCancellationPolicy;
+ this.autoReevaluationIntervalDays = autoReevaluationInterval;
+ }
+
+ public OverdueStateConfigJson(final OverdueState input) {
+ this.name = input.getName();
+ this.isClearState = input.isClearState();
+ this.condition = input.getOverdueCondition() != null ? new OverdueConditionJson(input.getOverdueCondition()) : null;
+ this.externalMessage = input.getExternalMessage();
+ this.blockChanges = input.isBlockChanges();
+ this.disableEntitlement = input.isDisableEntitlementAndChangesBlocked();
+ this.subscriptionCancellationPolicy = input.getOverdueCancellationPolicy();
+ Integer tmpAutoReevaluationIntervalDays = null;
+ try {
+ tmpAutoReevaluationIntervalDays = input.getAutoReevaluationInterval().getDays();
+ } catch (final OverdueApiException e) {
+ } finally {
+ this.autoReevaluationIntervalDays = tmpAutoReevaluationIntervalDays;
+ }
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Boolean getClearState() {
+ return isClearState;
+ }
+
+ public OverdueConditionJson getCondition() {
+ return condition;
+ }
+
+ public String getExternalMessage() {
+ return externalMessage;
+ }
+
+ public Boolean getBlockChanges() {
+ return blockChanges;
+ }
+
+ public Boolean getDisableEntitlement() {
+ return disableEntitlement;
+ }
+
+ public OverdueCancellationPolicy getSubscriptionCancellationPolicy() {
+ return subscriptionCancellationPolicy;
+ }
+
+ public Integer getAutoReevaluationIntervalDays() {
+ return autoReevaluationIntervalDays;
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof OverdueStateConfigJson)) {
+ return false;
+ }
+
+ final OverdueStateConfigJson that = (OverdueStateConfigJson) o;
+
+ if (name != null ? !name.equals(that.name) : that.name != null) {
+ return false;
+ }
+ if (isClearState != null ? !isClearState.equals(that.isClearState) : that.isClearState != null) {
+ return false;
+ }
+ if (condition != null ? !condition.equals(that.condition) : that.condition != null) {
+ return false;
+ }
+ if (externalMessage != null ? !externalMessage.equals(that.externalMessage) : that.externalMessage != null) {
+ return false;
+ }
+ if (blockChanges != null ? !blockChanges.equals(that.blockChanges) : that.blockChanges != null) {
+ return false;
+ }
+ if (disableEntitlement != null ? !disableEntitlement.equals(that.disableEntitlement) : that.disableEntitlement != null) {
+ return false;
+ }
+ if (subscriptionCancellationPolicy != that.subscriptionCancellationPolicy) {
+ return false;
+ }
+ return autoReevaluationIntervalDays != null ? autoReevaluationIntervalDays.equals(that.autoReevaluationIntervalDays) : that.autoReevaluationIntervalDays == null;
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = name != null ? name.hashCode() : 0;
+ result = 31 * result + (isClearState != null ? isClearState.hashCode() : 0);
+ result = 31 * result + (condition != null ? condition.hashCode() : 0);
+ result = 31 * result + (externalMessage != null ? externalMessage.hashCode() : 0);
+ result = 31 * result + (blockChanges != null ? blockChanges.hashCode() : 0);
+ result = 31 * result + (disableEntitlement != null ? disableEntitlement.hashCode() : 0);
+ result = 31 * result + (subscriptionCancellationPolicy != null ? subscriptionCancellationPolicy.hashCode() : 0);
+ result = 31 * result + (autoReevaluationIntervalDays != null ? autoReevaluationIntervalDays.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "OverdueStateConfigJson{" +
+ "name='" + name + '\'' +
+ ", isClearState=" + isClearState +
+ ", condition=" + condition +
+ ", externalMessage='" + externalMessage + '\'' +
+ ", blockChanges=" + blockChanges +
+ ", disableEntitlement=" + disableEntitlement +
+ ", subscriptionCancellationPolicy=" + subscriptionCancellationPolicy +
+ ", autoReevaluationIntervalDays=" + autoReevaluationIntervalDays +
+ '}';
+ }
+}
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/OverdueResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/OverdueResource.java
index a30a0cf..fc5a080 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/OverdueResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/OverdueResource.java
@@ -20,6 +20,8 @@ package org.killbill.billing.jaxrs.resources;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
@@ -28,14 +30,23 @@ import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriInfo;
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.catalog.StandaloneCatalog;
+import org.killbill.billing.catalog.VersionedCatalog;
+import org.killbill.billing.catalog.api.StaticCatalog;
+import org.killbill.billing.jaxrs.json.CatalogJson;
+import org.killbill.billing.jaxrs.json.OverdueJson;
import org.killbill.billing.jaxrs.util.Context;
import org.killbill.billing.jaxrs.util.JaxrsUriBuilder;
import org.killbill.billing.overdue.api.OverdueApi;
+import org.killbill.billing.overdue.api.OverdueConfig;
import org.killbill.billing.overdue.config.DefaultOverdueConfig;
import org.killbill.billing.payment.api.PaymentApi;
import org.killbill.billing.util.api.AuditUserApi;
@@ -54,6 +65,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponses;
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
import static javax.ws.rs.core.MediaType.APPLICATION_XML;
@Singleton
@@ -80,7 +92,7 @@ public class OverdueResource extends JaxRsResourceBase {
@TimedResource
@GET
@Produces(APPLICATION_XML)
- @ApiOperation(value = "Retrieve the full catalog as XML", response = String.class, hidden = true)
+ @ApiOperation(value = "Retrieve the overdue config as XML", response = String.class, hidden = true)
@ApiResponses(value = {})
public Response getOverdueConfigXml(@javax.ws.rs.core.Context final HttpServletRequest request) throws Exception {
final TenantContext tenantContext = context.createContext(request);
@@ -106,4 +118,19 @@ public class OverdueResource extends JaxRsResourceBase {
overdueApi.uploadOverdueConfig(overdueXML, callContext);
return uriBuilder.buildResponse(uriInfo, OverdueResource.class, null, null);
}
+
+ @TimedResource
+ @GET
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Retrieve the overdue config as JSON" , response = OverdueJson.class)
+ @ApiResponses(value = {})
+ public Response getOverdueConfigJson(@javax.ws.rs.core.Context final HttpServletRequest request) throws Exception {
+
+
+ final TenantContext tenantContext = context.createContext(request);
+ final OverdueConfig overdueConfig = overdueApi.getOverdueConfig(tenantContext);
+ final OverdueJson result = new OverdueJson(overdueConfig);
+ return Response.status(Status.OK).entity(result).build();
+ }
+
}