/*
* 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.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.alfresco.repo.transaction.TransactionalResourceHelper;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.namespace.QName;
/**
* Abstract implementation to allow for easier migration if the interface changes.
*
* @author Derek Hulley
* @since 3.2
*/
public abstract class AbstractCopyBehaviourCallback implements CopyBehaviourCallback
{
private static final String KEY_NODEREF_REPOINTING_PREFIX = "recordNodeRefPropertiesForRepointing-";
/**
* @return Returns {@link ChildAssocRecurseAction#RESPECT_RECURSE_FLAG}
*/
public ChildAssocRecurseAction getChildAssociationRecurseAction(
QName classQName,
CopyDetails copyDetails,
CopyChildAssociationDetails childAssocCopyDetails)
{
return ChildAssocRecurseAction.RESPECT_RECURSE_FLAG;
}
/**
* @throws IllegalStateException always
*/
protected void throwExceptionForUnexpectedBehaviour(CopyDetails copyDetails, String ... otherDetails)
{
StringBuilder sb = new StringBuilder(512);
sb.append("Behaviour should have been invoked: \n" +
" Aspect: " + this.getClass().getName() + "\n" +
" " + copyDetails + "\n");
for (String otherDetail : otherDetails)
{
sb.append(" ").append(otherDetail).append("\n");
}
throw new IllegalStateException(sb.toString());
}
/**
* Helper method to transactionally record NodeRef
properties so that they
* can later be fixed up to point to the relative, after-copy locations.
*
* When the copy has been completed, the second stage of the process can be applied.
*
* @param sourceNodeRef the node that is being copied
* @param properties the node properties being copied
* @param propertyQName the qualified name of the property to check
*
* @see #repointNodeRefs(NodeRef, QName, Map, NodeService)
*/
public void recordNodeRefsForRepointing(
NodeRef sourceNodeRef,
MapNodeRef
repointing. Call this method to have
* any NodeRef
properties readjusted to reflect the copied node hierarchy.
* Only use this method if it a requirement for the particular type or aspect that you
* are coding for.
*
* @param sourceNodeRef the source node
* @param propertyQName the target node i.e. the copy of the source node
* @param copyMap the full hierarchy copy map of source to copies
*
* @see #recordNodeRefsForRepointing(NodeRef, Map, QName)
*/
@SuppressWarnings("unchecked")
public void repointNodeRefs(
NodeRef sourceNodeRef,
NodeRef targetNodeRef,
QName propertyQName,
Map