/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.itest.client;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.junit.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.orm.hibernate3.HibernateTemplate;
import com.enonic.cms.framework.xml.XMLDocumentFactory;
import com.enonic.cms.api.client.model.ImportContentsParams;
import com.enonic.cms.core.client.InternalClient;
import com.enonic.cms.core.content.ContentEntity;
import com.enonic.cms.core.content.ContentKey;
import com.enonic.cms.core.content.ContentService;
import com.enonic.cms.core.content.ContentVersionEntity;
import com.enonic.cms.core.content.binary.BinaryDataAndBinary;
import com.enonic.cms.core.content.command.CreateContentCommand;
import com.enonic.cms.core.content.contentdata.legacy.LegacyImageContentData;
import com.enonic.cms.core.content.contenttype.ContentHandlerName;
import com.enonic.cms.core.content.imports.ImportJobFactory;
import com.enonic.cms.core.security.PortalSecurityHolder;
import com.enonic.cms.core.security.user.UserEntity;
import com.enonic.cms.core.security.user.UserType;
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.ContentDao;
public abstract class AbstractInternalClientImpl_ImportContentTest
extends AbstractSpringTest
{
public static final String NORWEGIAN = "\u00c6\u00d8\u00c5\u00e6\u00f8\u00e5"; // AE, OE, AA, ae, oe, aa
public static final String CHINESE = "\u306d\u304e\u30de\u30e8\u713c\u304d";
public static final String AEC_ALL = "\u0082\u0083\u0084\u0085\u0086\u0087\u0089\u008a\u008b\u008c\u0091\u0092\u0093\u0094" +
"\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009f";
protected static final DateTimeFormatter FORMATTER = DateTimeFormat.forPattern( "yyyy.MM.dd HH:mm:ss" );
@Autowired
protected HibernateTemplate hibernateTemplate;
protected DomainFactory factory;
@Autowired
protected DomainFixture fixture;
@Autowired
protected ContentService contentService;
@Autowired
@Qualifier("localClient")
protected InternalClient internalClient;
@Autowired
protected ContentDao contentDao;
@Before
public void before()
throws IOException, JDOMException
{
ImportJobFactory.setExecuteInOneTransaction( true );
factory = fixture.getFactory();
fixture.initSystemData();
fixture.flushAndClearHibernateSession();
fixture.flushIndexTransaction();
}
protected void setupImport( final Document config )
{
fixture.createAndStoreUserAndUserGroup( "testuser", "testuser fullname", UserType.NORMAL, "testuserstore" );
fixture.createAndStoreUserAndUserGroup( "testuser2", "testuser2 fullname", UserType.NORMAL, "testuserstore" );
fixture.save( factory.createContentHandler( "Custom content", ContentHandlerName.CUSTOM.getHandlerClassShortName() ) );
fixture.save( factory.createContentType( "MyCustomContentType", ContentHandlerName.CUSTOM.getHandlerClassShortName(), config ) );
fixture.save( factory.createUnit( "MyCustomUnit", "en" ) );
fixture.save( factory.createCategory( "MyImportCategory", null, "MyCustomContentType", "MyCustomUnit", "testuser", "testuser" ) );
fixture.save( factory.createCategoryAccessForUser( "MyImportCategory", "testuser", "read, browse, create, approve" ) );
fixture.save( factory.createCategoryAccessForUser( "MyImportCategory", "testuser2", "read, browse, create, approve" ) );
fixture.flushAndClearHibernateSession();
fixture.flushIndexTransaction();
}
protected void setupImageCategory()
{
fixture.save( factory.createContentHandler( "Files", ContentHandlerName.FILE.getHandlerClassShortName() ) );
fixture.save(
factory.createContentType( "MyImageContentType", ContentHandlerName.FILE.getHandlerClassShortName(), getConfigImage() ) );
fixture.save( factory.createUnit( "MyFileUnit", "en" ) );
fixture.save( factory.createCategory( "MyImageCategory", null, "MyImageContentType", "MyFileUnit", "testuser", "testuser" ) );
fixture.save( factory.createCategoryAccessForUser( "MyImageCategory", "testuser", "read, browse, create, approve" ) );
}
protected void setupRelatedContentCategory()
{
fixture.save( factory.createContentType( "MyRelatedContentType", ContentHandlerName.CUSTOM.getHandlerClassShortName(),
getConfigRelatedContent() ) );
fixture.save( factory.createUnit( "MyRelatedContentUnit", "en" ) );
fixture.save( factory.createCategory( "MyRelatedContentCategory", null, "MyRelatedContentType", "MyRelatedContentUnit", "testuser",
"testuser" ) );
fixture.save( factory.createCategoryAccessForUser( "MyRelatedContentCategory", "testuser", "read, browse, create, approve" ) );
}
protected ContentKey setupImage()
{
return setupImage( "Image I" );
}
protected ContentKey setupImage( final String name )
{
final ContentEntity content = factory.createContent( "MyImageCategory", "en", "testuser", "0", new Date() );
final ContentVersionEntity version = factory.createContentVersion( "0", "testuser" );
final LegacyImageContentData contentData = new LegacyImageContentData( createImageContentDataDoc( name ) );
version.setContentData( contentData );
final UserEntity runningUser = fixture.findUserByName( "testuser" );
final CreateContentCommand createCommand = new CreateContentCommand();
createCommand.setCreator( runningUser );
createCommand.populateCommandWithContentValues( content );
createCommand.populateCommandWithContentVersionValues( version );
createCommand.setBinaryDatas( new ArrayList<BinaryDataAndBinary>() );
createCommand.setUseCommandsBinaryDataToAdd( true );
return contentService.createContent( createCommand );
}
protected ContentKey setupRelatedContent( final String name )
{
final ContentEntity content = factory.createContent( "MyRelatedContentCategory", "en", "testuser", "0", new Date() );
final ContentVersionEntity version = factory.createContentVersion( "0", "testuser" );
final LegacyImageContentData contentData = new LegacyImageContentData( createImageContentDataDoc( name ) );
version.setContentData( contentData );
final UserEntity runningUser = fixture.findUserByName( "testuser" );
final CreateContentCommand command = new CreateContentCommand();
command.setCreator( runningUser );
command.setPriority( 0 );
command.setCategory( fixture.findCategoryByName( "MyRelatedContentCategory" ) );
command.setLanguage( fixture.findLanguageByCode( "en" ) );
command.populateCommandWithContentValues( content );
command.populateCommandWithContentVersionValues( version );
command.setBinaryDatas( new ArrayList<BinaryDataAndBinary>() );
command.setUseCommandsBinaryDataToAdd( true );
return contentService.createContent( command );
}
private Document createImageContentDataDoc( final String name )
{
final Element contentdataEl = new Element( "contentdata" );
contentdataEl.addContent( new Element( "name" ).setText( name ) );
final Element imagesEl = new Element( "images" );
contentdataEl.addContent( imagesEl );
return new Document( contentdataEl );
}
protected void doImport( final String data )
throws Exception
{
doImport( data, "testuser", "MyImport" );
}
protected void doImport( final String data, final String userName, final String importName )
throws Exception
{
final Date publishFrom = FORMATTER.parseDateTime( "2001.01.02 03:04:05" ).toDate();
final Date publishTo = FORMATTER.parseDateTime( "2020.11.22 23:24:25" ).toDate();
doImport( data, userName, importName, publishFrom, publishTo );
}
protected void doImport( final String data, final String userName, final String importName, final Date publishFrom,
final Date publishTo )
throws Exception
{
final UserEntity runningUser = fixture.findUserByName( userName );
PortalSecurityHolder.setImpersonatedUser( runningUser.getKey() );
final ImportContentsParams importParams = new ImportContentsParams();
importParams.publishFrom = publishFrom;
importParams.publishTo = publishTo;
importParams.categoryKey = fixture.findCategoryByName( "MyImportCategory" ).getKey().toInt();
importParams.importName = importName;
importParams.data = data;
internalClient.importContents( importParams );
hibernateTemplate.clear();
}
private Document getConfigImage()
{
final StringBuilder config = new StringBuilder();
config.append( "<contenttype>" );
config.append( " <config>" );
config.append( " <sizes>" );
config.append( " <defaultcustom type=\"width\" value=\"310\"/>" );
config.append( " </sizes>" );
config.append( " </config>" );
config.append( " <indexparameters>" );
config.append( " <index xpath=\"contentdata/name\"/>" );
config.append( " </indexparameters>" );
config.append( "</contenttype>" );
return XMLDocumentFactory.create( config.toString() ).getAsJDOMDocument();
}
private Document getConfigRelatedContent()
{
final StringBuilder config = new StringBuilder();
config.append( "<contenttype>" );
config.append( " <config name=\"MyRelatedContentType\" version=\"1.0\">" );
config.append( " <form>" );
config.append( " <title name=\"name\"/>" );
config.append( " <block name=\"info\">" );
config.append( " <input name=\"name\" required=\"true\" type=\"text\">" );
config.append( " <display>Name</display>" );
config.append( " <xpath>contentdata/name</xpath>" );
config.append( " </input>" );
config.append( " </block>" );
config.append( " </form>" );
config.append( " </config>" );
config.append( " <indexparameters>" );
config.append( " <index xpath=\"contentdata/name\"/>" );
config.append( " </indexparameters>" );
config.append( "</contenttype>" );
return XMLDocumentFactory.create( config.toString() ).getAsJDOMDocument();
}
protected boolean contentKeyExistInContentCollection( Collection<ContentEntity> contents, ContentKey key )
{
if ( contents == null || key == null )
{
return false;
}
for ( ContentEntity content : contents )
{
if ( content.getKey().equals( key ) )
{
return true;
}
}
return false;
}
}