mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-06-30 18:15:39 +00:00
This covers most of the key interfaces, some initial definition load/save, along with the bootstrap+patch to create the new definition storage area in the data dictionary. No action logic is included yet. Most things are based on the best practices from the Rendition Service. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@20947 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
193 lines
7.1 KiB
Java
193 lines
7.1 KiB
Java
/*
|
|
* Copyright (C) 2005-2010 Alfresco Software Limited.
|
|
*
|
|
* This file is part of Alfresco
|
|
*
|
|
* Alfresco is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Alfresco 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 Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
package org.alfresco.repo.replication;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.HashSet;
|
|
import java.util.List;
|
|
import java.util.Set;
|
|
|
|
import org.alfresco.model.ContentModel;
|
|
import org.alfresco.repo.action.ActionModel;
|
|
import org.alfresco.repo.action.RuntimeActionService;
|
|
import org.alfresco.service.cmr.action.Action;
|
|
import org.alfresco.service.cmr.replication.ReplicationDefinition;
|
|
import org.alfresco.service.cmr.replication.ReplicationServiceException;
|
|
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.cmr.repository.StoreRef;
|
|
import org.alfresco.service.namespace.QName;
|
|
|
|
/**
|
|
* This class provides the implementation of ReplicationDefinition persistence.
|
|
*
|
|
* @author Nick Burch
|
|
* @since 3.4
|
|
*/
|
|
public class ReplicationDefinitionPersisterImpl implements ReplicationDefinitionPersister
|
|
{
|
|
/** Reference to the replication action space node */
|
|
private static final StoreRef SPACES_STORE = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore");
|
|
protected static final NodeRef REPLICATION_ACTION_ROOT_NODE_REF = new NodeRef(SPACES_STORE, "replication_actions_space");
|
|
|
|
/* Injected services */
|
|
private NodeService nodeService;
|
|
private RuntimeActionService runtimeActionService;
|
|
|
|
/**
|
|
* Injects the NodeService bean.
|
|
*
|
|
* @param nodeService the NodeService.
|
|
*/
|
|
public void setNodeService(NodeService nodeService)
|
|
{
|
|
this.nodeService = nodeService;
|
|
}
|
|
|
|
/**
|
|
* Injects the RuntimeActionService bean.
|
|
*
|
|
* @param runtimeActionService the RuntimeActionService.
|
|
*/
|
|
public void setRuntimeActionService(RuntimeActionService runtimeActionService)
|
|
{
|
|
this.runtimeActionService = runtimeActionService;
|
|
}
|
|
|
|
public List<ReplicationDefinition> loadReplicationDefinitions()
|
|
{
|
|
checkReplicationActionRootNodeExists();
|
|
|
|
// Note that in the call to getChildAssocs below, only the specified
|
|
// types are included.
|
|
// Subtypes of the type action:action will not be returned.
|
|
Set<QName> actionTypes = new HashSet<QName>();
|
|
actionTypes.add(ActionModel.TYPE_ACTION);
|
|
|
|
List<ChildAssociationRef> childAssocs = nodeService.getChildAssocs(REPLICATION_ACTION_ROOT_NODE_REF, actionTypes);
|
|
|
|
List<ReplicationDefinition> renderingActions = new ArrayList<ReplicationDefinition>(childAssocs.size());
|
|
for (ChildAssociationRef actionAssoc : childAssocs)
|
|
{
|
|
Action nextAction = runtimeActionService.createAction(actionAssoc.getChildRef());
|
|
renderingActions.add(new ReplicationDefinitionImpl(nextAction));
|
|
}
|
|
|
|
return renderingActions;
|
|
}
|
|
|
|
public List<ReplicationDefinition> loadReplicationDefinitions(String targetName)
|
|
{
|
|
if (targetName == null)
|
|
{
|
|
throw new NullPointerException("Unexpected null target");
|
|
}
|
|
|
|
List<ReplicationDefinition> allReplicationDefinitions = this.loadReplicationDefinitions();
|
|
|
|
List<ReplicationDefinition> filteredReplicationDefinitions = new ArrayList<ReplicationDefinition>();
|
|
for (ReplicationDefinition replicationAction : allReplicationDefinitions)
|
|
{
|
|
if (targetName.equals(replicationAction.getTargetName()))
|
|
{
|
|
filteredReplicationDefinitions.add(replicationAction);
|
|
}
|
|
}
|
|
|
|
return filteredReplicationDefinitions;
|
|
}
|
|
|
|
|
|
public ReplicationDefinition loadReplicationDefinition(QName replicationDefinitionName)
|
|
{
|
|
NodeRef actionNode = findActionNode(replicationDefinitionName);
|
|
if (actionNode != null)
|
|
{
|
|
Action action = runtimeActionService.createAction(actionNode);
|
|
return new ReplicationDefinitionImpl(action);
|
|
}
|
|
else
|
|
return null;
|
|
}
|
|
|
|
public void saveReplicationDefinition(ReplicationDefinition replicationAction)
|
|
{
|
|
NodeRef actionNodeRef = findOrCreateActionNode(replicationAction);
|
|
|
|
// TODO Serialize using JSON content instead.
|
|
// The current serialization mechanism creates a complex content model
|
|
// structure which is verbose and a JSON-based approach using a simplified
|
|
// content model perhaps could offer performance improvements.
|
|
runtimeActionService.saveActionImpl(actionNodeRef, replicationAction);
|
|
}
|
|
|
|
private NodeRef findActionNode(QName replicationDefinitionName)
|
|
{
|
|
checkReplicationActionRootNodeExists();
|
|
List<ChildAssociationRef> childAssocs = nodeService.getChildAssocs(//
|
|
REPLICATION_ACTION_ROOT_NODE_REF,//
|
|
ContentModel.ASSOC_CONTAINS,//
|
|
replicationDefinitionName);
|
|
if (childAssocs.isEmpty())
|
|
{
|
|
return null;
|
|
}
|
|
else
|
|
{
|
|
if (childAssocs.size() > 1)
|
|
{
|
|
throw new ReplicationServiceException("Multiple replication definitions with the name: "
|
|
+ replicationDefinitionName + " exist!");
|
|
}
|
|
return childAssocs.get(0).getChildRef();
|
|
}
|
|
}
|
|
|
|
private NodeRef findOrCreateActionNode(ReplicationDefinition replicationAction)
|
|
{
|
|
QName actionName = replicationAction.getReplicationName();
|
|
NodeRef actionNode = findActionNode(actionName);
|
|
if (actionNode == null)
|
|
{
|
|
actionNode = runtimeActionService.createActionNodeRef(//
|
|
replicationAction,//
|
|
REPLICATION_ACTION_ROOT_NODE_REF,//
|
|
ContentModel.ASSOC_CONTAINS,//
|
|
actionName);
|
|
}
|
|
return actionNode;
|
|
}
|
|
|
|
/**
|
|
* This method checks whether the folder containing Replication Action nodes
|
|
* exists.
|
|
*
|
|
* @throws ReplicationServiceException if the folder node does not exist.
|
|
*/
|
|
private void checkReplicationActionRootNodeExists()
|
|
{
|
|
if (nodeService.exists(REPLICATION_ACTION_ROOT_NODE_REF) == false)
|
|
{
|
|
throw new ReplicationServiceException("Unable to find replication action root node.");
|
|
}
|
|
}
|
|
}
|