package com.enonic.cms.itest.core.structure.page.template;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
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.orm.hibernate3.HibernateTemplate;
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.content.contenttype.ContentTypeKey;
import com.enonic.cms.core.resource.ResourceKey;
import com.enonic.cms.core.security.user.User;
import com.enonic.cms.core.structure.RunAsType;
import com.enonic.cms.core.structure.SiteEntity;
import com.enonic.cms.core.structure.page.template.CopyPageTemplateCommand;
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.ContentTypeDao;
import com.enonic.cms.store.dao.PageTemplateDao;
import com.enonic.cms.store.dao.PageTemplatePortletDao;
import com.enonic.cms.store.dao.PageTemplateRegionDao;
import com.enonic.cms.store.dao.PortletDao;
import static org.junit.Assert.*;
@TransactionConfiguration(defaultRollback = true)
@DirtiesContext
@Transactional
public class PageTemplateServiceImpl_copyPageTemplateTest
extends AbstractSpringTest
{
private DomainFactory factory;
@Autowired
private DomainFixture fixture;
@Autowired
private HibernateTemplate hibernateTemplate;
@Autowired
private PageTemplateService pageTemplateService;
@Autowired
private PageTemplateDao pageTemplateDao;
@Autowired
private PageTemplateRegionDao pageTemplateRegionDao;
@Autowired
private PageTemplatePortletDao pageTemplatePortletDao;
@Autowired
private PortletDao portletDao;
@Autowired
private ContentTypeDao contentTypeDao;
@Before
public void setUp()
{
factory = fixture.getFactory();
// setup needed common data for each test
fixture.initSystemData();
fixture.save( factory.createSite( "The Newspaper", new Date(), null, "en" ) );
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 );
fixture.flushAndClearHibernateSession();
fixture.flushIndexTransaction();
}
@Test
public void copy_page_template_with_relations()
{
save( factory.createContentType( "just-another-cty", ContentHandlerName.CUSTOM.getHandlerClassShortName(), null ) );
PageTemplateEntity pageTemplate =
createPageTemplate( "my-template", PageTemplateType.SECTIONPAGE, "The Newspaper", "just-another-cty" );
// PageTemplateRegion
PageTemplateRegionEntity region_leftColumn = createPageTemplateRegion( 20, "leftColumn", pageTemplate );
PageTemplateRegionEntity region_mainColumn = createPageTemplateRegion( 21, "mainColumn", pageTemplate );
pageTemplate.addPageTemplateRegion( region_leftColumn );
pageTemplate.addPageTemplateRegion( region_mainColumn );
pageTemplate.setStyleKey( ResourceKey.from( "/sites/advanced/dav/sites/advanced/page.xsl" ) );
pageTemplate.setCssKey( ResourceKey.from( "/sites/advanced/dav/_public/sites/advanced/all.css" ) );
ContentTypeEntity contentType = contentTypeDao.findByKey( new ContentTypeKey( 1001 ) );
pageTemplate.addContentType( contentType );
contentType = contentTypeDao.findByKey( new ContentTypeKey( 1002 ) );
pageTemplate.addContentType( contentType );
save( pageTemplate );
PageTemplateRegionEntity pRegion1 = pageTemplateRegionDao.findByKey( 20 );
assertEquals( 20, pRegion1.getKey() );
PageTemplateRegionEntity pRegion2 = pageTemplateRegionDao.findByKey( 21 );
assertEquals( 21, pRegion2.getKey() );
List<PageTemplateEntity> templates = pageTemplateDao.findByName( "my-template" );
assertEquals( 1, templates.size() );
PageTemplateEntity pPageTemplate = templates.get( 0 );
assertNotNull( pPageTemplate );
// Portlet
final String xml = "<menudata>" +
"<defaultcss key=\"DEFAULT_CSS\"/>" +
"<default-localization-resource>DEFAULT_LOCALIZATION_RESOURCE</default-localization-resource>" +
"<device-class-resolver>DEVICE_CLASS_RESOLVER</device-class-resolver>" +
"<locale-resolver>LOCALE_RESOLVER</locale-resolver>" +
"</menudata>";
final Document document = XMLDocumentFactory.create( xml ).getAsJDOMDocument();
final SiteEntity site = factory.createSite( "Times, The", new Date(), document, "en" );
save( site );
PortletEntity portlet = createPortlet( 11, "Portlet-1" );
portlet.setSite( site );
portlet.setStyleKey( ResourceKey.from( "CONTENT_OBJECT_STYLE" ) );
portlet.setBorderKey( ResourceKey.from( "CONTENT_OBJECT_BORDER" ) );
portlet.setXmlData( "<portlet/>" );
save( portlet );
PortletEntity pPortlet = portletDao.findByKey( 11 );
// PageTemplatePortlet
PageTemplatePortletEntity templatePortlet = new PageTemplatePortletEntity();
PageTemplatePortletKey templatePortletKey = new PageTemplatePortletKey( pPageTemplate.getKey(), pPortlet.getKey() );
templatePortlet.setKey( templatePortletKey );
templatePortlet.setPortlet( pPortlet );
templatePortlet.setPageTemplate( pPageTemplate );
templatePortlet.setPageTemplateRegion( pRegion1 );
templatePortlet.setTimestamp( new Date() );
save( templatePortlet );
PageTemplatePortletEntity pTemplatePortlet = pageTemplatePortletDao.findByKey( templatePortletKey );
pPageTemplate.addPageTemplatePortlet( pTemplatePortlet );
pPageTemplate.setDescription( "crocs" );
pPageTemplate.setXmlData( "<pagetemplatedata/>" );
save( pPageTemplate );
User adminUser = fixture.findUserByName( User.ROOT_UID );
CopyPageTemplateCommand command = new CopyPageTemplateCommand( pPageTemplate.getPageTemplateKey(), adminUser.getKey() );
pageTemplateService.copyPageTemplate( command );
List<PageTemplateEntity> list = pageTemplateDao.findByName( "my-template (copy)" );
PageTemplateEntity persisted = list.get( 0 );
assertNotNull( persisted );
// assertEquals( 1, persisted.getKey() );
assertEquals( "my-template (copy)", persisted.getName() );
assertEquals( "crocs", persisted.getDescription() );
assertEquals( PageTemplateType.SECTIONPAGE, persisted.getType() );
assertEquals( RunAsType.DEFAULT_USER, persisted.getRunAs() );
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 pSite = fixture.findSiteByName( "The Newspaper" );
assertEquals( pSite, persisted.getSite() );
assertEquals( "<pagetemplatedata/>", persisted.getXmlData().getDocumentAsString() );
Set<PageTemplateRegionEntity> regions = persisted.getPageTemplateRegions();
assertEquals( 2, regions.size() );
Iterator<PageTemplateRegionEntity> iterator = regions.iterator();
assertEquals( persisted, iterator.next().getPageTemplate() );
assertEquals( persisted, iterator.next().getPageTemplate() );
List<PageTemplatePortletEntity> portlets = persisted.getPortlets();
assertEquals( 1, portlets.size() );
PageTemplatePortletEntity portletEntity = portlets.get( 0 );
int pteKey = persisted.getKey();
assertEquals( new PageTemplatePortletKey( pteKey, 11 ), portletEntity.getKey() );
assertEquals( persisted, portletEntity.getPageTemplate() );
assertEquals( 11, portletEntity.getPortlet().getKey() );
assertEquals( "Portlet-1", portletEntity.getPortlet().getName() );
assertEquals( "leftColumn", portletEntity.getPageTemplateRegion().getName() );
Set<ContentTypeEntity> contentTypes = persisted.getContentTypes();
assertEquals( 3, contentTypes.size() );
List<String> names = new ArrayList<String>( contentTypes.size() );
for ( ContentTypeEntity cType : contentTypes )
{
names.add( cType.getName() );
}
assertUnorderedArrayArrayEquals( new String[]{"article", "document", "just-another-cty"}, names.toArray() );
}
private PageTemplateEntity createPageTemplate( String name, PageTemplateType type, String siteName, String... contentTypeNames )
{
PageTemplateEntity pageTemplate = factory.createPageTemplate( name, type, siteName, ResourceKey.from( "DUMMYKEY" ) );
Set<ContentTypeEntity> supportedContentTypes = new HashSet<ContentTypeEntity>();
for ( String contentTypeName : contentTypeNames )
{
supportedContentTypes.add( fixture.findContentTypeByName( contentTypeName ) );
}
pageTemplate.setContentTypes( supportedContentTypes );
return pageTemplate;
}
private PageTemplateRegionEntity createPageTemplateRegion( int key, String name, PageTemplateEntity pageTemplate )
{
PageTemplateRegionEntity i = new PageTemplateRegionEntity();
i.setKey( key );
i.setName( name );
i.setMultiple( true );
i.setOverride( true );
i.setSeparator( "dummySeparator" );
i.setPageTemplate( pageTemplate );
return i;
}
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;
}
private void save( Object object )
{
hibernateTemplate.save( object );
hibernateTemplate.flush();
}
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();
}
}