mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-06-16 17:55:15 +00:00
Merged V2.0 to HEAD
5456: (From WCM_DEPLOY) There were many pure conflicts on license headers, one conflict due to CR-LF and some other smaller issues to resolve: ----------------------------------------- Resolved (line endings not cr-lf): root\projects\repository\config\alfresco\public-services-context.xml Reverted: root\projects\web-client\source\web\images\icons\ajax_anim.gif Reverted or Resolved (License text conflicts): svn revert root\projects\jndi-client\source\java\org\alfresco\jndi\JndiTest.java svn resolved root\projects\jndi-client\source\java\org\alfresco\jndi\AVMFileDirContext.java svn revert root\projects\jndi-client\source\java\org\alfresco\jndi\AVMBulkLoader.java svn revert root\projects\jndi-client\source\java\org\alfresco\filter\CacheControlFilter.java svn revert root\projects\jndi-client\source\java\org\alfresco\filter\CacheControlFilterInfoBean.java svn revert -R root\projects\catalina-virtual\source\java\org\alfresco\mbeans svn revert root\projects\catalina-virtual\source\java\org\alfresco\catalina\context\AVMStandardContext.java svn revert root\projects\catalina-virtual\source\java\org\alfresco\catalina\loader\AVMWebappClassLoader.java svn revert root\projects\catalina-virtual\source\java\org\alfresco\catalina\loader\AVMWebappLoader.java svn revert root\projects\catalina-virtual\source\java\org\alfresco\catalina\host\AVMResourceBinding.java svn resolved root\projects\catalina-virtual\source\java\org\alfresco\catalina\host\AVMHostConfig.java - why the change in method naming convention? svn resolved root\projects\catalina-virtual\source\java\org\alfresco\catalina\host\AVMHost.java svn revert root\projects\catalina-virtual\source\java\org\alfresco\catalina\host\DefaultAVMResourceBinding.java svn revert root\projects\catalina-virtual\source\java\org\alfresco\catalina\valve\AVMUrlValveTest.java svn resolved root\projects\catalina-virtual\source\java\org\alfresco\catalina\valve\AVMUrlValve.java svn revert root\projects\catalina-virtual\source\java\org\alfresco\catalina\host\AVMHostMatch.java Modified: root\projects\web-client\source\java\org\alfresco\web\ui\wcm\component\UIDeployWebsite.java (Kevin to check line 330) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5484 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
parent
ad80d96da3
commit
138d1780cb
@ -483,6 +483,22 @@
|
||||
<value>false</value>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="avm-deploy-snapshot" class="org.alfresco.repo.avm.actions.AVMDeploySnapshotAction" parent="action-executer">
|
||||
<property name="deploymentService">
|
||||
<ref bean="DeploymentService"/>
|
||||
</property>
|
||||
<property name="contentService">
|
||||
<ref bean="ContentService"/>
|
||||
</property>
|
||||
<property name="nodeService">
|
||||
<ref bean="NodeService"/>
|
||||
</property>
|
||||
<property name="publicAction">
|
||||
<value>false</value>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!-- Scheduled action helper beans -->
|
||||
|
||||
<!-- Base template action definition -->
|
||||
|
@ -2,6 +2,9 @@
|
||||
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
|
||||
|
||||
<beans>
|
||||
<!-- Client Ticket Holder -->
|
||||
<bean id="clientTicketHolder" class="org.alfresco.repo.remote.ClientTicketHolderGlobal"/>
|
||||
|
||||
<!-- Remote AVM interface -->
|
||||
<bean id="avmRemote" class="org.alfresco.repo.remote.AVMRemoteImpl">
|
||||
<property name="avmRemoteTransport">
|
||||
@ -11,7 +14,7 @@
|
||||
|
||||
<bean id="avmRemoteTransport" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
|
||||
<property name="serviceUrl">
|
||||
<value>rmi://localhost:1313/avm</value>
|
||||
<value>rmi://localhost:50500/avm</value>
|
||||
</property>
|
||||
<property name="serviceInterface">
|
||||
<value>org.alfresco.service.cmr.remote.AVMRemoteTransport</value>
|
||||
@ -29,7 +32,7 @@
|
||||
|
||||
<bean id="avmSyncServiceTransport" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
|
||||
<property name="serviceUrl">
|
||||
<value>rmi://localhost:1313/avmsync</value>
|
||||
<value>rmi://localhost:50500/avmsync</value>
|
||||
</property>
|
||||
<property name="serviceInterface">
|
||||
<value>org.alfresco.service.cmr.remote.AVMSyncServiceTransport</value>
|
||||
@ -41,7 +44,7 @@
|
||||
|
||||
<bean id="authenticationService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
|
||||
<property name="serviceUrl">
|
||||
<value>rmi://localhost:1313/authentication</value>
|
||||
<value>rmi://localhost:50500/authentication</value>
|
||||
</property>
|
||||
<property name="serviceInterface">
|
||||
<value>org.alfresco.service.cmr.security.AuthenticationService</value>
|
||||
@ -53,7 +56,7 @@
|
||||
|
||||
<bean id="repoRemoteTransport" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
|
||||
<property name="serviceUrl">
|
||||
<value>rmi://localhost:1313/repo</value>
|
||||
<value>rmi://localhost:50500/repo</value>
|
||||
</property>
|
||||
<property name="serviceInterface">
|
||||
<value>org.alfresco.service.cmr.remote.RepoRemoteTransport</value>
|
||||
|
@ -115,6 +115,16 @@ avm-undo-list.title=Make a list of Nodes in a store transparent to staging.
|
||||
avm-undo-list.description=This acts as a mistake eraser for a user's sandbox.
|
||||
avm-undo-list.node-list.display-label=The string encoded list of nodes to revert.
|
||||
|
||||
avm-deploy-snapshot.title=Deploy a snapshot to a remote server.
|
||||
avm-deploy-snapshot.description=This deploys a website snapshot to a remote server.
|
||||
avm-deploy-snapshot.website.display-label=NodeRef of the website the deploy is occurring from.
|
||||
avm-deploy-snapshot.target-server.display-label=The name or IP address of the remote server to deploy to.
|
||||
avm-deploy-snapshot.default-rmi-port.display-label=The default RMI port to connect to if it is not supplied in target-server parameter.
|
||||
avm-deploy-snapshot.remote-username.display-label=The username to connect as.
|
||||
avm-deploy-snapshot.remote-password.display-label=The password for the remote-username.
|
||||
avm-deploy-snapshot.deploy-callback.display-label=The DeploymentCallback listener object.
|
||||
avm-deploy-snapshot.delay.display-label=An optional delay to apply to the start of a deployment.
|
||||
|
||||
start-avm-workflow.title=Start a WCM Workflow
|
||||
start-avm-workflow.description=Starts a workflow expecting an AVM workflow package
|
||||
start-avm-workflow.store-name.display-label=Store name for start task
|
||||
|
@ -32,6 +32,20 @@
|
||||
<title>Default Webapp</title>
|
||||
<type>d:text</type>
|
||||
</property>
|
||||
<property name="wca:deployto">
|
||||
<title>Deploy To</title>
|
||||
<type>d:text</type>
|
||||
<multiple>true</multiple>
|
||||
</property>
|
||||
<property name="wca:selecteddeployto">
|
||||
<title>Servers Selected For Deployment</title>
|
||||
<type>d:text</type>
|
||||
<multiple>true</multiple>
|
||||
</property>
|
||||
<property name="wca:selecteddeployversion">
|
||||
<title>Snapshot Version Selected For Deployment</title>
|
||||
<type>d:int</type>
|
||||
</property>
|
||||
</properties>
|
||||
<associations>
|
||||
<child-association name="wca:webuser">
|
||||
@ -67,6 +81,17 @@
|
||||
<many>true</many>
|
||||
</target>
|
||||
</child-association>
|
||||
<child-association name="wca:deploymentreport">
|
||||
<source>
|
||||
<mandatory>false</mandatory>
|
||||
<many>false</many>
|
||||
</source>
|
||||
<target>
|
||||
<class>wca:deploymentreport</class>
|
||||
<mandatory>false</mandatory>
|
||||
<many>true</many>
|
||||
</target>
|
||||
</child-association>
|
||||
</associations>
|
||||
</type>
|
||||
|
||||
@ -181,6 +206,42 @@
|
||||
<title>XForms Capture Form Folder</title>
|
||||
<parent>cm:folder</parent>
|
||||
</type>
|
||||
|
||||
<type name="wca:deploymentreport">
|
||||
<title>Website Deployment Report</title>
|
||||
<parent>cm:content</parent>
|
||||
<properties>
|
||||
<property name="wca:deployserver">
|
||||
<title>Server Deployed To</title>
|
||||
<type>d:text</type>
|
||||
<mandatory>true</mandatory>
|
||||
</property>
|
||||
<property name="wca:deployversion">
|
||||
<title>Snapshot Version Deployed</title>
|
||||
<type>d:int</type>
|
||||
<mandatory>true</mandatory>
|
||||
</property>
|
||||
<property name="wca:deploystarttime">
|
||||
<title>Time Deploy Started</title>
|
||||
<type>d:datetime</type>
|
||||
<mandatory>true</mandatory>
|
||||
</property>
|
||||
<property name="wca:deployendtime">
|
||||
<title>Time Deploy Finished</title>
|
||||
<type>d:datetime</type>
|
||||
<mandatory>true</mandatory>
|
||||
</property>
|
||||
<property name="wca:deploysuccessful">
|
||||
<title>Deployment Successful</title>
|
||||
<type>d:boolean</type>
|
||||
<default>false</default>
|
||||
</property>
|
||||
<property name="wca:deployfailedreason">
|
||||
<title>Failure Reason</title>
|
||||
<type>d:text</type>
|
||||
</property>
|
||||
</properties>
|
||||
</type>
|
||||
</types>
|
||||
|
||||
<aspects>
|
||||
|
@ -767,6 +767,7 @@
|
||||
<value>getAspects</value>
|
||||
<value>hasAspect</value>
|
||||
<value>getAPath</value>
|
||||
<value>getGuid</value>
|
||||
</list>
|
||||
</property>
|
||||
</bean>
|
||||
@ -813,6 +814,7 @@
|
||||
<value>renameStore</value>
|
||||
<value>getSystemStore</value>
|
||||
<value>revert</value>
|
||||
<value>setGuid</value>
|
||||
</list>
|
||||
</property>
|
||||
</bean>
|
||||
@ -888,22 +890,41 @@
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!--
|
||||
<bean id="AVMSyncService" class="org.springframework.aop.framework.ProxyFactoryBean">
|
||||
<property name="proxyInterfaces">
|
||||
<value>org.alfresco.service.cmr.avmsync.AVMSyncService</value>
|
||||
<!-- Deployment Service. -->
|
||||
|
||||
<bean id="deploymentService" class="org.alfresco.repo.deploy.DeploymentServiceImpl">
|
||||
<property name="avmService">
|
||||
<ref bean="avmService"/>
|
||||
</property>
|
||||
<property name="target">
|
||||
<ref bean="avmSyncService"/>
|
||||
</bean>
|
||||
|
||||
<bean id="deploymentServiceReadTxnAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
|
||||
<property name="advice">
|
||||
<ref bean="retryingReadTxnAdvice"/>
|
||||
</property>
|
||||
<property name="interceptorNames">
|
||||
<property name="mappedNames">
|
||||
<list>
|
||||
<idref local="AVMSyncService_transaction"/>
|
||||
<idref local="AVMSyncService_descriptor"/>
|
||||
<value>deployDifference</value>
|
||||
<value>deployDifferenceFS</value>
|
||||
</list>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="DeploymentService" class="org.springframework.aop.framework.ProxyFactoryBean">
|
||||
<property name="proxyInterfaces">
|
||||
<list>
|
||||
<value>org.alfresco.service.cmr.avm.deploy.DeploymentService</value>
|
||||
</list>
|
||||
</property>
|
||||
<property name="targetName">
|
||||
<value>deploymentService</value>
|
||||
</property>
|
||||
<property name="interceptorNames">
|
||||
<list>
|
||||
<value>deploymentServiceReadTxnAdvisor</value>
|
||||
</list>
|
||||
</property>
|
||||
</bean>
|
||||
-->
|
||||
|
||||
<!-- Workflow Service -->
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
<!-- Remote authentication service. -->
|
||||
<bean id="authenticationService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
|
||||
<property name="serviceUrl">
|
||||
<value>rmi://localhost:1313/authentication</value>
|
||||
<value>rmi://localhost:50500/authentication</value>
|
||||
</property>
|
||||
<property name="serviceInterface">
|
||||
<value>org.alfresco.service.cmr.security.AuthenticationService</value>
|
||||
@ -16,17 +16,23 @@
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!-- Client Ticket Holder Bean. -->
|
||||
<bean id="clientTicketHolder" class="org.alfresco.repo.remote.ClientTicketHolderGlobal"/>
|
||||
|
||||
<!-- Remote interface for AVM. -->
|
||||
<bean id="avmRemote" class="org.alfresco.repo.remote.AVMRemoteImpl">
|
||||
<property name="avmRemoteTransport">
|
||||
<ref bean="avmRemoteTransport"/>
|
||||
</property>
|
||||
<property name="clientTicketHolder">
|
||||
<ref bean="clientTicketHolder"/>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!-- RMI Proxy bean for avmRemoteTransport -->
|
||||
<bean id="avmRemoteTransport" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
|
||||
<property name="serviceUrl">
|
||||
<value>rmi://localhost:1313/avm</value>
|
||||
<value>rmi://localhost:50500/avm</value>
|
||||
</property>
|
||||
<property name="serviceInterface">
|
||||
<value>org.alfresco.service.cmr.remote.AVMRemoteTransport</value>
|
||||
@ -40,11 +46,14 @@
|
||||
<property name="avmSyncServiceTransport">
|
||||
<ref bean="avmSyncServiceTransport"/>
|
||||
</property>
|
||||
<property name="clientTicketHolder">
|
||||
<ref bean="clientTicketHolder"/>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="avmSyncServiceTransport" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
|
||||
<property name="serviceUrl">
|
||||
<value>rmi://localhost:1313/avmsync</value>
|
||||
<value>rmi://localhost:50500/avmsync</value>
|
||||
</property>
|
||||
<property name="serviceInterface">
|
||||
<value>org.alfresco.service.cmr.remote.AVMSyncServiceTransport</value>
|
||||
|
@ -36,9 +36,13 @@ public interface WCMAppModel
|
||||
static final QName TYPE_AVMWEBFOLDER = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webfolder");
|
||||
static final QName PROP_AVMSTORE = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "avmstore");
|
||||
static final QName PROP_DEFAULTWEBAPP = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "defaultwebapp");
|
||||
static final QName PROP_DEPLOYTO = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployto");
|
||||
static final QName PROP_SELECTEDDEPLOYTO = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "selecteddeployto");
|
||||
static final QName PROP_SELECTEDDEPLOYVERSION = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "selecteddeployversion");
|
||||
static final QName ASSOC_WEBUSER = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webuser");
|
||||
static final QName ASSOC_WEBFORM = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webform");
|
||||
static final QName ASSOC_WEBWORKFLOWDEFAULTS = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webworkflowdefaults");
|
||||
static final QName ASSOC_DEPLOYMENTREPORT = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deploymentreport");
|
||||
|
||||
// AVM web user reference
|
||||
static final QName TYPE_WEBUSER = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webuser");
|
||||
@ -63,6 +67,15 @@ public interface WCMAppModel
|
||||
// AVM web workflow defaults
|
||||
static final QName TYPE_WEBWORKFLOWDEFAULTS = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webworkflowdefaults");
|
||||
|
||||
// AVM website deployment report
|
||||
static final QName TYPE_DEPLOYMENTREPORT = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deploymentreport");
|
||||
static final QName PROP_DEPLOYSERVER = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployserver");
|
||||
static final QName PROP_DEPLOYVERSION = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployversion");
|
||||
static final QName PROP_DEPLOYSUCCESSFUL = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deploysuccessful");
|
||||
static final QName PROP_DEPLOYFAILEDREASON = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployfailedreason");
|
||||
static final QName PROP_DEPLOYSTARTTIME = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deploystarttime");
|
||||
static final QName PROP_DEPLOYENDTIME = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployendtime");
|
||||
|
||||
// AVM webapp aspect
|
||||
static final QName ASPECT_WEBAPP = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webapp");
|
||||
|
||||
|
@ -215,4 +215,16 @@ public interface AVMNode
|
||||
* @param other The other node.
|
||||
*/
|
||||
public void copyMetaDataFrom(AVMNode other);
|
||||
|
||||
/**
|
||||
* Get the GUID associated with this version.
|
||||
* @return The GUID.
|
||||
*/
|
||||
public String getGuid();
|
||||
|
||||
/**
|
||||
* Set the GUID associated with this version.
|
||||
* @param guid
|
||||
*/
|
||||
public void setGuid(String guid);
|
||||
}
|
@ -33,6 +33,7 @@ import org.alfresco.repo.domain.DbAccessControlList;
|
||||
import org.alfresco.repo.domain.PropertyValue;
|
||||
import org.alfresco.service.cmr.avm.AVMReadOnlyException;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.util.GUID;
|
||||
|
||||
/**
|
||||
* Base class for all repository file system like objects.
|
||||
@ -77,6 +78,11 @@ public abstract class AVMNodeImpl implements AVMNode, Serializable
|
||||
*/
|
||||
private AVMStore fStoreNew;
|
||||
|
||||
/**
|
||||
* The GUID for this version.
|
||||
*/
|
||||
private String fGUID;
|
||||
|
||||
/**
|
||||
* Default constructor.
|
||||
*/
|
||||
@ -109,6 +115,7 @@ public abstract class AVMNodeImpl implements AVMNode, Serializable
|
||||
time,
|
||||
time);
|
||||
fStoreNew = store;
|
||||
fGUID = GUID.generate();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -515,4 +522,20 @@ public abstract class AVMNodeImpl implements AVMNode, Serializable
|
||||
throw new AVMReadOnlyException("Write Operation on R/O Node.");
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.repo.avm.AVMNode#getGuid()
|
||||
*/
|
||||
public String getGuid()
|
||||
{
|
||||
return fGUID;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.repo.avm.AVMNode#setGuid(java.lang.String)
|
||||
*/
|
||||
public void setGuid(String guid)
|
||||
{
|
||||
fGUID = guid;
|
||||
}
|
||||
}
|
||||
|
@ -193,7 +193,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidStoreRefException("Not Found.", storeRef);
|
||||
throw new InvalidStoreRefException(storeName +":/" + " not found.", storeRef);
|
||||
}
|
||||
}
|
||||
|
||||
@ -297,7 +297,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
|
||||
}
|
||||
catch (AVMNotFoundException e)
|
||||
{
|
||||
throw new InvalidNodeRefException("Not Found.", parentRef);
|
||||
throw new InvalidNodeRefException(avmPath + " not found.", parentRef);
|
||||
}
|
||||
catch (AVMExistsException e)
|
||||
{
|
||||
@ -480,7 +480,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
|
||||
avmVersionPath.getSecond());
|
||||
if (desc == null)
|
||||
{
|
||||
throw new InvalidNodeRefException("Not Found.", nodeRef);
|
||||
throw new InvalidNodeRefException(avmVersionPath.getSecond() + " not found.", nodeRef);
|
||||
}
|
||||
if (desc.isPlainDirectory())
|
||||
{
|
||||
@ -794,7 +794,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
|
||||
}
|
||||
catch (AVMNotFoundException e)
|
||||
{
|
||||
throw new InvalidNodeRefException("Not Found.", nodeRef);
|
||||
throw new InvalidNodeRefException(avmVersionPath.getSecond() +" not found.", nodeRef);
|
||||
}
|
||||
}
|
||||
|
||||
@ -821,7 +821,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
|
||||
childVersionPath.getSecond());
|
||||
if (child == null)
|
||||
{
|
||||
throw new InvalidNodeRefException("Not Found.", childRef);
|
||||
throw new InvalidNodeRefException(childVersionPath.getSecond() + " not found.", childRef);
|
||||
}
|
||||
Pair<Integer, String> parentVersionPath = AVMNodeConverter.ToAVMVersionPath(parentRef);
|
||||
if (parentVersionPath.getFirst() >= 0)
|
||||
@ -870,7 +870,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
|
||||
String [] childPathBase = AVMNodeConverter.SplitBase(childPath);
|
||||
if (childPathBase[0] == null || !childPathBase[0].equals(parentPath))
|
||||
{
|
||||
throw new InvalidNodeRefException("Not a child.", childRef);
|
||||
throw new InvalidNodeRefException(childPath + " not a child of " + parentPath, childRef);
|
||||
}
|
||||
try
|
||||
{
|
||||
@ -887,7 +887,8 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
|
||||
}
|
||||
catch (AVMNotFoundException e)
|
||||
{
|
||||
throw new InvalidNodeRefException("Not found.", childRef);
|
||||
throw new InvalidNodeRefException(childPathBase[1] + " not found in " + childPathBase[0],
|
||||
childRef);
|
||||
}
|
||||
}
|
||||
|
||||
@ -944,7 +945,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
|
||||
}
|
||||
catch (AVMNotFoundException e)
|
||||
{
|
||||
throw new InvalidNodeRefException("Not Found.", nodeRef);
|
||||
throw new InvalidNodeRefException(avmVersionPath.getSecond() + " not found.", nodeRef);
|
||||
}
|
||||
Map<QName, Serializable> result = new HashMap<QName, Serializable>();
|
||||
for (QName qName : props.keySet())
|
||||
@ -1017,7 +1018,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
|
||||
}
|
||||
catch (AVMNotFoundException e)
|
||||
{
|
||||
throw new InvalidNodeRefException("Not Found.", nodeRef);
|
||||
throw new InvalidNodeRefException(avmVersionPath.getSecond() + " not found.", nodeRef);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1052,7 +1053,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
|
||||
avmVersionPath.getSecond());
|
||||
if (desc == null)
|
||||
{
|
||||
throw new InvalidNodeRefException("Not Found.", nodeRef);
|
||||
throw new InvalidNodeRefException(avmVersionPath.getSecond() + " not found.", nodeRef);
|
||||
}
|
||||
if (qName.equals(ContentModel.PROP_CREATED))
|
||||
{
|
||||
@ -1153,7 +1154,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
|
||||
AVMNodeDescriptor desc = fAVMService.lookup(-1, avmVersionPath.getSecond());
|
||||
if (desc == null)
|
||||
{
|
||||
throw new InvalidNodeRefException("Not Found.", nodeRef);
|
||||
throw new InvalidNodeRefException(avmVersionPath.getSecond() + " not found.", nodeRef);
|
||||
}
|
||||
if (desc.isPlainFile())
|
||||
{
|
||||
@ -1171,7 +1172,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
|
||||
}
|
||||
catch (AVMNotFoundException e)
|
||||
{
|
||||
throw new InvalidNodeRefException("Not Found.", nodeRef);
|
||||
throw new InvalidNodeRefException(avmVersionPath.getSecond() + " not found.", nodeRef);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1256,7 +1257,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
|
||||
}
|
||||
catch (AVMNotFoundException e)
|
||||
{
|
||||
throw new InvalidNodeRefException("Not Found.", nodeRef);
|
||||
throw new InvalidNodeRefException(avmVersionPath.getSecond() + " not found.", nodeRef);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -496,4 +496,12 @@ public class AVMRemoteLocal implements AVMRemote
|
||||
{
|
||||
return fService.getAPath(desc);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.service.cmr.remote.AVMRemote#setGuid(java.lang.String, java.lang.String)
|
||||
*/
|
||||
public void setGuid(String path, String guid)
|
||||
{
|
||||
fService.setGuid(path, guid);
|
||||
}
|
||||
}
|
||||
|
@ -1018,4 +1018,13 @@ public class AVMRemoteTransportService implements AVMRemoteTransport, Runnable
|
||||
fAuthService.validate(ticket);
|
||||
return fAVMService.getAPath(desc);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.service.cmr.remote.AVMRemoteTransport#setGuid(java.lang.String, java.lang.String, java.lang.String)
|
||||
*/
|
||||
public void setGuid(String ticket, String path, String guid)
|
||||
{
|
||||
fAuthService.validate(ticket);
|
||||
fAVMService.setGuid(path, guid);
|
||||
}
|
||||
}
|
||||
|
@ -51,6 +51,7 @@ import org.alfresco.service.cmr.repository.ContentData;
|
||||
import org.alfresco.service.cmr.repository.ContentReader;
|
||||
import org.alfresco.service.cmr.repository.ContentWriter;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.util.GUID;
|
||||
import org.alfresco.util.Pair;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
@ -2442,4 +2443,29 @@ public class AVMRepository
|
||||
fLookupCount.set(null);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the GUID on a node.
|
||||
* @param path
|
||||
* @param guid
|
||||
*/
|
||||
public void setGuid(String path, String guid)
|
||||
{
|
||||
fLookupCount.set(1);
|
||||
try
|
||||
{
|
||||
String [] pathParts = SplitPath(path);
|
||||
AVMStore store = getAVMStoreByName(pathParts[0]);
|
||||
if (store == null)
|
||||
{
|
||||
throw new AVMNotFoundException("Store not found:" + pathParts[0]);
|
||||
}
|
||||
fLookupCache.onWrite(pathParts[0]);
|
||||
store.setGuid(pathParts[1], guid);
|
||||
}
|
||||
finally
|
||||
{
|
||||
fLookupCount.set(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1458,4 +1458,17 @@ public class AVMServiceImpl implements AVMService
|
||||
AlfrescoTransactionSupport.bindListener(fTransactionListener);
|
||||
fAVMRepository.revert(baseName[0], baseName[1], toRevertTo);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.service.cmr.avm.AVMService#setGuid(java.lang.String, java.lang.String)
|
||||
*/
|
||||
public void setGuid(String path, String guid)
|
||||
{
|
||||
if (path == null || guid == null)
|
||||
{
|
||||
throw new AVMBadArgumentException("Illegal Null Argument.");
|
||||
}
|
||||
AlfrescoTransactionSupport.bindListener(fTransactionListener);
|
||||
fAVMRepository.setGuid(path, guid);
|
||||
}
|
||||
}
|
||||
|
@ -60,6 +60,8 @@ import org.alfresco.service.cmr.avm.AVMService;
|
||||
import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
|
||||
import org.alfresco.service.cmr.avm.LayeringDescriptor;
|
||||
import org.alfresco.service.cmr.avm.VersionDescriptor;
|
||||
import org.alfresco.service.cmr.avm.deploy.DeploymentReport;
|
||||
import org.alfresco.service.cmr.avm.deploy.DeploymentService;
|
||||
import org.alfresco.service.cmr.avmsync.AVMDifference;
|
||||
import org.alfresco.service.cmr.avmsync.AVMSyncException;
|
||||
import org.alfresco.service.cmr.model.FileFolderService;
|
||||
@ -82,6 +84,73 @@ import org.alfresco.util.Pair;
|
||||
*/
|
||||
public class AVMServiceTest extends AVMServiceTestBase
|
||||
{
|
||||
/**
|
||||
* Test Deployment.
|
||||
*/
|
||||
public void testDeployment()
|
||||
{
|
||||
try
|
||||
{
|
||||
DeploymentService depService = (DeploymentService)fContext.getBean("DeploymentService");
|
||||
setupBasicTree();
|
||||
TestDeploymentCallback callback = new TestDeploymentCallback();
|
||||
fService.createStore("target");
|
||||
DeploymentReport report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", false, false, false, callback);
|
||||
System.out.println(report);
|
||||
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());
|
||||
fService.createFile("main:/a/b", "biz").close();
|
||||
report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", false, false, true, callback);
|
||||
System.out.println(report);
|
||||
System.out.println(recursiveList("target", -1, true));
|
||||
assertNull(fService.lookup(-1, "target:/a/b/biz"));
|
||||
report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", false, false, false, callback);
|
||||
System.out.println(report);
|
||||
assertEquals(fService.lookup(-1, "main:/a/b/biz").getGuid(),
|
||||
fService.lookup(-1, "target:/a/b/biz").getGuid());
|
||||
fService.removeNode("main:/a/b/c/foo");
|
||||
report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", false, true, false, callback);
|
||||
System.out.println(report);
|
||||
assertNotNull(fService.lookup(-1, "target:/a/b/c/foo"));
|
||||
report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", false, false, false, callback);
|
||||
System.out.println(report);
|
||||
assertNull(fService.lookup(-1, "target:/a/b/c/foo"));
|
||||
fService.removeNode("main:/a/b/c/bar");
|
||||
fService.createDirectory("main:/a/b/c", "bar");
|
||||
report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", false, false, false, callback);
|
||||
System.out.println(report);
|
||||
depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target2:/wiggly/diggly", true, false, false, callback);
|
||||
System.out.println(report);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
fail();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test of GUIDs on AVM Nodes.
|
||||
*/
|
||||
public void testGuids()
|
||||
{
|
||||
try
|
||||
{
|
||||
setupBasicTree();
|
||||
System.out.println(fService.lookup(-1, "main:/a/b/c/foo").getGuid());
|
||||
String guid = GUID.generate();
|
||||
fService.setGuid("main:/a/b/c/foo", guid);
|
||||
assertEquals(guid, fService.lookup(-1, "main:/a/b/c/foo").getGuid());
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
fail();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the revert to version action.
|
||||
*/
|
||||
|
@ -470,4 +470,11 @@ public interface AVMStore
|
||||
* @param toRevertTo The descriptor of the version to revert to.
|
||||
*/
|
||||
public void revert(String path, String name, AVMNodeDescriptor toRevertTo);
|
||||
|
||||
/**
|
||||
* Set the GUID on a node.
|
||||
* @param path
|
||||
* @param guid
|
||||
*/
|
||||
public void setGuid(String path, String guid);
|
||||
}
|
@ -58,6 +58,7 @@ import org.alfresco.service.cmr.repository.ContentReader;
|
||||
import org.alfresco.service.cmr.repository.ContentWriter;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.util.GUID;
|
||||
|
||||
/**
|
||||
* A Repository contains a current root directory and a list of
|
||||
@ -948,6 +949,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
|
||||
}
|
||||
AVMNode node = lPath.getCurrentNode();
|
||||
node.setProperty(name, value);
|
||||
node.setGuid(GUID.generate());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -964,6 +966,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
|
||||
}
|
||||
AVMNode node = lPath.getCurrentNode();
|
||||
node.setProperties(properties);
|
||||
node.setGuid(GUID.generate());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1014,6 +1017,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
|
||||
throw new AVMNotFoundException("Path " + path + " not found.");
|
||||
}
|
||||
AVMNode node = lPath.getCurrentNode();
|
||||
node.setGuid(GUID.generate());
|
||||
node.deleteProperty(name);
|
||||
}
|
||||
|
||||
@ -1029,6 +1033,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
|
||||
throw new AVMNotFoundException("Path " + path + " not found.");
|
||||
}
|
||||
AVMNode node = lPath.getCurrentNode();
|
||||
node.setGuid(GUID.generate());
|
||||
node.deleteProperties();
|
||||
}
|
||||
|
||||
@ -1137,6 +1142,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
|
||||
throw new AVMWrongTypeException("File Expected.");
|
||||
}
|
||||
node.updateModTime();
|
||||
node.setGuid(GUID.generate());
|
||||
return ((FileNode)node).getContentData(lPath);
|
||||
}
|
||||
|
||||
@ -1174,6 +1180,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
|
||||
}
|
||||
AVMNode node = lPath.getCurrentNode();
|
||||
node.copyMetaDataFrom(from);
|
||||
node.setGuid(GUID.generate());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1197,6 +1204,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
|
||||
new AVMAspectNameImpl();
|
||||
newName.setNode(node);
|
||||
newName.setName(aspectName);
|
||||
node.setGuid(GUID.generate());
|
||||
AVMDAOs.Instance().fAVMAspectNameDAO.save(newName);
|
||||
}
|
||||
|
||||
@ -1245,6 +1253,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
|
||||
{
|
||||
AVMDAOs.Instance().fAVMNodePropertyDAO.delete(node, name);
|
||||
}
|
||||
node.setGuid(GUID.generate());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1279,6 +1288,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
|
||||
}
|
||||
AVMNode node = lPath.getCurrentNode();
|
||||
node.setAcl(acl);
|
||||
node.setGuid(GUID.generate());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1355,4 +1365,18 @@ public class AVMStoreImpl implements AVMStore, Serializable
|
||||
PropertyValue value = new PropertyValue(null, toRevertTo.getId());
|
||||
toLink.setProperty(WCMModel.PROP_REVERTED_ID, value);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.repo.avm.AVMStore#setGuid(java.lang.String, java.lang.String)
|
||||
*/
|
||||
public void setGuid(String path, String guid)
|
||||
{
|
||||
Lookup lPath = lookup(-1, path, true, true);
|
||||
if (lPath == null)
|
||||
{
|
||||
throw new AVMNotFoundException("Path not found: " + path);
|
||||
}
|
||||
AVMNode node = lPath.getCurrentNode();
|
||||
node.setGuid(guid);
|
||||
}
|
||||
}
|
||||
|
@ -28,6 +28,7 @@ import java.io.OutputStream;
|
||||
import java.util.List;
|
||||
|
||||
import org.alfresco.repo.remote.ClientTicketHolder;
|
||||
import org.alfresco.repo.remote.ClientTicketHolderGlobal;
|
||||
import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
|
||||
import org.alfresco.service.cmr.avmsync.AVMDifference;
|
||||
import org.alfresco.service.cmr.avmsync.AVMSyncService;
|
||||
@ -72,7 +73,7 @@ public class AVMTestRemote extends TestCase
|
||||
fAuthService = (AuthenticationService)fContext.getBean("authenticationService");
|
||||
fAuthService.authenticate("admin", "admin".toCharArray());
|
||||
String ticket = fAuthService.getCurrentTicket();
|
||||
ClientTicketHolder.SetTicket(ticket);
|
||||
((ClientTicketHolder)fContext.getBean("clientTicketHolder")).setTicket(ticket);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -121,6 +121,7 @@ public class DeletedNodeImpl extends AVMNodeImpl implements DeletedNode
|
||||
attrs.getModDate(),
|
||||
attrs.getAccessDate(),
|
||||
getId(),
|
||||
getGuid(),
|
||||
getVersionID(),
|
||||
null,
|
||||
false,
|
||||
@ -149,6 +150,7 @@ public class DeletedNodeImpl extends AVMNodeImpl implements DeletedNode
|
||||
attrs.getModDate(),
|
||||
attrs.getAccessDate(),
|
||||
getId(),
|
||||
getGuid(),
|
||||
getVersionID(),
|
||||
null,
|
||||
false,
|
||||
@ -179,6 +181,7 @@ public class DeletedNodeImpl extends AVMNodeImpl implements DeletedNode
|
||||
attrs.getModDate(),
|
||||
attrs.getAccessDate(),
|
||||
getId(),
|
||||
getGuid(),
|
||||
getVersionID(),
|
||||
null,
|
||||
false,
|
||||
|
@ -719,6 +719,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
|
||||
attrs.getModDate(),
|
||||
attrs.getAccessDate(),
|
||||
getId(),
|
||||
getGuid(),
|
||||
getVersionID(),
|
||||
indirect,
|
||||
fPrimaryIndirection,
|
||||
@ -748,6 +749,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
|
||||
attrs.getModDate(),
|
||||
attrs.getAccessDate(),
|
||||
getId(),
|
||||
getGuid(),
|
||||
getVersionID(),
|
||||
getUnderlying(lPath),
|
||||
fPrimaryIndirection,
|
||||
@ -788,6 +790,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
|
||||
attrs.getModDate(),
|
||||
attrs.getAccessDate(),
|
||||
getId(),
|
||||
getGuid(),
|
||||
getVersionID(),
|
||||
indirection,
|
||||
fPrimaryIndirection,
|
||||
|
@ -165,6 +165,7 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode
|
||||
attrs.getModDate(),
|
||||
attrs.getAccessDate(),
|
||||
getId(),
|
||||
getGuid(),
|
||||
getVersionID(),
|
||||
getUnderlying(lPath),
|
||||
false,
|
||||
@ -193,6 +194,7 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode
|
||||
attrs.getModDate(),
|
||||
attrs.getAccessDate(),
|
||||
getId(),
|
||||
getGuid(),
|
||||
getVersionID(),
|
||||
getUnderlying(lPath),
|
||||
false,
|
||||
@ -223,6 +225,7 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode
|
||||
attrs.getModDate(),
|
||||
attrs.getAccessDate(),
|
||||
getId(),
|
||||
getGuid(),
|
||||
getVersionID(),
|
||||
fIndirection,
|
||||
false,
|
||||
|
@ -375,6 +375,7 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
|
||||
attrs.getModDate(),
|
||||
attrs.getAccessDate(),
|
||||
getId(),
|
||||
getGuid(),
|
||||
getVersionID(),
|
||||
null,
|
||||
false,
|
||||
@ -403,6 +404,7 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
|
||||
attrs.getModDate(),
|
||||
attrs.getAccessDate(),
|
||||
getId(),
|
||||
getGuid(),
|
||||
getVersionID(),
|
||||
null,
|
||||
false,
|
||||
@ -433,6 +435,7 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
|
||||
attrs.getModDate(),
|
||||
attrs.getAccessDate(),
|
||||
getId(),
|
||||
getGuid(),
|
||||
getVersionID(),
|
||||
null,
|
||||
false,
|
||||
|
@ -200,6 +200,7 @@ class PlainFileNodeImpl extends FileNodeImpl implements PlainFileNode
|
||||
attrs.getModDate(),
|
||||
attrs.getAccessDate(),
|
||||
getId(),
|
||||
getGuid(),
|
||||
getVersionID(),
|
||||
null,
|
||||
false,
|
||||
@ -228,6 +229,7 @@ class PlainFileNodeImpl extends FileNodeImpl implements PlainFileNode
|
||||
attrs.getModDate(),
|
||||
attrs.getAccessDate(),
|
||||
getId(),
|
||||
getGuid(),
|
||||
getVersionID(),
|
||||
null,
|
||||
false,
|
||||
@ -258,6 +260,7 @@ class PlainFileNodeImpl extends FileNodeImpl implements PlainFileNode
|
||||
attrs.getModDate(),
|
||||
attrs.getAccessDate(),
|
||||
getId(),
|
||||
getGuid(),
|
||||
getVersionID(),
|
||||
null,
|
||||
false,
|
||||
|
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* 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.avm;
|
||||
|
||||
import org.alfresco.service.cmr.avm.deploy.DeploymentCallback;
|
||||
import org.alfresco.service.cmr.avm.deploy.DeploymentEvent;
|
||||
|
||||
/**
|
||||
* Trivial deployment callback for testing.
|
||||
* @author britt
|
||||
*/
|
||||
public class TestDeploymentCallback implements DeploymentCallback
|
||||
{
|
||||
public void eventOccurred(DeploymentEvent event)
|
||||
{
|
||||
System.out.println(event);
|
||||
}
|
||||
}
|
@ -0,0 +1,327 @@
|
||||
/*
|
||||
* 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.avm.actions;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.io.Serializable;
|
||||
import java.io.StringWriter;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.model.WCMAppModel;
|
||||
import org.alfresco.repo.action.ParameterDefinitionImpl;
|
||||
import org.alfresco.repo.action.executer.ActionExecuterAbstractBase;
|
||||
import org.alfresco.repo.avm.AVMNodeConverter;
|
||||
import org.alfresco.repo.content.MimetypeMap;
|
||||
import org.alfresco.service.cmr.action.Action;
|
||||
import org.alfresco.service.cmr.action.ParameterDefinition;
|
||||
import org.alfresco.service.cmr.avm.deploy.DeploymentCallback;
|
||||
import org.alfresco.service.cmr.avm.deploy.DeploymentEvent;
|
||||
import org.alfresco.service.cmr.avm.deploy.DeploymentReport;
|
||||
import org.alfresco.service.cmr.avm.deploy.DeploymentService;
|
||||
import org.alfresco.service.cmr.avmsync.AVMSyncException;
|
||||
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
||||
import org.alfresco.service.cmr.repository.ContentService;
|
||||
import org.alfresco.service.cmr.repository.ContentWriter;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.util.Pair;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
/**
|
||||
* Deploys a website snapshot to a remote server.
|
||||
*
|
||||
* @author gavinc
|
||||
*/
|
||||
public class AVMDeploySnapshotAction extends ActionExecuterAbstractBase
|
||||
{
|
||||
public static final String NAME = "avm-deploy-snapshot";
|
||||
|
||||
public static final String PARAM_WEBSITE = "website";
|
||||
public static final String PARAM_TARGET_SERVER = "target-server";
|
||||
public static final String PARAM_DEFAULT_RMI_PORT = "default-rmi-port";
|
||||
public static final String PARAM_REMOTE_USERNAME = "remote-username";
|
||||
public static final String PARAM_REMOTE_PASSWORD = "remote-password";
|
||||
public static final String PARAM_CALLBACK = "deploy-callback";
|
||||
public static final String PARAM_DELAY = "delay";
|
||||
|
||||
private DeploymentService deployService;
|
||||
private ContentService contentService;
|
||||
private NodeService nodeService;
|
||||
|
||||
private static Log logger = LogFactory.getLog(AVMDeploySnapshotAction.class);
|
||||
private static Log delayDeploymentLogger = LogFactory.getLog("alfresco.deployment.delay");
|
||||
|
||||
/**
|
||||
* @param service The NodeService instance
|
||||
*/
|
||||
public void setNodeService(NodeService service)
|
||||
{
|
||||
this.nodeService = service;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param contentService The ContentService instance
|
||||
*/
|
||||
public void setContentService(ContentService contentService)
|
||||
{
|
||||
this.contentService = contentService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param service The AVM Deployment Service instance
|
||||
*/
|
||||
public void setDeploymentService(DeploymentService service)
|
||||
{
|
||||
deployService = service;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addParameterDefinitions(List<ParameterDefinition> paramList)
|
||||
{
|
||||
paramList.add(new ParameterDefinitionImpl(PARAM_WEBSITE, DataTypeDefinition.NODE_REF, true,
|
||||
getParamDisplayLabel(PARAM_WEBSITE)));
|
||||
paramList.add(new ParameterDefinitionImpl(PARAM_TARGET_SERVER, DataTypeDefinition.TEXT, true,
|
||||
getParamDisplayLabel(PARAM_TARGET_SERVER)));
|
||||
paramList.add(new ParameterDefinitionImpl(PARAM_DEFAULT_RMI_PORT, DataTypeDefinition.INT, true,
|
||||
getParamDisplayLabel(PARAM_DEFAULT_RMI_PORT)));
|
||||
paramList.add(new ParameterDefinitionImpl(PARAM_REMOTE_USERNAME, DataTypeDefinition.TEXT, true,
|
||||
getParamDisplayLabel(PARAM_REMOTE_USERNAME)));
|
||||
paramList.add(new ParameterDefinitionImpl(PARAM_REMOTE_PASSWORD, DataTypeDefinition.TEXT, true,
|
||||
getParamDisplayLabel(PARAM_REMOTE_PASSWORD)));
|
||||
paramList.add(new ParameterDefinitionImpl(PARAM_CALLBACK, DataTypeDefinition.ANY, false,
|
||||
getParamDisplayLabel(PARAM_CALLBACK)));
|
||||
paramList.add(new ParameterDefinitionImpl(PARAM_DELAY, DataTypeDefinition.INT, false,
|
||||
getParamDisplayLabel(PARAM_DELAY)));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void executeImpl(Action action, NodeRef actionedUponNodeRef)
|
||||
{
|
||||
// the actionedUponNodeRef is the path of the sandbox to deploy
|
||||
Pair<Integer, String> avmVersionPath = AVMNodeConverter.ToAVMVersionPath(actionedUponNodeRef);
|
||||
int version = avmVersionPath.getFirst();
|
||||
String path = avmVersionPath.getSecond();
|
||||
|
||||
// get store name and path parts.
|
||||
String [] storePath = path.split(":");
|
||||
if (storePath.length != 2)
|
||||
{
|
||||
throw new AVMSyncException("Malformed source path: " + path);
|
||||
}
|
||||
|
||||
// get the NodeRef representing the website being deployed
|
||||
NodeRef websiteRef = (NodeRef)action.getParameterValue(PARAM_WEBSITE);
|
||||
if (this.nodeService.exists(websiteRef) == false)
|
||||
{
|
||||
throw new IllegalStateException("The website NodeRef (" + websiteRef +
|
||||
") provided does not exist!");
|
||||
}
|
||||
|
||||
// get the callback object
|
||||
DeploymentCallback callback = (DeploymentCallback)action.getParameterValue(PARAM_CALLBACK);
|
||||
|
||||
// get the remote machine
|
||||
String targetServer = (String)action.getParameterValue(PARAM_TARGET_SERVER);
|
||||
String remoteUsername = (String)action.getParameterValue(PARAM_REMOTE_USERNAME);
|
||||
String remotePassword = (String)action.getParameterValue(PARAM_REMOTE_PASSWORD);
|
||||
int defaultRmiPort = (Integer)action.getParameterValue(PARAM_DEFAULT_RMI_PORT);
|
||||
int delay = -1;
|
||||
if (action.getParameterValue(PARAM_DELAY) != null)
|
||||
{
|
||||
delay = (Integer)action.getParameterValue(PARAM_DELAY);
|
||||
}
|
||||
|
||||
// if "localhost" is passed as the target server add "live" to the end of the
|
||||
// store name, this store will then get created automatically.
|
||||
String targetPath = null;
|
||||
if (targetServer.equalsIgnoreCase("localhost") || targetServer.equalsIgnoreCase("127.0.0.1"))
|
||||
{
|
||||
targetPath = storePath[0] + "live:" + storePath[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO: Check that the actual host name of the machine hasn't been passed
|
||||
|
||||
targetPath = path;
|
||||
}
|
||||
|
||||
// take a note of the current date/time
|
||||
Date startDate = new Date();
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Starting deployment of " + actionedUponNodeRef.toString() +
|
||||
" to " + targetServer + " at " + startDate);
|
||||
|
||||
if (delayDeploymentLogger.isDebugEnabled() && delay > 0)
|
||||
{
|
||||
delayDeploymentLogger.debug("Delaying deployment by " + delay + "s...");
|
||||
|
||||
// add a delay for testing purposes if the delay logger level is debug
|
||||
try { Thread.sleep(1000*delay); } catch (Throwable e) {}
|
||||
}
|
||||
|
||||
// make the deploy call passing in the DeploymentCallback, if present
|
||||
Throwable deployError = null;
|
||||
DeploymentReport report = null;
|
||||
try
|
||||
{
|
||||
int port = defaultRmiPort;
|
||||
|
||||
// check whether there is a port number present, if so, use it
|
||||
int idx = targetServer.indexOf(":");
|
||||
if (idx != -1)
|
||||
{
|
||||
String strPort = targetServer.substring(idx+1);
|
||||
port = Integer.parseInt(strPort);
|
||||
}
|
||||
|
||||
// TODO: we need to capture username/password for the remote server at some
|
||||
// point, for now we use the admin/admin account, need to externalise this too!
|
||||
report = this.deployService.deployDifference(version, path, targetServer, port,
|
||||
remoteUsername, remotePassword, targetPath, true, false, false, callback);
|
||||
}
|
||||
catch (Throwable err)
|
||||
{
|
||||
deployError = err;
|
||||
logger.error(deployError);
|
||||
|
||||
// report the error to the callback object
|
||||
// TODO: See if this can be incorporated into the DeploymentCallback I/F
|
||||
if (callback != null)
|
||||
{
|
||||
// to avoid a circular dependency use reflection to call the method
|
||||
try
|
||||
{
|
||||
Method method = callback.getClass().getMethod("errorOccurred", new Class[] {Throwable.class});
|
||||
if (method != null)
|
||||
{
|
||||
method.invoke(callback, new Object[] {err});
|
||||
}
|
||||
}
|
||||
catch (Throwable e)
|
||||
{
|
||||
logger.warn("Failed to inform deployment monitor of deployment failure", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (report != null)
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Differences successfully applied to " + targetServer);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Failed to apply differences to " + targetServer);
|
||||
}
|
||||
|
||||
// create the deployment report node
|
||||
createDeploymentReportNode(report, (String)action.getParameterValue(PARAM_TARGET_SERVER),
|
||||
version, websiteRef, startDate, deployError);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a deployment report node as a child of the given website.
|
||||
*
|
||||
* @param report The DeploymentReport result from the deploy,
|
||||
* will be null if the deploy failed
|
||||
* @param targetServer The server the deploy was going to
|
||||
* @param version The version of the site bebing deployed (the snapshot)
|
||||
* @param websiteRef The NodeRef of the folder representing the website
|
||||
* @param startDate The date/time the deployment started
|
||||
* @param error The error that caused the deployment to fail, null if the
|
||||
* deployment was successful
|
||||
* @return The created deployment report NodeRef
|
||||
*/
|
||||
private NodeRef createDeploymentReportNode(DeploymentReport report, String targetServer,
|
||||
int version, NodeRef websiteRef, Date startDate, Throwable error)
|
||||
{
|
||||
NodeRef reportRef = null;
|
||||
|
||||
Map<QName, Serializable> props = new HashMap<QName, Serializable>(4, 1.0f);
|
||||
props.put(ContentModel.PROP_NAME, targetServer.replace(':', '_') + " deployment report.txt");
|
||||
props.put(WCMAppModel.PROP_DEPLOYSERVER, targetServer);
|
||||
props.put(WCMAppModel.PROP_DEPLOYVERSION, version);
|
||||
props.put(WCMAppModel.PROP_DEPLOYSTARTTIME, startDate);
|
||||
props.put(WCMAppModel.PROP_DEPLOYENDTIME, new Date());
|
||||
props.put(WCMAppModel.PROP_DEPLOYSUCCESSFUL, (report != null));
|
||||
if (report == null && error != null)
|
||||
{
|
||||
// add error message as fail reason if appropriate
|
||||
props.put(WCMAppModel.PROP_DEPLOYFAILEDREASON, error.getMessage());
|
||||
}
|
||||
reportRef = this.nodeService.createNode(websiteRef,
|
||||
WCMAppModel.ASSOC_DEPLOYMENTREPORT, WCMAppModel.ASSOC_DEPLOYMENTREPORT,
|
||||
WCMAppModel.TYPE_DEPLOYMENTREPORT, props).getChildRef();
|
||||
ContentWriter writer = contentService.getWriter(reportRef, ContentModel.PROP_CONTENT, true);
|
||||
writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN);
|
||||
writer.setEncoding("UTF-8");
|
||||
|
||||
if (report == null)
|
||||
{
|
||||
if (error == null)
|
||||
{
|
||||
writer.putContent("");
|
||||
}
|
||||
else
|
||||
{
|
||||
// add the full stack trace of the error as the content
|
||||
StringWriter stack = new StringWriter();
|
||||
PrintWriter stackPrint = new PrintWriter(stack);
|
||||
error.printStackTrace(stackPrint);
|
||||
writer.putContent(stack.toString());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO: revisit this, is it better to stream to a temp file?
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (DeploymentEvent event : report)
|
||||
{
|
||||
builder.append(event.getType());
|
||||
builder.append(" ");
|
||||
builder.append(event.getDestination());
|
||||
builder.append("\r\n");
|
||||
}
|
||||
|
||||
writer.putContent(builder.toString());
|
||||
}
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Created deplyoment report node (" + reportRef + ") for targetServer " +
|
||||
targetServer);
|
||||
|
||||
return reportRef;
|
||||
}
|
||||
}
|
@ -32,6 +32,7 @@
|
||||
won't cause violations in the db during saves. -->
|
||||
<property name="versionID" type="int" column="version_id"
|
||||
not-null="true"/>
|
||||
<property name="guid" type="string" length="36" column="guid" not-null="true"/>
|
||||
<component name="basicAttributes" class="BasicAttributesImpl">
|
||||
<property name="creator" type="string" not-null="true"/>
|
||||
<property name="owner" type="string" not-null="true"/>
|
||||
|
@ -12,6 +12,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.alfresco.repo.remote.ClientTicketHolder;
|
||||
import org.alfresco.repo.remote.ClientTicketHolderGlobal;
|
||||
import org.alfresco.service.cmr.avmsync.AVMSyncService;
|
||||
import org.alfresco.service.cmr.remote.AVMRemote;
|
||||
import org.alfresco.service.cmr.remote.RepoRemote;
|
||||
@ -71,7 +72,7 @@ public abstract class CltBase
|
||||
fAuthenticationService = (AuthenticationService)fContext.getBean("authenticationService");
|
||||
fAuthenticationService.authenticate(System.getenv("ALFUSER"), System.getenv("ALFPASSWORD").toCharArray());
|
||||
String ticket = fAuthenticationService.getCurrentTicket();
|
||||
ClientTicketHolder.SetTicket(ticket);
|
||||
((ClientTicketHolder)fContext.getBean("clientTicketHolder")).setTicket(ticket);
|
||||
}
|
||||
|
||||
/**
|
||||
|
577
source/java/org/alfresco/repo/deploy/DeploymentServiceImpl.java
Normal file
577
source/java/org/alfresco/repo/deploy/DeploymentServiceImpl.java
Normal file
@ -0,0 +1,577 @@
|
||||
/*
|
||||
* 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.deploy;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.SortedMap;
|
||||
|
||||
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.avm.AVMException;
|
||||
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
|
||||
import org.alfresco.service.cmr.avm.AVMNotFoundException;
|
||||
import org.alfresco.service.cmr.avm.AVMService;
|
||||
import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
|
||||
import org.alfresco.service.cmr.avm.AVMWrongTypeException;
|
||||
import org.alfresco.service.cmr.avm.deploy.DeploymentCallback;
|
||||
import org.alfresco.service.cmr.avm.deploy.DeploymentEvent;
|
||||
import org.alfresco.service.cmr.avm.deploy.DeploymentReport;
|
||||
import org.alfresco.service.cmr.avm.deploy.DeploymentService;
|
||||
import org.alfresco.service.cmr.avmsync.AVMDifference;
|
||||
import org.alfresco.service.cmr.avmsync.AVMSyncService;
|
||||
import org.alfresco.service.cmr.remote.AVMRemote;
|
||||
import org.alfresco.service.cmr.remote.AVMRemoteTransport;
|
||||
import org.alfresco.service.cmr.security.AuthenticationService;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.util.Pair;
|
||||
import org.springframework.remoting.rmi.RmiProxyFactoryBean;
|
||||
|
||||
/**
|
||||
* Implementation of DeploymentService.
|
||||
* @author britt
|
||||
*/
|
||||
public class DeploymentServiceImpl implements DeploymentService
|
||||
{
|
||||
/**
|
||||
* The local AVMService Instance.
|
||||
*/
|
||||
private AVMService fAVMService;
|
||||
|
||||
/**
|
||||
* The Ticket holder.
|
||||
*/
|
||||
private ClientTicketHolder fTicketHolder;
|
||||
|
||||
/**
|
||||
* Default constructor.
|
||||
*/
|
||||
public DeploymentServiceImpl()
|
||||
{
|
||||
fTicketHolder = new ClientTicketHolderThread();
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter.
|
||||
* @param service The instance to set.
|
||||
*/
|
||||
public void setAvmService(AVMService service)
|
||||
{
|
||||
fAVMService = service;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.service.cmr.avm.deploy.DeploymentService#deployDifference(int, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String, boolean, boolean)
|
||||
*/
|
||||
public DeploymentReport deployDifference(int version, String srcPath, String hostName, int port, String userName, String password, String dstPath, boolean createDst, boolean dontDelete, boolean dontDo, DeploymentCallback callback)
|
||||
{
|
||||
try
|
||||
{
|
||||
DeploymentReport report = new DeploymentReport();
|
||||
AVMRemote remote = getRemote(hostName, port, userName, password);
|
||||
if (callback != null)
|
||||
{
|
||||
DeploymentEvent event = new DeploymentEvent(DeploymentEvent.Type.START,
|
||||
new Pair<Integer, String>(version, srcPath),
|
||||
dstPath);
|
||||
callback.eventOccurred(event);
|
||||
}
|
||||
// Get the root of the deployment from this server.
|
||||
AVMNodeDescriptor srcRoot = fAVMService.lookup(version, srcPath);
|
||||
if (srcRoot == null)
|
||||
{
|
||||
throw new AVMNotFoundException("Directory Not Found: " + srcPath);
|
||||
}
|
||||
if (!srcRoot.isDirectory())
|
||||
{
|
||||
throw new AVMWrongTypeException("Not a directory: " + srcPath);
|
||||
}
|
||||
// Create a snapshot on the destination store.
|
||||
String [] storePath = dstPath.split(":");
|
||||
int snapshot = -1;
|
||||
AVMNodeDescriptor dstParent = null;
|
||||
if (!dontDo)
|
||||
{
|
||||
String[] parentBase = AVMNodeConverter.SplitBase(dstPath);
|
||||
dstParent = remote.lookup(-1, parentBase[0]);
|
||||
if (dstParent == null)
|
||||
{
|
||||
if (createDst)
|
||||
{
|
||||
createDestination(remote, parentBase[0]);
|
||||
dstParent = remote.lookup(-1, parentBase[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new AVMNotFoundException("Node Not Found: " + parentBase[0]);
|
||||
}
|
||||
}
|
||||
snapshot = remote.createSnapshot(storePath[0], "PreDeploy", "Pre Deployment Snapshot");
|
||||
}
|
||||
// Get the root of the deployment on the destination server.
|
||||
AVMNodeDescriptor dstRoot = remote.lookup(-1, dstPath);
|
||||
if (dstRoot == null)
|
||||
{
|
||||
// If it doesn't exist, do a copyDirectory to create it.
|
||||
DeploymentEvent event =
|
||||
new DeploymentEvent(DeploymentEvent.Type.COPIED,
|
||||
new Pair<Integer, String>(version, srcPath),
|
||||
dstPath);
|
||||
report.add(event);
|
||||
if (callback != null)
|
||||
{
|
||||
callback.eventOccurred(event);
|
||||
}
|
||||
if (dontDo)
|
||||
{
|
||||
return report;
|
||||
}
|
||||
copyDirectory(version, srcRoot, dstParent, remote);
|
||||
if (callback != null)
|
||||
{
|
||||
event = new DeploymentEvent(DeploymentEvent.Type.END,
|
||||
new Pair<Integer, String>(version, srcPath),
|
||||
dstPath);
|
||||
callback.eventOccurred(event);
|
||||
}
|
||||
return report;
|
||||
}
|
||||
if (!dstRoot.isDirectory())
|
||||
{
|
||||
throw new AVMWrongTypeException("Not a Directory: " + dstPath);
|
||||
}
|
||||
// The corresponding directory exists so recursively deploy.
|
||||
try
|
||||
{
|
||||
deployDirectoryPush(version, srcRoot, dstRoot, remote, dontDelete, dontDo, report, callback);
|
||||
if (callback != null)
|
||||
{
|
||||
DeploymentEvent event = new DeploymentEvent(DeploymentEvent.Type.END,
|
||||
new Pair<Integer, String>(version, srcPath),
|
||||
dstPath);
|
||||
callback.eventOccurred(event);
|
||||
}
|
||||
return report;
|
||||
}
|
||||
catch (AVMException e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (snapshot != -1)
|
||||
{
|
||||
AVMSyncService syncService = getSyncService(hostName, port);
|
||||
List<AVMDifference> diffs = syncService.compare(snapshot, dstPath, -1, dstPath, null);
|
||||
syncService.update(diffs, null, false, false, true, true, "Abortd Deployment", "Aborted Deployment");
|
||||
}
|
||||
}
|
||||
catch (Exception ee)
|
||||
{
|
||||
throw new AVMException("Failed to rollback to version " + snapshot + " on " + hostName, ee);
|
||||
}
|
||||
throw new AVMException("Deployment to " + hostName + "failed.", e);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
fTicketHolder.setTicket(null);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Deploy all the children of corresponding directories.
|
||||
* @param src The source directory.
|
||||
* @param dst The destination directory.
|
||||
* @param remote The AVMRemote instance.
|
||||
* @param dontDelete Flag for not deleting.
|
||||
* @param dontDo Flag for dry run.
|
||||
*/
|
||||
private void deployDirectoryPush(int version,
|
||||
AVMNodeDescriptor src, AVMNodeDescriptor dst,
|
||||
AVMRemote remote, boolean dontDelete, boolean dontDo,
|
||||
DeploymentReport report,
|
||||
DeploymentCallback callback)
|
||||
{
|
||||
// Get the listing for the source.
|
||||
SortedMap<String, AVMNodeDescriptor> srcList = fAVMService.getDirectoryListing(src);
|
||||
// Get the listing for the destination.
|
||||
SortedMap<String, AVMNodeDescriptor> dstList = remote.getDirectoryListing(dst);
|
||||
for (Map.Entry<String, AVMNodeDescriptor> entry : srcList.entrySet())
|
||||
{
|
||||
String name = entry.getKey();
|
||||
AVMNodeDescriptor srcNode = entry.getValue();
|
||||
AVMNodeDescriptor dstNode = dstList.get(name);
|
||||
deploySinglePush(version, srcNode, dst, dstNode, remote, dontDelete, dontDo, report, callback);
|
||||
}
|
||||
// Delete nodes that are missing in the source.
|
||||
if (dontDelete)
|
||||
{
|
||||
return;
|
||||
}
|
||||
for (String name : dstList.keySet())
|
||||
{
|
||||
if (!srcList.containsKey(name))
|
||||
{
|
||||
Pair<Integer, String> source =
|
||||
new Pair<Integer, String>(version, AVMNodeConverter.ExtendAVMPath(src.getPath(), name));
|
||||
String destination = AVMNodeConverter.ExtendAVMPath(dst.getPath(), name);
|
||||
DeploymentEvent event =
|
||||
new DeploymentEvent(DeploymentEvent.Type.DELETED,
|
||||
source,
|
||||
destination);
|
||||
report.add(event);
|
||||
if (callback != null)
|
||||
{
|
||||
callback.eventOccurred(event);
|
||||
}
|
||||
if (dontDo)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
remote.removeNode(dst.getPath(), name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Push out a single node.
|
||||
* @param src The source node.
|
||||
* @param dstParent The destination parent.
|
||||
* @param dst The destination node. May be null.
|
||||
* @param remote The AVMRemote instance.
|
||||
* @param dontDelete Flag for whether deletions should happen.
|
||||
* @param dontDo Dry run flag.
|
||||
*/
|
||||
private void deploySinglePush(int version,
|
||||
AVMNodeDescriptor src, AVMNodeDescriptor dstParent,
|
||||
AVMNodeDescriptor dst, AVMRemote remote,
|
||||
boolean dontDelete, boolean dontDo,
|
||||
DeploymentReport report,
|
||||
DeploymentCallback callback)
|
||||
{
|
||||
// Destination does not exist.
|
||||
if (dst == null)
|
||||
{
|
||||
if (src.isDirectory())
|
||||
{
|
||||
// Recursively copy a source directory.
|
||||
Pair<Integer, String> source =
|
||||
new Pair<Integer, String>(version, src.getPath());
|
||||
String destination = AVMNodeConverter.ExtendAVMPath(dstParent.getPath(), src.getName());
|
||||
DeploymentEvent event = new DeploymentEvent(DeploymentEvent.Type.COPIED,
|
||||
source,
|
||||
destination);
|
||||
report.add(event);
|
||||
if (callback != null)
|
||||
{
|
||||
callback.eventOccurred(event);
|
||||
}
|
||||
if (dontDo)
|
||||
{
|
||||
return;
|
||||
}
|
||||
copyDirectory(version, src, dstParent, remote);
|
||||
return;
|
||||
}
|
||||
Pair<Integer, String> source =
|
||||
new Pair<Integer, String>(version, src.getPath());
|
||||
String destination = AVMNodeConverter.ExtendAVMPath(dstParent.getPath(), src.getName());
|
||||
DeploymentEvent event = new DeploymentEvent(DeploymentEvent.Type.COPIED,
|
||||
source,
|
||||
destination);
|
||||
report.add(event);
|
||||
if (callback != null)
|
||||
{
|
||||
callback.eventOccurred(event);
|
||||
}
|
||||
if (dontDo)
|
||||
{
|
||||
return;
|
||||
}
|
||||
// Copy a source file.
|
||||
OutputStream out = remote.createFile(dstParent.getPath(), src.getName());
|
||||
InputStream in = fAVMService.getFileInputStream(src);
|
||||
copyStream(in, out);
|
||||
copyMetadata(version, src, remote.lookup(-1, dstParent.getPath() + '/' + src.getName()), remote);
|
||||
return;
|
||||
}
|
||||
// Destination exists.
|
||||
if (src.isDirectory())
|
||||
{
|
||||
// If the destination is also a directory, recursively deploy.
|
||||
if (dst.isDirectory())
|
||||
{
|
||||
deployDirectoryPush(version, src, dst, remote, dontDelete, dontDo, report, callback);
|
||||
return;
|
||||
}
|
||||
Pair<Integer, String> source =
|
||||
new Pair<Integer, String>(version, src.getPath());
|
||||
String destination = dst.getPath();
|
||||
DeploymentEvent event = new DeploymentEvent(DeploymentEvent.Type.COPIED,
|
||||
source, destination);
|
||||
report.add(event);
|
||||
if (callback != null)
|
||||
{
|
||||
callback.eventOccurred(event);
|
||||
}
|
||||
if (dontDo)
|
||||
{
|
||||
return;
|
||||
}
|
||||
remote.removeNode(dstParent.getPath(), src.getName());
|
||||
copyDirectory(version, src, dstParent, remote);
|
||||
return;
|
||||
}
|
||||
// Source is a file.
|
||||
if (dst.isFile())
|
||||
{
|
||||
// Destination is also a file. Overwrite if the GUIDS are different.
|
||||
if (src.getGuid().equals(dst.getGuid()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
Pair<Integer, String> source =
|
||||
new Pair<Integer, String>(version, src.getPath());
|
||||
String destination = dst.getPath();
|
||||
DeploymentEvent event = new DeploymentEvent(DeploymentEvent.Type.UPDATED,
|
||||
source,
|
||||
destination);
|
||||
report.add(event);
|
||||
if (callback != null)
|
||||
{
|
||||
callback.eventOccurred(event);
|
||||
}
|
||||
if (dontDo)
|
||||
{
|
||||
return;
|
||||
}
|
||||
InputStream in = fAVMService.getFileInputStream(src);
|
||||
OutputStream out = remote.getFileOutputStream(dst.getPath());
|
||||
copyStream(in, out);
|
||||
copyMetadata(version, src, dst, remote);
|
||||
return;
|
||||
}
|
||||
Pair<Integer, String> source =
|
||||
new Pair<Integer, String>(version, src.getPath());
|
||||
String destination = AVMNodeConverter.ExtendAVMPath(dstParent.getPath(), src.getName());
|
||||
DeploymentEvent event = new DeploymentEvent(DeploymentEvent.Type.UPDATED,
|
||||
source,
|
||||
destination);
|
||||
report.add(event);
|
||||
if (callback != null)
|
||||
{
|
||||
callback.eventOccurred(event);
|
||||
}
|
||||
if (dontDo)
|
||||
{
|
||||
return;
|
||||
}
|
||||
// Destination is a directory and the source is a file.
|
||||
// Delete the destination directory and copy the file over.
|
||||
remote.removeNode(dstParent.getPath(), dst.getName());
|
||||
InputStream in = fAVMService.getFileInputStream(src);
|
||||
OutputStream out = remote.createFile(dstParent.getPath(), src.getName());
|
||||
copyStream(in, out);
|
||||
copyMetadata(version, src, remote.lookup(-1, dstParent.getPath() + '/' + dst.getName()), remote);
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively copy a directory.
|
||||
* @param src
|
||||
* @param parent
|
||||
* @param remote
|
||||
*/
|
||||
private void copyDirectory(int version, AVMNodeDescriptor src, AVMNodeDescriptor parent,
|
||||
AVMRemote remote)
|
||||
{
|
||||
// Create the destination directory.
|
||||
remote.createDirectory(parent.getPath(), src.getName());
|
||||
AVMNodeDescriptor newParent = remote.lookup(-1, parent.getPath() + '/' + src.getName());
|
||||
copyMetadata(version, src, newParent, remote);
|
||||
SortedMap<String, AVMNodeDescriptor> list =
|
||||
fAVMService.getDirectoryListing(src);
|
||||
// For each child in the source directory.
|
||||
for (AVMNodeDescriptor child : list.values())
|
||||
{
|
||||
// If it's a file, copy it over and move on.
|
||||
if (child.isFile())
|
||||
{
|
||||
InputStream in = fAVMService.getFileInputStream(child);
|
||||
OutputStream out = remote.createFile(newParent.getPath(), child.getName());
|
||||
copyStream(in, out);
|
||||
copyMetadata(version, child, remote.lookup(-1, newParent.getPath() + '/' + child.getName()), remote);
|
||||
continue;
|
||||
}
|
||||
// Otherwise copy the child directory recursively.
|
||||
copyDirectory(version, child, newParent, remote);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility for copying from one stream to another.
|
||||
* @param in The input stream.
|
||||
* @param out The output stream.
|
||||
*/
|
||||
private void copyStream(InputStream in, OutputStream out)
|
||||
{
|
||||
byte[] buff = new byte[8192];
|
||||
int read = 0;
|
||||
try
|
||||
{
|
||||
while ((read = in.read(buff)) != -1)
|
||||
{
|
||||
out.write(buff, 0, read);
|
||||
}
|
||||
in.close();
|
||||
out.close();
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
throw new AVMException("I/O Exception", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void copyMetadata(int version, AVMNodeDescriptor src, AVMNodeDescriptor dst, AVMRemote remote)
|
||||
{
|
||||
Map<QName, PropertyValue> props = fAVMService.getNodeProperties(version, src.getPath());
|
||||
remote.setNodeProperties(dst.getPath(), props);
|
||||
List<QName> aspects = fAVMService.getAspects(version, src.getPath());
|
||||
for (QName aspect : aspects)
|
||||
{
|
||||
remote.addAspect(dst.getPath(), aspect);
|
||||
}
|
||||
remote.setGuid(dst.getPath(), src.getGuid());
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility to get an AVMRemote from a remote Alfresco Server.
|
||||
* @param hostName
|
||||
* @param port
|
||||
* @param userName
|
||||
* @param password
|
||||
* @return
|
||||
*/
|
||||
private AVMRemote getRemote(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(AVMRemoteTransport.class);
|
||||
remoteFactory.setServiceUrl("rmi://" + hostName + ":" + port + "/avm");
|
||||
remoteFactory.afterPropertiesSet();
|
||||
AVMRemoteTransport transport = (AVMRemoteTransport)remoteFactory.getObject();
|
||||
AVMRemoteImpl remote = new AVMRemoteImpl();
|
||||
remote.setAvmRemoteTransport(transport);
|
||||
remote.setClientTicketHolder(fTicketHolder);
|
||||
return remote;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new AVMException("Could not Initialize Remote Connection to " + hostName, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility to get the sync service for rolling back after a failed deployment.
|
||||
* @param hostName The target machine.
|
||||
* @param port The port.
|
||||
* @return An AVMSyncService instance.
|
||||
*/
|
||||
private AVMSyncService getSyncService(String hostName, int port)
|
||||
{
|
||||
try
|
||||
{
|
||||
RmiProxyFactoryBean syncFactory = new RmiProxyFactoryBean();
|
||||
syncFactory.setRefreshStubOnConnectFailure(true);
|
||||
syncFactory.setServiceInterface(AVMSyncService.class);
|
||||
syncFactory.setServiceUrl("rmi://" + hostName + ":" + port + "/avmsync");
|
||||
syncFactory.afterPropertiesSet();
|
||||
AVMSyncService syncService = (AVMSyncService)syncFactory.getObject();
|
||||
return syncService;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new AVMException("Could not roll back failed deployment to " + hostName, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to create a non existent destination.
|
||||
* @param remote The AVMRemote instance.
|
||||
* @param dstPath The destination path to create.
|
||||
*/
|
||||
private void createDestination(AVMRemote remote, String dstPath)
|
||||
{
|
||||
String[] storePath = dstPath.split(":");
|
||||
String storeName = storePath[0];
|
||||
String path = storePath[1];
|
||||
AVMStoreDescriptor storeDesc = remote.getStore(storeName);
|
||||
if (storeDesc == null)
|
||||
{
|
||||
remote.createStore(storeName);
|
||||
}
|
||||
SimplePath simpPath = new SimplePath(path);
|
||||
if (simpPath.size() == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
String prevPath = storeName + ":/";
|
||||
for (int i = 0; i < simpPath.size(); i++)
|
||||
{
|
||||
String currPath = AVMNodeConverter.ExtendAVMPath(prevPath, simpPath.get(i));
|
||||
AVMNodeDescriptor desc = remote.lookup(-1, currPath);
|
||||
if (desc == null)
|
||||
{
|
||||
remote.createDirectory(prevPath, simpPath.get(i));
|
||||
}
|
||||
prevPath = currPath;
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.service.cmr.avm.deploy.DeploymentService#deployDifferenceFS(int, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String, boolean, boolean)
|
||||
*/
|
||||
public DeploymentReport deployDifferenceFS(int version, String srcPath, String hostName, int port, String userName, String password, String dstPath, boolean createDst, boolean dontDelete, boolean dontDo, DeploymentCallback callback)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
@ -31,6 +31,11 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
private AVMRemoteTransport fTransport;
|
||||
|
||||
/**
|
||||
* The client ticket holder.
|
||||
*/
|
||||
private ClientTicketHolder fTicketHolder;
|
||||
|
||||
/**
|
||||
* Default constructor.
|
||||
*/
|
||||
@ -46,12 +51,17 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
fTransport = transport;
|
||||
}
|
||||
|
||||
public void setClientTicketHolder(ClientTicketHolder ticketHolder)
|
||||
{
|
||||
fTicketHolder = ticketHolder;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.repo.avm.AVMRemote#createAVMStore(java.lang.String)
|
||||
*/
|
||||
public void createStore(String name)
|
||||
{
|
||||
fTransport.createStore(ClientTicketHolder.GetTicket(), name);
|
||||
fTransport.createStore(fTicketHolder.getTicket(), name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -60,7 +70,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
public void createBranch(int version, String srcPath, String dstPath,
|
||||
String name)
|
||||
{
|
||||
fTransport.createBranch(ClientTicketHolder.GetTicket(), version,
|
||||
fTransport.createBranch(fTicketHolder.getTicket(), version,
|
||||
srcPath, dstPath, name);
|
||||
}
|
||||
|
||||
@ -69,7 +79,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void createDirectory(String path, String name)
|
||||
{
|
||||
fTransport.createDirectory(ClientTicketHolder.GetTicket(), path, name);
|
||||
fTransport.createDirectory(fTicketHolder.getTicket(), path, name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -77,7 +87,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public OutputStream createFile(String path, String name)
|
||||
{
|
||||
return new AVMRemoteOutputStream(fTransport.createFile(ClientTicketHolder.GetTicket(), path, name), fTransport);
|
||||
return new AVMRemoteOutputStream(fTransport.createFile(fTicketHolder.getTicket(), path, name), fTransport, fTicketHolder);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -86,7 +96,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
public void createLayeredDirectory(String targetPath, String parent,
|
||||
String name)
|
||||
{
|
||||
fTransport.createLayeredDirectory(ClientTicketHolder.GetTicket(), targetPath, parent, name);
|
||||
fTransport.createLayeredDirectory(fTicketHolder.getTicket(), targetPath, parent, name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -94,7 +104,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void createLayeredFile(String targetPath, String parent, String name)
|
||||
{
|
||||
fTransport.createLayeredFile(ClientTicketHolder.GetTicket(), targetPath, parent, name);
|
||||
fTransport.createLayeredFile(fTicketHolder.getTicket(), targetPath, parent, name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -102,7 +112,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public int createSnapshot(String store, String label, String comment)
|
||||
{
|
||||
return fTransport.createSnapshot(ClientTicketHolder.GetTicket(), store, label, comment);
|
||||
return fTransport.createSnapshot(fTicketHolder.getTicket(), store, label, comment);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -110,7 +120,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void deleteNodeProperties(String path)
|
||||
{
|
||||
fTransport.deleteNodeProperties(ClientTicketHolder.GetTicket(), path);
|
||||
fTransport.deleteNodeProperties(fTicketHolder.getTicket(), path);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -118,7 +128,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void deleteNodeProperty(String path, QName name)
|
||||
{
|
||||
fTransport.deleteNodeProperty(ClientTicketHolder.GetTicket(), path, name);
|
||||
fTransport.deleteNodeProperty(fTicketHolder.getTicket(), path, name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -126,7 +136,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void deleteStoreProperty(String store, QName name)
|
||||
{
|
||||
fTransport.deleteStoreProperty(ClientTicketHolder.GetTicket(), store, name);
|
||||
fTransport.deleteStoreProperty(fTicketHolder.getTicket(), store, name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -134,7 +144,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public AVMStoreDescriptor getStore(String name)
|
||||
{
|
||||
return fTransport.getStore(ClientTicketHolder.GetTicket(), name);
|
||||
return fTransport.getStore(fTicketHolder.getTicket(), name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -142,7 +152,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public AVMNodeDescriptor getStoreRoot(int version, String name)
|
||||
{
|
||||
return fTransport.getStoreRoot(ClientTicketHolder.GetTicket(), version, name);
|
||||
return fTransport.getStoreRoot(fTicketHolder.getTicket(), version, name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -150,7 +160,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public List<VersionDescriptor> getStoreVersions(String name)
|
||||
{
|
||||
return fTransport.getStoreVersions(ClientTicketHolder.GetTicket(), name);
|
||||
return fTransport.getStoreVersions(fTicketHolder.getTicket(), name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -159,7 +169,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
public List<VersionDescriptor> getStoreVersions(String name, Date from,
|
||||
Date to)
|
||||
{
|
||||
return fTransport.getStoreVersions(ClientTicketHolder.GetTicket(), name);
|
||||
return fTransport.getStoreVersions(fTicketHolder.getTicket(), name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -167,7 +177,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public List<AVMStoreDescriptor> getStores()
|
||||
{
|
||||
return fTransport.getStores(ClientTicketHolder.GetTicket());
|
||||
return fTransport.getStores(fTicketHolder.getTicket());
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -176,7 +186,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
public AVMNodeDescriptor getCommonAncestor(AVMNodeDescriptor left,
|
||||
AVMNodeDescriptor right)
|
||||
{
|
||||
return fTransport.getCommonAncestor(ClientTicketHolder.GetTicket(), left, right);
|
||||
return fTransport.getCommonAncestor(fTicketHolder.getTicket(), left, right);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -184,7 +194,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public List<String> getDeleted(int version, String path)
|
||||
{
|
||||
return fTransport.getDeleted(ClientTicketHolder.GetTicket(), version, path);
|
||||
return fTransport.getDeleted(fTicketHolder.getTicket(), version, path);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -193,7 +203,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
public SortedMap<String, AVMNodeDescriptor> getDirectoryListing(
|
||||
int version, String path)
|
||||
{
|
||||
return fTransport.getDirectoryListing(ClientTicketHolder.GetTicket(), version, path);
|
||||
return fTransport.getDirectoryListing(fTicketHolder.getTicket(), version, path);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -202,7 +212,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
public SortedMap<String, AVMNodeDescriptor> getDirectoryListing(
|
||||
AVMNodeDescriptor dir)
|
||||
{
|
||||
return fTransport.getDirectoryListing(ClientTicketHolder.GetTicket(), dir);
|
||||
return fTransport.getDirectoryListing(fTicketHolder.getTicket(), dir);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -211,7 +221,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
public SortedMap<String, AVMNodeDescriptor> getDirectoryListingDirect(
|
||||
int version, String path)
|
||||
{
|
||||
return fTransport.getDirectoryListing(ClientTicketHolder.GetTicket(), version, path);
|
||||
return fTransport.getDirectoryListing(fTicketHolder.getTicket(), version, path);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -219,8 +229,8 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public InputStream getFileInputStream(int version, String path)
|
||||
{
|
||||
return new AVMRemoteInputStream(fTransport.getInputHandle(ClientTicketHolder.GetTicket(), version, path),
|
||||
fTransport);
|
||||
return new AVMRemoteInputStream(fTransport.getInputHandle(fTicketHolder.getTicket(), version, path),
|
||||
fTransport, fTicketHolder);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -228,8 +238,8 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public InputStream getFileInputStream(AVMNodeDescriptor desc)
|
||||
{
|
||||
return new AVMRemoteInputStream(fTransport.getInputHandle(ClientTicketHolder.GetTicket(), desc),
|
||||
fTransport);
|
||||
return new AVMRemoteInputStream(fTransport.getInputHandle(fTicketHolder.getTicket(), desc),
|
||||
fTransport, fTicketHolder);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -237,8 +247,8 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public OutputStream getFileOutputStream(String path)
|
||||
{
|
||||
return new AVMRemoteOutputStream(fTransport.getOutputHandle(ClientTicketHolder.GetTicket(), path),
|
||||
fTransport);
|
||||
return new AVMRemoteOutputStream(fTransport.getOutputHandle(fTicketHolder.getTicket(), path),
|
||||
fTransport, fTicketHolder);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -246,7 +256,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public List<AVMNodeDescriptor> getHistory(AVMNodeDescriptor desc, int count)
|
||||
{
|
||||
return fTransport.getHistory(ClientTicketHolder.GetTicket(), desc, count);
|
||||
return fTransport.getHistory(fTicketHolder.getTicket(), desc, count);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -254,7 +264,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public String getIndirectionPath(int version, String path)
|
||||
{
|
||||
return fTransport.getIndirectionPath(ClientTicketHolder.GetTicket(), version, path);
|
||||
return fTransport.getIndirectionPath(fTicketHolder.getTicket(), version, path);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -262,7 +272,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public int getLatestSnapshotID(String storeName)
|
||||
{
|
||||
return fTransport.getLatestSnapshotID(ClientTicketHolder.GetTicket(), storeName);
|
||||
return fTransport.getLatestSnapshotID(fTicketHolder.getTicket(), storeName);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -270,7 +280,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public int getNextVersionID(String storeName)
|
||||
{
|
||||
return fTransport.getNextVersionID(ClientTicketHolder.GetTicket(), storeName);
|
||||
return fTransport.getNextVersionID(fTicketHolder.getTicket(), storeName);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -278,7 +288,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public LayeringDescriptor getLayeringInfo(int version, String path)
|
||||
{
|
||||
return fTransport.getLayeringInfo(ClientTicketHolder.GetTicket(), version, path);
|
||||
return fTransport.getLayeringInfo(fTicketHolder.getTicket(), version, path);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -286,7 +296,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public Map<QName, PropertyValue> getNodeProperties(int version, String path)
|
||||
{
|
||||
return fTransport.getNodeProperties(ClientTicketHolder.GetTicket(), version, path);
|
||||
return fTransport.getNodeProperties(fTicketHolder.getTicket(), version, path);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -294,7 +304,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public PropertyValue getNodeProperty(int version, String path, QName name)
|
||||
{
|
||||
return fTransport.getNodeProperty(ClientTicketHolder.GetTicket(), version, path, name);
|
||||
return fTransport.getNodeProperty(fTicketHolder.getTicket(), version, path, name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -302,7 +312,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public Map<QName, PropertyValue> getStoreProperties(String store)
|
||||
{
|
||||
return fTransport.getStoreProperties(ClientTicketHolder.GetTicket(), store);
|
||||
return fTransport.getStoreProperties(fTicketHolder.getTicket(), store);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -310,7 +320,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public PropertyValue getStoreProperty(String store, QName name)
|
||||
{
|
||||
return fTransport.getStoreProperty(ClientTicketHolder.GetTicket(), store, name);
|
||||
return fTransport.getStoreProperty(fTicketHolder.getTicket(), store, name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -318,7 +328,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public AVMNodeDescriptor lookup(int version, String path)
|
||||
{
|
||||
return fTransport.lookup(ClientTicketHolder.GetTicket(), version, path);
|
||||
return fTransport.lookup(fTicketHolder.getTicket(), version, path);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -326,7 +336,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name)
|
||||
{
|
||||
return fTransport.lookup(ClientTicketHolder.GetTicket(), dir, name);
|
||||
return fTransport.lookup(fTicketHolder.getTicket(), dir, name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -334,7 +344,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void makePrimary(String path)
|
||||
{
|
||||
fTransport.makePrimary(ClientTicketHolder.GetTicket(), path);
|
||||
fTransport.makePrimary(fTicketHolder.getTicket(), path);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -342,7 +352,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void purgeStore(String name)
|
||||
{
|
||||
fTransport.purgeStore(ClientTicketHolder.GetTicket(), name);
|
||||
fTransport.purgeStore(fTicketHolder.getTicket(), name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -350,7 +360,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void purgeVersion(int version, String name)
|
||||
{
|
||||
fTransport.purgeVersion(ClientTicketHolder.GetTicket(), version, name);
|
||||
fTransport.purgeVersion(fTicketHolder.getTicket(), version, name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -359,7 +369,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
public Map<QName, PropertyValue> queryStorePropertyKey(String store,
|
||||
QName keyPattern)
|
||||
{
|
||||
return fTransport.queryStorePropertyKey(ClientTicketHolder.GetTicket(), store, keyPattern);
|
||||
return fTransport.queryStorePropertyKey(fTicketHolder.getTicket(), store, keyPattern);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -368,7 +378,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
public Map<String, Map<QName, PropertyValue>> queryStoresPropertyKey(
|
||||
QName keyPattern)
|
||||
{
|
||||
return fTransport.queryStoresPropertyKey(ClientTicketHolder.GetTicket(), keyPattern);
|
||||
return fTransport.queryStoresPropertyKey(fTicketHolder.getTicket(), keyPattern);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -376,7 +386,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void removeNode(String parent, String name)
|
||||
{
|
||||
fTransport.removeNode(ClientTicketHolder.GetTicket(), parent, name);
|
||||
fTransport.removeNode(fTicketHolder.getTicket(), parent, name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -385,7 +395,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
public void rename(String srcParent, String srcName, String dstParent,
|
||||
String dstName)
|
||||
{
|
||||
fTransport.rename(ClientTicketHolder.GetTicket(), srcParent, srcName, dstParent, dstName);
|
||||
fTransport.rename(fTicketHolder.getTicket(), srcParent, srcName, dstParent, dstName);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -393,7 +403,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void retargetLayeredDirectory(String path, String target)
|
||||
{
|
||||
fTransport.retargetLayeredDirectory(ClientTicketHolder.GetTicket(), path, target);
|
||||
fTransport.retargetLayeredDirectory(fTicketHolder.getTicket(), path, target);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -402,7 +412,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
public void setNodeProperties(String path,
|
||||
Map<QName, PropertyValue> properties)
|
||||
{
|
||||
fTransport.setNodeProperties(ClientTicketHolder.GetTicket(), path, properties);
|
||||
fTransport.setNodeProperties(fTicketHolder.getTicket(), path, properties);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -410,7 +420,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void setNodeProperty(String path, QName name, PropertyValue value)
|
||||
{
|
||||
fTransport.setNodeProperty(ClientTicketHolder.GetTicket(), path, name, value);
|
||||
fTransport.setNodeProperty(fTicketHolder.getTicket(), path, name, value);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -418,7 +428,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void setOpacity(String path, boolean opacity)
|
||||
{
|
||||
fTransport.setOpacity(ClientTicketHolder.GetTicket(), path, opacity);
|
||||
fTransport.setOpacity(fTicketHolder.getTicket(), path, opacity);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -426,7 +436,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void setStoreProperties(String store, Map<QName, PropertyValue> props)
|
||||
{
|
||||
fTransport.setStoreProperties(ClientTicketHolder.GetTicket(), store, props);
|
||||
fTransport.setStoreProperties(fTicketHolder.getTicket(), store, props);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -434,7 +444,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void setStoreProperty(String store, QName name, PropertyValue value)
|
||||
{
|
||||
fTransport.setStoreProperty(ClientTicketHolder.GetTicket(), store, name, value);
|
||||
fTransport.setStoreProperty(fTicketHolder.getTicket(), store, name, value);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -442,7 +452,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void uncover(String dirPath, String name)
|
||||
{
|
||||
fTransport.uncover(ClientTicketHolder.GetTicket(), dirPath, name);
|
||||
fTransport.uncover(fTicketHolder.getTicket(), dirPath, name);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -450,7 +460,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void renameStore(String sourceName, String destName)
|
||||
{
|
||||
fTransport.renameStore(ClientTicketHolder.GetTicket(), sourceName, destName);
|
||||
fTransport.renameStore(fTicketHolder.getTicket(), sourceName, destName);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -458,7 +468,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void addAspect(String path, QName aspectName)
|
||||
{
|
||||
fTransport.addAspect(ClientTicketHolder.GetTicket(), path, aspectName);
|
||||
fTransport.addAspect(fTicketHolder.getTicket(), path, aspectName);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -466,7 +476,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public List<QName> getAspects(int version, String path)
|
||||
{
|
||||
return fTransport.getAspects(ClientTicketHolder.GetTicket(), version, path);
|
||||
return fTransport.getAspects(fTicketHolder.getTicket(), version, path);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -474,7 +484,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public boolean hasAspect(int version, String path, QName aspectName)
|
||||
{
|
||||
return fTransport.hasAspect(ClientTicketHolder.GetTicket(), version, path, aspectName);
|
||||
return fTransport.hasAspect(fTicketHolder.getTicket(), version, path, aspectName);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -482,7 +492,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void removeAspect(String path, QName aspectName)
|
||||
{
|
||||
fTransport.removeAspect(ClientTicketHolder.GetTicket(), path, aspectName);
|
||||
fTransport.removeAspect(fTicketHolder.getTicket(), path, aspectName);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -490,7 +500,7 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public void revert(String path, AVMNodeDescriptor toRevertTo)
|
||||
{
|
||||
fTransport.revert(ClientTicketHolder.GetTicket(), path, toRevertTo);
|
||||
fTransport.revert(fTicketHolder.getTicket(), path, toRevertTo);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -498,6 +508,14 @@ public class AVMRemoteImpl implements AVMRemote
|
||||
*/
|
||||
public Pair<Integer, String> getAPath(AVMNodeDescriptor desc)
|
||||
{
|
||||
return fTransport.getAPath(ClientTicketHolder.GetTicket(), desc);
|
||||
return fTransport.getAPath(fTicketHolder.getTicket(), desc);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.service.cmr.remote.AVMRemote#setGuid(java.lang.String, java.lang.String)
|
||||
*/
|
||||
public void setGuid(String path, String guid)
|
||||
{
|
||||
fTransport.setGuid(fTicketHolder.getTicket(), path, guid);
|
||||
}
|
||||
}
|
||||
|
@ -39,6 +39,11 @@ public class AVMRemoteInputStream extends InputStream
|
||||
*/
|
||||
private AVMRemoteTransport fAVMRemote;
|
||||
|
||||
/**
|
||||
* The client ticket holder.
|
||||
*/
|
||||
private ClientTicketHolder fTicketHolder;
|
||||
|
||||
/**
|
||||
* The handle to the input stream.
|
||||
*/
|
||||
@ -49,10 +54,12 @@ public class AVMRemoteInputStream extends InputStream
|
||||
* @param handle The handle returned by getInputStream();
|
||||
* @param remote The AVMRemote instance.
|
||||
*/
|
||||
public AVMRemoteInputStream(String handle, AVMRemoteTransport remote)
|
||||
public AVMRemoteInputStream(String handle, AVMRemoteTransport remote,
|
||||
ClientTicketHolder ticketHolder)
|
||||
{
|
||||
fHandle = handle;
|
||||
fAVMRemote = remote;
|
||||
fTicketHolder = ticketHolder;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -64,7 +71,7 @@ public class AVMRemoteInputStream extends InputStream
|
||||
{
|
||||
try
|
||||
{
|
||||
byte [] buff = fAVMRemote.readInput(ClientTicketHolder.GetTicket(), fHandle, 1);
|
||||
byte [] buff = fAVMRemote.readInput(fTicketHolder.getTicket(), fHandle, 1);
|
||||
if (buff.length == 0)
|
||||
{
|
||||
return -1;
|
||||
@ -89,7 +96,7 @@ public class AVMRemoteInputStream extends InputStream
|
||||
{
|
||||
try
|
||||
{
|
||||
byte [] buff = fAVMRemote.readInput(ClientTicketHolder.GetTicket(), fHandle, len);
|
||||
byte [] buff = fAVMRemote.readInput(fTicketHolder.getTicket(), fHandle, len);
|
||||
if (buff.length == 0)
|
||||
{
|
||||
return -1;
|
||||
@ -111,7 +118,7 @@ public class AVMRemoteInputStream extends InputStream
|
||||
{
|
||||
try
|
||||
{
|
||||
fAVMRemote.closeInputHandle(ClientTicketHolder.GetTicket(), fHandle);
|
||||
fAVMRemote.closeInputHandle(fTicketHolder.getTicket(), fHandle);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
@ -33,15 +33,19 @@ public class AVMRemoteOutputStream extends OutputStream
|
||||
|
||||
private String fHandle;
|
||||
|
||||
private ClientTicketHolder fTicketHolder;
|
||||
|
||||
/**
|
||||
* Create a new one.
|
||||
* @param handle The handle returned from an AVMRemote call.
|
||||
* @param remote The AVMRemote instance.
|
||||
*/
|
||||
public AVMRemoteOutputStream(String handle, AVMRemoteTransport remote)
|
||||
public AVMRemoteOutputStream(String handle, AVMRemoteTransport remote,
|
||||
ClientTicketHolder ticketHolder)
|
||||
{
|
||||
fAVMRemote = remote;
|
||||
fHandle = handle;
|
||||
fTicketHolder = ticketHolder;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -66,7 +70,7 @@ public class AVMRemoteOutputStream extends OutputStream
|
||||
{
|
||||
try
|
||||
{
|
||||
fAVMRemote.closeOutputHandle(ClientTicketHolder.GetTicket(), fHandle);
|
||||
fAVMRemote.closeOutputHandle(fTicketHolder.getTicket(), fHandle);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@ -88,13 +92,13 @@ public class AVMRemoteOutputStream extends OutputStream
|
||||
{
|
||||
if (off == 0)
|
||||
{
|
||||
fAVMRemote.writeOutput(ClientTicketHolder.GetTicket(), fHandle, b, len);
|
||||
fAVMRemote.writeOutput(fTicketHolder.getTicket(), fHandle, b, len);
|
||||
}
|
||||
else
|
||||
{
|
||||
byte [] buff = new byte[len];
|
||||
System.arraycopy(b, off, buff, 0, len);
|
||||
fAVMRemote.writeOutput(ClientTicketHolder.GetTicket(), fHandle, buff, len);
|
||||
fAVMRemote.writeOutput(fTicketHolder.getTicket(), fHandle, buff, len);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@ -21,6 +21,11 @@ public class AVMSyncServiceClient implements AVMSyncService
|
||||
*/
|
||||
private AVMSyncServiceTransport fTransport;
|
||||
|
||||
/**
|
||||
* The ticket holder.
|
||||
*/
|
||||
private ClientTicketHolder fTicketHolder;
|
||||
|
||||
/**
|
||||
* Default constructor.
|
||||
*/
|
||||
@ -36,13 +41,22 @@ public class AVMSyncServiceClient implements AVMSyncService
|
||||
fTransport = transport;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter.
|
||||
* @param ticketHolder To set.
|
||||
*/
|
||||
public void setClientTicketHolder(ClientTicketHolder ticketHolder)
|
||||
{
|
||||
fTicketHolder = ticketHolder;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.service.cmr.avmsync.AVMSyncService#compare(int, java.lang.String, int, java.lang.String)
|
||||
*/
|
||||
public List<AVMDifference> compare(int srcVersion, String srcPath,
|
||||
int dstVersion, String dstPath, NameMatcher excluder)
|
||||
{
|
||||
return fTransport.compare(ClientTicketHolder.GetTicket(), srcVersion, srcPath, dstVersion, dstPath, excluder);
|
||||
return fTransport.compare(fTicketHolder.getTicket(), srcVersion, srcPath, dstVersion, dstPath, excluder);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -50,7 +64,7 @@ public class AVMSyncServiceClient implements AVMSyncService
|
||||
*/
|
||||
public void flatten(String layerPath, String underlyingPath)
|
||||
{
|
||||
fTransport.flatten(ClientTicketHolder.GetTicket(), layerPath, underlyingPath);
|
||||
fTransport.flatten(fTicketHolder.getTicket(), layerPath, underlyingPath);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -58,7 +72,7 @@ public class AVMSyncServiceClient implements AVMSyncService
|
||||
*/
|
||||
public void resetLayer(String layerPath)
|
||||
{
|
||||
fTransport.resetLayer(ClientTicketHolder.GetTicket(), layerPath);
|
||||
fTransport.resetLayer(fTicketHolder.getTicket(), layerPath);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -69,6 +83,6 @@ public class AVMSyncServiceClient implements AVMSyncService
|
||||
boolean ignoreOlder, boolean overrideConflicts,
|
||||
boolean overrideOlder, String tag, String description)
|
||||
{
|
||||
fTransport.update(ClientTicketHolder.GetTicket(), diffList, excluder, ignoreConflicts, ignoreOlder, overrideConflicts, overrideOlder, tag, description);
|
||||
fTransport.update(fTicketHolder.getTicket(), diffList, excluder, ignoreConflicts, ignoreOlder, overrideConflicts, overrideOlder, tag, description);
|
||||
}
|
||||
}
|
||||
|
@ -1,32 +1,18 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package org.alfresco.repo.remote;
|
||||
|
||||
/**
|
||||
* Remote client utility to hold an authentication ticket.
|
||||
* Interface for Authentication ticket caching.
|
||||
* @author britt
|
||||
*/
|
||||
public class ClientTicketHolder
|
||||
public interface ClientTicketHolder
|
||||
{
|
||||
/**
|
||||
* Thread local tickets.
|
||||
*/
|
||||
private static String fTicket;
|
||||
|
||||
/**
|
||||
* Set the ticket.
|
||||
*/
|
||||
public static void SetTicket(String ticket)
|
||||
{
|
||||
fTicket = ticket;
|
||||
}
|
||||
public void setTicket(String ticket);
|
||||
|
||||
/**
|
||||
* Get the ticket.
|
||||
*/
|
||||
public static String GetTicket()
|
||||
{
|
||||
return fTicket;
|
||||
}
|
||||
public String getTicket();
|
||||
}
|
||||
|
@ -0,0 +1,32 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package org.alfresco.repo.remote;
|
||||
|
||||
/**
|
||||
* Remote client utility to hold an authentication ticket.
|
||||
* @author britt
|
||||
*/
|
||||
public class ClientTicketHolderGlobal implements ClientTicketHolder
|
||||
{
|
||||
/**
|
||||
* Thread local tickets.
|
||||
*/
|
||||
private String fTicket;
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.repo.remote.ClientTicketHolder#setTicket(java.lang.String)
|
||||
*/
|
||||
public void setTicket(String ticket)
|
||||
{
|
||||
fTicket = ticket;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.repo.remote.ClientTicketHolder#getTicket()
|
||||
*/
|
||||
public String getTicket()
|
||||
{
|
||||
return fTicket;
|
||||
}
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
package org.alfresco.repo.remote;
|
||||
|
||||
/**
|
||||
* A Ticket holder that holds a ticket per thread.
|
||||
* @author britt
|
||||
*/
|
||||
public class ClientTicketHolderThread implements ClientTicketHolder
|
||||
{
|
||||
/**
|
||||
* The Thread Local storage for tickets.
|
||||
*/
|
||||
private ThreadLocal<String> fTicket;
|
||||
|
||||
public ClientTicketHolderThread()
|
||||
{
|
||||
fTicket = new ThreadLocal<String>();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.repo.remote.ClientTicketHolder#getTicket()
|
||||
*/
|
||||
public String getTicket()
|
||||
{
|
||||
return fTicket.get();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.repo.remote.ClientTicketHolder#setTicket(java.lang.String)
|
||||
*/
|
||||
public void setTicket(String ticket)
|
||||
{
|
||||
fTicket.set(ticket);
|
||||
}
|
||||
}
|
@ -21,6 +21,11 @@ public class ReauthenticatingAdvice implements MethodInterceptor
|
||||
*/
|
||||
private AuthenticationService fAuthService;
|
||||
|
||||
/**
|
||||
* The ticket holder.
|
||||
*/
|
||||
private ClientTicketHolder fTicketHolder;
|
||||
|
||||
/**
|
||||
* The user name.
|
||||
*/
|
||||
@ -52,6 +57,14 @@ public class ReauthenticatingAdvice implements MethodInterceptor
|
||||
fAuthService = service;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter.
|
||||
*/
|
||||
public void setClientTicketHolder(ClientTicketHolder ticketHolder)
|
||||
{
|
||||
fTicketHolder = ticketHolder;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter.
|
||||
*/
|
||||
@ -104,7 +117,7 @@ public class ReauthenticatingAdvice implements MethodInterceptor
|
||||
// Reauthenticate.
|
||||
fAuthService.authenticate(fUser, fPassword.toCharArray());
|
||||
String ticket = fAuthService.getCurrentTicket();
|
||||
ClientTicketHolder.SetTicket(ticket);
|
||||
fTicketHolder.setTicket(ticket);
|
||||
// Modify the ticket argument.
|
||||
mi.getArguments()[0] = ticket;
|
||||
}
|
||||
|
@ -23,6 +23,11 @@ public class RepoRemoteImpl implements RepoRemote
|
||||
*/
|
||||
private RepoRemoteTransport fTransport;
|
||||
|
||||
/**
|
||||
* The ticket holder.
|
||||
*/
|
||||
private ClientTicketHolder fTicketHolder;
|
||||
|
||||
/**
|
||||
* Default constructor.
|
||||
*/
|
||||
@ -38,12 +43,21 @@ public class RepoRemoteImpl implements RepoRemote
|
||||
fTransport = transport;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter.
|
||||
* @param ticketHolder To set.
|
||||
*/
|
||||
public void setClientTicketHolder(ClientTicketHolder ticketHolder)
|
||||
{
|
||||
fTicketHolder = ticketHolder;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.alfresco.service.cmr.remote.RepoRemote#createDirectory(org.alfresco.service.cmr.repository.NodeRef, java.lang.String)
|
||||
*/
|
||||
public NodeRef createDirectory(NodeRef base, String path)
|
||||
{
|
||||
return fTransport.createDirectory(ClientTicketHolder.GetTicket(), base, path);
|
||||
return fTransport.createDirectory(fTicketHolder.getTicket(), base, path);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -51,8 +65,8 @@ public class RepoRemoteImpl implements RepoRemote
|
||||
*/
|
||||
public OutputStream createFile(NodeRef base, String path)
|
||||
{
|
||||
return new RepoRemoteOutputStream(fTransport.createFile(ClientTicketHolder.GetTicket(), base, path),
|
||||
fTransport);
|
||||
return new RepoRemoteOutputStream(fTransport.createFile(fTicketHolder.getTicket(), base, path),
|
||||
fTransport, fTicketHolder);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -60,7 +74,7 @@ public class RepoRemoteImpl implements RepoRemote
|
||||
*/
|
||||
public Map<String, Pair<NodeRef, Boolean>> getListing(NodeRef dir)
|
||||
{
|
||||
return fTransport.getListing(ClientTicketHolder.GetTicket(), dir);
|
||||
return fTransport.getListing(fTicketHolder.getTicket(), dir);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -68,7 +82,7 @@ public class RepoRemoteImpl implements RepoRemote
|
||||
*/
|
||||
public NodeRef getRoot()
|
||||
{
|
||||
return fTransport.getRoot(ClientTicketHolder.GetTicket());
|
||||
return fTransport.getRoot(fTicketHolder.getTicket());
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -76,7 +90,7 @@ public class RepoRemoteImpl implements RepoRemote
|
||||
*/
|
||||
public Pair<NodeRef, Boolean> lookup(NodeRef base, String path)
|
||||
{
|
||||
return fTransport.lookup(ClientTicketHolder.GetTicket(), base, path);
|
||||
return fTransport.lookup(fTicketHolder.getTicket(), base, path);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -84,8 +98,8 @@ public class RepoRemoteImpl implements RepoRemote
|
||||
*/
|
||||
public InputStream readFile(NodeRef fileRef)
|
||||
{
|
||||
return new RepoRemoteInputStream(fTransport.readFile(ClientTicketHolder.GetTicket(), fileRef),
|
||||
fTransport);
|
||||
return new RepoRemoteInputStream(fTransport.readFile(fTicketHolder.getTicket(), fileRef),
|
||||
fTransport, fTicketHolder);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -93,8 +107,8 @@ public class RepoRemoteImpl implements RepoRemote
|
||||
*/
|
||||
public InputStream readFile(NodeRef base, String path)
|
||||
{
|
||||
return new RepoRemoteInputStream(fTransport.readFile(ClientTicketHolder.GetTicket(), base, path),
|
||||
fTransport);
|
||||
return new RepoRemoteInputStream(fTransport.readFile(fTicketHolder.getTicket(), base, path),
|
||||
fTransport, fTicketHolder);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -102,7 +116,7 @@ public class RepoRemoteImpl implements RepoRemote
|
||||
*/
|
||||
public void removeNode(NodeRef toRemove)
|
||||
{
|
||||
fTransport.removeNode(ClientTicketHolder.GetTicket(), toRemove);
|
||||
fTransport.removeNode(fTicketHolder.getTicket(), toRemove);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -110,7 +124,7 @@ public class RepoRemoteImpl implements RepoRemote
|
||||
*/
|
||||
public void removeNode(NodeRef base, String path)
|
||||
{
|
||||
fTransport.removeNode(ClientTicketHolder.GetTicket(), base, path);
|
||||
fTransport.removeNode(fTicketHolder.getTicket(), base, path);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -118,7 +132,7 @@ public class RepoRemoteImpl implements RepoRemote
|
||||
*/
|
||||
public void rename(NodeRef base, String src, String dst)
|
||||
{
|
||||
fTransport.rename(ClientTicketHolder.GetTicket(), base, src, dst);
|
||||
fTransport.rename(fTicketHolder.getTicket(), base, src, dst);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@ -126,7 +140,7 @@ public class RepoRemoteImpl implements RepoRemote
|
||||
*/
|
||||
public OutputStream writeFile(NodeRef base, String path)
|
||||
{
|
||||
return new RepoRemoteOutputStream(fTransport.writeFile(ClientTicketHolder.GetTicket(), base, path),
|
||||
fTransport);
|
||||
return new RepoRemoteOutputStream(fTransport.writeFile(fTicketHolder.getTicket(), base, path),
|
||||
fTransport, fTicketHolder);
|
||||
}
|
||||
}
|
||||
|
@ -20,6 +20,11 @@ public class RepoRemoteInputStream extends InputStream
|
||||
*/
|
||||
private RepoRemoteTransport fRepoRemote;
|
||||
|
||||
/**
|
||||
* The ticket holder.
|
||||
*/
|
||||
private ClientTicketHolder fTicketHolder;
|
||||
|
||||
/**
|
||||
* The handle to the input stream.
|
||||
*/
|
||||
@ -30,10 +35,12 @@ public class RepoRemoteInputStream extends InputStream
|
||||
* @param handle The handle returned by getInputStream();
|
||||
* @param remote The AVMRemote instance.
|
||||
*/
|
||||
public RepoRemoteInputStream(String handle, RepoRemoteTransport remote)
|
||||
public RepoRemoteInputStream(String handle, RepoRemoteTransport remote,
|
||||
ClientTicketHolder ticketHolder)
|
||||
{
|
||||
fHandle = handle;
|
||||
fRepoRemote = remote;
|
||||
fTicketHolder = ticketHolder;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -45,7 +52,7 @@ public class RepoRemoteInputStream extends InputStream
|
||||
{
|
||||
try
|
||||
{
|
||||
byte [] buff = fRepoRemote.readInput(ClientTicketHolder.GetTicket(), fHandle, 1);
|
||||
byte [] buff = fRepoRemote.readInput(fTicketHolder.getTicket(), fHandle, 1);
|
||||
if (buff.length == 0)
|
||||
{
|
||||
return -1;
|
||||
@ -70,7 +77,7 @@ public class RepoRemoteInputStream extends InputStream
|
||||
{
|
||||
try
|
||||
{
|
||||
byte [] buff = fRepoRemote.readInput(ClientTicketHolder.GetTicket(), fHandle, len);
|
||||
byte [] buff = fRepoRemote.readInput(fTicketHolder.getTicket(), fHandle, len);
|
||||
if (buff.length == 0)
|
||||
{
|
||||
return -1;
|
||||
@ -92,7 +99,7 @@ public class RepoRemoteInputStream extends InputStream
|
||||
{
|
||||
try
|
||||
{
|
||||
fRepoRemote.closeInputHandle(ClientTicketHolder.GetTicket(), fHandle);
|
||||
fRepoRemote.closeInputHandle(fTicketHolder.getTicket(), fHandle);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
@ -19,15 +19,19 @@ public class RepoRemoteOutputStream extends OutputStream
|
||||
|
||||
private String fHandle;
|
||||
|
||||
private ClientTicketHolder fTicketHolder;
|
||||
|
||||
/**
|
||||
* Create a new one.
|
||||
* @param handle The handle returned from an RepoRemoteTransport call.
|
||||
* @param remote The AVMRemote instance.
|
||||
*/
|
||||
public RepoRemoteOutputStream(String handle, RepoRemoteTransport remote)
|
||||
public RepoRemoteOutputStream(String handle, RepoRemoteTransport remote,
|
||||
ClientTicketHolder ticketHolder)
|
||||
{
|
||||
fRepoRemote = remote;
|
||||
fHandle = handle;
|
||||
fTicketHolder = ticketHolder;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -52,7 +56,7 @@ public class RepoRemoteOutputStream extends OutputStream
|
||||
{
|
||||
try
|
||||
{
|
||||
fRepoRemote.closeOutputHandle(ClientTicketHolder.GetTicket(), fHandle);
|
||||
fRepoRemote.closeOutputHandle(fTicketHolder.getTicket(), fHandle);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@ -74,13 +78,13 @@ public class RepoRemoteOutputStream extends OutputStream
|
||||
{
|
||||
if (off == 0)
|
||||
{
|
||||
fRepoRemote.writeOutput(ClientTicketHolder.GetTicket(), fHandle, b, len);
|
||||
fRepoRemote.writeOutput(fTicketHolder.getTicket(), fHandle, b, len);
|
||||
}
|
||||
else
|
||||
{
|
||||
byte [] buff = new byte[len];
|
||||
System.arraycopy(b, off, buff, 0, len);
|
||||
fRepoRemote.writeOutput(ClientTicketHolder.GetTicket(), fHandle, buff, len);
|
||||
fRepoRemote.writeOutput(fTicketHolder.getTicket(), fHandle, buff, len);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@ -124,6 +124,11 @@ public class AVMNodeDescriptor implements Serializable
|
||||
*/
|
||||
private int fDeletedType;
|
||||
|
||||
/**
|
||||
* The GUID for the node.
|
||||
*/
|
||||
private String fGuid;
|
||||
|
||||
/**
|
||||
* Make one up.
|
||||
* @param path The looked up path.
|
||||
@ -136,6 +141,7 @@ public class AVMNodeDescriptor implements Serializable
|
||||
* @param accessDate The access date.
|
||||
* @param id The object id.
|
||||
* @param versionID The version id.
|
||||
* @param guid The GUID.
|
||||
* @param indirection The indirection.
|
||||
* @param isPrimary Whether this is a primary indirection.
|
||||
* @param layerID The layer id.
|
||||
@ -152,6 +158,7 @@ public class AVMNodeDescriptor implements Serializable
|
||||
long modDate,
|
||||
long accessDate,
|
||||
long id,
|
||||
String guid,
|
||||
int versionID,
|
||||
String indirection,
|
||||
boolean isPrimary,
|
||||
@ -170,6 +177,7 @@ public class AVMNodeDescriptor implements Serializable
|
||||
fModDate = modDate;
|
||||
fAccessDate = accessDate;
|
||||
fID = id;
|
||||
fGuid = guid;
|
||||
fVersionID = versionID;
|
||||
fIndirection = indirection;
|
||||
fIsPrimary = isPrimary;
|
||||
@ -485,4 +493,12 @@ public class AVMNodeDescriptor implements Serializable
|
||||
(fDeletedType == AVMNodeType.LAYERED_FILE ||
|
||||
fDeletedType == AVMNodeType.PLAIN_FILE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the GUID for the node.
|
||||
*/
|
||||
public String getGuid()
|
||||
{
|
||||
return fGuid;
|
||||
}
|
||||
}
|
||||
|
@ -1209,4 +1209,12 @@ public interface AVMService
|
||||
* @throws AVMNotFoundException
|
||||
*/
|
||||
public void revert(String path, AVMNodeDescriptor toRevertTo);
|
||||
|
||||
/**
|
||||
* Set the GUID on a node. The GUID of a node uniquely identifies
|
||||
* the state of a node, i.e. its content, metadata, and aspects.
|
||||
* @param path The path to the node.
|
||||
* @param guid The GUID to set.
|
||||
*/
|
||||
public void setGuid(String path, String guid);
|
||||
}
|
||||
|
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* 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.avm.deploy;
|
||||
|
||||
/**
|
||||
* Callback interface for deployments.
|
||||
* @author britt
|
||||
*/
|
||||
public interface DeploymentCallback
|
||||
{
|
||||
/**
|
||||
* Called each time something happens during deployment.
|
||||
* This is called synchronously by the deployer and should
|
||||
* therefore be handled rapidly, if possible.
|
||||
* @param event The event that occurred.
|
||||
*/
|
||||
public void eventOccurred(DeploymentEvent event);
|
||||
}
|
@ -0,0 +1,100 @@
|
||||
/*
|
||||
* 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.avm.deploy;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import org.alfresco.util.Pair;
|
||||
|
||||
/**
|
||||
* Interface for Deployment Events.
|
||||
* @author britt
|
||||
*/
|
||||
public class DeploymentEvent implements Serializable
|
||||
{
|
||||
private static final long serialVersionUID = 2696116904379321786L;
|
||||
|
||||
/**
|
||||
* The type of the event.
|
||||
* @author britt
|
||||
*/
|
||||
public static enum Type implements Serializable
|
||||
{
|
||||
COPIED, // Copied a source node that did not exist on the destination.
|
||||
UPDATED, // Overwrote the destination.
|
||||
DELETED, // Deleted the destination node.
|
||||
START, // A Deployment has begun.
|
||||
END // A Deployment has ended.
|
||||
};
|
||||
|
||||
private Type fType;
|
||||
|
||||
private Pair<Integer, String> fSource;
|
||||
|
||||
private String fDestination;
|
||||
|
||||
public DeploymentEvent(Type type, Pair<Integer, String> source, String destination)
|
||||
{
|
||||
fType = type;
|
||||
fSource = source;
|
||||
fDestination = destination;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the type of the event.
|
||||
* @return The type.
|
||||
*/
|
||||
public Type getType()
|
||||
{
|
||||
return fType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the source node version and path.
|
||||
* @return
|
||||
*/
|
||||
public Pair<Integer, String> getSource()
|
||||
{
|
||||
return fSource;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the destination path.
|
||||
* @return
|
||||
*/
|
||||
public String getDestination()
|
||||
{
|
||||
return fDestination;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a String representation.
|
||||
*/
|
||||
public String toString()
|
||||
{
|
||||
return fType + ": " + fSource + " -> " + fDestination;
|
||||
}
|
||||
}
|
@ -0,0 +1,78 @@
|
||||
/*
|
||||
* 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.avm.deploy;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* A value class that contains the results of a deployment run.
|
||||
* @author britt
|
||||
*/
|
||||
public class DeploymentReport implements Serializable, Iterable<DeploymentEvent>
|
||||
{
|
||||
private static final long serialVersionUID = 5528250199836250533L;
|
||||
|
||||
private List<DeploymentEvent> fEvents;
|
||||
|
||||
public DeploymentReport()
|
||||
{
|
||||
fEvents = new ArrayList<DeploymentEvent>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a String representation.
|
||||
*/
|
||||
public String toString()
|
||||
{
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (DeploymentEvent event : fEvents)
|
||||
{
|
||||
builder.append(event.toString());
|
||||
builder.append('\n');
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an event.
|
||||
* @param event
|
||||
*/
|
||||
public void add(DeploymentEvent event)
|
||||
{
|
||||
fEvents.add(event);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see java.lang.Iterable#iterator()
|
||||
*/
|
||||
public Iterator<DeploymentEvent> iterator()
|
||||
{
|
||||
return fEvents.iterator();
|
||||
}
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package org.alfresco.service.cmr.avm.deploy;
|
||||
|
||||
/**
|
||||
* A service to handle AVM repository to remote AVM repository deployment.
|
||||
* @author britt
|
||||
*/
|
||||
public interface DeploymentService
|
||||
{
|
||||
/**
|
||||
* Deploys the differences between what is is the local source path
|
||||
* and a destination machine's path.
|
||||
* @param version The local version.
|
||||
* @param srcPath The local path.
|
||||
* @param hostName The remote hostname.
|
||||
* @param port The remote rmi registry port.
|
||||
* @param userName The username for authentication.
|
||||
* @param password The password for authentication.
|
||||
* @param dstPath The destination path corresponding to source path.
|
||||
* @param createDst Flag for whether a missing destination should be created.
|
||||
* @param dontDelete Don't delete assets at the destination.
|
||||
* @param dontDo If this is set then this is a dry run.
|
||||
* @param callback A possibly null callback.
|
||||
*/
|
||||
public DeploymentReport deployDifference(int version, String srcPath,
|
||||
String hostName, int port,
|
||||
String userName, String password,
|
||||
String dstPath,
|
||||
boolean createDst,
|
||||
boolean dontDelete,
|
||||
boolean dontDo,
|
||||
DeploymentCallback callback);
|
||||
|
||||
/**
|
||||
* Deploy to a filesystem on another machine.
|
||||
* @param version The version to deploy from.
|
||||
* @param srcPath The path to deploy from.
|
||||
* @param hostName The hostname of the filesystem receiver.
|
||||
* @param port The port to connect to.
|
||||
* @param userName The username for authentication
|
||||
* @param password The password for authentication
|
||||
* @param dstPath The destination path.
|
||||
* @param createDst Flag for whether a missing destination should be created.
|
||||
* @param dontDelete Don't delete deleted nodes from destination.
|
||||
* @param dontDo If this is set, this is a dry run.
|
||||
* @param callback A possibly null callback.
|
||||
*/
|
||||
public DeploymentReport deployDifferenceFS(int version, String srcPath,
|
||||
String hostName, int port,
|
||||
String userName, String password,
|
||||
String dstPath,
|
||||
boolean createDst,
|
||||
boolean dontDelete,
|
||||
boolean dontDo,
|
||||
DeploymentCallback callback);
|
||||
}
|
@ -468,4 +468,11 @@ public interface AVMRemote
|
||||
* @throws AVMNotFoundException
|
||||
*/
|
||||
public Pair<Integer, String> getAPath(AVMNodeDescriptor desc);
|
||||
|
||||
/**
|
||||
* Set the GUID of a node.
|
||||
* @param path The path to the node.
|
||||
* @param guid The GUID.
|
||||
*/
|
||||
public void setGuid(String path, String guid);
|
||||
}
|
||||
|
@ -480,4 +480,12 @@ public interface AVMRemoteTransport
|
||||
* @return version and path.
|
||||
*/
|
||||
public Pair<Integer, String> getAPath(String ticket, AVMNodeDescriptor desc);
|
||||
|
||||
/**
|
||||
* Set the GUID on a node.
|
||||
* @param ticket The authentication ticket.
|
||||
* @param path The path to the node.
|
||||
* @param guid The GUID to set.
|
||||
*/
|
||||
public void setGuid(String ticket, String path, String guid);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user