diff --git a/config/alfresco/remote-services-context.xml b/config/alfresco/remote-services-context.xml index 8d7ce8999d..cabf719b74 100644 --- a/config/alfresco/remote-services-context.xml +++ b/config/alfresco/remote-services-context.xml @@ -164,4 +164,30 @@ ${avm.remote.port} + + + + + + + + + + + + + + + + + + org.alfresco.service.cmr.action.ActionServiceTransport + + + action + + + ${avm.remote.port} + + \ No newline at end of file diff --git a/source/java/org/alfresco/repo/action/ActionServiceRemote.java b/source/java/org/alfresco/repo/action/ActionServiceRemote.java new file mode 100644 index 0000000000..ad894df39c --- /dev/null +++ b/source/java/org/alfresco/repo/action/ActionServiceRemote.java @@ -0,0 +1,225 @@ +/* + * Copyright (C) 2005-2007 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.action; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +import org.alfresco.repo.remote.ClientTicketHolder; +import org.alfresco.service.cmr.action.Action; +import org.alfresco.service.cmr.action.ActionCondition; +import org.alfresco.service.cmr.action.ActionConditionDefinition; +import org.alfresco.service.cmr.action.ActionDefinition; +import org.alfresco.service.cmr.action.ActionService; +import org.alfresco.service.cmr.action.ActionServiceTransport; +import org.alfresco.service.cmr.action.CompositeAction; +import org.alfresco.service.cmr.repository.NodeRef; + +/** + * Client side implementation of ActionService for remote access. + * @author britt + */ +public class ActionServiceRemote implements ActionService +{ + private ClientTicketHolder fHolder; + + private ActionServiceTransport fTransport; + + public void setClientTicketHolder(ClientTicketHolder holder) + { + fHolder = holder; + } + + public void setActionServiceTransport(ActionServiceTransport transport) + { + fTransport = transport; + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#createAction(java.lang.String) + */ + public Action createAction(String name) + { + return fTransport.createAction(fHolder.getTicket(), name); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#createAction(java.lang.String, java.util.Map) + */ + public Action createAction(String name, Map params) + { + return fTransport.createAction(fHolder.getTicket(), name, params); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#createActionCondition(java.lang.String) + */ + public ActionCondition createActionCondition(String name) + { + return fTransport.createActionCondition(fHolder.getTicket(), name); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#createActionCondition(java.lang.String, java.util.Map) + */ + public ActionCondition createActionCondition(String name, + Map params) + { + return fTransport.createActionCondition(fHolder.getTicket(), name, params); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#createCompositeAction() + */ + public CompositeAction createCompositeAction() + { + return fTransport.createCompositeAction(fHolder.getTicket()); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#evaluateAction(org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef) + */ + public boolean evaluateAction(Action action, NodeRef actionedUponNodeRef) + { + return fTransport.evaluateAction(fHolder.getTicket(), action, actionedUponNodeRef); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#evaluateActionCondition(org.alfresco.service.cmr.action.ActionCondition, org.alfresco.service.cmr.repository.NodeRef) + */ + public boolean evaluateActionCondition(ActionCondition condition, + NodeRef actionedUponNodeRef) + { + return fTransport.evaluateActionCondition(fHolder.getTicket(), condition, actionedUponNodeRef); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#executeAction(org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef) + */ + public void executeAction(Action action, NodeRef actionedUponNodeRef) + { + fTransport.executeAction(fHolder.getTicket(), action, actionedUponNodeRef); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#executeAction(org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef, boolean) + */ + public void executeAction(Action action, NodeRef actionedUponNodeRef, + boolean checkConditions) + { + fTransport.executeAction(fHolder.getTicket(), action, actionedUponNodeRef, checkConditions); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#executeAction(org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef, boolean, boolean) + */ + public void executeAction(Action action, NodeRef actionedUponNodeRef, + boolean checkConditions, boolean executeAsynchronously) + { + fTransport.executeAction(fHolder.getTicket(), action, actionedUponNodeRef, checkConditions); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#getAction(org.alfresco.service.cmr.repository.NodeRef, java.lang.String) + */ + public Action getAction(NodeRef nodeRef, String actionId) + { + return fTransport.getAction(fHolder.getTicket(), nodeRef, actionId); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#getActionConditionDefinition(java.lang.String) + */ + public ActionConditionDefinition getActionConditionDefinition(String name) + { + return fTransport.getActionConditionDefinition(fHolder.getTicket(), name); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#getActionConditionDefinitions() + */ + public List getActionConditionDefinitions() + { + return fTransport.getActionConditionDefinitions(fHolder.getTicket()); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#getActionDefinition(java.lang.String) + */ + public ActionDefinition getActionDefinition(String name) + { + return fTransport.getActionDefinition(fHolder.getTicket(), name); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#getActionDefinitions() + */ + public List getActionDefinitions() + { + return fTransport.getActionDefinitions(fHolder.getTicket()); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#getActionDefinitions(org.alfresco.service.cmr.repository.NodeRef) + */ + public List getActionDefinitions(NodeRef nodeRef) + { + return fTransport.getActionDefinitions(fHolder.getTicket(), nodeRef); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#getActions(org.alfresco.service.cmr.repository.NodeRef) + */ + public List getActions(NodeRef nodeRef) + { + return fTransport.getActions(fHolder.getTicket(), nodeRef); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#removeAction(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.action.Action) + */ + public void removeAction(NodeRef nodeRef, Action action) + { + fTransport.removeAction(fHolder.getTicket(), nodeRef, action); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#removeAllActions(org.alfresco.service.cmr.repository.NodeRef) + */ + public void removeAllActions(NodeRef nodeRef) + { + fTransport.removeAllActions(fHolder.getTicket(), nodeRef); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionService#saveAction(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.action.Action) + */ + public void saveAction(NodeRef nodeRef, Action action) + { + fTransport.saveAction(fHolder.getTicket(), nodeRef, action); + } +} diff --git a/source/java/org/alfresco/repo/action/ActionServiceTransportImpl.java b/source/java/org/alfresco/repo/action/ActionServiceTransportImpl.java new file mode 100644 index 0000000000..190ede86e8 --- /dev/null +++ b/source/java/org/alfresco/repo/action/ActionServiceTransportImpl.java @@ -0,0 +1,252 @@ +/* + * Copyright (C) 2005-2007 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.action; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +import org.alfresco.service.cmr.action.Action; +import org.alfresco.service.cmr.action.ActionCondition; +import org.alfresco.service.cmr.action.ActionConditionDefinition; +import org.alfresco.service.cmr.action.ActionDefinition; +import org.alfresco.service.cmr.action.ActionService; +import org.alfresco.service.cmr.action.ActionServiceTransport; +import org.alfresco.service.cmr.action.CompositeAction; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.security.AuthenticationService; + +/** + * Server side implementation for transport of ActionService. + * @author britt + */ +public class ActionServiceTransportImpl implements ActionServiceTransport +{ + private ActionService fActionService; + + private AuthenticationService fAuthenticationService; + + public void setActionService(ActionService service) + { + fActionService = service; + } + + public void setAuthenticationService(AuthenticationService service) + { + fAuthenticationService = service; + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#createAction(java.lang.String, java.lang.String) + */ + public Action createAction(String ticket, String name) + { + fAuthenticationService.validate(ticket); + return fActionService.createAction(name); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#createAction(java.lang.String, java.lang.String, java.util.Map) + */ + public Action createAction(String ticket, String name, + Map params) + { + fAuthenticationService.validate(ticket); + return fActionService.createAction(name, params); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#createActionCondition(java.lang.String, java.lang.String) + */ + public ActionCondition createActionCondition(String ticket, String name) + { + fAuthenticationService.validate(ticket); + return fActionService.createActionCondition(name); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#createActionCondition(java.lang.String, java.lang.String, java.util.Map) + */ + public ActionCondition createActionCondition(String ticket, String name, + Map params) + { + fAuthenticationService.validate(ticket); + return fActionService.createActionCondition(name, params); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#createCompositeAction(java.lang.String) + */ + public CompositeAction createCompositeAction(String ticket) + { + fAuthenticationService.validate(ticket); + return fActionService.createCompositeAction(); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#evaluateAction(java.lang.String, org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef) + */ + public boolean evaluateAction(String ticket, Action action, + NodeRef actionedUponNodeRef) + { + fAuthenticationService.validate(ticket); + return fActionService.evaluateAction(action, actionedUponNodeRef); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#evaluateActionCondition(java.lang.String, org.alfresco.service.cmr.action.ActionCondition, org.alfresco.service.cmr.repository.NodeRef) + */ + public boolean evaluateActionCondition(String ticket, + ActionCondition condition, NodeRef actionedUponNodeRef) + { + fAuthenticationService.validate(ticket); + return fActionService.evaluateActionCondition(condition, actionedUponNodeRef); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#executeAction(java.lang.String, org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef) + */ + public void executeAction(String ticket, Action action, + NodeRef actionedUponNodeRef) + { + fAuthenticationService.validate(ticket); + fActionService.executeAction(action, actionedUponNodeRef); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#executeAction(java.lang.String, org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef, boolean) + */ + public void executeAction(String ticket, Action action, + NodeRef actionedUponNodeRef, boolean checkConditions) + { + fAuthenticationService.validate(ticket); + fActionService.executeAction(action, actionedUponNodeRef, checkConditions); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#executeAction(java.lang.String, org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef, boolean, boolean) + */ + public void executeAction(String ticket, Action action, + NodeRef actionedUponNodeRef, boolean checkConditions, + boolean executeAsynchronously) + { + fAuthenticationService.validate(ticket); + fActionService.executeAction(action, actionedUponNodeRef, checkConditions, executeAsynchronously); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#getAction(java.lang.String, org.alfresco.service.cmr.repository.NodeRef, java.lang.String) + */ + public Action getAction(String ticket, NodeRef nodeRef, String actionId) + { + fAuthenticationService.validate(ticket); + return fActionService.getAction(nodeRef, actionId); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#getActionConditionDefinition(java.lang.String, java.lang.String) + */ + public ActionConditionDefinition getActionConditionDefinition( + String ticket, String name) + { + fAuthenticationService.validate(ticket); + return fActionService.getActionConditionDefinition(name); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#getActionConditionDefinitions(java.lang.String) + */ + public List getActionConditionDefinitions( + String ticket) + { + fAuthenticationService.validate(ticket); + return fActionService.getActionConditionDefinitions(); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#getActionDefinition(java.lang.String, java.lang.String) + */ + public ActionDefinition getActionDefinition(String ticket, String name) + { + fAuthenticationService.validate(ticket); + return fActionService.getActionDefinition(name); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#getActionDefinitions(java.lang.String) + */ + public List getActionDefinitions(String ticket) + { + fAuthenticationService.validate(ticket); + return fActionService.getActionDefinitions(); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#getActionDefinitions(java.lang.String, org.alfresco.service.cmr.repository.NodeRef) + */ + public List getActionDefinitions(String ticket, + NodeRef nodeRef) + { + fAuthenticationService.validate(ticket); + return fActionService.getActionDefinitions(nodeRef); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#getActions(java.lang.String, org.alfresco.service.cmr.repository.NodeRef) + */ + public List getActions(String ticket, NodeRef nodeRef) + { + fAuthenticationService.validate(ticket); + return fActionService.getActions(nodeRef); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#removeAction(java.lang.String, org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.action.Action) + */ + public void removeAction(String ticket, NodeRef nodeRef, Action action) + { + fAuthenticationService.validate(ticket); + fActionService.removeAction(nodeRef, action); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#removeAllActions(java.lang.String, org.alfresco.service.cmr.repository.NodeRef) + */ + public void removeAllActions(String ticket, NodeRef nodeRef) + { + fAuthenticationService.validate(ticket); + fActionService.removeAllActions(nodeRef); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.action.ActionServiceTransport#saveAction(java.lang.String, org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.action.Action) + */ + public void saveAction(String ticket, NodeRef nodeRef, Action action) + { + fAuthenticationService.validate(ticket); + fActionService.saveAction(nodeRef, action); + } +} diff --git a/source/java/org/alfresco/repo/avm/AVMNodeImpl.java b/source/java/org/alfresco/repo/avm/AVMNodeImpl.java index 0a5d3660d5..4751f35b03 100644 --- a/source/java/org/alfresco/repo/avm/AVMNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMNodeImpl.java @@ -26,7 +26,6 @@ package org.alfresco.repo.avm; import java.io.Serializable; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; @@ -36,6 +35,7 @@ import org.alfresco.repo.domain.PropertyValue; import org.alfresco.service.cmr.avm.AVMReadOnlyException; import org.alfresco.service.namespace.QName; import org.alfresco.util.GUID; +import org.apache.log4j.Logger; /** * Base class for all repository file system like objects. @@ -43,6 +43,8 @@ import org.alfresco.util.GUID; */ public abstract class AVMNodeImpl implements AVMNode, Serializable { + private static Logger fgLogger = Logger.getLogger(AVMNodeImpl.class); + protected static final boolean DEBUG = true; /** diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java index a7dbd7ab08..9596740c72 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java @@ -57,6 +57,8 @@ import org.alfresco.repo.search.impl.lucene.AVMLuceneIndexer; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; +import org.alfresco.service.cmr.action.Action; +import org.alfresco.service.cmr.action.ActionService; import org.alfresco.service.cmr.avm.AVMBadArgumentException; import org.alfresco.service.cmr.avm.AVMCycleException; import org.alfresco.service.cmr.avm.AVMException; @@ -490,12 +492,20 @@ public class AVMServiceTest extends AVMServiceTestBase assertNull(fService.lookup(-1, "target:/a/b/snarl.bak")); runQueriesAgainstBasicTreeWithAOnly("target"); System.out.println(report); + ActionService actionService = depService.getRemoteActionService("localhost", 50500, "admin", "admin"); + Map params = new HashMap(); + params.put("property", ContentModel.PROP_ADDRESSEE); + params.put("value", "Santa Claus"); assertEquals(fService.lookup(-1, "main:/a/b/c/foo").getGuid(), fService.lookup(-1, "target:/a/b/c/foo") .getGuid()); assertEquals(fService.lookup(-1, "main:/a/b/c/bar").getGuid(), fService.lookup(-1, "target:/a/b/c/bar") .getGuid()); - ContentData srcCD = fService.getContentDataForRead(-1, "main:/a/b/c/foo"); - ContentData dstCD = fService.getContentDataForRead(-1, "target:/a/b/c/foo"); + NodeRef nodeRef = AVMNodeConverter.ToNodeRef(-1, "target:/a/b/c/foo"); + Action action = new ActionImpl(nodeRef, "set-property-value", "set-property-value", params); + actionService.executeAction(action, nodeRef, false, false); + assertEquals("Santa Claus", fService.getNodeProperty(-1, "target:/a/b/c/foo", ContentModel.PROP_ADDRESSEE).getStringValue()); + ContentData srcCD = fService.getContentDataForRead(-1, "main:/a/b/c/bar"); + ContentData dstCD = fService.getContentDataForRead(-1, "target:/a/b/c/bar"); assertEquals(srcCD.getMimetype(), dstCD.getMimetype()); fService.createFile("main:/a/b", "biz").close(); report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", matcher, diff --git a/source/java/org/alfresco/repo/deploy/DeploymentServiceImpl.java b/source/java/org/alfresco/repo/deploy/DeploymentServiceImpl.java index dabad5c571..e78d33819e 100644 --- a/source/java/org/alfresco/repo/deploy/DeploymentServiceImpl.java +++ b/source/java/org/alfresco/repo/deploy/DeploymentServiceImpl.java @@ -39,12 +39,15 @@ import org.alfresco.deployment.DeploymentReceiverTransport; import org.alfresco.deployment.FileDescriptor; import org.alfresco.deployment.FileType; import org.alfresco.deployment.impl.client.DeploymentReceiverServiceClient; +import org.alfresco.repo.action.ActionServiceRemote; import org.alfresco.repo.avm.AVMNodeConverter; import org.alfresco.repo.avm.util.SimplePath; import org.alfresco.repo.domain.PropertyValue; import org.alfresco.repo.remote.AVMRemoteImpl; import org.alfresco.repo.remote.ClientTicketHolder; import org.alfresco.repo.remote.ClientTicketHolderThread; +import org.alfresco.service.cmr.action.ActionService; +import org.alfresco.service.cmr.action.ActionServiceTransport; import org.alfresco.service.cmr.avm.AVMException; import org.alfresco.service.cmr.avm.AVMNodeDescriptor; import org.alfresco.service.cmr.avm.AVMNotFoundException; @@ -556,6 +559,39 @@ public class DeploymentServiceImpl implements DeploymentService } } + /* (non-Javadoc) + * @see org.alfresco.service.cmr.avm.deploy.DeploymentService#getRemoteActionService(java.lang.String, int, java.lang.String, java.lang.String) + */ + public ActionService getRemoteActionService(String hostName, int port, String userName, String password) + { + try + { + RmiProxyFactoryBean authFactory = new RmiProxyFactoryBean(); + authFactory.setRefreshStubOnConnectFailure(true); + authFactory.setServiceInterface(AuthenticationService.class); + authFactory.setServiceUrl("rmi://" + hostName + ":" + port + "/authentication"); + authFactory.afterPropertiesSet(); + AuthenticationService authService = (AuthenticationService)authFactory.getObject(); + authService.authenticate(userName, password.toCharArray()); + String ticket = authService.getCurrentTicket(); + fTicketHolder.setTicket(ticket); + RmiProxyFactoryBean remoteFactory = new RmiProxyFactoryBean(); + remoteFactory.setRefreshStubOnConnectFailure(true); + remoteFactory.setServiceInterface(ActionServiceTransport.class); + remoteFactory.setServiceUrl("rmi://" + hostName + ":" + port + "/action"); + remoteFactory.afterPropertiesSet(); + ActionServiceTransport transport = (ActionServiceTransport)remoteFactory.getObject(); + ActionServiceRemote remote = new ActionServiceRemote(); + remote.setActionServiceTransport(transport); + remote.setClientTicketHolder(fTicketHolder); + return remote; + } + catch (Exception e) + { + throw new AVMException("Could not Initialize Remote Connection to " + hostName, e); + } + } + private DeploymentReceiverService getReceiver(String hostName, int port) { try diff --git a/source/java/org/alfresco/service/cmr/action/ActionServiceTransport.java b/source/java/org/alfresco/service/cmr/action/ActionServiceTransport.java new file mode 100644 index 0000000000..26103e004d --- /dev/null +++ b/source/java/org/alfresco/service/cmr/action/ActionServiceTransport.java @@ -0,0 +1,232 @@ +/* + * Copyright (C) 2005-2007 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.service.cmr.action; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +import org.alfresco.service.Auditable; +import org.alfresco.service.cmr.repository.NodeRef; + +/** + * This is the interface for over the transport of ActionService. + * It's job is to tunnel an authentication token for each call. + * @author britt + */ +public interface ActionServiceTransport +{ + /** + * Get a named action definition + * + * @param name the name of the action definition + * @return the action definition + */ + ActionDefinition getActionDefinition(String ticket, String name); + + /** + * Get all the action definitions + * + * @return the list action definitions + */ + List getActionDefinitions(String ticket); + + /** + * Get all the action definitions that are applicable for the given node, based on + * its type and aspects. + * + * @param nodeRef the node reference + * @return a list of applicable action definitions + */ + List getActionDefinitions(String ticket, NodeRef nodeRef); + + /** + * Get a named action condition definition + * + * @param name the name of the action condition definition + * @return the action condition definition + */ + ActionConditionDefinition getActionConditionDefinition(String ticket, String name); + + /** + * Get all the action condition definitions + * + * @return the list of aciton condition definitions + */ + List getActionConditionDefinitions(String ticket); + + /** + * Create a new action + * + * @param name the action definition name + * @return the action + */ + Action createAction(String ticket, String name); + + /** + * Create a new action specifying the initial set of parameter values + * + * @param name the action definition name + * @param params the parameter values + * @return the action + */ + Action createAction(String ticket, String name, Map params); + + /** + * Create a composite action + * + * @return the composite action + */ + CompositeAction createCompositeAction(String ticket); + + /** + * Create an action condition + * + * @param name the action condition definition name + * @return the action condition + */ + ActionCondition createActionCondition(String ticket, String name); + + /** + * Create an action condition specifying the initial set of parameter values + * + * @param name the action condition definition name + * @param params the parameter values + * @return the action condition + */ + ActionCondition createActionCondition(String ticket, String name, Map params); + + /** + * The actions conditions are always checked. + * + * @see ActionService#executeAction(Action, NodeRef, boolean) + * + * @param action the action + * @param actionedUponNodeRef the actioned upon node reference + */ + void executeAction(String ticket, Action action, NodeRef actionedUponNodeRef); + + /** + * The action is executed based on the asynchronous attribute of the action. + * + * @see ActionService#executeAction(Action, NodeRef, boolean, boolean) + * + * @param action the action + * @param actionedUponNodeRef the actioned upon node reference + * @param checkConditions indicates whether the conditions should be checked + */ + void executeAction(String ticket, Action action, NodeRef actionedUponNodeRef, boolean checkConditions); + + /** + * Executes the specified action upon the node reference provided. + *

+ * If specified that the conditions should be checked then any conditions + * set on the action are evaluated. + *

+ * If the conditions fail then the action is not executed. + *

+ * If an action has no conditions then the action will always be executed. + *

+ * If the conditions are not checked then the action will always be executed. + * + * @param action the action + * @param actionedUponNodeRef the actioned upon node reference + * @param checkConditions indicates whether the conditions should be checked before + * executing the action + * @param executeAsynchronously indicates whether the action should be executed asychronously or not, this value overrides + * the value set on the action its self + */ + void executeAction(String ticket, Action action, NodeRef actionedUponNodeRef, boolean checkConditions, boolean executeAsynchronously); + + /** + * Evaluted the conditions set on an action. + *

+ * Returns true if the action has no conditions. + *

+ * If the action has more than one condition their results are combined using the 'AND' + * logical operator. + * + * @param action the action + * @param actionedUponNodeRef the actioned upon node reference + * @return true if the condition succeeds, false otherwise + */ + boolean evaluateAction(String ticket, Action action, NodeRef actionedUponNodeRef); + + /** + * Evaluate an action condition. + * + * @param condition the action condition + * @param actionedUponNodeRef the actioned upon node reference + * @return true if the condition succeeds, false otherwise + */ + boolean evaluateActionCondition(String ticket, ActionCondition condition, NodeRef actionedUponNodeRef); + + /** + * Save an action against a node reference. + *

+ * The node will be made configurable if it is not already. + *

+ * If the action already exists then its details will be updated. + * + * @param nodeRef the node reference + * @param action the action + */ + void saveAction(String ticket, NodeRef nodeRef, Action action); + + /** + * Gets all the actions currently saved on the given node reference. + * + * @param nodeRef the node reference + * @return the list of actions + */ + List getActions(String ticket, NodeRef nodeRef); + + /** + * Gets an action stored against a given node reference. + *

+ * Returns null if the action can not be found. + * + * @param nodeRef the node reference + * @param actionId the action id + * @return the action + */ + Action getAction(String ticket, NodeRef nodeRef, String actionId); + + /** + * Removes an action associated with a node reference. + * + * @param nodeRef the node reference + * @param action the action + */ + void removeAction(String ticket, NodeRef nodeRef, Action action); + + /** + * Removes all actions associated with a node reference + * + * @param nodeRef the node reference + */ + void removeAllActions(String ticket, NodeRef nodeRef); +} diff --git a/source/java/org/alfresco/service/cmr/avm/deploy/DeploymentService.java b/source/java/org/alfresco/service/cmr/avm/deploy/DeploymentService.java index c07c3b5387..31302523a7 100644 --- a/source/java/org/alfresco/service/cmr/avm/deploy/DeploymentService.java +++ b/source/java/org/alfresco/service/cmr/avm/deploy/DeploymentService.java @@ -3,6 +3,7 @@ */ package org.alfresco.service.cmr.avm.deploy; +import org.alfresco.service.cmr.action.ActionService; import org.alfresco.util.NameMatcher; /** @@ -35,6 +36,17 @@ public interface DeploymentService boolean dontDelete, boolean dontDo, DeploymentCallback callback); + + /** + * Get A reference to an ActionService instance on a remote Alfresco Server. + * @param hostName + * @param port + * @param userName + * @param password + * @return + */ + public ActionService getRemoteActionService(String hostName, int port, + String userName, String password); /** * Deploy to a filesystem on another machine.