/*
* (C) Copyright 2011 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Contributors:
* Thierry Delprat
*/
package org.nuxeo.ecm.platform.forms.layout.export;
import java.util.Collections;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.nuxeo.ecm.platform.forms.layout.api.BuiltinModes;
import org.nuxeo.ecm.platform.forms.layout.api.LayoutDefinition;
import org.nuxeo.ecm.platform.forms.layout.api.converters.LayoutConversionContext;
import org.nuxeo.ecm.platform.forms.layout.api.converters.LayoutDefinitionConverter;
import org.nuxeo.ecm.platform.forms.layout.api.converters.WidgetDefinitionConverter;
import org.nuxeo.ecm.platform.forms.layout.api.service.LayoutStore;
import org.nuxeo.ecm.platform.forms.layout.io.JSONLayoutExporter;
import org.nuxeo.ecm.platform.types.TypeManager;
import org.nuxeo.ecm.webengine.model.view.TemplateView;
import org.nuxeo.runtime.api.Framework;
/**
* Exports and presents documentation about layouts definitions
*
* @author Tiry
* @since 5.5
*/
public class LayoutResource {
public static final String DEFAULT_DOCUMENT_LAYOUT_MODE = BuiltinModes.EDIT;
public static final String DEFAULT_CONVERSION_CATEGORY = "standalone";
public static final String DEFAULT_LANGUAGE = "en";
protected final String category;
protected LayoutStore service;
protected List<String> registeredLayoutNames;
public LayoutResource(String category) {
this.category = category;
service = Framework.getService(LayoutStore.class);
registeredLayoutNames = service.getLayoutDefinitionNames(category);
// sort so that order is deterministic
Collections.sort(registeredLayoutNames);
}
protected TemplateView getTemplate(String name, UriInfo uriInfo) {
String baseURL = uriInfo.getAbsolutePath().toString();
if (!baseURL.endsWith("/")) {
baseURL += "/";
}
return new TemplateView(this, name).arg("baseURL", baseURL).arg("layoutNames", registeredLayoutNames);
}
@GET
public Object doGet(@QueryParam("layoutName") String layoutName, @Context UriInfo uriInfo) {
TemplateView tpl = getTemplate("layouts.ftl", uriInfo);
if (layoutName != null) {
LayoutDefinition layoutDef = service.getLayoutDefinition(category, layoutName);
tpl.arg("layoutDefinition", layoutDef);
}
return tpl;
}
@GET
@Path("json")
public String getAsJson(@QueryParam("layoutName") String layoutName, @QueryParam("lang") String lang,
@QueryParam("convertCat") String conversionCategory) {
if (layoutName != null) {
if (StringUtils.isBlank(lang)) {
lang = DEFAULT_LANGUAGE;
}
if (StringUtils.isBlank(conversionCategory)) {
conversionCategory = DEFAULT_CONVERSION_CATEGORY;
}
LayoutDefinition layoutDef = service.getLayoutDefinition(category, layoutName);
if (layoutDef != null) {
LayoutConversionContext ctx = new LayoutConversionContext(lang, null);
List<LayoutDefinitionConverter> layoutConverters = service.getLayoutConverters(conversionCategory);
// pass layout converters now
for (LayoutDefinitionConverter conv : layoutConverters) {
layoutDef = conv.getLayoutDefinition(layoutDef, ctx);
}
if (layoutDef != null) {
List<WidgetDefinitionConverter> widgetConverters = service.getWidgetConverters(conversionCategory);
JSONObject json = JSONLayoutExporter.exportToJson(category, layoutDef, ctx, widgetConverters);
return json.toString(2);
}
}
}
return "No layout found";
}
@GET
@Path("docType/{docType}")
public String getLayoutsForTypeAsJson(@PathParam("docType") String docType, @QueryParam("mode") String mode,
@QueryParam("lang") String lang, @QueryParam("convertCat") String conversionCategory) {
if (StringUtils.isBlank(mode)) {
mode = DEFAULT_DOCUMENT_LAYOUT_MODE;
}
if (StringUtils.isBlank(lang)) {
lang = DEFAULT_LANGUAGE;
}
if (StringUtils.isBlank(conversionCategory)) {
conversionCategory = DEFAULT_CONVERSION_CATEGORY;
}
TypeManager tm = Framework.getLocalService(TypeManager.class);
String[] layoutNames = tm.getType(docType).getLayouts(mode);
JSONArray jsonLayouts = new JSONArray();
for (String layoutName : layoutNames) {
LayoutDefinition layoutDef = service.getLayoutDefinition(category, layoutName);
LayoutConversionContext ctx = new LayoutConversionContext(lang, null);
List<LayoutDefinitionConverter> layoutConverters = service.getLayoutConverters(conversionCategory);
// pass layout converters now
for (LayoutDefinitionConverter conv : layoutConverters) {
layoutDef = conv.getLayoutDefinition(layoutDef, ctx);
}
if (layoutDef != null) {
List<WidgetDefinitionConverter> widgetConverters = service.getWidgetConverters(conversionCategory);
JSONObject jsonLayout = JSONLayoutExporter.exportToJson(category, layoutDef, ctx, widgetConverters);
jsonLayouts.add(jsonLayout);
}
}
return jsonLayouts.toString(2);
}
}