/**
* 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.LinkedList;
import java.util.List;
import com.comcast.cmb.common.util.CMBException;
import com.comcast.cmb.common.util.Util;
import com.comcast.cns.model.CNSSubscription.CnsSubscriptionProtocol;
/**
* Class represents an endpoint publish job which contains the message and a list of subscribers
* to send notification to
* @author aseem, bwolf
*
* Class is immutable
*/
public class CNSEndpointPublishJob {
//Note the reason we do this craziness instead of just using JSON is for space efficiency
public CNSMessage getMessage() {
return message;
}
public List<? extends CNSEndpointSubscriptionInfo> getSubInfos() {
return subInfos;
}
/**
* CNSEndpointSubscriptionInfo represents the minimum info on a subscriber used for (de)serialization
* That is essential for CNSEndpointPublishJob serialization
* Class is immutable
*/
public static class CNSEndpointSubscriptionInfo {
public final CnsSubscriptionProtocol protocol;
public final String endpoint;
public final String subArn;
public final boolean rawDelivery;
public CNSEndpointSubscriptionInfo(CnsSubscriptionProtocol protocol, String endpoint, String subArn, boolean rawDelivery) {
this.protocol = protocol;
this.endpoint = endpoint;
this.subArn = subArn;
this.rawDelivery = rawDelivery;
}
/**
* serialized form is <protocol-ord>|<endpoint>|<subArn>
* @return serialized form
*/
public String serialize() {
StringBuffer sb = new StringBuffer();
sb.append(protocol.ordinal()).append("|").append(endpoint).append("|").append(subArn).append("|").append(rawDelivery);
return sb.toString();
}
/**
* Parse the string and create new SubInfo
* @param str serialized form
* @return SubInfo object from the serializedform
*/
public static CNSEndpointSubscriptionInfo parseInstance(String str) {
String arr[] = str.split("\\|");
if (arr.length != 4) {
throw new IllegalArgumentException("Expected format for SubInfo is <protocol-ord>|<endpoint>|<subArn>|<rawDelivery> got:" + str);
}
//TODO: store raw flag as "0" or "1" instead of "true" or "false" for efficiency
return new CNSEndpointSubscriptionInfo(CnsSubscriptionProtocol.values()[Integer.parseInt(arr[0])], arr[1], arr[2], Boolean.parseBoolean(arr[3]));
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof CNSEndpointSubscriptionInfo)) {
return false;
}
CNSEndpointSubscriptionInfo o = (CNSEndpointSubscriptionInfo) obj;
if (Util.isEqual(protocol, o.protocol) &&
Util.isEqual(endpoint, o.endpoint) &&
Util.isEqual(subArn, o.subArn) &&
Util.isEqual(rawDelivery, o.rawDelivery)) {
return true;
} else {
return false;
}
}
}
private final CNSMessage message;
private final List<? extends CNSEndpointSubscriptionInfo> subInfos;
public CNSEndpointPublishJob(CNSMessage message, List<? extends CNSEndpointSubscriptionInfo> subInfos) {
this.message = message;
this.subInfos = subInfos;
}
/**
*
* @return a Unicode string representing the entire job
* <num-subinfos>\n[<sub-info>\n<sub-info>...\n]<CNSPublishJob>
*/
public String serialize() {
StringBuffer sb = new StringBuffer();
sb.append(subInfos.size()).append("\n");
for (CNSEndpointSubscriptionInfo subInfo : subInfos) {
sb.append(subInfo.serialize()).append("\n");
}
sb.append(message.serialize());
return sb.toString();
}
/**
* Parse the serialized form and return instance of this class
* @param str serialized form
* @return instance from the serialized form
* @throws CMBException
*/
public static CNSEndpointPublishJob parseInstance(String str) throws CMBException {
String arr[] = str.split("\n");
if (arr.length < 2) {
throw new IllegalArgumentException("Expected at least two tokens in CNSEndpointPublishJob serial representation. Expect4ed <num-subinfos>\n[<sub-info>\n<sub-info>...\n]<CNSPublishJob>. Got:" + str);
}
int numSubInfos = Integer.parseInt(arr[0]);
int idx = 1;
List<CNSEndpointSubscriptionInfo> subInfos = new LinkedList<CNSEndpointPublishJob.CNSEndpointSubscriptionInfo>();
for (int i = 0; i < numSubInfos; i++) {
subInfos.add(CNSEndpointSubscriptionInfo.parseInstance(arr[idx++]));
}
StringBuffer sb = new StringBuffer();
for (int j = idx; j < arr.length; j++) {
if (j != idx) {
sb.append("\n");
}
sb.append(arr[j]);
}
CNSMessage message = CNSMessage.parseInstance(sb.toString());
return new CNSEndpointPublishJob(message, subInfos);
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof CNSEndpointPublishJob)) {
return false;
}
CNSEndpointPublishJob o = (CNSEndpointPublishJob)obj;
if (Util.isEqual(message, o.message) &&
Util.isCollectionsEqual(subInfos, o.subInfos)) {
return true;
} else {
return false;
}
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("message=").append(message.toString()).append(" subInfos=");
for (CNSEndpointSubscriptionInfo subInfo : subInfos) {
sb.append("subInfo=").append(subInfo.toString());
}
return sb.toString();
}
}