/* * Copyright (C) 2005-2010 Alfresco Software Limited. * * This file is part of Alfresco * * Alfresco 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 3 of the License, or * (at your option) any later version. * * Alfresco 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 Alfresco. If not, see . */ package org.alfresco.repo.rendition.executer; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import org.alfresco.model.ContentModel; import org.alfresco.repo.content.transform.AbstractContentTransformerTest; import org.alfresco.repo.model.Repository; import org.alfresco.repo.rendition.RenditionDefinitionPersisterImpl; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.rendition.RenditionDefinition; import org.alfresco.service.cmr.rendition.RenditionService; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.namespace.QName; import org.alfresco.util.BaseAlfrescoSpringTest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Unit tests for the HTML Rendering Engine * * @author Nick Burch */ public class HTMLRenderingEngineTest extends BaseAlfrescoSpringTest { private final static Log log = LogFactory.getLog(HTMLRenderingEngineTest.class); private NodeRef companyHome; private DictionaryService dictionaryService; private RenditionService renditionService; private Repository repositoryHelper; private NodeRef sourceDoc; private NodeRef targetFolder; private String targetFolderPath; private RenditionDefinition def; private static final String MIMETYPE_DOC = "application/msword"; private static final String MIMETYPE_DOCX = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; /* * (non-Javadoc) * * @see org.alfresco.util.BaseAlfrescoSpringTest#onSetUpInTransaction() */ @SuppressWarnings("deprecation") @Override protected void onSetUpInTransaction() throws Exception { super.onSetUpInTransaction(); this.nodeService = (NodeService) this.applicationContext.getBean("NodeService"); this.contentService = (ContentService) this.applicationContext.getBean("ContentService"); this.renditionService = (RenditionService) this.applicationContext.getBean("RenditionService"); this.repositoryHelper = (Repository) this.applicationContext.getBean("repositoryHelper"); this.dictionaryService = (DictionaryService) this.applicationContext.getBean("dictionaryService"); this.companyHome = repositoryHelper.getCompanyHome(); createTargetFolder(); // Setup the basic rendition definition QName renditionName = QName.createQName("Test"); RenditionDefinition rd = renditionService.loadRenditionDefinition(renditionName); if(rd != null) { RenditionDefinitionPersisterImpl rdp = new RenditionDefinitionPersisterImpl(); rdp.setNodeService(nodeService); rdp.deleteRenditionDefinition(rd); } def = renditionService.createRenditionDefinition(renditionName, HTMLRenderingEngine.NAME); } @Override protected void onTearDownInTransaction() throws Exception { super.onTearDownInTransaction(); tidyUpSourceDoc(); } private void createTargetFolder() { // Set the current security context as admin AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName()); Map properties = new HashMap(); properties.put(ContentModel.PROP_NAME, "TestFolder"); targetFolder = nodeService.createNode( companyHome, ContentModel.ASSOC_CONTAINS, QName.createQName("TestFolder"), ContentModel.TYPE_FOLDER, properties ).getChildRef(); targetFolderPath = "/" + (String) nodeService.getProperty(companyHome, ContentModel.PROP_NAME) + "/" + (String) nodeService.getProperty(targetFolder, ContentModel.PROP_NAME) ; } private void tidyUpSourceDoc() { // Set the current security context as admin AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName()); // Clean up the source if(sourceDoc != null) { nodeService.deleteNode(sourceDoc); } // Clean up the target folder nodeService.deleteNode(targetFolder); targetFolder = null; // All done sourceDoc = null; createTargetFolder(); } private NodeRef createForDoc(String docname) throws IOException { // Create the node Map properties = new HashMap(); properties.put(ContentModel.PROP_NAME, docname); NodeRef node = nodeService.createNode( companyHome, ContentModel.ASSOC_CONTAINS, QName.createQName(docname), ContentModel.TYPE_CONTENT, properties ).getChildRef(); // Put the sample doc into it File f = AbstractContentTransformerTest.loadNamedQuickTestFile(docname); if(f == null) { fail("Unable to find test file for " + docname); } ContentWriter writer = contentService.getWriter( node, ContentModel.PROP_CONTENT, true ); if(docname.endsWith(".doc")) { writer.setMimetype(MIMETYPE_DOC); } if(docname.endsWith(".docx")) { writer.setMimetype(MIMETYPE_DOCX); } writer.putContent(f); if (log.isDebugEnabled()) { log.debug("Created document with name: " + docname + ", nodeRef: " + node + ", mimetype: " + writer.getMimetype()); } // All done return node; } public void testBasics() throws Exception { def.setParameterValue( RenditionService.PARAM_DESTINATION_PATH_TEMPLATE, targetFolderPath + "/${name}.html" ); sourceDoc = createForDoc("quick.doc"); ChildAssociationRef rendition = renditionService.render(sourceDoc, def); assertNotNull(rendition); // Check it was created NodeRef htmlNode = rendition.getChildRef(); assertEquals(true, nodeService.exists(htmlNode)); // Check it got the right name assertEquals( "quick.html", nodeService.getProperty(htmlNode, ContentModel.PROP_NAME) ); // Check it got the right contents ContentReader reader = contentService.getReader( htmlNode, ContentModel.PROP_CONTENT ); String html = reader.getContentString(); assertEquals("")); assertTrue("HTML wrong:\n"+html, html.contains("")); assertTrue("HTML wrong:\n"+html, html.contains("

The quick brown fox")); // Now do a body-only one, check that we still got the // contents, but not the html surround def.setParameterValue( HTMLRenderingEngine.PARAM_BODY_CONTENTS_ONLY, Boolean.TRUE ); rendition = renditionService.render(sourceDoc, def); assertNotNull(rendition); htmlNode = rendition.getChildRef(); assertEquals(true, nodeService.exists(htmlNode)); reader = contentService.getReader( htmlNode, ContentModel.PROP_CONTENT ); html = reader.getContentString(); assertEquals("")); assertFalse("Body wrong:\n"+html, html.contains("")); assertTrue("HTML wrong:\n"+html, html.contains("

The quick brown fox")); assertTrue("HTML wrong:\n"+html, html.contains("

")); } /** * Test for a .doc and a .docx, neither of which have images */ public void testDocWithoutImages() throws Exception { def.setParameterValue( RenditionService.PARAM_DESTINATION_PATH_TEMPLATE, targetFolderPath + "/${name}.html" ); for(String name : new String[] {"quick.doc","quick.docx"}) { sourceDoc = createForDoc(name); int numItemsStart = nodeService.getChildAssocs(targetFolder).size(); ChildAssociationRef rendition = renditionService.render(sourceDoc, def); assertNotNull(rendition); // Check it was created NodeRef htmlNode = rendition.getChildRef(); assertEquals(true, nodeService.exists(htmlNode)); // Check it got the right name assertEquals( name.substring(0, name.lastIndexOf('.')) + ".html", nodeService.getProperty(htmlNode, ContentModel.PROP_NAME) ); // Check it ended up in the right place assertEquals( "Should have been in " + targetFolderPath + " but was in" + nodeService.getPath(htmlNode), targetFolder, nodeService.getPrimaryParent(htmlNode).getParentRef() ); // Check it got the right contents ContentReader reader = contentService.getReader( htmlNode, ContentModel.PROP_CONTENT ); String html = reader.getContentString(); assertEquals("