/* * JBoss, Home of Professional Open Source. * Copyright 2011, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.portal.mop.management.binding.xml; import static org.junit.Assert.assertArrayEquals; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.exoplatform.portal.config.model.Application; import org.exoplatform.portal.config.model.ApplicationState; import org.exoplatform.portal.config.model.ApplicationType; import org.exoplatform.portal.config.model.Container; import org.exoplatform.portal.config.model.ModelObject; import org.exoplatform.portal.config.model.Page; import org.exoplatform.portal.config.model.TransientApplicationState; import org.exoplatform.portal.mop.ProtectedResource; import org.exoplatform.portal.pom.config.Utils; import org.exoplatform.portal.pom.data.ApplicationData; import org.exoplatform.portal.pom.data.ComponentData; import org.exoplatform.portal.pom.data.ContainerData; import org.exoplatform.portal.pom.data.PageData; import org.exoplatform.portal.pom.spi.gadget.Gadget; import org.exoplatform.portal.pom.spi.portlet.Portlet; import org.exoplatform.portal.pom.spi.portlet.Preference; import org.exoplatform.portal.pom.spi.wsrp.WSRP; /** * @author <a href="mailto:nscavell@redhat.com">Nick Scavelli</a> * @version $Revision$ */ public class PageMarshallerTest extends AbstractMarshallerTest { public void testHomePageUnMarshalling() { PageMarshaller marshaller = new PageMarshaller(); InputStream in = null; try { in = getClass().getResourceAsStream("/org/exoplatform/portal/mop/management/pages-homepage.xml"); Page.PageSet pages = marshaller.unmarshal(in); assertNotNull(pages); assertNotNull(pages.getPages()); assertEquals(1, pages.getPages().size()); Page page = pages.getPages().get(0); assertEquals("homepage", page.getName()); assertEquals("Home Page", page.getTitle()); assertEquals("Everyone", Utils.join(";", page.getAccessPermissions())); assertEquals("*:/platform/administrators", page.getEditPermission()); assertNotNull(page.getChildren()); assertEquals(1, page.getChildren().size()); ModelObject child = page.getChildren().get(0); assertTrue(child instanceof Application); @SuppressWarnings("unchecked") Application<Portlet> application = (Application<Portlet>) child; assertTrue(application.getType() == ApplicationType.PORTLET); ApplicationState<Portlet> state = application.getState(); assertNotNull(state); assertTrue(state instanceof TransientApplicationState); TransientApplicationState<Portlet> tas = (TransientApplicationState<Portlet>) state; assertEquals("web/HomePagePortlet", tas.getContentId()); Portlet portlet = tas.getContentState(); int count = 0; for (Iterator<Preference> it = portlet.iterator(); it.hasNext(); it.next()) { count++; } assertEquals(1, count); Preference pref = portlet.getPreference("template"); assertNotNull(pref); assertEquals("template", pref.getName()); assertEquals("system:/templates/groovy/webui/component/UIHomePagePortlet.gtmpl", pref.getValue()); assertFalse(pref.isReadOnly()); assertNull(application.getTheme()); assertEquals("Home Page portlet", application.getTitle()); assertEquals("Everyone", Utils.join(";", application.getAccessPermissions())); assertFalse(application.getShowInfoBar()); assertFalse(application.getShowApplicationState()); assertFalse(application.getShowApplicationMode()); assertNull(application.getDescription()); assertNull(application.getIcon()); assertNull(application.getWidth()); assertNull(application.getHeight()); } finally { if (in != null) { try { in.close(); } catch (IOException ignored) { } } } } public void testLoadedPageUnmarshalling() { PageMarshaller marshaller = new PageMarshaller(); InputStream in = null; try { in = getClass().getResourceAsStream("/org/exoplatform/portal/mop/management/pages-loaded.xml"); Page.PageSet pages = marshaller.unmarshal(in); assertNotNull(pages); assertNotNull(pages.getPages()); assertEquals(1, pages.getPages().size()); Page page = pages.getPages().get(0); // Verify page properties assertEquals("loaded-page", page.getName()); assertEquals("Loaded Page", page.getTitle()); assertEquals("manager:/platform/administrators;manager:/platform/users", Utils.join(";", page.getAccessPermissions())); assertEquals("*:/platform/administrators", page.getEditPermission()); // Verify page children assertNotNull(page.getChildren()); assertEquals(1, page.getChildren().size()); ModelObject child = page.getChildren().get(0); assertTrue(child instanceof Container); // Verify root container Container rootContainer = (Container) child; assertEquals("rootContainer", rootContainer.getId()); assertEquals("system:/groovy/portal/webui/container/UIContainer.gtmpl", rootContainer.getTemplate()); assertEquals("Everyone", Utils.join(";", rootContainer.getAccessPermissions())); // Verify root container children List<ModelObject> rootChildren = rootContainer.getChildren(); assertNotNull(rootChildren); assertEquals(3, rootChildren.size()); // Verify container 1 ModelObject c1 = rootChildren.get(0); assertNotNull(c1); assertTrue(c1 instanceof ModelObject); Container container1 = (Container) c1; assertEquals("c1", container1.getId()); assertEquals("system:/groovy/portal/webui/container/UIContainer.gtmpl", container1.getTemplate()); assertEquals("*:/platform/users", Utils.join(";", container1.getAccessPermissions())); { // Verify homepage application assertNotNull(container1.getChildren()); assertEquals(1, container1.getChildren().size()); ModelObject homeComponent = container1.getChildren().get(0); assertTrue(homeComponent instanceof Application); @SuppressWarnings("unchecked") Application<Portlet> application = (Application<Portlet>) homeComponent; assertTrue(application.getType() == ApplicationType.PORTLET); ApplicationState<Portlet> state = application.getState(); assertNotNull(state); assertTrue(state instanceof TransientApplicationState); TransientApplicationState<Portlet> tas = (TransientApplicationState<Portlet>) state; assertEquals("web/HomePagePortlet", tas.getContentId()); Portlet portlet = tas.getContentState(); int count = 0; for (Iterator<Preference> it = portlet.iterator(); it.hasNext(); it.next()) { count++; } assertEquals(3, count); Preference pref = portlet.getPreference("template"); assertNotNull(pref); assertEquals("template", pref.getName()); assertEquals("system:/templates/groovy/webui/component/UIHomePagePortlet.gtmpl", pref.getValue()); assertTrue(pref.isReadOnly()); pref = portlet.getPreference("empty-preference-value"); assertNotNull(pref); assertEquals("empty-preference-value", pref.getName()); assertNull(pref.getValue()); assertFalse(pref.isReadOnly()); pref = portlet.getPreference("no-preference-value"); assertNotNull(pref); assertEquals("no-preference-value", pref.getName()); assertNull(pref.getValue()); assertFalse(pref.isReadOnly()); assertEquals("Mac:MacTheme::Default:DefaultTheme::Vista:VistaTheme", application.getTheme()); assertEquals("Home Page portlet", application.getTitle()); assertEquals("Everyone", Utils.join(";", application.getAccessPermissions())); assertTrue(application.getShowInfoBar()); assertTrue(application.getShowApplicationState()); assertTrue(application.getShowApplicationMode()); assertNull(application.getDescription()); assertNull(application.getIcon()); assertNull(application.getWidth()); assertNull(application.getHeight()); } // Verify container 2 ModelObject c2 = rootChildren.get(1); assertNotNull(c2); assertTrue(c2 instanceof Container); Container container2 = (Container) c2; assertEquals("c2", container2.getId()); assertEquals("system:/groovy/portal/webui/container/UITableColumnContainer.gtmpl", container2.getTemplate()); assertEquals("*:/platform/guests", Utils.join(";", container2.getAccessPermissions())); assertEquals("TableColumnContainer", container2.getFactoryId()); assertNotNull(container2.getChildren()); assertEquals(2, container2.getChildren().size()); { // Verify column 1 of container 2 ModelObject appregComp = container2.getChildren().get(0); assertTrue(appregComp instanceof Container); Container appregContainer = (Container) appregComp; assertEquals("c2-1", appregContainer.getId()); assertEquals("system:/groovy/portal/webui/container/UIContainer.gtmpl", appregContainer.getTemplate()); assertEquals("300px", appregContainer.getWidth()); assertEquals("400px", appregContainer.getHeight()); assertEquals("Everyone", Utils.join(";", appregContainer.getAccessPermissions())); { // Verify app registry application assertNotNull(appregContainer.getChildren()); assertEquals(1, appregContainer.getChildren().size()); ModelObject appregComponent = appregContainer.getChildren().get(0); assertTrue(appregComponent instanceof Application); @SuppressWarnings("unchecked") Application<Portlet> application = (Application<Portlet>) appregComponent; assertTrue(application.getType() == ApplicationType.PORTLET); ApplicationState<Portlet> state = application.getState(); assertNotNull(state); assertTrue(state instanceof TransientApplicationState); TransientApplicationState<Portlet> tas = (TransientApplicationState<Portlet>) state; assertEquals("exoadmin/ApplicationRegistryPortlet", tas.getContentId()); assertNull(tas.getContentState()); assertEquals("Default:DefaultTheme::Mac:MacTheme::Vista:VistaTheme", application.getTheme()); assertEquals("Application Registry", application.getTitle()); assertEquals("*:/platform/administrators;*:/organization/management/executive-board", Utils.join(";", application.getAccessPermissions())); assertFalse(application.getShowInfoBar()); assertTrue(application.getShowApplicationState()); assertFalse(application.getShowApplicationMode()); assertEquals("Application Registry", application.getDescription()); assertEquals("PortletIcon", application.getIcon()); assertEquals("250px", application.getWidth()); assertEquals("350px", application.getHeight()); } // Verify column 2 of container 2 ModelObject orgComp = container2.getChildren().get(1); assertTrue(orgComp instanceof Container); Container orgContainer = (Container) orgComp; assertEquals("c2-2", orgContainer.getId()); assertEquals("system:/groovy/portal/webui/container/UIContainer.gtmpl", orgContainer.getTemplate()); assertEquals("200px", orgContainer.getWidth()); assertEquals("300px", orgContainer.getHeight()); assertEquals("/platform/users", Utils.join(";", orgContainer.getAccessPermissions())); { // Verify calendar gadget application assertNotNull(orgContainer.getChildren()); assertEquals(1, orgContainer.getChildren().size()); ModelObject gadgetComponent = orgContainer.getChildren().get(0); assertTrue(gadgetComponent instanceof Application); @SuppressWarnings("unchecked") Application<Gadget> application = (Application<Gadget>) gadgetComponent; assertTrue(application.getType() == ApplicationType.GADGET); ApplicationState<Gadget> state = application.getState(); assertNotNull(state); assertTrue(state instanceof TransientApplicationState); TransientApplicationState<Gadget> tas = (TransientApplicationState<Gadget>) state; assertEquals("Calendar", tas.getContentId()); assertNull(tas.getContentState()); assertEquals("Vista:VistaTheme::Mac:MacTheme::Default:DefaultTheme", application.getTheme()); assertEquals("Calendar Title", application.getTitle()); assertEquals("*:/platform/administrators;*:/organization/management/executive-board", Utils.join(";", application.getAccessPermissions())); assertTrue(application.getShowInfoBar()); assertFalse(application.getShowApplicationState()); assertFalse(application.getShowApplicationMode()); assertEquals("Calendar Description", application.getDescription()); assertEquals("StarAwardIcon", application.getIcon()); assertEquals("100px", application.getWidth()); assertEquals("200px", application.getHeight()); } } // Verify container 3 ModelObject c3 = rootChildren.get(2); assertNotNull(c3); assertTrue(c3 instanceof Container); Container container3 = (Container) c3; assertEquals("c3", container3.getId()); assertEquals("system:/groovy/portal/webui/container/UIContainer.gtmpl", container3.getTemplate()); assertEquals(container3.getTemplate(), "system:/groovy/portal/webui/container/UIContainer.gtmpl"); assertEquals("Everyone", Utils.join(";", container3.getAccessPermissions())); assertNull(container3.getFactoryId()); { // Verify site map & wsrp application assertNotNull(container3.getChildren()); assertEquals(2, container3.getChildren().size()); { ModelObject sitemapcomponent = container3.getChildren().get(0); assertTrue(sitemapcomponent instanceof Application); @SuppressWarnings("unchecked") Application<Portlet> application = (Application<Portlet>) sitemapcomponent; assertTrue(application.getType() == ApplicationType.PORTLET); ApplicationState<Portlet> state = application.getState(); assertNotNull(state); assertTrue(state instanceof TransientApplicationState); TransientApplicationState<Portlet> tas = (TransientApplicationState<Portlet>) state; assertEquals("web/SiteMapPortlet", tas.getContentId()); assertNull(tas.getContentState()); assertEquals("Default:DefaultTheme::Vista:VistaTheme::Mac:MacTheme", application.getTheme()); assertEquals("SiteMap", application.getTitle()); assertEquals("*:/platform/users", Utils.join(";", application.getAccessPermissions())); assertTrue(application.getShowInfoBar()); assertTrue(application.getShowApplicationState()); assertFalse(application.getShowApplicationMode()); assertEquals("SiteMap", application.getDescription()); assertNull(application.getIcon()); assertNull(application.getWidth()); assertNull(application.getHeight()); } { ModelObject wsrpcomponent = container3.getChildren().get(1); assertTrue(wsrpcomponent instanceof Application); @SuppressWarnings("unchecked") Application<WSRP> application = (Application<WSRP>) wsrpcomponent; assertTrue(application.getType() == ApplicationType.WSRP_PORTLET); ApplicationState<WSRP> state = application.getState(); assertNotNull(state); assertTrue(state instanceof TransientApplicationState); TransientApplicationState<WSRP> tas = (TransientApplicationState<WSRP>) state; assertEquals("selfv2./portletApplicationName.portletName", tas.getContentId()); assertNull(tas.getContentState()); assertEquals("WSRP", application.getTitle()); assertEquals("Someone", Utils.join(";", application.getAccessPermissions())); assertFalse(application.getShowInfoBar()); assertTrue(application.getShowApplicationState()); assertTrue(application.getShowApplicationMode()); assertNull(application.getDescription()); assertNull(application.getIcon()); assertNull(application.getWidth()); assertNull(application.getHeight()); } } } finally { if (in != null) { try { in.close(); } catch (IOException ignored) { } } } } public void testEmptyPageUnmarshalling() { PageMarshaller marshaller = new PageMarshaller(); InputStream in = null; try { in = getClass().getResourceAsStream("/org/exoplatform/portal/mop/management/pages-empty.xml"); Page.PageSet pages = marshaller.unmarshal(in); assertNotNull(pages); assertNotNull(pages.getPages()); assertEquals(1, pages.getPages().size()); Page page = pages.getPages().get(0); assertNotNull(page); assertEquals("empty-page", page.getName()); assertEquals("Empty", page.getTitle()); assertNull(page.getAccessPermissions()); assertNull(page.getEditPermission()); assertArrayEquals(new String [] {ProtectedResource.EVERYONE}, page.getMoveAppsPermissions()); assertArrayEquals(new String [] {ProtectedResource.EVERYONE}, page.getMoveContainersPermissions()); assertNotNull(page.getChildren()); assertTrue(page.getChildren().isEmpty()); } finally { if (in != null) { try { in.close(); } catch (IOException ignored) { } } } } public void testPageMarshalling() { ByteArrayOutputStream baos = new ByteArrayOutputStream(); Portlet portlet = new Portlet(); portlet.putPreference(new Preference("pref-1", "value-1", true)); portlet.putPreference(new Preference("pref-2", "value-2", false)); portlet.putPreference(new Preference("multi-value-pref", Arrays.asList("one", "two", "three"), false)); portlet.putPreference(new Preference("empty-value-pref", (String) null, true)); ApplicationState<Portlet> state = new TransientApplicationState<Portlet>("app-ref/portlet-ref", portlet); ApplicationData<Portlet> applicationData = new ApplicationData<Portlet>(null, null, ApplicationType.PORTLET, state, null, "app-title", "app-icon", "app-description", false, true, false, "app-theme", "app-wdith", "app-height", new HashMap<String, String>(), Collections.singletonList("app-edit-permissions")); ContainerData containerData = new ContainerData(null, "cd-id", "cd-name", "cd-icon", "cd-template", "cd-factoryId", "cd-title", "cd-description", "cd-width", "cd-height", Collections.singletonList("cd-access-permissions"), Collections.singletonList("cd-move-apps-permissions"), Collections.singletonList("cd-move-containers-permissions"), Collections.singletonList((ComponentData) applicationData)); List<ComponentData> children = Collections.singletonList((ComponentData) containerData); PageData expectedData = new PageData(null, null, "page-name", null, null, null, "Page Title", null, null, null, Collections.singletonList("access-permissions"), children, "", "", "edit-permission", true, Collections.singletonList("move-apps-permissions"), Collections.singletonList("move-containers-permissions")); Page expected = new Page(expectedData); Page.PageSet expectedPages = new Page.PageSet(); expectedPages.setPages(new ArrayList<Page>(1)); expectedPages.getPages().add(expected); PageMarshaller marshaller = new PageMarshaller(); marshaller.marshal(expectedPages, baos, false); // System.out.println(baos.toString()); Page.PageSet actualPages = marshaller.unmarshal(new ByteArrayInputStream(baos.toByteArray())); assertNotNull(actualPages); assertNotNull(actualPages.getPages()); assertEquals(1, actualPages.getPages().size()); comparePages(expected, actualPages.getPages().get(0)); } public void testPageMarshallingWithGadget() { ByteArrayOutputStream baos = new ByteArrayOutputStream(); Gadget gadget = null; // TODO: Uncomment when gadget user-prefs are supported in gatein_objects // Gadget gadget = new Gadget(); // gadget.setUserPref("user-pref"); ApplicationState<Gadget> state = new TransientApplicationState<Gadget>("gadget-ref", gadget); ApplicationData<Gadget> applicationData = new ApplicationData<Gadget>(null, null, ApplicationType.GADGET, state, null, "app-title", "app-icon", "app-description", false, true, false, "app-theme", "app-wdith", "app-height", new HashMap<String, String>(), Collections.singletonList("app-edit-permissions")); List<ComponentData> children = Collections.singletonList((ComponentData) applicationData); PageData expectedData = new PageData(null, null, "page-name", null, null, null, "Page Title", null, null, null, Collections.singletonList("access-permissions"), children, "", "", "edit-permission", true, Collections.singletonList("move-apps-permissions"), Collections.singletonList("move-containers-permissions")); Page expected = new Page(expectedData); Page.PageSet expectedPages = new Page.PageSet(); expectedPages.setPages(new ArrayList<Page>(1)); expectedPages.getPages().add(expected); PageMarshaller marshaller = new PageMarshaller(); marshaller.marshal(expectedPages, baos, false); // System.out.println(baos.toString()); Page.PageSet actualPages = marshaller.unmarshal(new ByteArrayInputStream(baos.toByteArray())); assertNotNull(actualPages); assertNotNull(actualPages.getPages()); assertEquals(1, actualPages.getPages().size()); comparePages(expected, actualPages.getPages().get(0)); } public void testTemplatePagesUnMarshalling() { PageMarshaller marshaller = new PageMarshaller(); InputStream in = null; try { in = getClass().getResourceAsStream("/org/exoplatform/portal/mop/management/pages-template.xml"); Page.PageSet pages = marshaller.unmarshal(in); assertNotNull(pages); assertNotNull(pages.getPages()); assertEquals(1, pages.getPages().size()); Page page = pages.getPages().get(0); assertEquals("Tab_Default", page.getName()); assertEquals("Tab_Default", page.getTitle()); assertNotNull(page.getChildren()); assertEquals(1, page.getChildren().size()); ModelObject child = page.getChildren().get(0); assertTrue(child instanceof Application); @SuppressWarnings("unchecked") Application<Portlet> application = (Application<Portlet>) child; assertTrue(application.getType() == ApplicationType.PORTLET); ApplicationState<Portlet> state = application.getState(); assertNotNull(state); assertTrue(state instanceof TransientApplicationState); } finally { if (in != null) { try { in.close(); } catch (IOException ignored) { } } } } private void comparePages(Page expected, Page actual) { assertNull(actual.getStorageId()); assertNull(actual.getStorageName()); assertNull(actual.getId()); assertNull(actual.getOwnerType()); assertNull(actual.getOwnerId()); assertEquals(expected.getName(), actual.getName()); assertNull(actual.getIcon()); assertNull(actual.getTemplate()); assertNull(actual.getFactoryId()); assertEquals(expected.getTitle(), actual.getTitle()); assertNull(actual.getDescription()); assertNull(actual.getWidth()); assertNull(actual.getHeight()); assertEquals(Arrays.asList(expected.getAccessPermissions()), Arrays.asList(actual.getAccessPermissions())); compareComponents(expected.getChildren(), actual.getChildren()); assertEquals(expected.getEditPermission(), actual.getEditPermission()); assertEquals(expected.isShowMaxWindow(), actual.isShowMaxWindow()); } }