Task Form Processor now handles Webscript-safe version of task Id, where the $ is replaced by an _.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@21352 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
N Smith
2010-07-22 10:31:32 +00:00
parent 9ddf7d5857
commit 5d4cfd5ab0
5 changed files with 84 additions and 48 deletions

View File

@@ -20,15 +20,19 @@
package org.alfresco.repo.forms.processor.workflow;
import java.util.List;
import java.util.regex.Matcher;
import org.alfresco.repo.forms.Form;
import org.alfresco.repo.forms.FormData;
import org.alfresco.repo.forms.FormNotFoundException;
import org.alfresco.repo.forms.Item;
import org.alfresco.repo.forms.FormData.FieldData;
import org.alfresco.repo.forms.processor.FormCreationData;
import org.alfresco.repo.forms.processor.node.ContentModelFormProcessor;
import org.alfresco.repo.forms.processor.node.ItemData;
import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.util.ParameterCheck;
/**
* @author Nick Smith
@@ -71,6 +75,57 @@ public abstract class AbstractWorkflowFormProcessor<ItemType, PersistType> exten
this.workflowService = workflowService;
}
/*
* @see
* org.alfresco.repo.forms.processor.node.NodeFormProcessor#getTypedItem
* (org.alfresco.repo.forms.Item)
*/
@Override
protected ItemType getTypedItem(Item item)
{
try
{
ParameterCheck.mandatory("item", item);
String itemId = decodeId(item.getId());
return getTypedItemForDecodedId(itemId);
}
catch (Exception e)
{
throw new FormNotFoundException(item, e);
}
}
/**
* The itemId may be in a URL/Webscript-friendly format. If so it must be converted
* back to the proper id format.
*
* @param itemId
*/
private String decodeId(String itemId)
{
String decodedId = itemId;
if (itemId.contains("$")==false)
{
decodedId = itemId.replaceFirst("_", Matcher.quoteReplacement("$"));
}
return decodedId;
}
/**
* Returns an implementation of {@link ContentModelFormPersister} which is
* used to accumulate all the changes specified in the {@link Form} and then persist them.
*
* @param item
* @return
*/
protected abstract ContentModelFormPersister<PersistType> makeFormPersister(ItemType item);
/**
* Returns the typed item.
* @param itemId the decoded item Id.
* @return
*/
protected abstract ItemType getTypedItemForDecodedId(String itemId);
}

View File

@@ -30,7 +30,6 @@ import java.util.List;
import java.util.Map;
import org.alfresco.repo.forms.Form;
import org.alfresco.repo.forms.Item;
import org.alfresco.repo.forms.processor.FieldProcessorRegistry;
import org.alfresco.repo.forms.processor.FormCreationData;
import org.alfresco.repo.forms.processor.node.ItemData;
@@ -41,7 +40,6 @@ import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.ParameterCheck;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -69,12 +67,13 @@ public class TaskFormProcessor extends AbstractWorkflowFormProcessor<WorkflowTas
this.fieldProcessorRegistry = fieldProcessorRegistry;
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.AbstractWorkflowFormProcessor#getTypedItemForDecodedId(java.lang.String)
*/
@Override
protected WorkflowTask getTypedItem(Item item)
protected WorkflowTask getTypedItemForDecodedId(String itemId)
{
ParameterCheck.mandatory("item", item);
String id = item.getId();
WorkflowTask task = workflowService.getTaskById(id);
WorkflowTask task = workflowService.getTaskById(itemId);
return task;
}

View File

