/*******************************************************************************
* Copyright (c) 2007 Cambridge Semantics Incorporated.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Cambridge Semantics Incorporated
*******************************************************************************/
package org.openanzo.combus;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Map;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.TextMessage;
import org.openanzo.exceptions.AnzoException;
import org.openanzo.exceptions.ExceptionConstants;
import org.openanzo.exceptions.LogUtils;
import org.openanzo.exceptions.Messages;
import org.openanzo.rdf.Constants;
import org.openanzo.rdf.MemURI;
import org.openanzo.rdf.RDFFormat;
import org.openanzo.rdf.Statement;
import org.openanzo.rdf.URI;
import org.openanzo.rdf.utils.ReadWriteUtils;
import org.openanzo.rdf.utils.SerializationConstants;
import org.openanzo.services.impl.UpdateTransaction;
import org.openanzo.services.serialization.CommonSerializationUtils;
import org.openanzo.services.serialization.NamedGraphUpdate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Provides JMS Message related utility methods.
*
* @author Joe Betz <jpbetz@cambridgesemantics.com>
*
*/
public class MessageUtils {
private static final Logger log = LoggerFactory.getLogger(MessageUtils.class);
/**
* Creates a human readable string representing the provided message.
*
* @param message
* The JMS Message
* @param title
* A title to prefix the message text with.
* @return Human readable string.
* @throws JMSException
*/
public static String prettyPrint(Message message, String title) throws JMSException {
if (message == null)
return "Null Message.";
StringBuilder builder = new StringBuilder();
builder.append(title);
builder.append("\n");
builder.append("[JMS-MESSAGE]-----------------------------------------------------------");
builder.append("\n");
Destination destination = message.getJMSDestination();
if (destination != null) {
builder.append("Destination = " + destination);
builder.append("\n");
}
Destination replyTo = message.getJMSReplyTo();
if (replyTo != null) {
builder.append("ReplyTo = " + replyTo);
builder.append("\n");
}
//builder.append("ElapsedTime: " + (currTime - messageTime) + "ms");
//builder.append("\n");
if (message.getJMSCorrelationID() != null) {
builder.append("JMSCorrelationID = " + message.getJMSCorrelationID());
builder.append("\n");
}
for (Enumeration<?> e = message.getPropertyNames(); e.hasMoreElements();) {
String name = (String) e.nextElement();
builder.append(name + " = " + message.getObjectProperty(name));
builder.append("\n");
}
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
String text = textMessage.getText();
if (text != null) {
builder.append("Text = \n");
builder.append(text);
builder.append("\n");
}
}
builder.append("--------------------------------------------------------------------//");
builder.append("\n");
return builder.toString();
}
/**
*
* @param topicMessage
* @return whether or a not a replication is required after processing this message
* @throws AnzoException
* @throws JMSException
*/
public static NamedGraphUpdate processNamedGraphUpdateMessage(Message topicMessage) throws AnzoException, JMSException {
String transactionUri = topicMessage.propertyExists(SerializationConstants.transactionURI) ? topicMessage.getStringProperty(SerializationConstants.transactionURI) : null;
String namedGraphUri = topicMessage.propertyExists(SerializationConstants.namedGraphUri) ? topicMessage.getStringProperty(SerializationConstants.namedGraphUri) : null;
String uuid = topicMessage.propertyExists(SerializationConstants.namedGraphUUID) ? topicMessage.getStringProperty(SerializationConstants.namedGraphUUID) : null;
String ngRevs = topicMessage.propertyExists(SerializationConstants.namedGraphUpdates) ? topicMessage.getStringProperty(SerializationConstants.namedGraphUpdates) : null;
String additions = topicMessage.propertyExists(SerializationConstants.additions) ? topicMessage.getStringProperty(SerializationConstants.additions) : null;
String removals = topicMessage.propertyExists(SerializationConstants.removals) ? topicMessage.getStringProperty(SerializationConstants.removals) : null;
String metaAdditions = topicMessage.propertyExists(SerializationConstants.metaAdditions) ? topicMessage.getStringProperty(SerializationConstants.metaAdditions) : null;
String metaRemovals = topicMessage.propertyExists(SerializationConstants.metaRemovals) ? topicMessage.getStringProperty(SerializationConstants.metaRemovals) : null;
String transactionContext = topicMessage.propertyExists(SerializationConstants.transactionContext) ? topicMessage.getStringProperty(SerializationConstants.transactionContext) : null;
long transactionTimestamp = topicMessage.propertyExists(SerializationConstants.transactionTimestamp) ? topicMessage.getLongProperty(SerializationConstants.transactionTimestamp) : 0;
//System.err.println("Processing Message: " + additions);
URI uri = Constants.valueFactory.createURI(transactionUri);
URI uuidURI = Constants.valueFactory.createURI(uuid);
Map<URI, Long> revs = CommonSerializationUtils.readNamedGraphRevisions(ngRevs);
Collection<Statement> adds = null;
Collection<Statement> removes = null;
Collection<Statement> metaAdds = null;
Collection<Statement> metaRemoves = null;
try {
adds = (additions != null) ? ReadWriteUtils.readStatements(additions, RDFFormat.JSON) : Collections.<Statement> emptySet();
removes = (removals != null) ? ReadWriteUtils.readStatements(removals, RDFFormat.JSON) : Collections.<Statement> emptySet();
metaAdds = (metaAdditions != null) ? ReadWriteUtils.readStatements(metaAdditions, RDFFormat.JSON) : Collections.<Statement> emptySet();
metaRemoves = (metaRemovals != null) ? ReadWriteUtils.readStatements(metaRemovals, RDFFormat.JSON) : Collections.<Statement> emptySet();
} catch (AnzoException e) {
log.error(LogUtils.COMBUS_MARKER, Messages.formatString(ExceptionConstants.COMBUS.ERROR_PROCESSING_MESSGE, "namedgraph update message"), e);
throw e;
}
URI ngUri = MemURI.create(namedGraphUri);
Long revision = revs.get(uuidURI);
NamedGraphUpdate update = new NamedGraphUpdate(ngUri, uuidURI, adds, removes, metaAdds, metaRemoves);
if (revision != null) {
update.setRevision(revision);
}
Collection<Statement> tc = null;
if (transactionContext != null) {
tc = ReadWriteUtils.readStatements(transactionContext, RDFFormat.JSON);
}
update.setTransaction(new UpdateTransaction(uri, transactionTimestamp, tc, revs));
return update;
}
}