package fr.itldev.koya.behaviour;
import java.io.Serializable;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.cache.SimpleCache;
import org.alfresco.repo.content.ContentServicePolicies;
import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.Behaviour;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.namespace.QName;
import fr.itldev.koya.alfservice.DossierService;
import fr.itldev.koya.alfservice.KoyaNodeService;
import fr.itldev.koya.model.KoyaModel;
import fr.itldev.koya.model.impl.Dossier;
/**
*
* Updates dossier's last modification date on content modification
*/
public class LastModificationDateBehaviour implements NodeServicePolicies.OnDeleteNodePolicy,
NodeServicePolicies.OnAddAspectPolicy, ContentServicePolicies.OnContentUpdatePolicy {
// Dependencies
private NodeService nodeService;
private PolicyComponent policyComponent;
private KoyaNodeService koyaNodeService;
private DossierService dossierService;
/**
* Cache for nodes and dossier witch have been updated<br/>
* KEY: The Node's NodeRef<br/>
* VALUE: IGNORED<br/>
*/
private SimpleCache<NodeRef, Serializable> lastModifiedSharedCache;
// Behaviours
private Behaviour onDeleteNode;
private Behaviour onContentUpdate;
private Behaviour onAddAspect;
public NodeService getNodeService() {
return nodeService;
}
public void setNodeService(NodeService nodeService) {
this.nodeService = nodeService;
}
public PolicyComponent getPolicyComponent() {
return policyComponent;
}
public void setPolicyComponent(PolicyComponent policyComponent) {
this.policyComponent = policyComponent;
}
public KoyaNodeService getKoyaNodeService() {
return koyaNodeService;
}
public void setKoyaNodeService(KoyaNodeService koyaNodeService) {
this.koyaNodeService = koyaNodeService;
}
public DossierService getDossierService() {
return dossierService;
}
public void setDossierService(DossierService dossierService) {
this.dossierService = dossierService;
}
public void setLastModifiedSharedCache(
SimpleCache<NodeRef, Serializable> lastModifiedSharedCache) {
this.lastModifiedSharedCache = lastModifiedSharedCache;
}
public void init() {
// Create behaviours
this.onDeleteNode = new JavaBehaviour(this, "onDeleteNode",
NotificationFrequency.TRANSACTION_COMMIT);
this.onContentUpdate = new JavaBehaviour(this, "onContentUpdate",
NotificationFrequency.TRANSACTION_COMMIT);
this.onAddAspect = new JavaBehaviour(this, "onAddAspect",
NotificationFrequency.TRANSACTION_COMMIT);
// Bind behaviours to node policies
// Delete behaviour
this.policyComponent.bindClassBehaviour(NodeServicePolicies.OnDeleteNodePolicy.QNAME,
ContentModel.ASPECT_AUDITABLE, this.onDeleteNode);
// Update or create behaviour
this.policyComponent.bindClassBehaviour(ContentServicePolicies.OnContentUpdatePolicy.QNAME,
ContentModel.ASPECT_AUDITABLE, this.onContentUpdate);
this.policyComponent.bindClassBehaviour(NodeServicePolicies.OnAddAspectPolicy.QNAME,
ContentModel.ASPECT_AUDITABLE, this.onAddAspect);
}
@Override
public void onDeleteNode(ChildAssociationRef childAssocRef, boolean isNodeArchived) {
if (!lastModifiedSharedCache.contains(childAssocRef.getChildRef())
&& !lastModifiedSharedCache.contains(childAssocRef.getParentRef())) {
if (existCondition(childAssocRef.getChildRef())
&& (typeCondition(childAssocRef.getChildRef(), ContentModel.TYPE_CONTENT)
|| typeCondition(childAssocRef.getChildRef(),
ContentModel.TYPE_FOLDER))) {
// failover find first parent of type dossier
try {
Dossier d = koyaNodeService.getFirstParentOfType(childAssocRef.getChildRef(),
Dossier.class);
if (!lastModifiedSharedCache.contains(d.getNodeRef())) {
lastModifiedSharedCache.put(childAssocRef.getChildRef(), "");
lastModifiedSharedCache.put(childAssocRef.getParentRef(), "");
lastModifiedSharedCache.put(d.getNodeRef(), "");
dossierService.updateLastModificationDate(d);
}
} catch (Exception e) {
// silently return
}
}
}
}
@Override
public void onContentUpdate(NodeRef nodeRef, boolean newContent) {
if (!lastModifiedSharedCache.contains(nodeRef)) {
if (existCondition(nodeRef) && (typeCondition(nodeRef, KoyaModel.TYPE_DOSSIER)
|| typeCondition(nodeRef, ContentModel.TYPE_CONTENT)
|| typeCondition(nodeRef, ContentModel.TYPE_FOLDER))) {
// failover find first parent of type dossier
try {
Dossier d = koyaNodeService.getFirstParentOfType(nodeRef, Dossier.class);
if (!lastModifiedSharedCache.contains(d.getNodeRef())) {
lastModifiedSharedCache.put(nodeRef, "");
lastModifiedSharedCache.put(d.getNodeRef(), "");
dossierService.updateLastModificationDate(d);
}
} catch (Exception e) {
// silently return
}
}
}
}
@Override
public void onAddAspect(NodeRef nodeRef, QName aspectTypeQName) {
if (!lastModifiedSharedCache.contains(nodeRef)) {
if (typeCondition(nodeRef, KoyaModel.TYPE_DOSSIER)) {
try {
Dossier d = koyaNodeService.getKoyaNode(nodeRef, Dossier.class);
if (!lastModifiedSharedCache.contains(d.getNodeRef())) {
lastModifiedSharedCache.put(nodeRef, "");
lastModifiedSharedCache.put(d.getNodeRef(), "");
dossierService.updateLastModificationDate(d);
}
} catch (Exception e) {
// silently return
}
}
}
}
// Add onCreateNode policy ? folder add ?
private Boolean existCondition(NodeRef n) {
return nodeService.exists(n);
}
private Boolean typeCondition(NodeRef n, QName type) {
return nodeService.getType(n).equals(type);
}
}