/*
* (C) Copyright 2006-2016 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:
* Nuxeo - initial API and implementation
*/
package org.nuxeo.ecm.platform.layout.service;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.Serializable;
import java.util.Map;
import javax.faces.view.facelets.FaceletHandler;
import javax.faces.view.facelets.Tag;
import javax.faces.view.facelets.TagAttribute;
import javax.faces.view.facelets.TagConfig;
import org.junit.Before;
import org.junit.Test;
import org.nuxeo.ecm.platform.forms.layout.api.BuiltinModes;
import org.nuxeo.ecm.platform.forms.layout.api.FieldDefinition;
import org.nuxeo.ecm.platform.forms.layout.api.LayoutDefinition;
import org.nuxeo.ecm.platform.forms.layout.api.LayoutRowDefinition;
import org.nuxeo.ecm.platform.forms.layout.api.WidgetDefinition;
import org.nuxeo.ecm.platform.forms.layout.api.WidgetReference;
import org.nuxeo.ecm.platform.forms.layout.api.WidgetType;
import org.nuxeo.ecm.platform.forms.layout.facelets.WidgetTypeHandler;
import org.nuxeo.ecm.platform.forms.layout.facelets.plugins.TemplateWidgetTypeHandler;
import org.nuxeo.ecm.platform.forms.layout.service.WebLayoutManager;
import org.nuxeo.ecm.platform.layout.facelets.DummyWidgetTypeHandler;
import org.nuxeo.ecm.platform.ui.web.tag.handler.LeafFaceletHandler;
import org.nuxeo.ecm.platform.ui.web.tag.handler.TagConfigFactory;
import org.nuxeo.runtime.api.Framework;
import org.nuxeo.runtime.test.NXRuntimeTestCase;
import com.sun.faces.facelets.tag.TagAttributesImpl;
/**
* Test layout component extension points.
*
* @author <a href="mailto:at@nuxeo.com">Anahide Tchertchian</a>
*/
public class TestLayoutComponent extends NXRuntimeTestCase {
private WebLayoutManager service;
@Before
public void setUp() throws Exception {
super.setUp();
deployBundle("org.nuxeo.ecm.platform.forms.layout.core");
deployContrib("org.nuxeo.ecm.platform.forms.layout.client", "OSGI-INF/layouts-framework.xml");
deployContrib("org.nuxeo.ecm.platform.forms.layout.client.tests", "layouts-test-contrib.xml");
service = Framework.getService(WebLayoutManager.class);
assertNotNull(service);
}
@SuppressWarnings("deprecation")
@Test
public void testLayoutRegistration() {
LayoutDefinition dublincore = service.getLayoutDefinition("dublincore");
assertNotNull(dublincore);
assertEquals("dublincore", dublincore.getName());
// test templates
assertEquals("default_template", dublincore.getTemplate(BuiltinModes.ANY));
assertEquals("view_template", dublincore.getTemplate(BuiltinModes.VIEW));
assertEquals("edit_template", dublincore.getTemplate(BuiltinModes.EDIT));
assertEquals("create_template", dublincore.getTemplate(BuiltinModes.CREATE));
assertEquals("default_template", dublincore.getTemplate("lalal"));
// test rows
LayoutRowDefinition[] rows = dublincore.getRows();
assertEquals(3, rows.length);
assertEquals(1, rows[0].getWidgetReferences().length);
assertEquals("title", rows[0].getWidgetReferences()[0].getName());
assertEquals(1, rows[1].getWidgetReferences().length);
assertEquals("description", rows[1].getWidgetReferences()[0].getName());
assertEquals(3, rows[2].getWidgetReferences().length);
assertEquals("creationDate", rows[2].getWidgetReferences()[0].getName());
assertEquals("", rows[2].getWidgetReferences()[1].getName());
assertEquals("modificationDate", rows[2].getWidgetReferences()[2].getName());
assertEquals(3, dublincore.getColumns());
// test widgets
WidgetDefinition title = dublincore.getWidgetDefinition("title");
assertNotNull(title);
assertEquals("title", title.getName());
assertEquals("text", title.getType());
assertEquals("label.dublincore.title", title.getLabel(BuiltinModes.ANY));
assertEquals("", title.getLabel(BuiltinModes.EDIT));
assertEquals("help text", title.getHelpLabel(BuiltinModes.EDIT));
assertTrue(title.isTranslated());
assertTrue(title.isHandlingLabels());
FieldDefinition[] fieldDefs = title.getFieldDefinitions();
assertEquals(1, fieldDefs.length);
assertNull(fieldDefs[0].getSchemaName());
assertEquals("dc:title", fieldDefs[0].getFieldName());
// props
Map<String, Serializable> anyProps = title.getProperties(BuiltinModes.ANY, BuiltinModes.ANY);
assertEquals(2, anyProps.size());
assertEquals("styleClass", anyProps.get("styleClass"));
assertEquals("#{!currentUser.administrator}", anyProps.get("required"));
Map<String, Serializable> editProps = title.getProperties(BuiltinModes.EDIT, BuiltinModes.VIEW);
assertEquals(3, editProps.size());
assertEquals("styleClass", editProps.get("styleClass"));
assertEquals("#{!currentUser.administrator}", editProps.get("required"));
assertEquals("false", editProps.get("rendered"));
WidgetDefinition subjects = dublincore.getWidgetDefinition("subjects");
assertNotNull(subjects);
assertEquals("subjects", subjects.getName());
assertEquals("list", subjects.getType());
assertEquals("list", subjects.getType());
assertEquals("view", subjects.getMode(BuiltinModes.ANY));
fieldDefs = subjects.getFieldDefinitions();
assertEquals(1, fieldDefs.length);
assertEquals("dublincore", fieldDefs[0].getSchemaName());
assertEquals("subjects", fieldDefs[0].getFieldName());
anyProps = subjects.getProperties(BuiltinModes.ANY, BuiltinModes.VIEW);
assertEquals(3, anyProps.size());
assertEquals("bar", anyProps.get("foo"));
assertEquals("subject", anyProps.get("directory"));
assertTrue(anyProps.get("list") instanceof String[]);
String[] list = (String[]) anyProps.get("list");
assertEquals(2, list.length);
assertEquals("fooListItem", list[0]);
assertEquals("barListItem", list[1]);
}
@Test
public void testLayoutSubWidgetsRegistration() {
LayoutDefinition testLayout = service.getLayoutDefinition("testLayout");
assertNotNull(testLayout);
assertEquals("testLayout", testLayout.getName());
assertEquals(7, testLayout.getRows().length);
WidgetDefinition withSubWidgets = testLayout.getWidgetDefinition("testWidgetWithSubWidgets");
assertNotNull(withSubWidgets);
WidgetDefinition[] subDefs = withSubWidgets.getSubWidgetDefinitions();
assertEquals(1, subDefs.length);
WidgetDefinition subDef = subDefs[0];
assertEquals("text", subDef.getType());
assertEquals("subwidget label", subDef.getLabel(BuiltinModes.ANY));
WidgetReference[] subRefs = withSubWidgets.getSubWidgetReferences();
assertEquals(0, subRefs.length);
WidgetDefinition withSubWidgetRefs = testLayout.getWidgetDefinition("testWidgetWithSubWidgetRefs");
subDefs = withSubWidgetRefs.getSubWidgetDefinitions();
assertEquals(0, subDefs.length);
subRefs = withSubWidgetRefs.getSubWidgetReferences();
assertEquals(2, subRefs.length);
assertNull(subRefs[0].getCategory());
assertEquals("globalSubWidget", subRefs[0].getName());
assertNull(subRefs[1].getCategory());
assertEquals("testLocalSubwidget", subRefs[1].getName());
}
@SuppressWarnings("deprecation")
@Test
public void testComplexLayoutRegistration() {
LayoutDefinition filesLayout = service.getLayoutDefinition("files");
assertNotNull(filesLayout);
assertEquals("files", filesLayout.getName());
// test rows
LayoutRowDefinition[] rows = filesLayout.getRows();
assertEquals(1, rows.length);
assertEquals(1, rows[0].getWidgetReferences().length);
assertEquals("files", rows[0].getWidgetReferences()[0].getName());
assertEquals(1, filesLayout.getColumns());
// test widgets
WidgetDefinition filesWidget = filesLayout.getWidgetDefinition("files");
assertNotNull(filesWidget);
assertEquals("complexList", filesWidget.getType());
FieldDefinition[] fieldDefs = filesWidget.getFieldDefinitions();
assertEquals(1, fieldDefs.length);
assertEquals("files", fieldDefs[0].getSchemaName());
assertEquals("files", fieldDefs[0].getFieldName());
WidgetDefinition[] subWidgets = filesWidget.getSubWidgetDefinitions();
assertEquals(2, subWidgets.length);
// test blob
assertEquals("blob", subWidgets[0].getName());
assertEquals("file", subWidgets[0].getType());
fieldDefs = subWidgets[0].getFieldDefinitions();
assertEquals(1, fieldDefs.length);
assertNull(fieldDefs[0].getSchemaName());
assertEquals("blob", fieldDefs[0].getFieldName());
// test filename
assertEquals("filename", subWidgets[1].getName());
assertEquals("text", subWidgets[1].getType());
fieldDefs = subWidgets[1].getFieldDefinitions();
assertEquals(1, fieldDefs.length);
assertNull(fieldDefs[0].getSchemaName());
assertEquals("filename", fieldDefs[0].getFieldName());
}
@Test
public void testWidgetTypeRegistration() {
WidgetType type = service.getWidgetType("test");
assertNotNull(type);
assertEquals("test", type.getName());
WidgetTypeHandler handler = service.getWidgetTypeHandler(getTestTagConfig(), null, "test");
assertNotNull(handler);
assertEquals(DummyWidgetTypeHandler.class.getName(), handler.getClass().getName());
assertEquals("bar1", handler.getProperty("foo1"));
assertEquals("bar2", handler.getProperty("foo2"));
assertNull(handler.getProperty("foo"));
}
@Test
public void testWidgetTypeNullHandlerRegistration() {
WidgetTypeHandler handler = service.getWidgetTypeHandler(getTestTagConfig(), null, "complex");
assertNotNull(handler);
assertEquals(TemplateWidgetTypeHandler.class.getName(), handler.getClass().getName());
assertEquals("/widgets/complex_widget_template.xhtml", handler.getProperty("template"));
}
@Test
public void testWidgetTypeNullHandlerRegistrationFromStore() {
WidgetTypeHandler handler = service.getWidgetTypeHandler(getTestTagConfig(), "testCategory",
"complexFromStore");
assertNotNull(handler);
assertEquals(TemplateWidgetTypeHandler.class.getName(), handler.getClass().getName());
assertEquals("/widgets/complex_widget_template.xhtml", handler.getProperty("template"));
}
protected TagConfig getTestTagConfig() {
TagConfig parent = new TagConfig() {
@Override
public String getTagId() {
return "tagId";
}
@Override
public Tag getTag() {
return new Tag(null, "ns", "localName", "qName", new TagAttributesImpl(new TagAttribute[0]));
}
@Override
public FaceletHandler getNextHandler() {
return new LeafFaceletHandler();
}
};
return TagConfigFactory.createTagConfig(parent, "id", null, new LeafFaceletHandler());
}
@Test
public void testLayoutPropertiesRegistration() {
LayoutDefinition layoutDef = service.getLayoutDefinition("layoutPropertiesTest");
assertNotNull(layoutDef);
assertEquals("layoutPropertiesTest", layoutDef.getName());
assertNotNull(layoutDef.getProperties("any"));
assertEquals("layoutPropValue", layoutDef.getProperties("any").get("layoutPropName"));
LayoutRowDefinition[] layoutRows = layoutDef.getRows();
assertNotNull(layoutRows);
assertEquals(1, layoutRows.length);
LayoutRowDefinition layoutRow = layoutRows[0];
assertNotNull(layoutRow.getProperties("any"));
assertEquals("layoutRowPropValue", layoutRow.getProperties("any").get("layoutRowPropName"));
}
@Test
public void testLayoutColumnsRegistration() {
LayoutDefinition layoutDef = service.getLayoutDefinition("layoutColumnsTest");
assertNotNull(layoutDef);
assertEquals("layoutColumnsTest", layoutDef.getName());
LayoutRowDefinition[] layoutColumns = layoutDef.getRows();
assertNotNull(layoutColumns);
assertEquals(1, layoutColumns.length);
LayoutRowDefinition layoutRow = layoutColumns[0];
assertNotNull(layoutRow.getProperties("any"));
assertEquals("layoutColumnPropValue", layoutRow.getProperties("any").get("layoutColumnPropName"));
}
}