/**
* Copyright 2012 Comcast Corporation
*
* Licensed 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 com.comcast.cns.model;
import java.util.Iterator;
import org.apache.log4j.Logger;
import org.json.JSONObject;
import com.comcast.cmb.common.util.CMBException;
import com.comcast.cns.util.CNSErrorCodes;
/**
* represents a delivery policy
* @author bwolf, jorge
*
* Class is not thread-safe. Caller must ensure thread-safety
*/
public class CNSTopicDeliveryPolicy {
private static Logger logger = Logger.getLogger(CNSTopicDeliveryPolicy.class);
private CNSRetryPolicy defaultHealthyRetryPolicy;
private CNSRetryPolicy defaultSicklyRetryPolicy;
private boolean disableSubscriptionOverrides;
private CNSThrottlePolicy defaultThrottlePolicy;
public CNSRetryPolicy getDefaultHealthyRetryPolicy() {
return defaultHealthyRetryPolicy;
}
public void setDefaultHealthyRetryPolicy(CNSRetryPolicy defaultHealthyRetryPolicy) {
this.defaultHealthyRetryPolicy = defaultHealthyRetryPolicy;
}
public CNSRetryPolicy getDefaultSicklyRetryPolicy() {
return defaultSicklyRetryPolicy;
}
public void setDefaultSicklyRetryPolicy(CNSRetryPolicy defaultSicklyRetryPolicy) {
this.defaultSicklyRetryPolicy = defaultSicklyRetryPolicy;
}
public CNSThrottlePolicy getDefaultThrottlePolicy() {
return defaultThrottlePolicy;
}
public void setDefaultThrottlePolicy(CNSThrottlePolicy defaultThrottlePolicy) {
this.defaultThrottlePolicy = defaultThrottlePolicy;
}
public boolean isDisableSubscriptionOverrides() {
return disableSubscriptionOverrides;
}
public void setDisableSubscriptionOverrides(boolean disableSubscriptionOverrides) {
this.disableSubscriptionOverrides = disableSubscriptionOverrides;
}
public CNSTopicDeliveryPolicy() {
defaultHealthyRetryPolicy = new CNSRetryPolicy();
defaultSicklyRetryPolicy = null;
disableSubscriptionOverrides = false;
defaultThrottlePolicy = new CNSThrottlePolicy();
}
private JSONObject httpJSONObject() {
try {
JSONObject json = new JSONObject();
if (defaultHealthyRetryPolicy != null) {
json.put("defaultHealthyRetryPolicy", defaultHealthyRetryPolicy.toJSON());
} else {
json.put("defaultHealthyRetryPolicy", JSONObject.NULL);
}
if (defaultSicklyRetryPolicy != null) {
json.put("defaultSicklyRetryPolicy", defaultSicklyRetryPolicy.toJSON());
} else {
json.put("defaultSicklyRetryPolicy", JSONObject.NULL);
}
if (disableSubscriptionOverrides) {
json.put("disableSubscriptionOverrides", true);
} else {
json.put("disableSubscriptionOverrides", false);
}
if (defaultThrottlePolicy != null) {
json.put("defaultThrottlePolicy", defaultThrottlePolicy.toJSON());
} else {
json.put("defaultThrottlePolicy", JSONObject.NULL);
}
return json;
} catch (Exception e) {
logger.error("event=cns_topic_delivery_policy_to_json", e);
}
return null;
}
public CNSTopicDeliveryPolicy(JSONObject json) throws CMBException {
String errorMessage = "";
boolean error = false;
if (!json.has("http")) {
errorMessage = "Topic Delivery Policy missing policy for http";
logger.error("event=construct_cns_topic_delivery_policy message=" + errorMessage);
throw new CMBException(CNSErrorCodes.CNS_InvalidParameter, errorMessage);
}
try{
JSONObject json2 = json.getJSONObject("http");
if (json2.length() == 0) {
throw new Exception("Empty http protocol");
}
for (Iterator<String> keys = json2.keys(); keys.hasNext();) {
String key = keys.next();
if (!(key.equals("defaultHealthyRetryPolicy") || key.equals("defaultSicklyRetryPolicy") || key.equals("disableSubscriptionOverrides") ||
key.equals("defaultThrottlePolicy"))) {
throw new Exception("Empty http delivery policy does not have key:" + key);
}
}
if (json2.has("defaultHealthyRetryPolicy") && (json2.get("defaultHealthyRetryPolicy") != JSONObject.NULL)) {
try {
defaultHealthyRetryPolicy = new CNSRetryPolicy(json2.getJSONObject("defaultHealthyRetryPolicy"));
} catch (Exception e) {
if (e instanceof CNSModelConstructionException) {
String message = ((CNSModelConstructionException) e).getErrormessage();
errorMessage = "DeliveryPolicy: defaultHealthyRetryPolicy." + message;
error = true;
}
}
} else {
defaultHealthyRetryPolicy = new CNSRetryPolicy();
}
if ((json2.has("defaultSicklyRetryPolicy"))) {
if (json2.get("defaultSicklyRetryPolicy") == JSONObject.NULL) defaultSicklyRetryPolicy = null;
else {
try {
defaultSicklyRetryPolicy = new CNSRetryPolicy(json2.getJSONObject("defaultSicklyRetryPolicy"));
} catch (Exception e) {
if (e instanceof CNSModelConstructionException) {
String message = ((CNSModelConstructionException) e).getErrormessage();
errorMessage = "DeliveryPolicy: defaultSicklyRetryPolicy." + message;
error = true;
}
}
}
}
if ((json2.has("disableSubscriptionOverrides"))) {
disableSubscriptionOverrides = json2.getBoolean("disableSubscriptionOverrides");
} else {
disableSubscriptionOverrides = false;
}
if ((json2.has("defaultThrottlePolicy")) && (json2.get("defaultThrottlePolicy") != JSONObject.NULL)) {
try {
defaultThrottlePolicy = new CNSThrottlePolicy(json2.getJSONObject("defaultThrottlePolicy"));
} catch (Exception e) {
if (e instanceof CNSModelConstructionException) {
String message = ((CNSModelConstructionException) e).getErrormessage();
errorMessage = "DeliveryPolicy: defaultThrottlePolicy." + message;
error = true;
}
}
} else {
defaultThrottlePolicy = new CNSThrottlePolicy();
}
} catch (Exception e) {
logger.error("event=construct_cns_topic_delivery_policy", e);
throw new CMBException(CNSErrorCodes.CNS_InvalidParameter,e.getMessage());
}
if (error) {
logger.error("event=update_cns_topic_delivery_policy message=" + errorMessage);
throw new CMBException(CNSErrorCodes.CNS_InvalidParameter, errorMessage);
}
}
/**
* Update this object by taking values from parameter (if present) or the default values
* Also do validation checks
* @param json
* @throws Exception
*/
public void update(JSONObject json) throws CNSModelConstructionException, CMBException {
if (!json.has("http")) {
String errorMessage = "Topic Delivery Policy missing policy for http";
logger.error("event=update_cns_topic_delivery_policy message=" + errorMessage);
throw new CMBException(CNSErrorCodes.CNS_InvalidParameter, errorMessage);
}
String errorMessage = "";
boolean error = false;
try {
CNSRetryPolicy ldefaultHealthyRetryPolicy = null;
CNSRetryPolicy ldefaultSicklyRetryPolicy = null;
CNSThrottlePolicy ldefaultThrottlePolicy = null;
boolean ldisableSubscriptionOverrides = false;
JSONObject json2 = json.getJSONObject("http");
if (json2.has("defaultHealthyRetryPolicy") && (json2.get("defaultHealthyRetryPolicy") != JSONObject.NULL)) {
try {
ldefaultHealthyRetryPolicy = new CNSRetryPolicy(json2.getJSONObject("defaultHealthyRetryPolicy"));
} catch (Exception e) {
if(e instanceof CNSModelConstructionException) {
String message = ((CNSModelConstructionException) e).getErrormessage();
errorMessage = "DeliveryPolicy: defaultHealthyRetryPolicy." + message;
error = true;
}
}
} else {
ldefaultHealthyRetryPolicy = new CNSRetryPolicy();
}
if ((json2.has("defaultSicklyRetryPolicy")) &&(json2.get("defaultSicklyRetryPolicy") != JSONObject.NULL)) {
try {
ldefaultSicklyRetryPolicy = new CNSRetryPolicy(json2.getJSONObject("defaultSicklyRetryPolicy"));
} catch (Exception e) {
if (e instanceof CNSModelConstructionException) {
String message = ((CNSModelConstructionException) e).getErrormessage();
errorMessage = "DeliveryPolicy: defaultSicklyRetryPolicy." + message;
error = true;
}
}
} else {
ldefaultSicklyRetryPolicy = null;
}
if ((json2.has("disableSubscriptionOverrides"))) {
try {
ldisableSubscriptionOverrides = json2.getBoolean("disableSubscriptionOverrides");
} catch (Exception e) {
errorMessage = "DeliveryPolicy: disableSubscriptionOverrides must be a boolean";
error = true;
}
} else {
ldisableSubscriptionOverrides = false;
}
if ((json2.has("defaultThrottlePolicy")) && (json2.get("defaultThrottlePolicy") != JSONObject.NULL)) {
try {
ldefaultThrottlePolicy = new CNSThrottlePolicy(json2.getJSONObject("defaultThrottlePolicy"));
} catch (Exception e) {
if (e instanceof CNSModelConstructionException) {
String message = ((CNSModelConstructionException) e).getErrormessage();
errorMessage = "DeliveryPolicy: defaultThrottlePolicy." + message;
error = true;
}
}
} else {
ldefaultThrottlePolicy = new CNSThrottlePolicy();
}
if (!error) {
defaultHealthyRetryPolicy = ldefaultHealthyRetryPolicy;
defaultSicklyRetryPolicy = ldefaultSicklyRetryPolicy;
disableSubscriptionOverrides = ldisableSubscriptionOverrides;
defaultThrottlePolicy = ldefaultThrottlePolicy;
}
} catch (Exception e) {
logger.error("event=update_cns_topic_delivery_policy", e);
throw new CMBException(CNSErrorCodes.CNS_InvalidParameter,"DeliveryPolicy: JSON exception");
}
if (error) {
logger.error("event=update_cns_topic_delivery_policy message=" + errorMessage);
throw new CMBException(CNSErrorCodes.CNS_InvalidParameter, errorMessage);
}
}
public JSONObject toJSON() {
try {
JSONObject json = new JSONObject();
JSONObject httpJson = httpJSONObject();
json.put("http", httpJson);
return json;
} catch (Exception e) {
logger.error("event=cns_topic_delivery_policy_to_json", e);
}
return null;
}
public String toString() {
try {
JSONObject json = this.toJSON();
if (json != null) {
return json.toString();
}
return null;
} catch (Exception e) {
logger.error("event=cns_topic_delivery_policy_to_string", e);
return null;
}
}
}