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; package org.alfresco.repo.forms.processor.workflow;
import java.util.List; import java.util.List;
import java.util.regex.Matcher;
import org.alfresco.repo.forms.Form; import org.alfresco.repo.forms.Form;
import org.alfresco.repo.forms.FormData; 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.FormData.FieldData;
import org.alfresco.repo.forms.processor.FormCreationData; import org.alfresco.repo.forms.processor.FormCreationData;
import org.alfresco.repo.forms.processor.node.ContentModelFormProcessor; import org.alfresco.repo.forms.processor.node.ContentModelFormProcessor;
import org.alfresco.repo.forms.processor.node.ItemData; import org.alfresco.repo.forms.processor.node.ItemData;
import org.alfresco.repo.workflow.WorkflowModel; import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.service.cmr.workflow.WorkflowService; import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.util.ParameterCheck;
/** /**
* @author Nick Smith * @author Nick Smith
@@ -71,6 +75,57 @@ public abstract class AbstractWorkflowFormProcessor<ItemType, PersistType> exten
this.workflowService = workflowService; 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); 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 java.util.Map;
import org.alfresco.repo.forms.Form; 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.FieldProcessorRegistry;
import org.alfresco.repo.forms.processor.FormCreationData; import org.alfresco.repo.forms.processor.FormCreationData;
import org.alfresco.repo.forms.processor.node.ItemData; 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.cmr.workflow.WorkflowTask;
import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.util.ParameterCheck;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
@@ -69,12 +67,13 @@ public class TaskFormProcessor extends AbstractWorkflowFormProcessor<WorkflowTas
this.fieldProcessorRegistry = fieldProcessorRegistry; this.fieldProcessorRegistry = fieldProcessorRegistry;
} }
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.AbstractWorkflowFormProcessor#getTypedItemForDecodedId(java.lang.String)
*/
@Override @Override
protected WorkflowTask getTypedItem(Item item) protected WorkflowTask getTypedItemForDecodedId(String itemId)
{ {
ParameterCheck.mandatory("item", item); WorkflowTask task = workflowService.getTaskById(itemId);
String id = item.getId();
WorkflowTask task = workflowService.getTaskById(id);
return task; return task;
} }

View File

@@ -43,6 +43,7 @@ import junit.framework.TestCase;
import org.alfresco.repo.forms.FieldDefinition; import org.alfresco.repo.forms.FieldDefinition;
import org.alfresco.repo.forms.Form; import org.alfresco.repo.forms.Form;
import org.alfresco.repo.forms.FormData; import org.alfresco.repo.forms.FormData;
import org.alfresco.repo.forms.FormNotFoundException;
import org.alfresco.repo.forms.Item; import org.alfresco.repo.forms.Item;
import org.alfresco.repo.forms.FormData.FieldData; import org.alfresco.repo.forms.FormData.FieldData;
import org.alfresco.repo.forms.processor.node.DefaultFieldProcessor; import org.alfresco.repo.forms.processor.node.DefaultFieldProcessor;
@@ -77,7 +78,7 @@ import org.mockito.stubbing.Answer;
public class TaskFormProcessorTest extends TestCase public class TaskFormProcessorTest extends TestCase
{ {
private static final String TASK_DEF_NAME = "TaskDef"; 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 DESC_NAME = WorkflowModel.PROP_DESCRIPTION;
private static final QName STATUS_NAME = WorkflowModel.PROP_STATUS; 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"); 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); processor.getTypedItem(null);
fail("Should have thrown an Exception here!"); fail("Should have thrown an Exception here!");
} }
catch (IllegalArgumentException e) catch (FormNotFoundException e)
{ {
// Do nothing! // Do nothing!
} }
@@ -114,7 +115,7 @@ public class TaskFormProcessorTest extends TestCase
processor.getTypedItem(new Item("task", "bad id")); processor.getTypedItem(new Item("task", "bad id"));
fail("Should have thrown an Exception here!"); fail("Should have thrown an Exception here!");
} }
catch (WorkflowException e) catch (FormNotFoundException e)
{ {
// Do nothing! // Do nothing!
} }
@@ -123,6 +124,12 @@ public class TaskFormProcessorTest extends TestCase
WorkflowTask result = processor.getTypedItem(item); WorkflowTask result = processor.getTypedItem(item);
assertNotNull(result); assertNotNull(result);
assertEquals(TASK_ID, result.id); 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 public void testGenerateSetsItemAndUrl() throws Exception

View File

@@ -21,14 +21,9 @@ package org.alfresco.repo.forms.processor.workflow;
import java.io.Serializable; import java.io.Serializable;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; 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.repo.workflow.WorkflowModel;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService; 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.WorkflowPath;
import org.alfresco.service.cmr.workflow.WorkflowService; import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.cmr.workflow.WorkflowTask; import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName; 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.io.Serializable;
import java.util.Collections; import java.util.Collections;
import java.util.Map; 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.repo.forms.processor.node.ItemData;
import org.alfresco.service.cmr.dictionary.TypeDefinition; import org.alfresco.service.cmr.dictionary.TypeDefinition;
import org.alfresco.service.cmr.workflow.WorkflowDefinition; import org.alfresco.service.cmr.workflow.WorkflowDefinition;
@@ -110,27 +107,16 @@ public class WorkflowFormProcessor extends AbstractWorkflowFormProcessor<Workflo
{ {
return logger; return logger;
} }
/* /*
* (non-Javadoc)
*
* @see * @see
* org.alfresco.repo.forms.processor.node.NodeFormProcessor#getTypedItem * org.alfresco.repo.forms.processor.workflow.AbstractWorkflowFormProcessor
* (org.alfresco.repo.forms.Item) * #getTypedItemForDecodedId(java.lang.String)
*/ */
@Override @Override
protected WorkflowDefinition getTypedItem(Item item) protected WorkflowDefinition getTypedItemForDecodedId(String itemId)
{
try
{
String itemId = item.getId();
return getWorkflowDefinitionForName(itemId);
}
catch (Exception e)
{
throw new FormNotFoundException(item, e);
}
}
private WorkflowDefinition getWorkflowDefinitionForName(String itemId)
{ {
String workflowDefName = decodeWorkflowDefinitionName(itemId); String workflowDefName = decodeWorkflowDefinitionName(itemId);
WorkflowDefinition workflowDef = workflowService.getDefinitionByName(workflowDefName); WorkflowDefinition workflowDef = workflowService.getDefinitionByName(workflowDefName);
@@ -143,25 +129,20 @@ 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. * back to the proper workflow definition name.
* * @param name
* @param itemId * @return The decoded name
*/ */
private String decodeWorkflowDefinitionName(String itemId) private String decodeWorkflowDefinitionName(String name)
{ {
String defName = itemId; if (name.contains(":")==false)
if (itemId.contains("$")==false)
{ {
defName = itemId.replaceFirst("_", Matcher.quoteReplacement("$")); name = name.replaceFirst("_", ":");
} }
if (itemId.contains(":")==false) return name;
{
defName = defName.replaceFirst("_", ":");
}
return defName;
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.AbstractWorkflowFormProcessor#makeFormPersister(java.lang.Object) * @see org.alfresco.repo.forms.processor.workflow.AbstractWorkflowFormProcessor#makeFormPersister(java.lang.Object)
*/ */