/******************************************************************************* * Copyright (c) 2008 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 * * File: $Source$ * Created by: Matthew Roy ( <a href="mailto:mroy@cambridgesemantics.com">mroy@cambridgesemantics.com </a>) * Created on: Mar 3, 2008 * Revision: $Id$ * * Contributors: * Cambridge Semantics Incorporated - initial API and implementation *******************************************************************************/ package org.openanzo.services.serialization; import java.io.IOException; import java.io.Writer; import java.util.Collection; import org.codehaus.jackson.JsonFactory; import org.codehaus.jackson.JsonGenerator; import org.openanzo.exceptions.AnzoException; import org.openanzo.exceptions.ExceptionConstants; import org.openanzo.rdf.Statement; import org.openanzo.rdf.URI; import org.openanzo.rdf.utils.JSONRdfWriter; import org.openanzo.rdf.utils.SerializationConstants; import org.openanzo.services.AnzoPrincipal; import org.openanzo.services.INamedGraphUpdate; import org.openanzo.services.IPrecondition; import org.openanzo.services.IUpdateTransaction; import org.openanzo.services.impl.AskResult; /** * @author Matthew Roy ( <a href="mailto:mroy@cambridgesemantics.com">mroy@cambridgesemantics.com</a>) * */ public class JSONWritingUtils { private final static JsonFactory factory = new JsonFactory(); static protected void writeTransaction(JsonGenerator JsonGenerator, boolean includeContents, IUpdateTransaction transaction) throws AnzoException { try { JsonGenerator.writeStartObject(); if (transaction.getURI() != null) JsonGenerator.writeStringField(SerializationConstants.transactionURI, transaction.getURI().toString()); if (transaction.getUpdatedNamedGraphRevisions() != null && transaction.getUpdatedNamedGraphRevisions().size() > 0) JsonGenerator.writeStringField(SerializationConstants.namedGraphUpdates, CommonSerializationUtils.writeNamedGraphRevisions(transaction.getUpdatedNamedGraphRevisions())); if (transaction.getTransactionContext() != null) { JsonGenerator.writeFieldName(SerializationConstants.transactionContext); JsonGenerator.writeStartArray(); for (Statement statement : transaction.getTransactionContext()) { JSONRdfWriter.writeStatement(JsonGenerator, statement); } JsonGenerator.writeEndArray(); } if (transaction.getErrors() != null && transaction.getErrors().size() > 0) { JsonGenerator.writeFieldName(SerializationConstants.errorResult); JsonGenerator.writeStartArray(); for (AnzoException exception : transaction.getErrors()) { writeError(JsonGenerator, exception.getErrorCode(), exception.getMessage(false), exception.getArgs()); } JsonGenerator.writeEndArray(); } else { if (includeContents) { writePreconditions(JsonGenerator, transaction.getPreconditions()); writeNamedGraphUpdates(JsonGenerator, transaction.getNamedGraphUpdates()); } } JsonGenerator.writeEndObject(); } catch (IOException e) { throw new AnzoException(ExceptionConstants.IO.WRITE_ERROR, e.getMessage()); } } static private void writeNamedGraphUpdates(JsonGenerator JsonGenerator, Collection<INamedGraphUpdate> namedGraphUpdates) throws AnzoException { try { JsonGenerator.writeFieldName(SerializationConstants.namedGraphs); JsonGenerator.writeStartArray(); for (INamedGraphUpdate update : namedGraphUpdates) { writeNamedGraphUpdate(JsonGenerator, update); } JsonGenerator.writeEndArray(); } catch (IOException e) { throw new AnzoException(ExceptionConstants.IO.WRITE_ERROR, e.getMessage()); } } static protected void writeNamedGraphUpdate(JsonGenerator JsonGenerator, INamedGraphUpdate namedGraphUpdates) throws AnzoException { writeNamedGraphUpdate(JsonGenerator, namedGraphUpdates.getNamedGraphURI(), namedGraphUpdates.getUUID(), namedGraphUpdates.getRevision(), namedGraphUpdates.getAdditions(), namedGraphUpdates.getRemovals(), namedGraphUpdates.getMetaAdditions(), namedGraphUpdates.getMetaRemovals()); } static private void writeNamedGraphUpdate(JsonGenerator JsonGenerator, URI namedGraphURI, URI uuid, long revision, Collection<Statement> additions, Collection<Statement> removals, Collection<Statement> metaAdditions, Collection<Statement> metaRemovals) throws AnzoException { try { JsonGenerator.writeStartObject(); JsonGenerator.writeStringField(SerializationConstants.namedGraphUri, namedGraphURI.toString()); if (uuid != null) JsonGenerator.writeStringField(SerializationConstants.namedGraphUUID, uuid.toString()); JsonGenerator.writeStringField(SerializationConstants.revision, Long.toString(revision)); JsonGenerator.writeFieldName(SerializationConstants.removals); JsonGenerator.writeStartArray(); for (Statement stmt : removals) { JSONRdfWriter.writeStatement(JsonGenerator, stmt); } JsonGenerator.writeEndArray(); JsonGenerator.writeFieldName(SerializationConstants.metaRemovals); JsonGenerator.writeStartArray(); for (Statement stmt : metaRemovals) { JSONRdfWriter.writeStatement(JsonGenerator, stmt); } JsonGenerator.writeEndArray(); JsonGenerator.writeFieldName(SerializationConstants.additions); JsonGenerator.writeStartArray(); for (Statement stmt : additions) { JSONRdfWriter.writeStatement(JsonGenerator, stmt); } JsonGenerator.writeEndArray(); JsonGenerator.writeFieldName(SerializationConstants.metaAdditions); JsonGenerator.writeStartArray(); for (Statement stmt : metaAdditions) { JSONRdfWriter.writeStatement(JsonGenerator, stmt); } JsonGenerator.writeEndArray(); JsonGenerator.writeEndObject(); } catch (IOException e) { throw new AnzoException(ExceptionConstants.IO.WRITE_ERROR, e.getMessage()); } } static private void writeError(JsonGenerator JsonGenerator, long errorCode, String message, String... errorMessageArgs) throws AnzoException { try { JsonGenerator.writeStartObject(); JsonGenerator.writeStringField(SerializationConstants.errorTags, "0"); JsonGenerator.writeStringField(SerializationConstants.errorCode, errorCode + ""); if (message != null) { JsonGenerator.writeStringField(SerializationConstants.errorMessage, message); } JsonGenerator.writeFieldName(SerializationConstants.errorMessageArg); JsonGenerator.writeStartArray(); for (String arg : errorMessageArgs) { JsonGenerator.writeString(arg); } JsonGenerator.writeEndArray(); JsonGenerator.writeEndObject(); } catch (IOException e) { throw new AnzoException(ExceptionConstants.IO.WRITE_ERROR, e.getMessage()); } } /** * Write a set of IPreconditions to a JsonGenerator * * @param preconditions * to serialize * @param writer * JSON writer to which precoditions are written * @throws AnzoException */ static private void writePreconditions(JsonGenerator JsonGenerator, Collection<IPrecondition> preconditions) throws AnzoException { if (preconditions != null) { try { JsonGenerator.writeFieldName(SerializationConstants.preconditions); JsonGenerator.writeStartArray(); for (IPrecondition precondition : preconditions) { JsonGenerator.writeStartObject(); if (precondition.getDefaultGraphUris() != null) { JsonGenerator.writeFieldName(SerializationConstants.defaultGraphs); JsonGenerator.writeStartArray(); for (URI uri : precondition.getDefaultGraphUris()) { JsonGenerator.writeString(uri.toString()); } JsonGenerator.writeEndArray(); } if (precondition.getNamedGraphUris() != null) { JsonGenerator.writeFieldName(SerializationConstants.namedGraphs); JsonGenerator.writeStartArray(); for (URI uri : precondition.getNamedGraphUris()) { JsonGenerator.writeString(uri.toString()); } JsonGenerator.writeEndArray(); } JsonGenerator.writeFieldName(SerializationConstants.query); JsonGenerator.writeStartObject(); JsonGenerator.writeStringField(SerializationConstants.queryString, precondition.getQuery()); JsonGenerator.writeBooleanField(SerializationConstants.askQueryResult, ((AskResult) precondition.getResult()).getResultValue()); JsonGenerator.writeEndObject(); JsonGenerator.writeEndObject(); } JsonGenerator.writeEndArray(); } catch (IOException e) { throw new AnzoException(ExceptionConstants.IO.WRITE_ERROR, e); } } } static protected void writeAnzoPrincipal(Writer out, AnzoPrincipal principal) throws AnzoException { try { JsonGenerator jsonWriter = factory.createJsonGenerator(out); writeAnzoPrincipal(jsonWriter, principal); jsonWriter.flush(); jsonWriter.close(); } catch (IOException ioe) { throw new AnzoException(ExceptionConstants.IO.WRITE_ERROR, ioe, ioe.getMessage()); } } static private void writeAnzoPrincipal(JsonGenerator JsonGenerator, AnzoPrincipal principal) throws AnzoException { try { JsonGenerator.writeStartObject(); JsonGenerator.writeStringField(SerializationConstants.user, principal.getName()); JsonGenerator.writeStringField(SerializationConstants.userUri, principal.getUserURI().toString()); JsonGenerator.writeStringField(SerializationConstants.isSysAdmin, Boolean.toString(principal.isSysadmin())); JsonGenerator.writeObjectFieldStart(SerializationConstants.role); JsonGenerator.writeStartArray(); for (URI role : principal.getRoles()) { JsonGenerator.writeString(role.toString()); } JsonGenerator.writeEndArray(); JsonGenerator.writeEndObject(); } catch (IOException e) { throw new AnzoException(ExceptionConstants.IO.WRITE_ERROR, e, e.getMessage()); } } }