mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-06-30 18:15:39 +00:00
Fallout: 1. Policy handling for 'onCopy' has been changed to 'getCopyCallback' 2. All existing policy usage was refactored to control behaviour more closely 3. The default child association behaviour has changed: 3.1 Types and aspects control their own child association behaviour 3.2 cm:folder recurses into primary children, but merely copies the secondary association 3.3 cm:rule recurses into primary children 3.4 unless behaviour is defined for a child association, there is no recursion or copying 4. Node association behavior has changed 4.1 There is no copying of node associations. Each type and aspect must handle this by recording nodes and fixing up the required associations in the onCopyComplete. 4.2 If there is a requirement, this can be added to the callback later See 'org.alfresco.repo.copy.AbstractCopyBehaviourCallback' and derived classes for examples. Areas to test with particular attention: 1. Normal copy behaviour 2. Copy of documents with discussions 3. Check-in check-out 4. Check-in, check-out of documents where a discussion was added to working copy 5. Copies of documents with thumbnails 6. Copies of documents with rules 7. Copying of hierarchies that contain rules to copy to another location within the hierarchy 8. Copying into folders where named children already exist git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@13915 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
152 lines
6.3 KiB
Java
152 lines
6.3 KiB
Java
/*
|
|
* Copyright (C) 2005-2009 Alfresco Software Limited.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
|
|
* This program 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 General Public License for more details.
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
* As a special exception to the terms and conditions of version 2.0 of
|
|
* the GPL, you may redistribute this Program in connection with Free/Libre
|
|
* and Open Source Software ("FLOSS") applications as described in Alfresco's
|
|
* FLOSS exception. You should have recieved a copy of the text describing
|
|
* the FLOSS exception, and it is also available here:
|
|
* http://www.alfresco.com/legal/licensing"
|
|
*/
|
|
package org.alfresco.repo.copy;
|
|
|
|
import java.util.Map;
|
|
|
|
import org.alfresco.repo.policy.ClassPolicy;
|
|
import org.alfresco.service.cmr.repository.NodeRef;
|
|
import org.alfresco.service.namespace.QName;
|
|
|
|
/**
|
|
* Policies for the CopyService.
|
|
* <p>
|
|
* A typical registration and invocation would look like this:
|
|
* <code><pre>
|
|
* public void init()
|
|
* {
|
|
* this.policyComponent.bindClassBehaviour(
|
|
* QName.createQName(NamespaceService.ALFRESCO_URI, "getCopyCallback"),
|
|
* ActionModel.ASPECT_ACTIONS,
|
|
* new JavaBehaviour(this, "getCopyCallback"));
|
|
* this.policyComponent.bindClassBehaviour(
|
|
* QName.createQName(NamespaceService.ALFRESCO_URI, "onCopyComplete"),
|
|
* ActionModel.ASPECT_ACTIONS,
|
|
* new JavaBehaviour(this, "onCopyComplete"));
|
|
* ...
|
|
* }
|
|
*
|
|
* public CopyBehaviourCallback getCopyCallback(QName classRef, CopyDetails copyDetails)
|
|
* {
|
|
* return new XyzAspectCopyBehaviourCallback();
|
|
* }
|
|
*
|
|
* private static class XyzAspectCopyBehaviourCallback extends DefaultCopyBehaviourCallback
|
|
* {
|
|
* // Override methods any to achieve the desired behaviour
|
|
*
|
|
* public boolean mustCopyChildAssociation(QName classQName, CopyDetails copyDetails, ChildAssociationRef childAssocRef)
|
|
* {
|
|
* ...
|
|
* }
|
|
* }
|
|
*
|
|
* public void onCopyComplete(
|
|
* NodeRef sourceNodeRef,
|
|
* NodeRef targetNodeRef,
|
|
* boolean copyToNewNode,
|
|
* Map<NodeRef,NodeRef> copyMap)
|
|
* {
|
|
* ...
|
|
* }
|
|
* </pre></code>
|
|
*
|
|
* @author Derek Hulley
|
|
*/
|
|
public interface CopyServicePolicies
|
|
{
|
|
/**
|
|
* Policy invoked when a <b>node</b> is copied.
|
|
* <p>
|
|
* <b>Note:</b> Copy policies are used to modify the copy behaviour. Rather than attempt to
|
|
* determine, up front, the behaviour that applies for all types and aspects,
|
|
* the callbacks are used to lazily adjust the behaviour.
|
|
* <p>
|
|
* Implementing this policy is particularly important if aspects want to partake in the copy process.
|
|
* The behaviour can change whether or not the aspect is copied and which of the properties to carry
|
|
* to the new node.
|
|
* <p>
|
|
* If no behaviour is registered or no callback is given, then
|
|
* the {@link DefaultCopyBehaviourCallback default behaviour} is assumed. Several pre-defined behaviours
|
|
* exist to simplify the callbacks, including:
|
|
* <ul>
|
|
* <li>Do nothing: {@link DoNothingCopyBehaviourCallback}</li>
|
|
* <li>Default: {@link DefaultCopyBehaviourCallback}</li>
|
|
* </ul>
|
|
* The {@link DefaultCopyBehaviourCallback} is probably the best starting point for further
|
|
* callback implementations; overriding the class allows the behaviour to be overridden, provided
|
|
* that this policy method is implemented.
|
|
* <p>
|
|
* <b>Note: </b> A 'class' is either a type or an aspect.
|
|
*/
|
|
public interface OnCopyNodePolicy extends ClassPolicy
|
|
{
|
|
/**
|
|
* Called for all types and aspects before copying a node.
|
|
*
|
|
* @param classRef the type or aspect qualified name
|
|
* @param copyDetails the details of the impending copy
|
|
* @return Return the callback that will be used to modify the copy behaviour for this
|
|
* dictionary class. Return <tt>null</tt> to assume the default copy the helper to carry information back to the Copy Service. If this is not used, then
|
|
* neither the aspect nor any of its properties will be copied.
|
|
*
|
|
* @see CopyServicePolicies
|
|
*
|
|
* @since V3.2
|
|
*/
|
|
CopyBehaviourCallback getCopyCallback(QName classRef, CopyDetails copyDetails);
|
|
|
|
static Arg ARG_0 = Arg.KEY;
|
|
static Arg ARG_1 = Arg.KEY;
|
|
}
|
|
|
|
/**
|
|
* Final callback after the copy (including any cascading) has been completed. This should
|
|
* be used where post-copy manipulation of nodes is required in order to enforce adherence
|
|
* to a particular dictionary or business model.
|
|
* <p>
|
|
* The copy map contains all the nodes created during the copy, this helps to re-map
|
|
* any potentially relative associations.
|
|
*/
|
|
public interface OnCopyCompletePolicy extends ClassPolicy
|
|
{
|
|
/**
|
|
* @param classRef the type of the node that was copied
|
|
* @param sourceNodeRef the origional node
|
|
* @param targetNodeRef the destination node
|
|
* @param copyMap a map containing all the nodes that have been created during the copy
|
|
*/
|
|
public void onCopyComplete(
|
|
QName classRef,
|
|
NodeRef sourceNodeRef,
|
|
NodeRef targetNodeRef,
|
|
boolean copyToNewNode,
|
|
Map<NodeRef, NodeRef> copyMap);
|
|
|
|
static Arg ARG_0 = Arg.KEY;
|
|
static Arg ARG_1 = Arg.KEY;
|
|
}
|
|
}
|