001/*
002 * (C) Copyright 2014 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     <a href="mailto:grenard@nuxeo.com">Guillaume Renard</a>
018 *
019 */
020
021package org.nuxeo.ecm.restapi.server.jaxrs.routing.io;
022
023import java.io.IOException;
024import java.io.Serializable;
025import java.util.Map.Entry;
026
027import javax.servlet.http.HttpServletRequest;
028import javax.ws.rs.Produces;
029import javax.ws.rs.core.Context;
030import javax.ws.rs.core.MediaType;
031import javax.ws.rs.core.UriInfo;
032import javax.ws.rs.ext.Provider;
033
034import org.codehaus.jackson.JsonGenerationException;
035import org.codehaus.jackson.JsonGenerator;
036import org.nuxeo.ecm.automation.jaxrs.io.EntityWriter;
037import org.nuxeo.ecm.platform.routing.api.DocumentRoute;
038import org.nuxeo.ecm.platform.routing.core.impl.GraphRoute;
039import org.nuxeo.ecm.platform.routing.core.io.JsonEncodeDecodeUtils;
040
041/**
042 * @since 7.2
043 */
044@Provider
045@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON + "+nxentity" })
046public class DocumentRouteWriter extends EntityWriter<DocumentRoute> {
047
048    public static final String ENTITY_TYPE = "workflow";
049
050    @Context
051    HttpServletRequest request;
052
053    @Context
054    UriInfo uriInfo;
055
056    @Override
057    protected void writeEntityBody(JsonGenerator jg, DocumentRoute item) throws IOException {
058        writeDocumentRoute(jg, item, request, uriInfo);
059    }
060
061    public static void writeDocumentRoute(JsonGenerator jg, DocumentRoute item, HttpServletRequest request,
062            UriInfo uriInfo) throws JsonGenerationException, IOException {
063        jg.writeStringField("id", item.getDocument().getId());
064        jg.writeStringField("name", item.getName());
065        jg.writeStringField("title", item.getTitle());
066        jg.writeStringField("state", item.getDocument().getCurrentLifeCycleState());
067        jg.writeStringField("workflowModelName", item.getModelName());
068        jg.writeStringField("initiator", item.getInitiator());
069
070        jg.writeArrayFieldStart("attachedDocumentIds");
071        for (String docId : item.getAttachedDocuments()) {
072            jg.writeStartObject();
073            jg.writeStringField("id", docId);
074            jg.writeEndObject();
075        }
076        jg.writeEndArray();
077
078        if (item instanceof GraphRoute) {
079            GraphRoute graphRoute = (GraphRoute) item;
080            jg.writeFieldName("variables");
081            jg.writeStartObject();
082            for (Entry<String, Serializable> e : graphRoute.getVariables().entrySet()) {
083                JsonEncodeDecodeUtils.encodeVariableEntry(item.getDocument(), GraphRoute.PROP_VARIABLES_FACET, e, jg,
084                        request);
085            }
086            jg.writeEndObject();
087            String graphResourceUrl = "";
088            if (item.isValidated()) {
089                // it is a model
090                graphResourceUrl = uriInfo.getBaseUri() + "api/v1/workflowModel/" + item.getDocument().getName()
091                        + "/graph";
092            } else {
093                // it is an instance
094                graphResourceUrl = uriInfo.getBaseUri() + "api/v1/workflow/" + item.getDocument().getId() + "/graph";
095            }
096            jg.writeStringField("graphResource", graphResourceUrl);
097        }
098    }
099
100    @Override
101    protected String getEntityType() {
102        return ENTITY_TYPE;
103    }
104
105}