package org.jboss.shrinkwrap.portal.test;
import org.custommonkey.xmlunit.Diff;
import org.custommonkey.xmlunit.XMLUnit;
import org.jboss.shrinkwrap.api.*;
import org.jboss.shrinkwrap.descriptor.api.Descriptors;
import org.jboss.shrinkwrap.descriptor.api.portletapp20.InitParamType;
import org.jboss.shrinkwrap.descriptor.api.portletapp20.PortletDescriptor;
import org.jboss.shrinkwrap.descriptor.api.portletapp20.PortletType;
import org.jboss.shrinkwrap.descriptor.api.portletapp20.SupportsType;
import org.jboss.shrinkwrap.portal.api.PortletArchive;
import org.jboss.shrinkwrap.portal.api.PortletMode;
import org.jboss.shrinkwrap.spi.ArchiveFormatAssociable;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.xml.sax.SAXException;
import javax.portlet.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
/**
* @author <a href="http://community.jboss.org/people/kenfinni">Ken Finnigan</a>
*/
@RunWith(JUnit4.class)
public class PortletArchiveImplTestCase {
private static final ArchivePath PORTLET_XML_PATH = ArchivePaths.create("WEB-INF/portlet.xml");
private static final String GENERIC_PORTLET_CLASS = "javax.portlet.GenericPortlet";
private static final String GENERIC_PORTLET_NAME = "GenericPortlet";
private static final String GENERIC_FACES_PORTLET_CLASS = "javax.portlet.faces.GenericFacesPortlet";
private static final String DEFAULT_VIEW_PARAM_NAME = "javax.portlet.faces.defaultViewId.view";
private static final String DEFAULT_EDIT_PARAM_NAME = "javax.portlet.faces.defaultViewId.edit";
private static final String DEFAULT_HELP_PARAM_NAME = "javax.portlet.faces.defaultViewId.help";
private PortletArchive archive;
@Before
public void createPortletArchive() {
archive = ShrinkWrap.create(PortletArchive.class);
}
@Test
public void testDefaultArchiveFormatIsSet() throws Exception {
Assert.assertEquals("Unexpected default archive format", ArchiveFormat.ZIP, ((ArchiveFormatAssociable)archive).getArchiveFormat());
}
@Test
public void testSimplePortlet() throws Exception {
archive.createSimplePortlet(GenericPortlet.class);
PortletDescriptor portletDescriptor = getDescriptor(archive);
List<PortletType<PortletDescriptor>> portlets = portletDescriptor.getAllPortlet();
Assert.assertEquals("Only one portlet defined", 1, portlets.size());
PortletType genericPortlet = portlets.get(0);
Assert.assertEquals("Portlet class set", GENERIC_PORTLET_CLASS, genericPortlet.getPortletClass());
Assert.assertEquals("Portlet name set", GENERIC_PORTLET_NAME, genericPortlet.getPortletName());
Assert.assertEquals("Portlet title set", GENERIC_PORTLET_NAME, genericPortlet.getOrCreatePortletInfo().getTitle());
}
@Test
public void testSimplePortletWithCustom() throws Exception {
archive.createSimplePortlet(DummyPortlet.class);
PortletDescriptor portletDescriptor = getDescriptor(archive);
List<PortletType<PortletDescriptor>> portlets = portletDescriptor.getAllPortlet();
Assert.assertEquals("Only one portlet defined", 1, portlets.size());
PortletType genericPortlet = portlets.get(0);
Assert.assertEquals("Portlet class set", "org.jboss.shrinkwrap.portal.test.PortletArchiveImplTestCase$DummyPortlet", genericPortlet.getPortletClass());
Assert.assertEquals("Portlet name set", "DummyPortlet", genericPortlet.getPortletName());
Assert.assertEquals("Portlet title set", "DummyPortlet", genericPortlet.getOrCreatePortletInfo().getTitle());
}
@Test
public void testSimplePortletWithNameAndTitle() throws Exception {
String name = "MyPortlet";
String title = "My Portlet Title";
archive.createSimplePortlet(GenericPortlet.class, name, title);
PortletDescriptor portletDescriptor = getDescriptor(archive);
List<PortletType<PortletDescriptor>> portlets = portletDescriptor.getAllPortlet();
Assert.assertEquals("Only one portlet defined", 1, portlets.size());
PortletType genericPortlet = portlets.get(0);
Assert.assertEquals("Portlet class set", GENERIC_PORTLET_CLASS, genericPortlet.getPortletClass());
Assert.assertEquals("Portlet name set", name, genericPortlet.getPortletName());
Assert.assertEquals("Portlet title set", title, genericPortlet.getOrCreatePortletInfo().getTitle());
}
@Test
public void testSimplePortletWithNameTitleAndMode() throws Exception {
String name = "MyPortlet";
String title = "My Portlet Title";
archive.createSimplePortlet(GenericPortlet.class, name, title, "text/html", PortletMode.VIEW);
PortletDescriptor portletDescriptor = getDescriptor(archive);
List<PortletType<PortletDescriptor>> portlets = portletDescriptor.getAllPortlet();
Assert.assertEquals("Only one portlet defined", 1, portlets.size());
PortletType genericPortlet = portlets.get(0);
Assert.assertEquals("Portlet class set", GENERIC_PORTLET_CLASS, genericPortlet.getPortletClass());
Assert.assertEquals("Portlet name set", name, genericPortlet.getPortletName());
Assert.assertEquals("Portlet title set", title, genericPortlet.getOrCreatePortletInfo().getTitle());
SupportsType supports = ((SupportsType)genericPortlet.getAllSupports().get(0));
Assert.assertEquals("Portlet mime type set", "text/html", supports.getMimeType());
Assert.assertEquals("Should be only one Portlet Mode", 1, supports.getAllPortletMode().size());
Assert.assertEquals("Portlet mode set", PortletMode.VIEW.toString(), supports.getAllPortletMode().get(0));
}
@Test
public void testSimplePortletWithNameTitleAndModes() throws Exception {
String name = "MyPortlet";
String title = "My Portlet Title";
archive.createSimplePortlet(GenericPortlet.class, name, title, "text/html", PortletMode.VIEW, PortletMode.EDIT);
PortletDescriptor portletDescriptor = getDescriptor(archive);
List<PortletType<PortletDescriptor>> portlets = portletDescriptor.getAllPortlet();
Assert.assertEquals("Only one portlet defined", 1, portlets.size());
PortletType genericPortlet = portlets.get(0);
Assert.assertEquals("Portlet class set", GENERIC_PORTLET_CLASS, genericPortlet.getPortletClass());
Assert.assertEquals("Portlet name set", name, genericPortlet.getPortletName());
Assert.assertEquals("Portlet title set", title, genericPortlet.getOrCreatePortletInfo().getTitle());
SupportsType supports = ((SupportsType)genericPortlet.getAllSupports().get(0));
Assert.assertEquals("Portlet mime type set", "text/html", supports.getMimeType());
Assert.assertEquals("Should be two Portlet Modes", 2, supports.getAllPortletMode().size());
Assert.assertEquals("Portlet mode set", PortletMode.VIEW.toString(), supports.getAllPortletMode().get(0));
Assert.assertEquals("Portlet mode set", PortletMode.EDIT.toString(), supports.getAllPortletMode().get(1));
}
@Test
public void testSimplePortletAgainstXmlFile() throws Exception {
archive.createSimplePortlet(JSPHelloUserPortlet.class, "JSPHelloUserPortlet", "JSP Hello User Portlet", "text/html", PortletMode.values());
PortletDescriptor portletDescriptor = getDescriptor(archive);
String generatedOutput = portletDescriptor.exportAsString();
String expectedOutput = getResourceContents("src/test/resources/genericPortlet.xml");
assertIdenticalXml(expectedOutput, generatedOutput);
}
@Test
public void testFacesPortlet() throws Exception {
archive.createFacesPortlet("JSFPortlet");
PortletDescriptor portletDescriptor = getDescriptor(archive);
List<PortletType<PortletDescriptor>> portlets = portletDescriptor.getAllPortlet();
Assert.assertEquals("Only one portlet defined", 1, portlets.size());
PortletType genericPortlet = portlets.get(0);
Assert.assertEquals("Portlet class set", GENERIC_FACES_PORTLET_CLASS, genericPortlet.getPortletClass());
Assert.assertEquals("Portlet name set", "JSFPortlet", genericPortlet.getPortletName());
Assert.assertEquals("Portlet title set", "JSFPortlet", genericPortlet.getOrCreatePortletInfo().getTitle());
List<InitParamType> allInitParams = genericPortlet.getAllInitParam();
Assert.assertEquals("Should be one Init Param", 1, allInitParams.size());
InitParamType param = allInitParams.get(0);
Assert.assertEquals("Param name set", DEFAULT_VIEW_PARAM_NAME, param.getName());
Assert.assertEquals("Param value set", "/index.xhtml", param.getValue());
SupportsType supports = ((SupportsType)genericPortlet.getAllSupports().get(0));
Assert.assertEquals("Portlet mime type set", "text/html", supports.getMimeType());
Assert.assertEquals("Should be only one Portlet Mode", 1, supports.getAllPortletMode().size());
Assert.assertEquals("Portlet mode set", PortletMode.VIEW.toString(), supports.getAllPortletMode().get(0));
}
@Test
public void testFacesPortletWithViewId() throws Exception {
archive.createFacesPortlet("JSFPortlet", "JSF Portlet", "/home.xhtml");
PortletDescriptor portletDescriptor = getDescriptor(archive);
List<PortletType<PortletDescriptor>> portlets = portletDescriptor.getAllPortlet();
Assert.assertEquals("Only one portlet defined", 1, portlets.size());
PortletType genericPortlet = portlets.get(0);
Assert.assertEquals("Portlet class set", GENERIC_FACES_PORTLET_CLASS, genericPortlet.getPortletClass());
Assert.assertEquals("Portlet name set", "JSFPortlet", genericPortlet.getPortletName());
Assert.assertEquals("Portlet title set", "JSF Portlet", genericPortlet.getOrCreatePortletInfo().getTitle());
List<InitParamType> allInitParams = genericPortlet.getAllInitParam();
Assert.assertEquals("Should be one Init Param", 1, allInitParams.size());
InitParamType param = allInitParams.get(0);
Assert.assertEquals("Param name set", DEFAULT_VIEW_PARAM_NAME, param.getName());
Assert.assertEquals("Param value set", "/home.xhtml", param.getValue());
SupportsType supports = ((SupportsType)genericPortlet.getAllSupports().get(0));
Assert.assertEquals("Portlet mime type set", "text/html", supports.getMimeType());
Assert.assertEquals("Should be only one Portlet Mode", 1, supports.getAllPortletMode().size());
Assert.assertEquals("Portlet mode set", PortletMode.VIEW.toString(), supports.getAllPortletMode().get(0));
}
@Test
public void testFacesPortletWithViewEditIds() throws Exception {
archive.createFacesPortlet("JSFPortlet", "JSF Portlet", "/home.xhtml", "/edit.xhtml");
PortletDescriptor portletDescriptor = getDescriptor(archive);
List<PortletType<PortletDescriptor>> portlets = portletDescriptor.getAllPortlet();
Assert.assertEquals("Only one portlet defined", 1, portlets.size());
PortletType genericPortlet = portlets.get(0);
Assert.assertEquals("Portlet class set", GENERIC_FACES_PORTLET_CLASS, genericPortlet.getPortletClass());
Assert.assertEquals("Portlet name set", "JSFPortlet", genericPortlet.getPortletName());
Assert.assertEquals("Portlet title set", "JSF Portlet", genericPortlet.getOrCreatePortletInfo().getTitle());
List<InitParamType> allInitParams = genericPortlet.getAllInitParam();
Assert.assertEquals("Should be two Init Param", 2, allInitParams.size());
InitParamType param = allInitParams.get(0);
Assert.assertEquals("Param name set", DEFAULT_VIEW_PARAM_NAME, param.getName());
Assert.assertEquals("Param value set", "/home.xhtml", param.getValue());
param = allInitParams.get(1);
Assert.assertEquals("Param name set", DEFAULT_EDIT_PARAM_NAME, param.getName());
Assert.assertEquals("Param value set", "/edit.xhtml", param.getValue());
SupportsType supports = ((SupportsType)genericPortlet.getAllSupports().get(0));
Assert.assertEquals("Portlet mime type set", "text/html", supports.getMimeType());
Assert.assertEquals("Should be two Portlet Modes", 2, supports.getAllPortletMode().size());
Assert.assertEquals("Portlet mode set", PortletMode.VIEW.toString(), supports.getAllPortletMode().get(0));
Assert.assertEquals("Portlet mode set", PortletMode.EDIT.toString(), supports.getAllPortletMode().get(1));
}
@Test
public void testFacesPortletWithViewEditHelpIds() throws Exception {
archive.createFacesPortlet("JSFPortlet", "JSF Portlet", "/home.xhtml", "/edit.xhtml", "/help.xhtml");
PortletDescriptor portletDescriptor = getDescriptor(archive);
List<PortletType<PortletDescriptor>> portlets = portletDescriptor.getAllPortlet();
Assert.assertEquals("Only one portlet defined", 1, portlets.size());
PortletType genericPortlet = portlets.get(0);
Assert.assertEquals("Portlet class set", GENERIC_FACES_PORTLET_CLASS, genericPortlet.getPortletClass());
Assert.assertEquals("Portlet name set", "JSFPortlet", genericPortlet.getPortletName());
Assert.assertEquals("Portlet title set", "JSF Portlet", genericPortlet.getOrCreatePortletInfo().getTitle());
List<InitParamType> allInitParams = genericPortlet.getAllInitParam();
Assert.assertEquals("Should be two Init Param", 3, allInitParams.size());
InitParamType param = allInitParams.get(0);
Assert.assertEquals("Param name set", DEFAULT_VIEW_PARAM_NAME, param.getName());
Assert.assertEquals("Param value set", "/home.xhtml", param.getValue());
param = allInitParams.get(1);
Assert.assertEquals("Param name set", DEFAULT_EDIT_PARAM_NAME, param.getName());
Assert.assertEquals("Param value set", "/edit.xhtml", param.getValue());
param = allInitParams.get(2);
Assert.assertEquals("Param name set", DEFAULT_HELP_PARAM_NAME, param.getName());
Assert.assertEquals("Param value set", "/help.xhtml", param.getValue());
SupportsType supports = ((SupportsType)genericPortlet.getAllSupports().get(0));
Assert.assertEquals("Portlet mime type set", "text/html", supports.getMimeType());
Assert.assertEquals("Should be three Portlet Modes", 3, supports.getAllPortletMode().size());
Assert.assertEquals("Portlet mode set", PortletMode.VIEW.toString(), supports.getAllPortletMode().get(0));
Assert.assertEquals("Portlet mode set", PortletMode.EDIT.toString(), supports.getAllPortletMode().get(1));
Assert.assertEquals("Portlet mode set", PortletMode.HELP.toString(), supports.getAllPortletMode().get(2));
}
@Test
public void testFacesPortletAgainstXmlFile() throws Exception {
archive.createFacesPortlet("richfaces-simple", "RichFaces 4 Simple Portlet");
PortletDescriptor portletDescriptor = getDescriptor(archive);
String generatedOutput = portletDescriptor.exportAsString();
String expectedOutput = getResourceContents("src/test/resources/genericFacesPortlet.xml");
assertIdenticalXml(expectedOutput, generatedOutput);
}
@Test
public void testFacesPortletAgainstXmlFileWithViewId() throws Exception {
archive.createFacesPortlet("richfaces-simple", "RichFaces 4 Simple Portlet", "index.xhtml");
PortletDescriptor portletDescriptor = getDescriptor(archive);
String generatedOutput = portletDescriptor.exportAsString();
String expectedOutput = getResourceContents("src/test/resources/genericFacesPortlet.xml");
assertIdenticalXml(expectedOutput, generatedOutput);
}
private PortletDescriptor getDescriptor(PortletArchive archive) {
Node portletNode = archive.get(PORTLET_XML_PATH);
return Descriptors.importAs(PortletDescriptor.class).fromStream(portletNode.getAsset().openStream());
}
private String getResourceContents(String resourceName) throws Exception {
final BufferedReader reader = new BufferedReader(new FileReader(resourceName));
final StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
builder.append("\n");
}
return builder.toString();
}
private void assertIdenticalXml(String expected, String actual) {
XMLUnit.setIgnoreWhitespace(true);
XMLUnit.setIgnoreComments(true);
XMLUnit.setNormalizeWhitespace(true);
try {
Diff diff = new Diff(expected, actual);
Assert.assertTrue("Pieces of xml are similar " + diff, diff.similar());
Assert.assertTrue("but are they identical? " + diff, diff.identical());
} catch (SAXException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
class DummyPortlet implements Portlet {
@Override
public void init(PortletConfig config) throws PortletException {
}
@Override
public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException {
}
@Override
public void render(RenderRequest request, RenderResponse response) throws PortletException, IOException {
}
@Override
public void destroy() {
}
}
}