mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
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:
@@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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;
|
||||||
@@ -112,25 +109,14 @@ public class WorkflowFormProcessor extends AbstractWorkflowFormProcessor<Workflo
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
* (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,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.
|
* 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)
|
||||||
|
Reference in New Issue
Block a user