quartzPro/.svn/pristine/f9/f90e15d5d57f8ea3fe7a30c500f...

220 lines
7.7 KiB
Plaintext

package com.ifish.jpush.push.model;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.ifish.jpush.push.model.audience.Audience;
import com.ifish.jpush.push.model.notification.AndroidNotification;
import com.ifish.jpush.push.model.notification.IosNotification;
import com.ifish.jpush.push.model.notification.Notification;
import com.ifish.jpush.push.model.notification.PlatformNotification;
import com.ifish.jpush.utils.Preconditions;
/**
* The object you should build for sending a push.
*
* Basically start with newBuilder() method to build a PushPayload object.
*
* alertAll() is a shortcut for quickly build payload of alert to all platform and all audience;
* mesageAll() is a shortcut for quickly build payload of message to all platform and all audience.
*
*/
public class PushPayload implements PushModel {
private static final String PLATFORM = "platform";
private static final String AUDIENCE = "audience";
private static final String NOTIFICATION = "notification";
private static final String MESSAGE = "message";
private static final String OPTIONS = "options";
private static final int MAX_GLOBAL_ENTITY_LENGTH = 1200; // Definition acording to JPush Docs
private static final int MAX_IOS_PAYLOAD_LENGTH = 220; // Definition acording to JPush Docs
private static Gson _gson = new Gson();
private final Platform platform;
private final Audience audience;
private final Notification notification;
private final Message message;
private Options options;
private PushPayload(Platform platform, Audience audience,
Notification notification, Message message, Options options) {
this.platform = platform;
this.audience = audience;
this.notification = notification;
this.message = message;
this.options = options;
}
/**
* The entrance for building a PushPayload object.
*/
public static Builder newBuilder() {
return new Builder();
}
/**
* The shortcut of building a simple alert notification object to all platforms and all audiences
*/
public static PushPayload alertAll(String alert) {
return new Builder()
.setPlatform(Platform.all())
.setAudience(Audience.all())
.setNotification(Notification.alert(alert)).build();
}
/**
* The shortcut of building a simple message object to all platforms and all audiences
*/
public static PushPayload messageAll(String msgContent) {
return new Builder()
.setPlatform(Platform.all())
.setAudience(Audience.all())
.setMessage(Message.content(msgContent)).build();
}
public static PushPayload fromJSON(String payloadString) {
return _gson.fromJson(payloadString, PushPayload.class);
}
public void resetOptionsApnsProduction(boolean apnsProduction) {
if (null == options) {
options = Options.newBuilder().setApnsProduction(apnsProduction).build();
} else {
options.setApnsProduction(apnsProduction);
}
}
public void resetOptionsTimeToLive(long timeToLive) {
if (null == options) {
options = Options.newBuilder().setTimeToLive(timeToLive).build();
} else {
options.setTimeToLive(timeToLive);
}
}
public int getSendno() {
if (null != options) {
return options.getSendno();
}
return 0;
}
@Override
public JsonElement toJSON() {
JsonObject json = new JsonObject();
if (null != platform) {
json.add(PLATFORM, platform.toJSON());
}
if (null != audience) {
json.add(AUDIENCE, audience.toJSON());
}
if (null != notification) {
json.add(NOTIFICATION, notification.toJSON());
}
if (null != message) {
json.add(MESSAGE, message.toJSON());
}
if (null != options) {
json.add(OPTIONS, options.toJSON());
}
return json;
}
public boolean isGlobalExceedLength() {
int messageLength = 0;
JsonObject payload = (JsonObject) this.toJSON();
if (payload.has(MESSAGE)) {
JsonObject message = payload.getAsJsonObject(MESSAGE);
messageLength = message.toString().getBytes().length;
}
if (!payload.has(NOTIFICATION)) {
// only mesage
return messageLength > MAX_GLOBAL_ENTITY_LENGTH;
} else {
JsonObject notification = payload.getAsJsonObject(NOTIFICATION);
if (notification.has(AndroidNotification.NOTIFICATION_ANDROID)) {
JsonObject android = notification.getAsJsonObject(AndroidNotification.NOTIFICATION_ANDROID);
int androidLength = android.toString().getBytes().length;
return (androidLength + messageLength) > MAX_GLOBAL_ENTITY_LENGTH;
}
}
return false;
}
public boolean isIosExceedLength() {
JsonObject payload = (JsonObject) this.toJSON();
if (payload.has(NOTIFICATION)) {
JsonObject notification = payload.getAsJsonObject(NOTIFICATION);
if (notification.has(IosNotification.NOTIFICATION_IOS)) {
JsonObject ios = notification.getAsJsonObject(IosNotification.NOTIFICATION_IOS);
return ios.toString().getBytes().length > MAX_IOS_PAYLOAD_LENGTH;
} else {
if (notification.has(PlatformNotification.ALERT)) {
String alert = notification.get(PlatformNotification.ALERT).getAsString();
JsonObject ios = new JsonObject();
ios.add("alert", new JsonPrimitive(alert));
return ios.toString().getBytes().length > MAX_IOS_PAYLOAD_LENGTH;
} else {
// No iOS Payload
}
}
}
return false;
}
@Override
public String toString() {
return _gson.toJson(toJSON());
}
public static class Builder {
private Platform platform = null;
private Audience audience = null;
private Notification notification = null;
private Message message = null;
private Options options = null;
public Builder setPlatform(Platform platform) {
this.platform = platform;
return this;
}
public Builder setAudience(Audience audience) {
this.audience = audience;
return this;
}
public Builder setNotification(Notification notification) {
this.notification = notification;
return this;
}
public Builder setMessage(Message message) {
this.message = message;
return this;
}
public Builder setOptions(Options options) {
this.options = options;
return this;
}
public PushPayload build() {
Preconditions.checkArgument(! (null == audience || null == platform), "audience and platform both should be set.");
Preconditions.checkArgument(! (null == notification && null == message), "notification or message should be set at least one.");
// if options is not set, a sendno will be generated for tracing easily
if (null == options) {
options = Options.sendno();
}
return new PushPayload(platform, audience, notification, message, options);
}
}
}