package com.enonic.cms.itest.core.structure.page.template; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Set; import org.jdom.Document; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.transaction.TransactionConfiguration; import org.springframework.transaction.annotation.Transactional; import junit.framework.Assert; import com.enonic.cms.framework.xml.XMLDocumentFactory; import com.enonic.cms.core.content.contenttype.ContentHandlerName; import com.enonic.cms.core.content.contenttype.ContentTypeConfigBuilder; import com.enonic.cms.core.content.contenttype.ContentTypeEntity; import com.enonic.cms.core.resource.ResourceKey; import com.enonic.cms.core.structure.RunAsType; import com.enonic.cms.core.structure.SiteEntity; import com.enonic.cms.core.structure.page.template.CreatePageTemplateCommand; import com.enonic.cms.core.structure.page.template.PageTemplateEntity; import com.enonic.cms.core.structure.page.template.PageTemplatePortletEntity; import com.enonic.cms.core.structure.page.template.PageTemplatePortletKey; import com.enonic.cms.core.structure.page.template.PageTemplateRegionEntity; import com.enonic.cms.core.structure.page.template.PageTemplateService; import com.enonic.cms.core.structure.page.template.PageTemplateType; import com.enonic.cms.core.structure.portlet.PortletEntity; import com.enonic.cms.itest.AbstractSpringTest; import com.enonic.cms.itest.util.DomainFactory; import com.enonic.cms.itest.util.DomainFixture; import com.enonic.cms.store.dao.PageTemplateDao; import static org.junit.Assert.*; @TransactionConfiguration(defaultRollback = true) @DirtiesContext @Transactional public class PageTemplateServiceImpl_createPageTemplateTest extends AbstractSpringTest { private DomainFactory factory; @Autowired private DomainFixture fixture; @Autowired private PageTemplateService pageTemplateService; @Autowired private PageTemplateDao pageTemplateDao; private int siteKey; @Before public void setUp() { factory = fixture.getFactory(); // setup needed common data for each test fixture.initSystemData(); final SiteEntity site = factory.createSite( "The Newspaper", new Date(), null, "en" ); siteKey = site.getKey().toInt(); fixture.save( site ); fixture.save( factory.createContentHandler( "Custom content", ContentHandlerName.CUSTOM.getHandlerClassShortName() ) ); // setup content type ContentTypeConfigBuilder ctyconf = new ContentTypeConfigBuilder( "Skole", "tittel" ); ctyconf.startBlock( "Skole" ); ctyconf.addInput( "tittel", "text", "contentdata/tittel", "Tittel", true ); ctyconf.endBlock(); ctyconf.startBlock( "Elever", "contentdata/elever" ); ctyconf.addInput( "elev-navn", "text", "navn", "Navn" ); ctyconf.addInput( "elev-karakter", "text", "karakter", "Karakter" ); ctyconf.endBlock(); ctyconf.startBlock( "Laerere", "contentdata/laerere" ); ctyconf.addInput( "laerer-navn", "text", "navn", "Navn" ); ctyconf.addInput( "laerer-karakter", "text", "karakter", "Karakter" ); ctyconf.endBlock(); Document configAsXmlBytes = XMLDocumentFactory.create( ctyconf.toString() ).getAsJDOMDocument(); ContentTypeEntity contenType = factory.createContentType( "article", ContentHandlerName.CUSTOM.getHandlerClassShortName(), configAsXmlBytes ); contenType.setKey( 1001 ); fixture.save( contenType ); contenType = factory.createContentType( "document", ContentHandlerName.CUSTOM.getHandlerClassShortName(), configAsXmlBytes ); contenType.setKey( 1002 ); fixture.save( contenType ); final PortletEntity portlet = createPortlet( 1, "Article-Show" ); portlet.setSite( site ); portlet.setStyleKey( ResourceKey.from( "CONTENT_OBJECT_STYLE" ) ); portlet.setBorderKey( ResourceKey.from( "CONTENT_OBJECT_BORDER" ) ); fixture.save( portlet ); fixture.flushAndClearHibernateSession(); fixture.flushIndexTransaction(); } @Test public void create_page_template_with_relations() { final String xmdData = "<pagetemplate menukey=\"" + siteKey + "\" runAs=\"DEFAULT_USER\" type=\"content\">" + "<css stylesheetkey=\"/sites/advanced/dav/_public/sites/advanced/all.css\"/>" + "<name>Bublik</name>" + "<description>video subject</description>" + "<stylesheet stylesheetkey=\"/sites/advanced/dav/sites/advanced/page.xsl\"/>" + "<pagetemplateparameters>" + " <pagetemplateparameter key=\"\" multiple=\"0\" override=\"0\"><name>center</name><separator><br /></separator></pagetemplateparameter>" + " <pagetemplateparameter key=\"\" multiple=\"0\" override=\"0\"><name>east</name><separator><br /></separator></pagetemplateparameter>" + " <pagetemplateparameter key=\"\" multiple=\"0\" override=\"0\"><name>north</name><separator><br /></separator></pagetemplateparameter>" + " <pagetemplateparameter key=\"\" multiple=\"0\" override=\"0\"><name>south</name><separator><br /></separator></pagetemplateparameter>" + " <pagetemplateparameter key=\"\" multiple=\"0\" override=\"0\"><name>west</name><separator><br /></separator></pagetemplateparameter>" + "</pagetemplateparameters>" + "<contentobjects>" + " <contentobject conobjkey=\"1\" pagetemplatekey=\"\" parameterkey=\"_0\">" + " <order>0</order>" + " <name>Article-Show</name>" + " </contentobject>" + "</contentobjects><pagetemplatedata><datasources>\n" + " <datasource name=\"getPreferences\">\n" + " <parameter name=\"scope\">*</parameter>\n" + " <parameter name=\"keyPattern\">*</parameter>\n" + " </datasource>\n" + "</datasources><document mode=\"xhtml\"/></pagetemplatedata>" + " <contenttypes>" + " <contenttype key=\"1001\"/>" + " <contenttype key=\"1002\"/>" + " </contenttypes>" + "</pagetemplate>"; CreatePageTemplateCommand command = new CreatePageTemplateCommand( xmdData ); pageTemplateService.createPageTemplate( command ); fixture.flushAndClearHibernateSession(); PageTemplateEntity persisted = pageTemplateDao.findByName( "Bublik" ).get( 0 ); assertEquals( "Bublik", persisted.getName() ); assertEquals( "video subject", persisted.getDescription() ); assertEquals( "<pagetemplatedata><datasources>\n" + " <datasource name=\"getPreferences\">\n" + " <parameter name=\"scope\">*</parameter>\n" + " <parameter name=\"keyPattern\">*</parameter>\n" + " </datasource>\n" + "</datasources><document mode=\"xhtml\"/></pagetemplatedata>", persisted.getXmlData().getDocumentAsString() ); assertEquals( ResourceKey.from( "/sites/advanced/dav/sites/advanced/page.xsl" ), persisted.getStyleKey() ); assertEquals( ResourceKey.from( "/sites/advanced/dav/_public/sites/advanced/all.css" ), persisted.getCssKey() ); SiteEntity site = fixture.findSiteByName( "The Newspaper" ); assertEquals( site, persisted.getSite() ); assertEquals( PageTemplateType.CONTENT, persisted.getType() ); assertEquals( RunAsType.DEFAULT_USER, persisted.getRunAs() ); Set<PageTemplateRegionEntity> regions = persisted.getPageTemplateRegions(); assertEquals( 5, regions.size() ); PageTemplateRegionEntity centerRegion = null; for ( PageTemplateRegionEntity region : regions ) { if ( "center".equals( region.getName() ) ) { centerRegion = region; break; } } List<PageTemplatePortletEntity> portlets = persisted.getPortlets(); assertEquals( 1, portlets.size() ); PageTemplatePortletEntity templatePortlet = portlets.get( 0 ); int pteKey = persisted.getKey(); assertEquals( new PageTemplatePortletKey( pteKey, 1 ), templatePortlet.getKey() ); assertEquals( 0, templatePortlet.getOrder() ); assertEquals( persisted, templatePortlet.getPageTemplate() ); assertEquals( 1, templatePortlet.getPortlet().getKey() ); assertEquals( "Article-Show", templatePortlet.getPortlet().getName() ); assertEquals( centerRegion, templatePortlet.getPageTemplateRegion() ); assertEquals( false, centerRegion.isMultiple() ); assertEquals( false, centerRegion.isOverride() ); assertEquals( "<br />", centerRegion.getSeparator() ); assertEquals( persisted, centerRegion.getPageTemplate() ); Set<PageTemplatePortletEntity> ptpEntities = centerRegion.getPortlets(); assertEquals( 1, ptpEntities.size() ); assertEquals( new PageTemplatePortletKey( pteKey, 1 ), ptpEntities.iterator().next().getKey() ); assertEquals( persisted, centerRegion.getPageTemplate() ); Set<ContentTypeEntity> contentTypes = persisted.getContentTypes(); assertEquals( 2, contentTypes.size() ); List<String> names = new ArrayList<String>( contentTypes.size() ); for ( ContentTypeEntity contentType : contentTypes ) { names.add( contentType.getName() ); } assertUnorderedArrayArrayEquals( new String[]{"article", "document"}, names.toArray() ); } private static void assertUnorderedArrayArrayEquals( Object[] a1, Object[] a2 ) { Object[] b1 = a1.clone(); Object[] b2 = a2.clone(); Arrays.sort( b1 ); Arrays.sort( b2 ); assertArrayEquals( b1, b2 ); } private static void assertArrayEquals( final Object[] a1, final Object[] a2 ) { Assert.assertEquals( arrayToString( a1 ), arrayToString( a2 ) ); } private static String arrayToString( final Object[] a ) { StringBuilder result = new StringBuilder( "[" ); for ( int i = 0; i < a.length; i++ ) { result.append( i ).append( ": " ).append( a[i] ); if ( i < a.length - 1 ) { result.append( ", " ); } } result.append( "]" ); return result.toString(); } private PortletEntity createPortlet( int key, String name ) { PortletEntity portlet = new PortletEntity(); portlet.setKey( key ); portlet.setName( name ); portlet.setCreated( new Date() ); portlet.setRunAs( RunAsType.PERSONALIZED ); return portlet; } }