ME += "-" + sessionId;
if (log.isLoggable(Level.FINE)) log.fine("Entering servlet doPost() ...");
Global glob = null;
I_XmlBlasterAccess xmlBlaster = null;
PushHandler pushHandler = null;
Object returnObject = null;
try {
pushHandler = getPushHandler(req);
xmlBlaster = pushHandler.getXmlBlasterAccess();
glob = xmlBlaster.getGlobal();
}
catch (XmlBlasterException e) {
log.warning("Caught XmlBlaster Exception: " + e.getMessage());
writeResponse(res, I_XmlBlasterAccessRaw.EXCEPTION_NAME, e.getMessage());
return;
}
try {
// Extract the message data
MsgHolder msg = extractMessage(ME, log, req, binaryMsg);
String oid = msg.getOid();
String key = msg.getKey();
String qos = msg.getQos();
String xmlRequest = msg.getKey(); // in case of xmlScript the request is sent as the key (all other are null)
byte[] content = msg.getContent();
if (actionType.equals(I_XmlBlasterAccessRaw.PING_NAME)) { // "ping"
if (log.isLoggable(Level.FINE)) log.fine("ping arrived, qos=" + qos);
Hashtable map = new Hashtable();
if (xmlBlaster.isAlive()) {
map.put("/qos/state/@id", Constants.STATE_OK);
map.put("/qos/state/@info", ConnectionStateEnum.ALIVE.toString()); // "ALIVE"
}
else if (xmlBlaster.isPolling()) {
map.put("/qos/state/@id", Constants.STATE_OK);
map.put("/qos/state/@info", ConnectionStateEnum.POLLING.toString()); // "POLLING"
}
else {
map.put("/qos/state/@id", Constants.STATE_WARN);
map.put("/qos/state/@info", ConnectionStateEnum.DEAD.toString()); // "DEAD"
}
returnObject = map;
}
else if (actionType.equals(I_XmlBlasterAccessRaw.SUBSCRIBE_NAME)) { // "subscribe"
if (log.isLoggable(Level.FINE)) log.fine("subscribe arrived ... oid=" + oid + ", key=" + key + ", qos=" + qos);
if (oid != null) {
SubscribeKey xmlKey = new SubscribeKey(glob, oid);
SubscribeReturnQos ret = xmlBlaster.subscribe(xmlKey.toXml(), qos);
returnObject = ret.getData().toJXPath();
if (log.isLoggable(Level.FINE)) log.fine("Subscribed to simple key.oid=" + oid + ": " + ret.getSubscriptionId());
}
else if (key != null) {
SubscribeReturnQos ret = xmlBlaster.subscribe(key, qos);
returnObject = ret.getData().toJXPath();
if (log.isLoggable(Level.FINE)) log.fine("Subscribed to " + key + ": SubscriptionId=" + ret.getSubscriptionId() + " qos=" + qos + " returnObject=" + returnObject.getClass().getName());
}
else {
String str = "Please call servlet with some 'key.oid=...' or 'key=<key ...' when subscribing";
log.warning(str);
throw new XmlBlasterException(this.initialGlobal, ErrorCode.USER_CONFIGURATION, ME, str);
}
}
else if (actionType.equals(I_XmlBlasterAccessRaw.UNSUBSCRIBE_NAME)) { // "unSubscribe"
if (log.isLoggable(Level.FINE)) log.fine("unSubscribe arrived ...");
UnSubscribeReturnQos[] ret;
if (oid != null) {
UnSubscribeKey xmlKey = new UnSubscribeKey(glob, oid);
ret = xmlBlaster.unSubscribe(xmlKey.toXml(), qos);
}
else if (key != null) {
ret = xmlBlaster.unSubscribe(key, qos);
}
else {
String str = "Please call servlet with some 'key.oid=...' or 'key=<key ...' when unsubscribing";
log.warning(str);
throw new XmlBlasterException(this.initialGlobal, ErrorCode.USER_CONFIGURATION, ME, str);
}
Vector arr = new Vector();
for (int ii=0; ii<ret.length; ii++) {
arr.add(ret[ii].getData().toJXPath());
if (log.isLoggable(Level.FINE)) log.fine("UnSubscribed " + ret[ii].getSubscriptionId());
}
returnObject = (Hashtable[])arr.toArray(new Hashtable[arr.size()]);
}
else if (actionType.equals(I_XmlBlasterAccessRaw.GET_NAME)) { // "get"
if (log.isLoggable(Level.FINE)) log.fine("get arrived ...");
MsgUnit[] msgUnitArr = xmlBlaster.get(key, qos);
Vector list = new Vector(msgUnitArr.length*3);
for (int i=0; i<msgUnitArr.length; i++) {
list.add(((MsgQosData)msgUnitArr[i].getQosData()).toJXPath());
list.add(((MsgKeyData)msgUnitArr[i].getKeyData()).toJXPath());
list.add(msgUnitArr[i].getContent());
}
returnObject = list;
}
else if (actionType.equals(I_XmlBlasterAccessRaw.PUBLISH_NAME)) { // "publish"
if (log.isLoggable(Level.FINE)) log.fine("publish arrived ...");
if (key == null) {
String str = "Please call servlet with some key when publishing";
log.warning(str);
XmlBlasterException x = new XmlBlasterException(this.initialGlobal, ErrorCode.USER_ILLEGALARGUMENT, ME, str);
writeResponse(res, I_XmlBlasterAccessRaw.EXCEPTION_NAME, x.getMessage());
return;
}
if (log.isLoggable(Level.FINE)) log.fine("Publishing '" + key + "'");
MsgUnit msgUnit = new MsgUnit(glob, key, content, qos);
try {
PublishReturnQos prq = xmlBlaster.publish(msgUnit);
returnObject = prq.getData().toJXPath();
if (log.isLoggable(Level.FINE)) log.fine("Success: Publishing done, returned oid=" + prq.getKeyOid());
} catch(XmlBlasterException e) {
log.warning("XmlBlasterException: " + e.getMessage());
}
}
else if (actionType.equals(I_XmlBlasterAccessRaw.ERASE_NAME)) { // "erase"
if (log.isLoggable(Level.FINE)) log.fine("erase arrived ...");
EraseReturnQos[] ret;
if (oid != null) {
EraseKey ek = new EraseKey(glob, oid);
ret = xmlBlaster.erase(ek.toXml(), qos);
}
else if (key != null) {
ret = xmlBlaster.erase(key, qos);
}
else {
String str = "Please call servlet with some 'key.oid=...' or 'key=<key ...' when subscribing";
log.warning(str);
throw new XmlBlasterException(this.initialGlobal, ErrorCode.USER_CONFIGURATION, ME, str);