Fix AR-1798 + related fix for undo/cancel checkout. Also fix copy - cannot copy an active model.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6955 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Jan Vonka 2007-10-10 16:32:26 +00:00
parent 4489bd0a22
commit 24e809b33b

View File

@ -25,6 +25,7 @@
package org.alfresco.repo.dictionary;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@ -71,7 +72,8 @@ import org.apache.commons.logging.LogFactory;
*/
public class DictionaryModelType implements ContentServicePolicies.OnContentUpdatePolicy,
NodeServicePolicies.OnUpdatePropertiesPolicy,
NodeServicePolicies.BeforeDeleteNodePolicy
NodeServicePolicies.BeforeDeleteNodePolicy,
NodeServicePolicies.OnRemoveAspectPolicy
{
// Logger
private static Log logger = LogFactory.getLog(DictionaryModelType.class);
@ -79,6 +81,9 @@ public class DictionaryModelType implements ContentServicePolicies.OnContentUpda
/** Key to the pending models */
private static final String KEY_PENDING_MODELS = "dictionaryModelType.pendingModels";
/** Key to the removed aspect */
private static final String KEY_WORKING_COPY = "dictionaryModelType.workingCopy";
/** The dictionary DAO */
private DictionaryDAO dictionaryDAO;
@ -232,6 +237,12 @@ public class DictionaryModelType implements ContentServicePolicies.OnContentUpda
ContentModel.TYPE_DICTIONARY_MODEL,
new JavaBehaviour(this, "beforeDeleteNode"));
// Register interest in the remove aspect policy
policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onRemoveAspect"),
this,
new JavaBehaviour(this, "onRemoveAspect"));
// Create the transaction listener
this.transactionListener = new DictionaryModelTypeTransactionListener(this.nodeService, this.contentService);
}
@ -290,11 +301,28 @@ public class DictionaryModelType implements ContentServicePolicies.OnContentUpda
}
}
public void onRemoveAspect(NodeRef nodeRef, QName aspect)
{
// undo/cancel checkout removes the aspect prior to deleting the node - hence need to track here
if (aspect.equals(ContentModel.ASPECT_WORKING_COPY))
{
AlfrescoTransactionSupport.bindResource(KEY_WORKING_COPY, nodeRef);
}
}
@SuppressWarnings("unchecked")
public void beforeDeleteNode(NodeRef nodeRef)
{
// Ignore if the node is a working copy
if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY) == false)
boolean workingCopy = nodeService.hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY);
NodeRef wcNodeRef = (NodeRef)AlfrescoTransactionSupport.getResource(KEY_WORKING_COPY);
if ((wcNodeRef != null) && (wcNodeRef.equals(nodeRef)))
{
workingCopy = true;
}
// Ignore if the node is a working copy or archived
if ((workingCopy == false) && (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_ARCHIVED) == false))
{
QName modelName = (QName)this.nodeService.getProperty(nodeRef, ContentModel.PROP_MODEL_NAME);
if (modelName != null)
@ -361,8 +389,9 @@ public class DictionaryModelType implements ContentServicePolicies.OnContentUpda
isActive = value.booleanValue();
}
// Ignore if the node is a working copy or if its inactive
if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY) == false)
// Ignore if the node is a working copy or archived
if ((nodeService.hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY) == false) &&
(nodeService.hasAspect(nodeRef, ContentModel.ASPECT_ARCHIVED) == false))
{
if (isActive == true)
{
@ -376,17 +405,32 @@ public class DictionaryModelType implements ContentServicePolicies.OnContentUpda
M2Model m2Model = M2Model.createModel(contentReader.getContentInputStream());
// Try and compile the model
ModelDefinition modelDefintion = m2Model.compile(dictionaryDAO, namespaceDAO).getModelDefinition();
ModelDefinition modelDefinition = m2Model.compile(dictionaryDAO, namespaceDAO).getModelDefinition();
// Update the meta data for the model
Map<QName, Serializable> props = nodeService.getProperties(nodeRef);
props.put(ContentModel.PROP_MODEL_NAME, modelDefintion.getName());
props.put(ContentModel.PROP_MODEL_DESCRIPTION, modelDefintion.getDescription());
props.put(ContentModel.PROP_MODEL_AUTHOR, modelDefintion.getAuthor());
props.put(ContentModel.PROP_MODEL_PUBLISHED_DATE, modelDefintion.getPublishedDate());
props.put(ContentModel.PROP_MODEL_VERSION, modelDefintion.getVersion());
props.put(ContentModel.PROP_MODEL_NAME, modelDefinition.getName());
props.put(ContentModel.PROP_MODEL_DESCRIPTION, modelDefinition.getDescription());
props.put(ContentModel.PROP_MODEL_AUTHOR, modelDefinition.getAuthor());
props.put(ContentModel.PROP_MODEL_PUBLISHED_DATE, modelDefinition.getPublishedDate());
props.put(ContentModel.PROP_MODEL_VERSION, modelDefinition.getVersion());
nodeService.setProperties(nodeRef, props);
ArrayList<NodeRef> modelNodeRefs = getModelNodes(nodeRef.getStoreRef(), modelDefinition.getName());
for (NodeRef existingNodeRef : modelNodeRefs)
{
if (! existingNodeRef.equals(nodeRef))
{
// check if existing model node is active
Boolean existingValue = (Boolean)nodeService.getProperty(existingNodeRef, ContentModel.PROP_MODEL_ACTIVE);
if ((existingValue != null) && (existingValue.booleanValue() == true))
{
String name = (String)nodeService.getProperty(existingNodeRef, ContentModel.PROP_NAME);
throw new AlfrescoRuntimeException("Cannot activate '"+modelDefinition.getName()+"' - existing active model: " + name);
}
}
}
// Validate model against dictionary - could be new, unchanged or updated
dictionaryDAO.validateModel(m2Model);
@ -541,4 +585,23 @@ public class DictionaryModelType implements ContentServicePolicies.OnContentUpda
}
}
}
private ArrayList<NodeRef> getModelNodes(StoreRef storeRef, QName modelName)
{
ArrayList<NodeRef> nodeRefs = new ArrayList<NodeRef>();
ResultSet rs = searchService.query(storeRef, SearchService.LANGUAGE_LUCENE, "TYPE:\""+ContentModel.TYPE_DICTIONARY_MODEL+"\"");
if (rs.length() > 0)
{
for (NodeRef modelNodeRef : rs.getNodeRefs())
{
QName name = (QName)nodeService.getProperty(modelNodeRef, ContentModel.PROP_MODEL_NAME);
if ((name != null) && (name.equals(modelName)))
{
nodeRefs.add(modelNodeRef);
}
}
}
return nodeRefs;
}
}