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