mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-06-16 17:55:15 +00:00
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:
parent
4489bd0a22
commit
24e809b33b
@ -25,6 +25,7 @@
|
|||||||
package org.alfresco.repo.dictionary;
|
package org.alfresco.repo.dictionary;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -71,7 +72,8 @@ import org.apache.commons.logging.LogFactory;
|
|||||||
*/
|
*/
|
||||||
public class DictionaryModelType implements ContentServicePolicies.OnContentUpdatePolicy,
|
public class DictionaryModelType implements ContentServicePolicies.OnContentUpdatePolicy,
|
||||||
NodeServicePolicies.OnUpdatePropertiesPolicy,
|
NodeServicePolicies.OnUpdatePropertiesPolicy,
|
||||||
NodeServicePolicies.BeforeDeleteNodePolicy
|
NodeServicePolicies.BeforeDeleteNodePolicy,
|
||||||
|
NodeServicePolicies.OnRemoveAspectPolicy
|
||||||
{
|
{
|
||||||
// Logger
|
// Logger
|
||||||
private static Log logger = LogFactory.getLog(DictionaryModelType.class);
|
private static Log logger = LogFactory.getLog(DictionaryModelType.class);
|
||||||
@ -79,6 +81,9 @@ public class DictionaryModelType implements ContentServicePolicies.OnContentUpda
|
|||||||
/** Key to the pending models */
|
/** Key to the pending models */
|
||||||
private static final String KEY_PENDING_MODELS = "dictionaryModelType.pendingModels";
|
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 */
|
/** The dictionary DAO */
|
||||||
private DictionaryDAO dictionaryDAO;
|
private DictionaryDAO dictionaryDAO;
|
||||||
|
|
||||||
@ -232,6 +237,12 @@ public class DictionaryModelType implements ContentServicePolicies.OnContentUpda
|
|||||||
ContentModel.TYPE_DICTIONARY_MODEL,
|
ContentModel.TYPE_DICTIONARY_MODEL,
|
||||||
new JavaBehaviour(this, "beforeDeleteNode"));
|
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
|
// Create the transaction listener
|
||||||
this.transactionListener = new DictionaryModelTypeTransactionListener(this.nodeService, this.contentService);
|
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")
|
@SuppressWarnings("unchecked")
|
||||||
public void beforeDeleteNode(NodeRef nodeRef)
|
public void beforeDeleteNode(NodeRef nodeRef)
|
||||||
{
|
{
|
||||||
// Ignore if the node is a working copy
|
boolean workingCopy = nodeService.hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY);
|
||||||
if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY) == false)
|
|
||||||
|
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);
|
QName modelName = (QName)this.nodeService.getProperty(nodeRef, ContentModel.PROP_MODEL_NAME);
|
||||||
if (modelName != null)
|
if (modelName != null)
|
||||||
@ -361,8 +389,9 @@ public class DictionaryModelType implements ContentServicePolicies.OnContentUpda
|
|||||||
isActive = value.booleanValue();
|
isActive = value.booleanValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ignore if the node is a working copy or if its inactive
|
// Ignore if the node is a working copy or archived
|
||||||
if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY) == false)
|
if ((nodeService.hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY) == false) &&
|
||||||
|
(nodeService.hasAspect(nodeRef, ContentModel.ASPECT_ARCHIVED) == false))
|
||||||
{
|
{
|
||||||
if (isActive == true)
|
if (isActive == true)
|
||||||
{
|
{
|
||||||
@ -376,17 +405,32 @@ public class DictionaryModelType implements ContentServicePolicies.OnContentUpda
|
|||||||
M2Model m2Model = M2Model.createModel(contentReader.getContentInputStream());
|
M2Model m2Model = M2Model.createModel(contentReader.getContentInputStream());
|
||||||
|
|
||||||
// Try and compile the model
|
// 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
|
// Update the meta data for the model
|
||||||
Map<QName, Serializable> props = nodeService.getProperties(nodeRef);
|
Map<QName, Serializable> props = nodeService.getProperties(nodeRef);
|
||||||
props.put(ContentModel.PROP_MODEL_NAME, modelDefintion.getName());
|
props.put(ContentModel.PROP_MODEL_NAME, modelDefinition.getName());
|
||||||
props.put(ContentModel.PROP_MODEL_DESCRIPTION, modelDefintion.getDescription());
|
props.put(ContentModel.PROP_MODEL_DESCRIPTION, modelDefinition.getDescription());
|
||||||
props.put(ContentModel.PROP_MODEL_AUTHOR, modelDefintion.getAuthor());
|
props.put(ContentModel.PROP_MODEL_AUTHOR, modelDefinition.getAuthor());
|
||||||
props.put(ContentModel.PROP_MODEL_PUBLISHED_DATE, modelDefintion.getPublishedDate());
|
props.put(ContentModel.PROP_MODEL_PUBLISHED_DATE, modelDefinition.getPublishedDate());
|
||||||
props.put(ContentModel.PROP_MODEL_VERSION, modelDefintion.getVersion());
|
props.put(ContentModel.PROP_MODEL_VERSION, modelDefinition.getVersion());
|
||||||
nodeService.setProperties(nodeRef, props);
|
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
|
// Validate model against dictionary - could be new, unchanged or updated
|
||||||
dictionaryDAO.validateModel(m2Model);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user