/**
* JBoss, Home of Professional Open Source
* Copyright Red Hat, Inc., and individual contributors.
*
* 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 org.jboss.aerogear.unifiedpush.message;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.ObjectMapper;
import java.io.IOException;
import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Contains the data of the JSON payload that has been sent to the
* RESTful Sender endpoint.
*
* <p>
* For details have a look at the <a href="http://aerogear.org/docs/specs/aerogear-push-messages/">Message Format Specification</a>.
*
* Messages are submitted as follows:
* <pre>
* {
* "message": {
* "alert": "HELLO!",
* "sound": "default",
* "badge": 2,
* "user-data": {
* "key": "value",
* "key2": "other value"
* },
* "windows": {
* "type": "tile",
* "duration": "short",
* "badge": "alert",
* "tileType": "TileWideBlockAndText01",
* "images": ["Assets/test.jpg", "Assets/background.png"],
* "textFields": ["foreground text"]
* },
* "apns": {
* "title" : "someTitle",
* "action-category": "some value",
* "content-available": true,
* "action" : "someAction",
* "url-args" :["args1","arg2"],
* "localized-key" : "some value",
* "localized-arguments" : ["args1","arg2"],
* "localized-title-key" : "some value",
* "localized-title-arguments" : ["args1","arg2"]
* },
* "simple-push": "version=123"
* },
* "criteria": {
* "alias": [ "someUsername" ],
* "deviceType": [ "someDevice" ],
* "categories": [ "someCategories" ],
* "variants": [ "someVariantIDs" ]
* },
* "config": {
* "ttl": 3600
* }
* }
* </pre>
*/
public class UnifiedPushMessage implements Serializable {
private static final long serialVersionUID = -5978882928783277261L;
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
private Message message = new Message();
private Criteria criteria = new Criteria();
private Config config = new Config();
/**
* Returns the object that contains all the submitted query criteria.
*/
public Criteria getCriteria() {
return criteria;
}
public void setCriteria(Criteria criteria) {
this.criteria = criteria;
}
public Config getConfig() {
return config;
}
public void setConfig(Config config) {
this.config = config;
}
public Message getMessage() {
return message;
}
public void setMessage(Message message) {
this.message = message;
}
/**
* Returns a JSON representation of the payload. This does not include any pushed data,
* just the alert of the message. This also contains the entire criteria object.
*
* @see #toMinimizedJsonString()
*
* @return JSON payload
*/
public String toStrippedJsonString() {
try {
final Map<String, Object> json = new LinkedHashMap<>();
json.put("alert", this.message.getAlert());
json.put("priority", this.message.getPriority().toString());
if (this.getMessage().getBadge()>0) {
json.put("badge", Integer.toString(this.getMessage().getBadge()));
}
json.put("criteria", this.criteria);
json.put("config", this.config);
return OBJECT_MAPPER.writeValueAsString(json);
} catch (JsonProcessingException e) {
return "[\"invalid json\"]";
} catch (IOException e) {
return "[\"invalid json\"]";
}
}
/**
* Returns a minimized JSON representation of the payload. This does not include potentially large objects, like
* alias or category from the given criteria.
*
* @see #toStrippedJsonString()
*
* @return minizmized JSON payload
*/
public String toMinimizedJsonString() {
try {
final Map<String, Object> json = new LinkedHashMap<>();
json.put("alert", this.message.getAlert());
if (this.getMessage().getBadge()>0) {
json.put("badge", Integer.toString(this.getMessage().getBadge()));
}
json.put("config", this.config);
// we strip down the criteria too, as alias/category can be quite long, based on use-case
final Map<String, Object> shrinkedCriteriaJSON = new LinkedHashMap<>();
shrinkedCriteriaJSON.put("variants", this.criteria.getVariants());
shrinkedCriteriaJSON.put("deviceType", this.criteria.getDeviceTypes());
json.put("criteria", shrinkedCriteriaJSON);
return OBJECT_MAPPER.writeValueAsString(json);
} catch (JsonProcessingException e) {
return "[\"invalid json\"]";
} catch (IOException e) {
return "[\"invalid json\"]";
}
}
// used in java-sender
public String toJsonString() {
try {
return OBJECT_MAPPER.writeValueAsString(this);
} catch (JsonProcessingException e) {
return "[\"invalid json\"]";
} catch (IOException e) {
return "[\"invalid json\"]";
}
}
@Override
public String toString() {
return "[alert=" + message.getAlert() + ", criteria="
+ criteria + ", time-to-live=" + config + "]";
}
}