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}