package com.kth.baasio.entity.push;
import static org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion.NON_NULL;
import com.kth.baasio.entity.BaasioBaseEntity;
import com.kth.baasio.utils.JsonUtils;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
public class BaasioMessage extends BaasioBaseEntity {
public final static String ENTITY_TYPE = "push";
public final static String TARGET_TYPE_ALL = "all";
public final static String TARGET_TYPE_TAG = "tag";
public final static String TARGET_TYPE_DEVICE = "device";
public final static String TARGET_TYPE_USER = "user";
public final static String PLATFORM_TYPE_GCM = "G";
public final static String PLATFORM_TYPE_IOS = "I";
public final static int PLATFORM_FLAG_TYPE_GCM = 0x01;
public final static int PLATFORM_FLAG_TYPE_IOS = 0x02;
public final static String PROPERTY_TARGET = "target";
public final static String PROPERTY_TO = "to";
public final static String PROPERTY_PAYLOAD = "payload";
public final static String PROPERTY_RESERVE = "reserve";
public final static String PROPERTY_PLATFORM = "platform";
public final static String PROPERTY_MEMO = "memo";
public BaasioMessage() {
super();
setType(ENTITY_TYPE);
setTarget(TARGET_TYPE_ALL);
setPlatform(PLATFORM_FLAG_TYPE_GCM | PLATFORM_FLAG_TYPE_IOS);
}
public BaasioMessage(BaasioBaseEntity entity) {
super(entity);
}
/**
* Get predefined property names.
*
* @return List of predefined property names
*/
@Override
@JsonIgnore
public List<String> getPropertyNames() {
List<String> properties = super.getPropertyNames();
properties.add(PROPERTY_TARGET);
properties.add(PROPERTY_TO);
properties.add(PROPERTY_PAYLOAD);
properties.add(PROPERTY_RESERVE);
properties.add(PROPERTY_PLATFORM);
properties.add(PROPERTY_MEMO);
return properties;
}
/**
* Get target type.
*
* @return Target type
*/
@JsonSerialize(include = NON_NULL)
public String getTarget() {
return JsonUtils.getStringProperty(properties, PROPERTY_TARGET);
}
/**
* Set target type.
*
* @param target Target type
*/
public void setTarget(String target) {
JsonUtils.setStringProperty(properties, PROPERTY_TARGET, target);
}
/**
* Get target string.
*
* @return Target string
*/
@JsonSerialize(include = NON_NULL)
public String getTo() {
return JsonUtils.getStringProperty(properties, PROPERTY_TO);
}
/**
* Get list of target.
*
* @return List of target
*/
@JsonIgnore
public String[] getToList() {
String to = getTo();
return to.split(",\\");
}
/**
* Set target.
*
* @param toList List of target
*/
public void setTo(String... toList) {
if (toList == null || toList.length <= 0) {
return;
}
StringBuilder builder = new StringBuilder();
for (String to : toList) {
if (builder.length() > 0) {
builder.append(",");
}
builder.append(to);
}
JsonUtils.setStringProperty(properties, PROPERTY_TO, builder.toString());
}
/**
* Get payload to send.
*
* @return payload
*/
@JsonSerialize(include = NON_NULL)
public BaasioPayload getPayload() {
return JsonUtils.getObjectProperty(properties, PROPERTY_PAYLOAD, BaasioPayload.class);
}
/**
* Set payload to send.
*
* @param payload Payload to send
*/
public void setPayload(BaasioPayload payload) {
JsonUtils.setObjectProperty(properties, PROPERTY_PAYLOAD, payload);
}
/**
* Set simple push message to send. If you want to add custom field, use
* setPayload() instead.
*
* @param alert Message
* @param sound Sound
* @param badge badge count
*/
public void setMessage(String alert, String sound, Integer badge) {
BaasioPayload payload = new BaasioPayload();
payload.setAlert(alert);
payload.setSound(sound);
payload.setBadge(badge);
JsonUtils.setObjectProperty(properties, PROPERTY_PAYLOAD, payload);
}
/**
* Get time string to send.
*
* @return Time string(yyyyMMddHHmm) in KST
*/
@JsonSerialize(include = NON_NULL)
public String getReserve() {
return JsonUtils.getStringProperty(properties, PROPERTY_RESERVE);
}
/**
* Set time string to send.
*
* @param reserve Time string(yyyyMMddHHmm) in KST
*/
public void setReserve(String reserve) {
if (reserve.length() < 12) {
return;
}
JsonUtils.setStringProperty(properties, PROPERTY_RESERVE, reserve);
}
private static String getReserveTimeString(long millis) {
String time = null;
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmm", Locale.getDefault());
time = formatter.format(new Date(millis));
return time;
}
/**
* Set time to send in UNIX time(milliseconds).
*
* @param millis UNIX time(milliseconds)
*/
public void setReserve(long millis) {
String reserve = getReserveTimeString(millis);
JsonUtils.setStringProperty(properties, PROPERTY_RESERVE, reserve);
}
/**
* Get target platform type. 'G' is android GCM. 'I' is iOS APNS.
*
* @return Target platform type
*/
@JsonSerialize(include = NON_NULL)
public String getPlatform() {
return JsonUtils.getStringProperty(properties, PROPERTY_PLATFORM);
}
/**
* To check, a platform type is included.
*
* @return true is included
*/
@JsonIgnore
public boolean isPlatformIncluded(int flag) {
String platform = getPlatform();
if (flag == (PLATFORM_FLAG_TYPE_GCM | PLATFORM_FLAG_TYPE_IOS)) {
if ((platform.contains("G") || platform.contains("g")) && platform.contains("I")
|| platform.contains("i")) {
return true;
}
} else if (flag == PLATFORM_FLAG_TYPE_GCM) {
if (platform.contains("G") || platform.contains("g")) {
return true;
}
} else if (flag == PLATFORM_FLAG_TYPE_IOS) {
if (platform.contains("I") || platform.contains("i")) {
return true;
}
}
return false;
}
/**
* Set target platform with flag.
*
* @param flag PLATFORM_FLAG_TYPE_GCM(0x1), PLATFORM_FLAG_TYPE_IOS(0x2)
*/
public void setPlatform(int flag) {
StringBuilder builder = new StringBuilder();
if ((flag & PLATFORM_FLAG_TYPE_GCM) == PLATFORM_FLAG_TYPE_GCM) {
builder.append("G");
}
if ((flag & PLATFORM_FLAG_TYPE_IOS) == PLATFORM_FLAG_TYPE_IOS) {
if (builder.length() > 0) {
builder.append(",");
}
builder.append("I");
}
JsonUtils.setStringProperty(properties, PROPERTY_PLATFORM, builder.toString());
}
/**
* Get additional memo.
*
* @return memo
*/
@JsonSerialize(include = NON_NULL)
public String getMemo() {
return JsonUtils.getStringProperty(properties, PROPERTY_MEMO);
}
/**
* Set additional memo data.
*
* @param memo memo
*/
public void setMemo(String memo) {
JsonUtils.setStringProperty(properties, PROPERTY_MEMO, memo);
}
}