001/*
002 * (C) Copyright 2014 Nuxeo SA (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl-2.1.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *     <a href="mailto:grenard@nuxeo.com">Guillaume Renard</a>
016 *
017 */
018
019package org.nuxeo.ecm.restapi.server.jaxrs.routing.io;
020
021import java.io.IOException;
022import java.io.Serializable;
023import java.util.Map.Entry;
024
025import javax.servlet.http.HttpServletRequest;
026import javax.ws.rs.Produces;
027import javax.ws.rs.core.Context;
028import javax.ws.rs.core.MediaType;
029import javax.ws.rs.core.UriInfo;
030import javax.ws.rs.ext.Provider;
031
032import org.codehaus.jackson.JsonGenerationException;
033import org.codehaus.jackson.JsonGenerator;
034import org.nuxeo.ecm.automation.jaxrs.io.EntityWriter;
035import org.nuxeo.ecm.platform.routing.api.DocumentRoute;
036import org.nuxeo.ecm.platform.routing.core.impl.GraphNode;
037import org.nuxeo.ecm.platform.routing.core.impl.GraphRoute;
038import org.nuxeo.ecm.restapi.server.jaxrs.routing.io.util.JsonEncodeDecodeUtils;
039
040/**
041 * @since 7.2
042 */
043@Provider
044@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON + "+nxentity" })
045public class DocumentRouteWriter extends EntityWriter<DocumentRoute> {
046
047    public static final String ENTITY_TYPE = "workflow";
048
049    @Context
050    HttpServletRequest request;
051
052    @Context
053    UriInfo uriInfo;
054
055    @Override
056    protected void writeEntityBody(JsonGenerator jg, DocumentRoute item) throws IOException {
057        writeDocumentRoute(jg, item, request, uriInfo);
058    }
059
060    public static void writeDocumentRoute(JsonGenerator jg, DocumentRoute item, HttpServletRequest request,
061            UriInfo uriInfo) throws JsonGenerationException, IOException {
062        jg.writeStringField("id", item.getDocument().getId());
063        jg.writeStringField("name", item.getName());
064        jg.writeStringField("title", item.getTitle());
065        jg.writeStringField("state", item.getDocument().getCurrentLifeCycleState());
066        jg.writeStringField("workflowModelName", item.getModelName());
067        jg.writeStringField("initiator", item.getInitiator());
068
069        jg.writeArrayFieldStart("attachedDocumentIds");
070        for (String docId : item.getAttachedDocuments()) {
071            jg.writeStartObject();
072            jg.writeStringField("id", docId);
073            jg.writeEndObject();
074        }
075        jg.writeEndArray();
076
077        if (item instanceof GraphRoute) {
078            GraphRoute graphRoute = (GraphRoute) item;
079            jg.writeFieldName("variables");
080            jg.writeStartObject();
081            for (Entry<String, Serializable> e : graphRoute.getVariables().entrySet()) {
082                JsonEncodeDecodeUtils.encodeVariableEntry(item.getDocument(), GraphNode.PROP_VARIABLES_FACET, e, jg,
083                        request);
084            }
085            jg.writeEndObject();
086            String graphResourceUrl = "";
087            if (item.isValidated()) {
088                // it is a model
089                graphResourceUrl = uriInfo.getBaseUri() + "api/v1/workflowModel/" + item.getDocument().getName()
090                        + "/graph";
091            } else {
092                // it is an instance
093                graphResourceUrl = uriInfo.getBaseUri() + "api/v1/workflow/" + item.getDocument().getId() + "/graph";
094            }
095            jg.writeStringField("graphResource", graphResourceUrl);
096        }
097    }
098
099    @Override
100    protected String getEntityType() {
101        return ENTITY_TYPE;
102    }
103
104}