001/*
002 * (C) Copyright 2011 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 *     Thierry Delprat
018 */
019package org.nuxeo.ecm.platform.forms.layout.export;
020
021import java.util.Collections;
022import java.util.List;
023
024import javax.ws.rs.GET;
025import javax.ws.rs.Path;
026import javax.ws.rs.PathParam;
027import javax.ws.rs.QueryParam;
028import javax.ws.rs.core.Context;
029import javax.ws.rs.core.UriInfo;
030
031import net.sf.json.JSONArray;
032import net.sf.json.JSONObject;
033
034import org.apache.commons.lang.StringUtils;
035import org.nuxeo.ecm.platform.forms.layout.api.BuiltinModes;
036import org.nuxeo.ecm.platform.forms.layout.api.LayoutDefinition;
037import org.nuxeo.ecm.platform.forms.layout.api.converters.LayoutConversionContext;
038import org.nuxeo.ecm.platform.forms.layout.api.converters.LayoutDefinitionConverter;
039import org.nuxeo.ecm.platform.forms.layout.api.converters.WidgetDefinitionConverter;
040import org.nuxeo.ecm.platform.forms.layout.api.service.LayoutStore;
041import org.nuxeo.ecm.platform.forms.layout.io.JSONLayoutExporter;
042import org.nuxeo.ecm.platform.types.TypeManager;
043import org.nuxeo.ecm.webengine.model.view.TemplateView;
044import org.nuxeo.runtime.api.Framework;
045
046/**
047 * Exports and presents documentation about layouts definitions
048 *
049 * @author Tiry
050 * @since 5.5
051 */
052public class LayoutResource {
053
054    public static final String DEFAULT_DOCUMENT_LAYOUT_MODE = BuiltinModes.EDIT;
055
056    public static final String DEFAULT_CONVERSION_CATEGORY = "standalone";
057
058    public static final String DEFAULT_LANGUAGE = "en";
059
060    protected final String category;
061
062    protected LayoutStore service;
063
064    protected List<String> registeredLayoutNames;
065
066    public LayoutResource(String category) {
067        this.category = category;
068        service = Framework.getService(LayoutStore.class);
069        registeredLayoutNames = service.getLayoutDefinitionNames(category);
070        // sort so that order is deterministic
071        Collections.sort(registeredLayoutNames);
072    }
073
074    protected TemplateView getTemplate(String name, UriInfo uriInfo) {
075        String baseURL = uriInfo.getAbsolutePath().toString();
076        if (!baseURL.endsWith("/")) {
077            baseURL += "/";
078        }
079        return new TemplateView(this, name).arg("baseURL", baseURL).arg("layoutNames", registeredLayoutNames);
080    }
081
082    @GET
083    public Object doGet(@QueryParam("layoutName") String layoutName, @Context UriInfo uriInfo) {
084        TemplateView tpl = getTemplate("layouts.ftl", uriInfo);
085        if (layoutName != null) {
086            LayoutDefinition layoutDef = service.getLayoutDefinition(category, layoutName);
087            tpl.arg("layoutDefinition", layoutDef);
088        }
089        return tpl;
090    }
091
092    @GET
093    @Path("json")
094    public String getAsJson(@QueryParam("layoutName") String layoutName, @QueryParam("lang") String lang,
095            @QueryParam("convertCat") String conversionCategory) {
096        if (layoutName != null) {
097            if (StringUtils.isBlank(lang)) {
098                lang = DEFAULT_LANGUAGE;
099            }
100            if (StringUtils.isBlank(conversionCategory)) {
101                conversionCategory = DEFAULT_CONVERSION_CATEGORY;
102            }
103            LayoutDefinition layoutDef = service.getLayoutDefinition(category, layoutName);
104            if (layoutDef != null) {
105                LayoutConversionContext ctx = new LayoutConversionContext(lang, null);
106                List<LayoutDefinitionConverter> layoutConverters = service.getLayoutConverters(conversionCategory);
107                // pass layout converters now
108                for (LayoutDefinitionConverter conv : layoutConverters) {
109                    layoutDef = conv.getLayoutDefinition(layoutDef, ctx);
110                }
111                if (layoutDef != null) {
112                    List<WidgetDefinitionConverter> widgetConverters = service.getWidgetConverters(conversionCategory);
113                    JSONObject json = JSONLayoutExporter.exportToJson(category, layoutDef, ctx, widgetConverters);
114                    return json.toString(2);
115                }
116            }
117        }
118        return "No layout found";
119    }
120
121    @GET
122    @Path("docType/{docType}")
123    public String getLayoutsForTypeAsJson(@PathParam("docType") String docType, @QueryParam("mode") String mode,
124            @QueryParam("lang") String lang, @QueryParam("convertCat") String conversionCategory) {
125
126        if (StringUtils.isBlank(mode)) {
127            mode = DEFAULT_DOCUMENT_LAYOUT_MODE;
128        }
129        if (StringUtils.isBlank(lang)) {
130            lang = DEFAULT_LANGUAGE;
131        }
132        if (StringUtils.isBlank(conversionCategory)) {
133            conversionCategory = DEFAULT_CONVERSION_CATEGORY;
134        }
135        TypeManager tm = Framework.getLocalService(TypeManager.class);
136        String[] layoutNames = tm.getType(docType).getLayouts(mode);
137
138        JSONArray jsonLayouts = new JSONArray();
139        for (String layoutName : layoutNames) {
140            LayoutDefinition layoutDef = service.getLayoutDefinition(category, layoutName);
141            LayoutConversionContext ctx = new LayoutConversionContext(lang, null);
142            List<LayoutDefinitionConverter> layoutConverters = service.getLayoutConverters(conversionCategory);
143            // pass layout converters now
144            for (LayoutDefinitionConverter conv : layoutConverters) {
145                layoutDef = conv.getLayoutDefinition(layoutDef, ctx);
146            }
147            if (layoutDef != null) {
148                List<WidgetDefinitionConverter> widgetConverters = service.getWidgetConverters(conversionCategory);
149                JSONObject jsonLayout = JSONLayoutExporter.exportToJson(category, layoutDef, ctx, widgetConverters);
150                jsonLayouts.add(jsonLayout);
151            }
152        }
153        return jsonLayouts.toString(2);
154    }
155}