diff --git a/source/java/org/alfresco/repo/rendition/RenditionNodeManager.java b/source/java/org/alfresco/repo/rendition/RenditionNodeManager.java
index d1981f2f03..6c4cee2da2 100644
--- a/source/java/org/alfresco/repo/rendition/RenditionNodeManager.java
+++ b/source/java/org/alfresco/repo/rendition/RenditionNodeManager.java
@@ -65,7 +65,7 @@ public class RenditionNodeManager
public ChildAssociationRef findOrCreateRenditionNode()
{
QName renditionName = renditionDefinition.getRenditionName();
- // If no rendition already exists create anew rendition node and
+ // If no rendition already exists create a new rendition node and
// association.
if (oldRendition == null)
{
@@ -94,7 +94,9 @@ public class RenditionNodeManager
private ChildAssociationRef moveRendition(QName associationName)
{
- return nodeService.moveNode(oldRendition, location.getParentRef(), ContentModel.ASSOC_CONTAINS, associationName);
+ NodeRef parent = location.getParentRef();
+ QName assocType = sourceNode.equals(parent) ? RenditionModel.ASSOC_RENDITION : ContentModel.ASSOC_CONTAINS;
+ return nodeService.moveNode(oldRendition, parent, assocType, associationName);
}
private void orphanRendition(QNamePattern renditionName)
diff --git a/source/java/org/alfresco/repo/rendition/RenditionNodeManagerTest.java b/source/java/org/alfresco/repo/rendition/RenditionNodeManagerTest.java
new file mode 100644
index 0000000000..b90cb7816e
--- /dev/null
+++ b/source/java/org/alfresco/repo/rendition/RenditionNodeManagerTest.java
@@ -0,0 +1,214 @@
+/*
+ * 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;
+
+import static org.mockito.Mockito.*;
+
+import org.alfresco.model.ContentModel;
+import org.alfresco.model.RenditionModel;
+import org.alfresco.repo.security.authentication.AuthenticationUtil;
+import org.alfresco.service.cmr.rendition.RenditionDefinition;
+import org.alfresco.service.cmr.repository.ChildAssociationRef;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.cmr.repository.NodeService;
+import org.alfresco.service.cmr.security.AuthenticationService;
+import org.alfresco.service.namespace.NamespaceService;
+import org.alfresco.service.namespace.QName;
+
+import com.sun.tools.xjc.reader.gbind.SourceNode;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Nick Smith
+ */
+public class RenditionNodeManagerTest extends TestCase
+{
+ private final NodeService nodeService = mock(NodeService.class);
+
+ private final NodeRef source = new NodeRef("http://test/sourceId");
+ private final NodeRef destination = new NodeRef("http://test/destinationId");
+ private final NodeRef oldRendition = new NodeRef("http://test/oldRenditionId");
+
+ private final QName renditionName = QName.createQName(NamespaceService.RENDITION_MODEL_1_0_URI, "renditionName");
+ private final RenditionDefinition definition = new RenditionDefinitionImpl("definitionId", renditionName, "engineName" );
+
+ // Check findOrCreateRenditionNode() works when there is
+ // no old rendition and a destination node is specified and
+ public void testNoOldRenditionAndDestinationSpecified()
+ {
+ ChildAssociationRef parentAssoc = makeAssoc(source, destination, true);
+ when(nodeService.getPrimaryParent(any(NodeRef.class))).thenReturn(parentAssoc);
+ RenditionLocation location = new RenditionLocationImpl(source, destination, "destinationName");
+ RenditionNodeManager manager = new RenditionNodeManager(source, null, location, definition, nodeService);
+ ChildAssociationRef result = manager.findOrCreateRenditionNode();
+ assertEquals(parentAssoc, result);
+ }
+
+ // Check findOrCreateRenditionNode() works when there is
+ // no old rendition and a destination node is not specified.
+ // the parent node is the source node.
+ public void testNoOldRenditionAndNoDestinationSpecifiedAndParentIsSource()
+ {
+ ChildAssociationRef parentAssoc = makeAssoc(source, destination, true);
+ when(nodeService.createNode(source, RenditionModel.ASSOC_RENDITION, renditionName, ContentModel.TYPE_CONTENT))
+ .thenReturn(parentAssoc);
+
+ RenditionLocation location = new RenditionLocationImpl(source, null, renditionName.getLocalName());
+ RenditionNodeManager manager = new RenditionNodeManager(source, null, location, definition, nodeService);
+ ChildAssociationRef result = manager.findOrCreateRenditionNode();
+ assertEquals(parentAssoc, result);
+ }
+
+ // Check findOrCreateRenditionNode() works when there is
+ // no old rendition and a destination node is not specified.
+ // the parent node is not the source node.
+ public void testNoOldRenditionAndNoDestinationSpecifiedAndParentIsNotSource()
+ {
+ NodeRef parent = new NodeRef("http://test/parentId");
+ ChildAssociationRef parentAssoc = makeAssoc(parent, destination, false);
+ when(nodeService.createNode(parent, ContentModel.ASSOC_CONTAINS, renditionName, ContentModel.TYPE_CONTENT))
+ .thenReturn(parentAssoc);
+
+ RenditionLocation location = new RenditionLocationImpl(parent, null, renditionName.getLocalName());
+ RenditionNodeManager manager = new RenditionNodeManager(source, null, location, definition, nodeService);
+ ChildAssociationRef result = manager.findOrCreateRenditionNode();
+ assertEquals(parentAssoc, result);
+ // Check the rendition association is created.
+ verify(nodeService).addChild(source, destination, RenditionModel.ASSOC_RENDITION, renditionName);
+ }
+
+ // Check findOrCreateRenditionNode() works when there is
+ // an old rendition which is specified as the destination
+ // node in the location.
+ public void testHasOldRenditionMatchesSpecifiedDestinationNode()
+ {
+ RenditionLocation location = new RenditionLocationImpl(source, oldRendition, renditionName.getLocalName());
+ RenditionNodeManager manager = new RenditionNodeManager(source, oldRendition, location, definition, nodeService);
+ manager.findOrCreateRenditionNode();
+ verify(nodeService).getPrimaryParent(oldRendition);
+ }
+
+ // Check findOrCreateRenditionNode() works when there is
+ // an old rendition which has the specified parent folder.
+ // If no name is specified and the parent folder is correct then the location should match.
+ public void testHasOldRenditionCorrectParentNoNameSpecified()
+ {
+ NodeRef parent = new NodeRef("http://test/parentId");
+ ChildAssociationRef parentAssoc = makeAssoc(parent, oldRendition, false);
+ when(nodeService.getPrimaryParent(oldRendition)).thenReturn(parentAssoc);
+
+ RenditionLocation location = new RenditionLocationImpl(parent, null, null);
+ RenditionNodeManager manager = new RenditionNodeManager(source, oldRendition, location, definition, nodeService);
+ ChildAssociationRef result = manager.findOrCreateRenditionNode();
+ assertEquals(parentAssoc, result);
+ verify(nodeService, times(2)).getPrimaryParent(oldRendition);
+ }
+
+ // Check findOrCreateRenditionNode() works when there is
+ // an old rendition which has the specified parent folder.
+ // If the correct name is specified and the parent folder is correct then the location should match.
+ public void testHasOldRenditionCorrectParentCorrectNameSpecified()
+ {
+ String rendName = "Rendition Name";
+ NodeRef parent = new NodeRef("http://test/parentId");
+ ChildAssociationRef parentAssoc = makeAssoc(parent, oldRendition, false);
+ when(nodeService.getPrimaryParent(oldRendition)).thenReturn(parentAssoc);
+ when(nodeService.getProperty(oldRendition,ContentModel.PROP_NAME ))
+ .thenReturn(rendName);
+
+ RenditionLocationImpl location = new RenditionLocationImpl(parent, null, rendName);
+ RenditionNodeManager manager = new RenditionNodeManager(source, oldRendition, location, definition, nodeService);
+ ChildAssociationRef result = manager.findOrCreateRenditionNode();
+ assertEquals(parentAssoc, result);
+ verify(nodeService, times(2)).getPrimaryParent(oldRendition);
+ }
+
+ // Check findOrCreateRenditionNode() works when there is
+ // an old rendition which has the wrong parent folder.
+ public void testHasOldRenditionWrongParentSpecified()
+ {
+ NodeRef parent = new NodeRef("http://test/parentId");
+ ChildAssociationRef parentAssoc = makeAssoc(parent, oldRendition, false);
+ ChildAssociationRef sourceAssoc = makeAssoc(source, oldRendition, true);
+
+ // The old rendition is under the source node but should be under parent node.
+ when(nodeService.getPrimaryParent(oldRendition)).thenReturn(sourceAssoc);
+ when(nodeService.moveNode(oldRendition, parent, ContentModel.ASSOC_CONTAINS, renditionName))
+ .thenReturn(parentAssoc);
+ RenditionLocationImpl location = new RenditionLocationImpl(parent, null, null);
+ RenditionNodeManager manager = new RenditionNodeManager(source, oldRendition, location, definition, nodeService);
+ ChildAssociationRef result = manager.findOrCreateRenditionNode();
+ assertEquals(parentAssoc, result);
+ verify(nodeService).moveNode(oldRendition, parent, ContentModel.ASSOC_CONTAINS, renditionName);
+
+ // The old rendition is under the parent node but should be under the source node.
+ when(nodeService.getPrimaryParent(oldRendition)).thenReturn(parentAssoc);
+ when(nodeService.moveNode(oldRendition, source, RenditionModel.ASSOC_RENDITION, renditionName))
+ .thenReturn(sourceAssoc);
+ location = new RenditionLocationImpl(source, null, null);
+ manager = new RenditionNodeManager(source, oldRendition, location, definition, nodeService);
+ result = manager.findOrCreateRenditionNode();
+ assertEquals(sourceAssoc, result);
+ verify(nodeService).moveNode(oldRendition, source, RenditionModel.ASSOC_RENDITION, renditionName);
+
+ // The old rendition is under the parent node but should be under the new parent node.
+ NodeRef newParent = new NodeRef("http://test/newParentId");
+ ChildAssociationRef newParentAssoc = makeAssoc(newParent, oldRendition, false);
+ AuthenticationService s=null;
+
+ when(nodeService.getPrimaryParent(oldRendition)).thenReturn(parentAssoc);
+ when(nodeService.moveNode(oldRendition, newParent, ContentModel.ASSOC_CONTAINS, renditionName))
+ .thenReturn(newParentAssoc);
+ location = new RenditionLocationImpl(newParent, null, null);
+ manager = new RenditionNodeManager(source, oldRendition, location, definition, nodeService);
+ result = manager.findOrCreateRenditionNode();
+ assertEquals(newParentAssoc, result);
+ verify(nodeService).moveNode(oldRendition, newParent, ContentModel.ASSOC_CONTAINS, renditionName);
+ }
+
+ // Check findOrCreateRenditionNode() works when there is
+ // an old rendition which has the correct parent folder
+ // but the wrong name
+ public void testHasOldRenditionCorrectParentWrongNameSpecified()
+ {
+ NodeRef parent = new NodeRef("http://test/parentId");
+ ChildAssociationRef parentAssoc = makeAssoc(parent, oldRendition, false);
+
+ when(nodeService.getPrimaryParent(oldRendition)).thenReturn(parentAssoc);
+ when(nodeService.moveNode(oldRendition, parent, ContentModel.ASSOC_CONTAINS, renditionName))
+ .thenReturn(parentAssoc);
+ when(nodeService.getProperty(oldRendition, ContentModel.PROP_NAME))
+ .thenReturn("oldName");
+
+ String newName = "newName";
+ RenditionLocationImpl location = new RenditionLocationImpl(parent, null, newName);
+ RenditionNodeManager manager = new RenditionNodeManager(source, oldRendition, location, definition, nodeService);
+ ChildAssociationRef result = manager.findOrCreateRenditionNode();
+ assertEquals(parentAssoc, result);
+ verify(nodeService).moveNode(oldRendition, parent, ContentModel.ASSOC_CONTAINS, renditionName);
+ }
+
+ private ChildAssociationRef makeAssoc(NodeRef parent, NodeRef child, boolean isRenditionAssoc)
+ {
+ QName assocType= isRenditionAssoc? RenditionModel.ASSOC_RENDITION : ContentModel.ASSOC_CONTAINS;
+ return new ChildAssociationRef(assocType, parent, renditionName, child);
+ }
+}
diff --git a/source/java/org/alfresco/repo/rendition/executer/AbstractRenderingEngine.java b/source/java/org/alfresco/repo/rendition/executer/AbstractRenderingEngine.java
index cad35e4b50..add487447d 100644
--- a/source/java/org/alfresco/repo/rendition/executer/AbstractRenderingEngine.java
+++ b/source/java/org/alfresco/repo/rendition/executer/AbstractRenderingEngine.java
@@ -51,6 +51,8 @@ import org.alfresco.util.GUID;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import com.sun.star.lang.NullPointerException;
+
/**
* This class adds some new behaviour to the standard ActionExecuterAbstractBase
* in order to support the RenditionService.
@@ -450,8 +452,10 @@ public abstract class AbstractRenderingEngine extends ActionExecuterAbstractBase
return null;
else
{
+ if(clazz == null)
+ throw new RenditionServiceException("The class must not be null!", new NullPointerException());
Class extends Serializable> valueClass = value.getClass();
- if (!valueClass.isAssignableFrom(clazz))
+ if ( !valueClass.isAssignableFrom(clazz))
{
throw new RenditionServiceException("The parameter: " + paramName + " must be of type: "
+ clazz.getName() + "but was of type: " + valueClass.getName());
@@ -476,6 +480,8 @@ public abstract class AbstractRenderingEngine extends ActionExecuterAbstractBase
@SuppressWarnings("unchecked")
public static T getParamWithDefault(String paramName, T defaultValue, RenditionDefinition definition)
{
+ if(defaultValue == null)
+ throw new RenditionServiceException("The defaultValue cannot be null!", new NullPointerException());
Class extends T> clazz = (Class extends T>) defaultValue.getClass();
T result = getCheckedParam(paramName, clazz, definition);
if (result == null)
diff --git a/source/java/org/alfresco/repo/rendition/executer/AbstractRenderingEngineTest.java b/source/java/org/alfresco/repo/rendition/executer/AbstractRenderingEngineTest.java
index 9a8c08bbe1..f006f874af 100644
--- a/source/java/org/alfresco/repo/rendition/executer/AbstractRenderingEngineTest.java
+++ b/source/java/org/alfresco/repo/rendition/executer/AbstractRenderingEngineTest.java
@@ -18,7 +18,12 @@
*/
package org.alfresco.repo.rendition.executer;
-import static org.mockito.Mockito.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyMap;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import java.io.Serializable;
import java.util.Map;
@@ -26,25 +31,26 @@ import java.util.Map;
import junit.framework.TestCase;
import org.alfresco.model.ContentModel;
+import org.alfresco.repo.action.ActionImpl;
import org.alfresco.repo.action.executer.ActionExecuter;
import org.alfresco.repo.rendition.RenditionDefinitionImpl;
import org.alfresco.repo.rendition.executer.AbstractRenderingEngine.RenderingContext;
import org.alfresco.service.cmr.rendition.RenditionDefinition;
import org.alfresco.service.cmr.rendition.RenditionService;
+import org.alfresco.service.cmr.rendition.RenditionServiceException;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.namespace.QName;
import org.mockito.ArgumentCaptor;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
/**
* @author Nick Smith
*/
public class AbstractRenderingEngineTest extends TestCase
{
+ private final NodeRef source = new NodeRef("http://test/sourceId");
private ContentService contentService;
private NodeService nodeService;
private TestRenderingEngine engine;
@@ -55,43 +61,24 @@ public class AbstractRenderingEngineTest extends TestCase
super.setUp();
this.contentService = mock(ContentService.class);
- NodeService nodeService1 = makeNodeService();
- this.nodeService = nodeService1;
+ this.nodeService = mock(NodeService.class);
engine = new TestRenderingEngine();
engine.setContentService(contentService);
engine.setNodeService(nodeService);
}
- /**
- * Creates a mock node service which fails with a helpful message by default if createNode is called.
- * @return
- */
- private NodeService makeNodeService()
- {
- NodeService nodeService1 = mock(NodeService.class);
- return nodeService1;
- }
@SuppressWarnings("unchecked")
public void testCreateRenditionNodeAssoc() throws Exception
{
- NodeRef source = new NodeRef("http://test/sourceId");
when(nodeService.exists(source)).thenReturn(true);
-
- QName assocType = ContentModel.ASSOC_CONTAINS;
- QName assocName = QName.createQName("url", "renditionName");
QName nodeType = ContentModel.TYPE_CONTENT;
- ChildAssociationRef renditionAssoc = mock(ChildAssociationRef.class);
+ ChildAssociationRef renditionAssoc = makeRenditionAssoc();
+ RenditionDefinition definition = makeRenditionDefinition(renditionAssoc);
- // Set up the rendition definition.
- String id = "definitionId";
- RenditionDefinition definition = new RenditionDefinitionImpl(id, assocName, TestRenderingEngine.NAME);
- definition.setRenditionAssociationType(assocType);
- definition.setRenditionParent(source);
-
+ QName assocType = renditionAssoc.getTypeQName();
// Stub the createNode() method to return renditionAssoc.
- when(nodeService
- .createNode(eq(source), eq(assocType), any(QName.class), any(QName.class), anyMap()))
+ when(nodeService.createNode(eq(source), eq(assocType), any(QName.class), any(QName.class), anyMap()))
.thenReturn(renditionAssoc);
engine.execute(definition, source);
@@ -102,16 +89,17 @@ public class AbstractRenderingEngineTest extends TestCase
Map props = captor.getValue();
// Check the node name is set to match teh rendition name local name.
- assertEquals(assocName.getLocalName(), props.get(ContentModel.PROP_NAME));
-
+ assertEquals(renditionAssoc.getQName().getLocalName(), props.get(ContentModel.PROP_NAME));
+
// Check content property name defaults to cm:content
assertEquals(ContentModel.PROP_CONTENT, props.get(ContentModel.PROP_CONTENT_PROPERTY_NAME));
- // Check the returned result is the association created by the call to nodeServcie.createNode().
+ // Check the returned result is the association created by the call to
+ // nodeServcie.createNode().
Serializable result = definition.getParameterValue(ActionExecuter.PARAM_RESULT);
- assertEquals("The returned rendition association is not the one created by the node service!",
- renditionAssoc, result);
-
+ assertEquals("The returned rendition association is not the one created by the node service!", renditionAssoc,
+ result);
+
// Check that setting the default content property and default node type
// on the rendition engine works.
nodeType = QName.createQName("url", "someNodeType");
@@ -120,7 +108,7 @@ public class AbstractRenderingEngineTest extends TestCase
engine.setDefaultRenditionNodeType(nodeType.toString());
engine.execute(definition, source);
verify(nodeService).createNode(eq(source), eq(assocType), any(QName.class), eq(nodeType), captor.capture());
- props=captor.getValue();
+ props = captor.getValue();
assertEquals(contentPropName, props.get(ContentModel.PROP_CONTENT_PROPERTY_NAME));
// Check that settign the rendition node type param works.
@@ -130,15 +118,184 @@ public class AbstractRenderingEngineTest extends TestCase
definition.setParameterValue(AbstractRenderingEngine.PARAM_TARGET_CONTENT_PROPERTY, contentPropName);
engine.execute(definition, source);
verify(nodeService).createNode(eq(source), eq(assocType), any(QName.class), eq(nodeType), captor.capture());
- props=captor.getValue();
+ props = captor.getValue();
assertEquals(contentPropName, props.get(ContentModel.PROP_CONTENT_PROPERTY_NAME));
}
+ public void testCheckActionIsRenditionDefinition()
+ {
+ ActionImpl action = new ActionImpl(null, "actionId", TestRenderingEngine.NAME);
+ try
+ {
+ engine.executeImpl(action, source);
+ fail("Should have thrown an exception here!");
+ } catch(RenditionServiceException e)
+ {
+ String expMsg = "02160000 Cannot execute action as it is not a RenditionDefinition: Action[ id=actionId, node=null ]";
+ assertEquals(expMsg, e.getMessage());
+ }
+ }
+
+ public void testCheckSourceNodeExists()
+ {
+ when(nodeService.exists(any(NodeRef.class))).thenReturn(false);
+ RenditionDefinitionImpl definition = new RenditionDefinitionImpl("id", null, TestRenderingEngine.NAME);
+ try
+ {
+ engine.executeImpl(definition, source);
+ fail("Should have thrown an exception here!");
+ } catch(RenditionServiceException e)
+ {
+ String expMsg = "02160001 Cannot execute action as node does not exist: http://test/sourceId";
+ assertEquals(expMsg, e.getMessage());
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testRenderingContext()
+ {
+ when(nodeService.exists(source)).thenReturn(true);
+ ChildAssociationRef renditionAssoc = makeRenditionAssoc();
+ RenditionDefinition definition = makeRenditionDefinition(renditionAssoc);
+ // Stub the createNode() method to return renditionAssoc.
+ when(nodeService.createNode(eq(source), eq(renditionAssoc.getTypeQName()), any(QName.class), any(QName.class), anyMap()))
+ .thenReturn(renditionAssoc);
+ engine.execute(definition, source);
+
+ RenderingContext context = engine.getContext();
+ assertEquals(definition, context.getDefinition());
+ assertEquals(renditionAssoc.getChildRef(), context.getDestinationNode());
+ assertEquals(source, context.getSourceNode());
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testGetParameterWithDefault()
+ {
+ when(nodeService.exists(source)).thenReturn(true);
+ ChildAssociationRef renditionAssoc = makeRenditionAssoc();
+ RenditionDefinition definition = makeRenditionDefinition(renditionAssoc);
+ // Stub the createNode() method to return renditionAssoc.
+ when(nodeService.createNode(eq(source), eq(renditionAssoc.getTypeQName()), any(QName.class), any(QName.class), anyMap()))
+ .thenReturn(renditionAssoc);
+ engine.executeImpl(definition, source);
+ RenderingContext context = engine.getContext();
+
+ // Check default value works.
+ String paramName = "Some-param";
+ String defaultValue = "default";
+ Object result = context.getParamWithDefault(paramName, defaultValue);
+ assertEquals(defaultValue, result);
+
+ // Check specific value overrides default.
+ String value = "value";
+ definition.setParameterValue(paramName, value);
+ engine.executeImpl(definition, source);
+ context = engine.getContext();
+ result = context.getParamWithDefault(paramName, defaultValue);
+ assertEquals(value, result);
+
+ // Check null default value throws exception.
+ try
+ {
+ result = context.getParamWithDefault(paramName, null);
+ fail("Should throw an Exception if default value is null!");
+ } catch(RenditionServiceException e)
+ {
+ String msg = "02160002 The defaultValue cannot be null!";
+ assertEquals(msg, e.getMessage());
+ }
+
+ // Check wrong type of default value throws exception.
+ try
+ {
+ result = context.getParamWithDefault(paramName, Boolean.TRUE);
+ fail("Should throw an exception if default value is of incoorect type!");
+ } catch (RenditionServiceException e)
+ {
+ String msg = "02160003 The parameter: Some-param must be of type: java.lang.Booleanbut was of type: java.lang.String";
+ assertEquals(msg, e.getMessage());
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testGetCheckedParameter()
+ {
+ when(nodeService.exists(source)).thenReturn(true);
+ ChildAssociationRef renditionAssoc = makeRenditionAssoc();
+ RenditionDefinition definition = makeRenditionDefinition(renditionAssoc);
+ // Stub the createNode() method to return renditionAssoc.
+ when(nodeService.createNode(eq(source), eq(renditionAssoc.getTypeQName()), any(QName.class), any(QName.class), anyMap()))
+ .thenReturn(renditionAssoc);
+ engine.executeImpl(definition, source);
+ RenderingContext context = engine.getContext();
+ String paramName = "Some param";
+
+ // Check returns null by default.
+ String result = context.getCheckedParam(paramName, String.class);
+ assertNull(result);
+
+ // Check can set a value to return.
+ String value = "value";
+ definition.setParameterValue(paramName, value);
+ engine.executeImpl(definition, source);
+ context = engine.getContext();
+ result = context.getCheckedParam(paramName, String.class);
+ assertEquals(value, result);
+
+ // Check throws an exception if value is of wrong type.
+ try
+ {
+ context.getCheckedParam(paramName, Boolean.class);
+ fail("Should throw an exception if type is wrong!");
+ } catch(RenditionServiceException e)
+ {
+ String msg = "02160004 The parameter: Some param must be of type: java.lang.Booleanbut was of type: java.lang.String";
+ assertEquals(msg, e.getMessage());
+ }
+
+ // Check throws an exception if value is of wrong type.
+ try
+ {
+ context.getCheckedParam(paramName, null);
+ fail("Should throw an exception if type is wrong!");
+ } catch(RenditionServiceException e)
+ {
+ String msg = "02160005 The class must not be null!";
+ assertEquals(msg, e.getMessage());
+ }
+ }
+
+ /**
+ * Set up the rendition definition.
+ * @param renditionAssoc
+ * @return
+ */
+ private RenditionDefinition makeRenditionDefinition(ChildAssociationRef renditionAssoc)
+ {
+ String id = "definitionId";
+ RenditionDefinition definition = new RenditionDefinitionImpl(id, renditionAssoc.getQName(), TestRenderingEngine.NAME);
+ definition.setRenditionAssociationType(renditionAssoc.getTypeQName());
+ definition.setRenditionParent(source);
+ return definition;
+ }
+
+ /**
+ * Create the rendition association and destination node.
+ */
+ private ChildAssociationRef makeRenditionAssoc()
+ {
+
+ QName assocType = ContentModel.ASSOC_CONTAINS;
+ QName assocName = QName.createQName("url", "renditionName");
+ NodeRef destination = new NodeRef("http://test/destinationId");
+ return new ChildAssociationRef(assocType, source, assocName, destination);
+ }
+
private static class TestRenderingEngine extends AbstractRenderingEngine
{
- private RenderingContext context;
-
public static String NAME = "Test";
+
+ private RenderingContext context;
@Override
protected void render(RenderingContext context1)