Refactored the persistence for WorkflowFormProcessor and TaskFormProcessor.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@21315 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
N Smith
2010-07-20 19:02:58 +00:00
parent 6f828a8b97
commit e2d9d74873
10 changed files with 524 additions and 280 deletions

View File

@@ -490,7 +490,6 @@ public class FormServiceImplTest extends BaseAlfrescoSpringTest
Date modifiedDate = (Date)data.getFieldData(modifiedField.getDataKeyName()).getValue();
assertNotNull("Expecting to find modified date", modifiedDate);
assertTrue("Expecting modified field to return a Date", (modifiedDate instanceof Date));
Calendar calTestValue = Calendar.getInstance();
calTestValue.setTime(VALUE_SENT_DATE);

View File

@@ -0,0 +1,78 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.forms.processor.workflow;
import java.util.List;
import org.alfresco.repo.forms.Form;
import org.alfresco.repo.forms.FormData;
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;
/**
* @author Nick Smith
*
*/
public abstract class AbstractWorkflowFormProcessor<ItemType, PersistType> extends ContentModelFormProcessor<ItemType, PersistType>
{
/** WorkflowService */
protected WorkflowService workflowService;
@Override
protected void populateForm(Form form, List<String> fields, FormCreationData data)
{
super.populateForm(form, fields, data);
// Add package actions to FormData.
ItemData<?> itemData = (ItemData<?>) data.getItemData();
addPropertyDataIfRequired(WorkflowModel.PROP_PACKAGE_ACTION_GROUP, form, itemData);
addPropertyDataIfRequired(WorkflowModel.PROP_PACKAGE_ITEM_ACTION_GROUP, form, itemData);
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.FilteredFormProcessor#internalPersist(java.lang.Object, org.alfresco.repo.forms.FormData)
*/
@Override
protected PersistType internalPersist(ItemType item, FormData data)
{
ContentModelFormPersister<PersistType> persister = makeFormPersister(item);
for (FieldData fieldData : data)
{
persister.addField(fieldData);
}
return persister.persist();
}
/**
* @param workflowService the workflowService to set
*/
public void setWorkflowService(WorkflowService workflowService)
{
this.workflowService = workflowService;
}
protected abstract ContentModelFormPersister<PersistType> makeFormPersister(ItemType item);
}

View File

@@ -0,0 +1,194 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.forms.processor.workflow;
import java.io.Serializable;
import java.util.List;
import org.alfresco.repo.forms.FormData.FieldData;
import org.alfresco.repo.forms.processor.node.ItemData;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author Nick Smith
*
*/
public abstract class ContentModelFormPersister<T> implements FormPersister<T>
{
/**
* Default Logger.
*/
private static final Log LOGGER= LogFactory.getLog(ContentModelFormPersister.class);
protected final static TypedPropertyValueGetter valueGetter = new TypedPropertyValueGetter();
protected final DataKeyMatcher keyMatcher;
protected final DictionaryService dictionaryService;
protected final Log logger;
protected final ItemData<?> itemData;
public ContentModelFormPersister(ItemData<?> itemData, NamespaceService namespaceService, DictionaryService dictionaryService, Log logger)
{
this.dictionaryService= dictionaryService;
this.logger = logger==null ? LOGGER : logger;
this.keyMatcher = new DataKeyMatcher(namespaceService);
this.itemData = itemData;
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.FormPersister#addField(java.lang.String, java.lang.Object)
*/
public void addField(FieldData fieldData)
{
String dataKeyName = fieldData.getName();
DataKeyInfo keyInfo = keyMatcher.match(dataKeyName);
if (keyInfo == null)
{
logIgnore(fieldData);
}
else
{
boolean wasApplied = persistField(fieldData, keyInfo);
if(wasApplied == false)
{
logIgnore(fieldData);
}
}
}
private boolean persistField(FieldData fieldData, DataKeyInfo keyInfo)
{
switch(keyInfo.getFieldType())
{
case PROPERTY:
return addProperty(keyInfo.getQName(), fieldData);
case TRANSIENT_PROPERTY:
return addTransientProperty(keyInfo.getFieldName(), fieldData);
default: // Handle properties
return changeAssociation(keyInfo, fieldData);
}
}
protected boolean addTransientProperty(String fieldName, FieldData fieldData)
{
return false;
}
protected boolean changeTransientAssociation(String fieldName, List<NodeRef> values, boolean add)
{
if(add)
{
return addTransientAssociation(fieldName, values);
}
else
{
return removeTransientAssociation(fieldName, values);
}
}
protected boolean removeTransientAssociation(String fieldName, List<NodeRef> values)
{
return false;
}
protected boolean addTransientAssociation(String fieldName, List<NodeRef> values)
{
return false;
}
protected boolean addProperty(QName qName, FieldData fieldData)
{
Object rawValue = fieldData.getValue();
Serializable value = getPropertyValueToPersist(qName, rawValue);
return updateProperty(qName, value);
}
protected Serializable getPropertyValueToPersist(QName qName, Object value)
{
PropertyDefinition propDef = itemData.getPropertyDefinition(qName);
if (propDef == null)
{
propDef = dictionaryService.getProperty(qName);
}
if (propDef != null)
{
return valueGetter.getValue(value, propDef);
}
return (Serializable) value;
}
protected boolean changeAssociation(DataKeyInfo info, FieldData fieldData)
{
Object rawValue = fieldData.getValue();
if (rawValue instanceof String)
{
List<NodeRef> values = NodeRef.getNodeRefs((String)rawValue, LOGGER);
if (values.isEmpty()==false)
{
boolean add = info.isAdd();
if(info.getFieldType() == FieldType.ASSOCIATION)
{
return changeAssociation(info.getQName(), values, add);
}
else
{
return changeTransientAssociation(info.getFieldName(), values, add);
}
}
}
return false;
}
private boolean changeAssociation(QName qName, List<NodeRef> values, boolean add)
{
if(add)
{
return addAssociation(qName, values);
}
else
{
return removeAssociation(qName, values);
}
}
protected void logIgnore(FieldData fieldData)
{
if(logger.isDebugEnabled())
logger.debug("Ignoring unrecognized field: " + fieldData.getName());
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.FormPersister#persist()
*/
public abstract T persist();
protected abstract boolean removeAssociation(QName qName, List<NodeRef> values);
protected abstract boolean addAssociation(QName qName, List<NodeRef> values);
protected abstract boolean updateProperty(QName qName, Serializable value);
}

View File

@@ -0,0 +1,36 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.forms.processor.workflow;
import org.alfresco.repo.forms.FormData.FieldData;
/**
* @author Nick Smith
*
*/
public interface FormPersister<T>
{
void addField(FieldData fieldData);
T persist();
}

View File

@@ -0,0 +1,93 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.forms.processor.workflow;
import java.io.Serializable;
import java.util.List;
import org.alfresco.repo.forms.processor.node.ItemData;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.repository.NodeRef;
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.apache.commons.logging.Log;
/**
* @author Nick Smith
*
*/
public class TaskFormPersister extends ContentModelFormPersister<WorkflowTask>
{
private final TaskUpdater updater;
public TaskFormPersister(ItemData<WorkflowTask> itemData,
NamespaceService namespaceService,
DictionaryService dictionaryService,
WorkflowService workflowService,
Log logger)
{
super(itemData, namespaceService, dictionaryService, logger);
WorkflowTask item = itemData.getItem();
this.updater = new TaskUpdater(item.id, workflowService);
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#addAssociation(org.alfresco.service.namespace.QName, java.util.List)
*/
@Override
protected boolean addAssociation(QName qName, List<NodeRef> values)
{
updater.addAssociation(qName, values);
return true;
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#removeAssociation(org.alfresco.service.namespace.QName, java.util.List)
*/
@Override
protected boolean removeAssociation(QName qName, List<NodeRef> values)
{
updater.removeAssociation(qName, values);
return true;
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#updateProperty(org.alfresco.service.namespace.QName, java.io.Serializable)
*/
@Override
protected boolean updateProperty(QName qName, Serializable value)
{
updater.addProperty(qName, value);
return true;
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#persist()
*/
@Override
public WorkflowTask persist()
{
return updater.update();
}
}

View File

@@ -30,16 +30,12 @@ import java.util.List;
import java.util.Map;
import org.alfresco.repo.forms.Form;
import org.alfresco.repo.forms.FormData;
import org.alfresco.repo.forms.Item;
import org.alfresco.repo.forms.FormData.FieldData;
import org.alfresco.repo.forms.processor.FieldProcessorRegistry;
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.dictionary.DictionaryService;
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
import org.alfresco.service.cmr.dictionary.TypeDefinition;
import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.cmr.workflow.WorkflowTask;
@@ -52,15 +48,11 @@ import org.apache.commons.logging.LogFactory;
/**
* @author Nick Smith
*/
public class TaskFormProcessor extends ContentModelFormProcessor<WorkflowTask, WorkflowTask>
public class TaskFormProcessor extends AbstractWorkflowFormProcessor<WorkflowTask, WorkflowTask>
{
/** Logger */
private static final Log LOGGER = LogFactory.getLog(TaskFormProcessor.class);
private TypedPropertyValueGetter valueGetter;
private DataKeyMatcher keyMatcher;
private WorkflowService workflowService;
// Constructor for Spring
public TaskFormProcessor()
{
@@ -75,8 +67,6 @@ public class TaskFormProcessor extends ContentModelFormProcessor<WorkflowTask, W
this.namespaceService = namespaceService;
this.dictionaryService = dictionaryService;
this.fieldProcessorRegistry = fieldProcessorRegistry;
this.keyMatcher = new DataKeyMatcher(namespaceService);
this.valueGetter = new TypedPropertyValueGetter(dictionaryService);
}
@Override
@@ -99,68 +89,6 @@ public class TaskFormProcessor extends ContentModelFormProcessor<WorkflowTask, W
addPropertyDataIfRequired(WorkflowModel.PROP_PACKAGE_ITEM_ACTION_GROUP, form, itemData);
}
@Override
protected WorkflowTask internalPersist(WorkflowTask task, FormData data)
{
TaskUpdater updater = new TaskUpdater(task.id, workflowService);
ItemData<WorkflowTask> itemData = makeItemData(task);
for (FieldData fieldData : data)
{
addFieldToSerialize(updater, itemData, fieldData);
}
return updater.update();
}
private void addFieldToSerialize(TaskUpdater updater,
ItemData<?> itemData,
FieldData fieldData)
{
String name = fieldData.getName();
DataKeyInfo keyInfo = keyMatcher.match(name);
if (keyInfo == null ||
FieldType.TRANSIENT_PROPERTY == keyInfo.getFieldType() )
{
if(LOGGER.isDebugEnabled())
LOGGER.debug("Ignoring unrecognized field: " + name);
return;
}
QName fullName = keyInfo.getQName();
Object rawValue = fieldData.getValue();
if (FieldType.PROPERTY == keyInfo.getFieldType())
{
Serializable propValue = getPropertyValueToPersist(fullName, rawValue, itemData);
// TODO What if the user wants to set prop to null?
if (propValue != null)
{
updater.addProperty(fullName, propValue);
}
}
else if (FieldType.ASSOCIATION == keyInfo.getFieldType())
{
if (rawValue instanceof String)
{
updater.changeAssociation(fullName, (String) rawValue, keyInfo.isAdd());
}
}
}
private Serializable getPropertyValueToPersist(QName fullName,
Object value,
ItemData<?> itemData)
{
PropertyDefinition propDef = itemData.getPropertyDefinition(fullName);
if (propDef == null)
{
propDef = dictionaryService.getProperty(fullName);
}
if (propDef != null)
{
return valueGetter.getValue(value, propDef);
}
return (Serializable) value;
}
/*
* (non-Javadoc)
*
@@ -224,36 +152,13 @@ public class TaskFormProcessor extends ContentModelFormProcessor<WorkflowTask, W
return null;
}
/**
* Sets the Workflow Service.
*
* @param workflowService
*/
public void setWorkflowService(WorkflowService workflowService)
{
this.workflowService = workflowService;
}
/*
* (non-Javadoc)
*
* @seeorg.alfresco.repo.forms.processor.task.ContentModelFormProcessor#
* setNamespaceService(org.alfresco.service.namespace.NamespaceService)
*/
@Override
public void setNamespaceService(NamespaceService namespaceService)
{
super.setNamespaceService(namespaceService);
this.keyMatcher = new DataKeyMatcher(namespaceService);
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.node.ContentModelFormProcessor#setDictionaryService(org.alfresco.service.cmr.dictionary.DictionaryService)
* @see org.alfresco.repo.forms.processor.workflow.AbstractWorkflowFormProcessor#makeFormPersister(java.lang.Object)
*/
@Override
public void setDictionaryService(DictionaryService dictionaryService)
protected ContentModelFormPersister<WorkflowTask> makeFormPersister(WorkflowTask item)
{
super.setDictionaryService(dictionaryService);
this.valueGetter = new TypedPropertyValueGetter(dictionaryService);
ItemData<WorkflowTask> itemData = makeItemData(item);
return new TaskFormPersister(itemData, namespaceService, dictionaryService, workflowService, LOGGER);
}
}

View File

@@ -31,11 +31,8 @@ import java.util.Arrays;
import java.util.List;
import org.alfresco.repo.forms.FormException;
import org.alfresco.repo.forms.processor.node.ItemData;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
import org.alfresco.service.namespace.QName;
import org.json.JSONArray;
import org.json.JSONException;
import org.springframework.extensions.surf.util.I18NUtil;
@@ -47,27 +44,6 @@ public class TypedPropertyValueGetter
{
public static final String ON = "on";
private final DictionaryService dictionaryService;
public TypedPropertyValueGetter(DictionaryService dictionaryService)
{
this.dictionaryService = dictionaryService;
}
public Serializable getPropertyValueToPersist(QName fullName, Object value, ItemData<?> itemData)
{
PropertyDefinition propDef = itemData.getPropertyDefinition(fullName);
if (propDef == null)
{
propDef = dictionaryService.getProperty(fullName);
}
if (propDef != null)
{
return getValue(value, propDef);
}
return (Serializable) value;
}
public Serializable getValue(Object value, PropertyDefinition propDef)
{
if (value == null)

View File

@@ -71,9 +71,12 @@ public class WorkflowBuilder
params.put(name, value);
}
public void addAssociationParameter(QName name, Serializable value)
public void addAssociationParameter(QName name, List<NodeRef> values)
{
params.put(name, value);
if(values instanceof Serializable)
{
params.put(name, (Serializable) values);
}
}
public void addPackageItems(List<NodeRef> items)

View File

@@ -0,0 +1,108 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.forms.processor.workflow;
import java.io.Serializable;
import java.util.List;
import org.alfresco.repo.forms.processor.node.ItemData;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
import org.alfresco.service.cmr.workflow.WorkflowInstance;
import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.apache.commons.logging.Log;
/**
* @author Nick Smith
*
*/
public class WorkflowFormPersister extends ContentModelFormPersister<WorkflowInstance>
{
private final WorkflowBuilder builder;
public WorkflowFormPersister(ItemData<?> itemData,
NamespaceService namespaceService,
DictionaryService dictionaryService,
WorkflowService workflowService,
NodeService nodeService,
Log logger)
{
super(itemData, namespaceService, dictionaryService, logger);
WorkflowDefinition definition = (WorkflowDefinition) itemData.getItem();
this.builder = new WorkflowBuilder(definition, workflowService, nodeService);
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#addAssociation(org.alfresco.service.namespace.QName, java.util.List)
*/
@Override
protected boolean addAssociation(QName qName, List<NodeRef> values)
{
builder.addAssociationParameter(qName, values);
return true;
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#persist()
*/
@Override
public WorkflowInstance persist()
{
return builder.build();
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#removeAssociation(org.alfresco.service.namespace.QName, java.util.List)
*/
@Override
protected boolean removeAssociation(QName qName, List<NodeRef> values)
{
// Do nothing!
return false;
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#updateProperty(org.alfresco.service.namespace.QName, java.io.Serializable)
*/
@Override
protected boolean updateProperty(QName qName, Serializable value)
{
builder.addParameter(qName, value);
return true;
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.ContentModelFormPersister#addTransientAssociation(java.lang.String, java.util.List)
*/
@Override
protected boolean addTransientAssociation(String fieldName, List<NodeRef> values)
{
if(PackageItemsFieldProcessor.KEY.equals(fieldName))
{
builder.addPackageItems(values);
return true;
}
return false;
}
}

View File

@@ -20,28 +20,16 @@ package org.alfresco.repo.forms.processor.workflow;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import org.alfresco.repo.forms.Form;
import org.alfresco.repo.forms.FormData;
import org.alfresco.repo.forms.FormException;
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.dictionary.DictionaryService;
import org.alfresco.service.cmr.dictionary.TypeDefinition;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
import org.alfresco.service.cmr.workflow.WorkflowInstance;
import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.cmr.workflow.WorkflowTaskDefinition;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -52,34 +40,11 @@ import org.apache.commons.logging.LogFactory;
*
* @author Nick Smith
*/
public class WorkflowFormProcessor extends ContentModelFormProcessor<WorkflowDefinition, WorkflowInstance>
public class WorkflowFormProcessor extends AbstractWorkflowFormProcessor<WorkflowDefinition, WorkflowInstance>
{
/** Logger */
private final static Log logger = LogFactory.getLog(WorkflowFormProcessor.class);
/** WorkflowService */
private WorkflowService workflowService;
/** TyepdPropertyValueGetter */
private TypedPropertyValueGetter valueGetter;
private DataKeyMatcher keyMatcher;
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.FilteredFormProcessor#generateFields(org.alfresco.repo.forms.Form, java.util.List, org.alfresco.repo.forms.processor.FormCreationData)
*/
@Override
protected void populateForm(Form form, List<String> fields, FormCreationData data)
{
super.populateForm(form, fields, data);
// Add package actions to FormData.
ItemData<?> itemData = (ItemData<?>) data.getItemData();
addPropertyDataIfRequired(WorkflowModel.PROP_PACKAGE_ACTION_GROUP, form, itemData);
addPropertyDataIfRequired(WorkflowModel.PROP_PACKAGE_ITEM_ACTION_GROUP, form, itemData);
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.node.ContentModelFormProcessor#getAssociationValues(java.lang.Object)
*/
@@ -197,126 +162,13 @@ public class WorkflowFormProcessor extends ContentModelFormProcessor<WorkflowDef
return defName;
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.FilteredFormProcessor#internalPersist(java.lang.Object, org.alfresco.repo.forms.FormData)
* @see org.alfresco.repo.forms.processor.workflow.AbstractWorkflowFormProcessor#makeFormPersister(java.lang.Object)
*/
@Override
protected WorkflowInstance internalPersist(WorkflowDefinition definition, FormData data)
protected ContentModelFormPersister<WorkflowInstance> makeFormPersister(WorkflowDefinition item)
{
WorkflowBuilder builder = new WorkflowBuilder(definition, workflowService, nodeService);
ItemData<WorkflowDefinition> itemData = makeItemData(definition);
for (FieldData fieldData : data)
{
addFieldToSerialize(builder, itemData, fieldData);
}
return builder.build();
}
private void addFieldToSerialize(WorkflowBuilder builder, ItemData<WorkflowDefinition> itemData, FieldData fieldData)
{
String dataKeyName = fieldData.getName();
DataKeyInfo keyInfo = keyMatcher.match(dataKeyName);
if (keyInfo == null ||
FieldType.TRANSIENT_PROPERTY == keyInfo.getFieldType() )
{
if(logger.isDebugEnabled())
logger.debug("Ignoring unrecognized field: " + dataKeyName);
return;
}
WorkflowDataKeyInfoVisitor visitor = new WorkflowDataKeyInfoVisitor(fieldData.getValue(), builder, itemData);
keyInfo.visit(visitor);
}
/**
* @param workflowService the workflowService to set
*/
public void setWorkflowService(WorkflowService workflowService)
{
this.workflowService = workflowService;
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.node.ContentModelFormProcessor#setNamespaceService(org.alfresco.service.namespace.NamespaceService)
*/
@Override
public void setNamespaceService(NamespaceService namespaceService)
{
super.setNamespaceService(namespaceService);
this.keyMatcher = new DataKeyMatcher(namespaceService);
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.node.ContentModelFormProcessor#setDictionaryService(org.alfresco.service.cmr.dictionary.DictionaryService)
*/
@Override
public void setDictionaryService(DictionaryService dictionaryService)
{
super.setDictionaryService(dictionaryService);
this.valueGetter = new TypedPropertyValueGetter(dictionaryService);
}
private class WorkflowDataKeyInfoVisitor implements DataKeyInfoVisitor<Void>
{
private final Object rawValue;
private final WorkflowBuilder builder;
private final ItemData<WorkflowDefinition> itemData;
public WorkflowDataKeyInfoVisitor(Object rawValue, WorkflowBuilder builder,
ItemData<WorkflowDefinition> itemData)
{
this.rawValue = rawValue;
this.builder = builder;
this.itemData = itemData;
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.DataKeyInfoVisitor#visitAssociation(org.alfresco.repo.forms.processor.workflow.DataKeyInfo)
*/
public Void visitAssociation(DataKeyInfo info)
{
QName qName = info.getQName();
if (rawValue instanceof String)
{
Serializable nodes = (Serializable) NodeRef.getNodeRefs((String) rawValue);
builder.addParameter(qName, nodes);
}
return null;
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.DataKeyInfoVisitor#visitProperty(org.alfresco.repo.forms.processor.workflow.DataKeyInfo)
*/
public Void visitProperty(DataKeyInfo info)
{
QName qName = info.getQName();
Serializable propValue = valueGetter.getPropertyValueToPersist(qName, rawValue, itemData);
builder.addParameter(qName, propValue);
return null;
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.DataKeyInfoVisitor#visitTransientAssociation(org.alfresco.repo.forms.processor.workflow.DataKeyInfo)
*/
public Void visitTransientAssociation(DataKeyInfo info)
{
if(PackageItemsFieldProcessor.KEY.equals(info.getFieldName()))
{
if(rawValue instanceof String)
{
builder.addPackageItems((String)rawValue);
}
}
return null;
}
/* (non-Javadoc)
* @see org.alfresco.repo.forms.processor.workflow.DataKeyInfoVisitor#visitTransientProperty(org.alfresco.repo.forms.processor.workflow.DataKeyInfo)
*/
public Void visitTransientProperty(DataKeyInfo info)
{
throw new FormException("This methdo should never be called!");
}
ItemData<WorkflowDefinition> itemData = makeItemData(item);
return new WorkflowFormPersister(itemData, namespaceService, dictionaryService, workflowService, nodeService, logger);
}
}