@@ -43,6 +43,7 @@ import junit.framework.TestCase;
import org.alfresco.repo.forms.FieldDefinition;
import org.alfresco.repo.forms.Form;
import org.alfresco.repo.forms.FormData;
import org.alfresco.repo.forms.FormNotFoundException;
import org.alfresco.repo.forms.Item;
import org.alfresco.repo.forms.FormData.FieldData;
import org.alfresco.repo.forms.processor.node.DefaultFieldProcessor;
@@ -77,7 +78,7 @@ import org.mockito.stubbing.Answer;
public class TaskFormProcessorTest extends TestCase
{
private static final String TASK_DEF_NAME = "TaskDef";
private static final String TASK_ID = "Real Id";
private static final String TASK_ID = "foo$Real Id";
private static final QName DESC_NAME = WorkflowModel.PROP_DESCRIPTION;
private static final QName STATUS_NAME = WorkflowModel.PROP_STATUS;
private static final QName PROP_WITH_ = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "some_prop");
@@ -104,7 +105,7 @@ public class TaskFormProcessorTest extends TestCase
processor.getTypedItem(null);
fail("Should have thrown an Exception here!");
}
catch (IllegalArgumentException e)
catch (FormNotFoundException e)
{
// Do nothing!
}
@@ -114,7 +115,7 @@ public class TaskFormProcessorTest extends TestCase
processor.getTypedItem(new Item("task", "bad id"));
fail("Should have thrown an Exception here!");
}
catch (WorkflowException e)
catch (FormNotFoundException e)
{
// Do nothing!
}
@@ -123,6 +124,12 @@ public class TaskFormProcessorTest extends TestCase
WorkflowTask result = processor.getTypedItem(item);
assertNotNull(result);
assertEquals(TASK_ID, result.id);
// Check URI-encoded id.
item = new Item("task", TASK_ID.replace('$', '_'));
result = processor.getTypedItem(item);
assertNotNull(result);
assertEquals(TASK_ID, result.id);
}
public void testGenerateSetsItemAndUrl() throws Exception

View File

@@ -21,14 +21,9 @@ package org.alfresco.repo.forms.processor.workflow;
import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
@@ -38,7 +33,6 @@ import org.alfresco.service.cmr.workflow.WorkflowInstance;
import org.alfresco.service.cmr.workflow.WorkflowPath;
import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
/**

View File

@@ -21,10 +21,7 @@ package org.alfresco.repo.forms.processor.workflow;
import java.io.Serializable;
import java.util.Collections;
import java.util.Map;
import java.util.regex.Matcher;
import org.alfresco.repo.forms.FormNotFoundException;
import org.alfresco.repo.forms.Item;
import org.alfresco.repo.forms.processor.node.ItemData;
import org.alfresco.service.cmr.dictionary.TypeDefinition;
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
@@ -112,25 +109,14 @@ public class WorkflowFormProcessor extends AbstractWorkflowFormProcessor<Workflo
}
/*
* (non-Javadoc)
*
* @see
* org.alfresco.repo.forms.processor.node.NodeFormProcessor#getTypedItem
* (org.alfresco.repo.forms.Item)
* org.alfresco.repo.forms.processor.workflow.AbstractWorkflowFormProcessor
* #getTypedItemForDecodedId(java.lang.String)
*/
@Override
protected WorkflowDefinition getTypedItem(Item item)
{
try
{
String itemId = item.getId();
return getWorkflowDefinitionForName(itemId);
}
catch (Exception e)
{
throw new FormNotFoundException(item, e);
}
}
private WorkflowDefinition getWorkflowDefinitionForName(String itemId)
protected WorkflowDefinition getTypedItemForDecodedId(String itemId)
{
String workflowDefName = decodeWorkflowDefinitionName(itemId);
WorkflowDefinition workflowDef = workflowService.getDefinitionByName(workflowDefName);
@@ -143,23 +129,18 @@ public class WorkflowFormProcessor extends AbstractWorkflowFormProcessor<Workflo
}
/**
* The itemId may be in a URL/Webscript-friendly format. If so it must be converted
* The <code>name</code> may be in a URL/Webscript-friendly format. If so it must be converted
* back to the proper workflow definition name.
*
* @param itemId
* @param name
* @return The decoded name
*/
private String decodeWorkflowDefinitionName(String itemId)
private String decodeWorkflowDefinitionName(String name)
{
String defName = itemId;
if (itemId.contains("$")==false)
if (name.contains(":")==false)
{
defName = itemId.replaceFirst("_", Matcher.quoteReplacement("$"));
name = name.replaceFirst("_", ":");
}
if (itemId.contains(":")==false)
{
defName = defName.replaceFirst("_", ":");
}
return defName;
return name;
}
/* (non-Javadoc)