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:
Derek Hulley 2007-04-12 01:41:14 +00:00
parent ad80d96da3
commit 138d1780cb
47 changed files with 1885 additions and 148 deletions

View File

@ -482,7 +482,23 @@
<property name="publicAction"> <property name="publicAction">
<value>false</value> <value>false</value>
</property> </property>
</bean> </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 --> <!-- Scheduled action helper beans -->
<!-- Base template action definition --> <!-- Base template action definition -->

View File

@ -2,6 +2,9 @@
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'> <!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans> <beans>
<!-- Client Ticket Holder -->
<bean id="clientTicketHolder" class="org.alfresco.repo.remote.ClientTicketHolderGlobal"/>
<!-- Remote AVM interface --> <!-- Remote AVM interface -->
<bean id="avmRemote" class="org.alfresco.repo.remote.AVMRemoteImpl"> <bean id="avmRemote" class="org.alfresco.repo.remote.AVMRemoteImpl">
<property name="avmRemoteTransport"> <property name="avmRemoteTransport">
@ -11,7 +14,7 @@
<bean id="avmRemoteTransport" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> <bean id="avmRemoteTransport" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl"> <property name="serviceUrl">
<value>rmi://localhost:1313/avm</value> <value>rmi://localhost:50500/avm</value>
</property> </property>
<property name="serviceInterface"> <property name="serviceInterface">
<value>org.alfresco.service.cmr.remote.AVMRemoteTransport</value> <value>org.alfresco.service.cmr.remote.AVMRemoteTransport</value>
@ -29,7 +32,7 @@
<bean id="avmSyncServiceTransport" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> <bean id="avmSyncServiceTransport" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl"> <property name="serviceUrl">
<value>rmi://localhost:1313/avmsync</value> <value>rmi://localhost:50500/avmsync</value>
</property> </property>
<property name="serviceInterface"> <property name="serviceInterface">
<value>org.alfresco.service.cmr.remote.AVMSyncServiceTransport</value> <value>org.alfresco.service.cmr.remote.AVMSyncServiceTransport</value>
@ -41,7 +44,7 @@
<bean id="authenticationService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> <bean id="authenticationService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl"> <property name="serviceUrl">
<value>rmi://localhost:1313/authentication</value> <value>rmi://localhost:50500/authentication</value>
</property> </property>
<property name="serviceInterface"> <property name="serviceInterface">
<value>org.alfresco.service.cmr.security.AuthenticationService</value> <value>org.alfresco.service.cmr.security.AuthenticationService</value>
@ -53,7 +56,7 @@
<bean id="repoRemoteTransport" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> <bean id="repoRemoteTransport" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl"> <property name="serviceUrl">
<value>rmi://localhost:1313/repo</value> <value>rmi://localhost:50500/repo</value>
</property> </property>
<property name="serviceInterface"> <property name="serviceInterface">
<value>org.alfresco.service.cmr.remote.RepoRemoteTransport</value> <value>org.alfresco.service.cmr.remote.RepoRemoteTransport</value>

View File

@ -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.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-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.title=Start a WCM Workflow
start-avm-workflow.description=Starts a workflow expecting an AVM workflow package start-avm-workflow.description=Starts a workflow expecting an AVM workflow package
start-avm-workflow.store-name.display-label=Store name for start task start-avm-workflow.store-name.display-label=Store name for start task

View File

@ -32,6 +32,20 @@
<title>Default Webapp</title> <title>Default Webapp</title>
<type>d:text</type> <type>d:text</type>
</property> </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> </properties>
<associations> <associations>
<child-association name="wca:webuser"> <child-association name="wca:webuser">
@ -67,6 +81,17 @@
<many>true</many> <many>true</many>
</target> </target>
</child-association> </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> </associations>
</type> </type>
@ -181,6 +206,42 @@
<title>XForms Capture Form Folder</title> <title>XForms Capture Form Folder</title>
<parent>cm:folder</parent> <parent>cm:folder</parent>
</type> </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> </types>
<aspects> <aspects>

View File

@ -767,6 +767,7 @@
<value>getAspects</value> <value>getAspects</value>
<value>hasAspect</value> <value>hasAspect</value>
<value>getAPath</value> <value>getAPath</value>
<value>getGuid</value>
</list> </list>
</property> </property>
</bean> </bean>
@ -813,6 +814,7 @@
<value>renameStore</value> <value>renameStore</value>
<value>getSystemStore</value> <value>getSystemStore</value>
<value>revert</value> <value>revert</value>
<value>setGuid</value>
</list> </list>
</property> </property>
</bean> </bean>
@ -888,22 +890,41 @@
</property> </property>
</bean> </bean>
<!-- <!-- Deployment Service. -->
<bean id="AVMSyncService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces"> <bean id="deploymentService" class="org.alfresco.repo.deploy.DeploymentServiceImpl">
<value>org.alfresco.service.cmr.avmsync.AVMSyncService</value> <property name="avmService">
<ref bean="avmService"/>
</property> </property>
<property name="target"> </bean>
<ref bean="avmSyncService"/>
<bean id="deploymentServiceReadTxnAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice">
<ref bean="retryingReadTxnAdvice"/>
</property> </property>
<property name="interceptorNames"> <property name="mappedNames">
<list> <list>
<idref local="AVMSyncService_transaction"/> <value>deployDifference</value>
<idref local="AVMSyncService_descriptor"/> <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> </list>
</property> </property>
</bean> </bean>
-->
<!-- Workflow Service --> <!-- Workflow Service -->
@ -1079,4 +1100,4 @@
</property> </property>
</bean> </bean>
</beans> </beans>

View File

@ -6,7 +6,7 @@
<!-- Remote authentication service. --> <!-- Remote authentication service. -->
<bean id="authenticationService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> <bean id="authenticationService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl"> <property name="serviceUrl">
<value>rmi://localhost:1313/authentication</value> <value>rmi://localhost:50500/authentication</value>
</property> </property>
<property name="serviceInterface"> <property name="serviceInterface">
<value>org.alfresco.service.cmr.security.AuthenticationService</value> <value>org.alfresco.service.cmr.security.AuthenticationService</value>
@ -16,17 +16,23 @@
</property> </property>
</bean> </bean>
<!-- Client Ticket Holder Bean. -->
<bean id="clientTicketHolder" class="org.alfresco.repo.remote.ClientTicketHolderGlobal"/>
<!-- Remote interface for AVM. --> <!-- Remote interface for AVM. -->
<bean id="avmRemote" class="org.alfresco.repo.remote.AVMRemoteImpl"> <bean id="avmRemote" class="org.alfresco.repo.remote.AVMRemoteImpl">
<property name="avmRemoteTransport"> <property name="avmRemoteTransport">
<ref bean="avmRemoteTransport"/> <ref bean="avmRemoteTransport"/>
</property> </property>
<property name="clientTicketHolder">
<ref bean="clientTicketHolder"/>
</property>
</bean> </bean>
<!-- RMI Proxy bean for avmRemoteTransport --> <!-- RMI Proxy bean for avmRemoteTransport -->
<bean id="avmRemoteTransport" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> <bean id="avmRemoteTransport" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl"> <property name="serviceUrl">
<value>rmi://localhost:1313/avm</value> <value>rmi://localhost:50500/avm</value>
</property> </property>
<property name="serviceInterface"> <property name="serviceInterface">
<value>org.alfresco.service.cmr.remote.AVMRemoteTransport</value> <value>org.alfresco.service.cmr.remote.AVMRemoteTransport</value>
@ -40,11 +46,14 @@
<property name="avmSyncServiceTransport"> <property name="avmSyncServiceTransport">
<ref bean="avmSyncServiceTransport"/> <ref bean="avmSyncServiceTransport"/>
</property> </property>
<property name="clientTicketHolder">
<ref bean="clientTicketHolder"/>
</property>
</bean> </bean>
<bean id="avmSyncServiceTransport" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> <bean id="avmSyncServiceTransport" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl"> <property name="serviceUrl">
<value>rmi://localhost:1313/avmsync</value> <value>rmi://localhost:50500/avmsync</value>
</property> </property>
<property name="serviceInterface"> <property name="serviceInterface">
<value>org.alfresco.service.cmr.remote.AVMSyncServiceTransport</value> <value>org.alfresco.service.cmr.remote.AVMSyncServiceTransport</value>

View File

@ -36,9 +36,13 @@ public interface WCMAppModel
static final QName TYPE_AVMWEBFOLDER = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webfolder"); 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_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_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_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_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_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 // AVM web user reference
static final QName TYPE_WEBUSER = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webuser"); 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 // AVM web workflow defaults
static final QName TYPE_WEBWORKFLOWDEFAULTS = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webworkflowdefaults"); 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 // AVM webapp aspect
static final QName ASPECT_WEBAPP = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webapp"); static final QName ASPECT_WEBAPP = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webapp");

View File

@ -215,4 +215,16 @@ public interface AVMNode
* @param other The other node. * @param other The other node.
*/ */
public void copyMetaDataFrom(AVMNode other); 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);
}

View File

@ -33,6 +33,7 @@ import org.alfresco.repo.domain.DbAccessControlList;
import org.alfresco.repo.domain.PropertyValue; import org.alfresco.repo.domain.PropertyValue;
import org.alfresco.service.cmr.avm.AVMReadOnlyException; import org.alfresco.service.cmr.avm.AVMReadOnlyException;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.util.GUID;
/** /**
* Base class for all repository file system like objects. * Base class for all repository file system like objects.
@ -77,6 +78,11 @@ public abstract class AVMNodeImpl implements AVMNode, Serializable
*/ */
private AVMStore fStoreNew; private AVMStore fStoreNew;
/**
* The GUID for this version.
*/
private String fGUID;
/** /**
* Default constructor. * Default constructor.
*/ */
@ -109,6 +115,7 @@ public abstract class AVMNodeImpl implements AVMNode, Serializable
time, time,
time); time);
fStoreNew = store; 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."); 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;
}
} }

View File

@ -193,7 +193,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
} }
else 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) catch (AVMNotFoundException e)
{ {
throw new InvalidNodeRefException("Not Found.", parentRef); throw new InvalidNodeRefException(avmPath + " not found.", parentRef);
} }
catch (AVMExistsException e) catch (AVMExistsException e)
{ {
@ -480,7 +480,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
avmVersionPath.getSecond()); avmVersionPath.getSecond());
if (desc == null) if (desc == null)
{ {
throw new InvalidNodeRefException("Not Found.", nodeRef); throw new InvalidNodeRefException(avmVersionPath.getSecond() + " not found.", nodeRef);
} }
if (desc.isPlainDirectory()) if (desc.isPlainDirectory())
{ {
@ -794,7 +794,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
} }
catch (AVMNotFoundException e) 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()); childVersionPath.getSecond());
if (child == null) if (child == null)
{ {
throw new InvalidNodeRefException("Not Found.", childRef); throw new InvalidNodeRefException(childVersionPath.getSecond() + " not found.", childRef);
} }
Pair<Integer, String> parentVersionPath = AVMNodeConverter.ToAVMVersionPath(parentRef); Pair<Integer, String> parentVersionPath = AVMNodeConverter.ToAVMVersionPath(parentRef);
if (parentVersionPath.getFirst() >= 0) if (parentVersionPath.getFirst() >= 0)
@ -870,7 +870,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
String [] childPathBase = AVMNodeConverter.SplitBase(childPath); String [] childPathBase = AVMNodeConverter.SplitBase(childPath);
if (childPathBase[0] == null || !childPathBase[0].equals(parentPath)) 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 try
{ {
@ -887,7 +887,8 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
} }
catch (AVMNotFoundException e) 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) 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>(); Map<QName, Serializable> result = new HashMap<QName, Serializable>();
for (QName qName : props.keySet()) for (QName qName : props.keySet())
@ -1017,7 +1018,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
} }
catch (AVMNotFoundException e) 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()); avmVersionPath.getSecond());
if (desc == null) if (desc == null)
{ {
throw new InvalidNodeRefException("Not Found.", nodeRef); throw new InvalidNodeRefException(avmVersionPath.getSecond() + " not found.", nodeRef);
} }
if (qName.equals(ContentModel.PROP_CREATED)) if (qName.equals(ContentModel.PROP_CREATED))
{ {
@ -1153,7 +1154,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
AVMNodeDescriptor desc = fAVMService.lookup(-1, avmVersionPath.getSecond()); AVMNodeDescriptor desc = fAVMService.lookup(-1, avmVersionPath.getSecond());
if (desc == null) if (desc == null)
{ {
throw new InvalidNodeRefException("Not Found.", nodeRef); throw new InvalidNodeRefException(avmVersionPath.getSecond() + " not found.", nodeRef);
} }
if (desc.isPlainFile()) if (desc.isPlainFile())
{ {
@ -1171,7 +1172,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
} }
catch (AVMNotFoundException e) 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) catch (AVMNotFoundException e)
{ {
throw new InvalidNodeRefException("Not Found.", nodeRef); throw new InvalidNodeRefException(avmVersionPath.getSecond() + " not found.", nodeRef);
} }
} }

View File

@ -496,4 +496,12 @@ public class AVMRemoteLocal implements AVMRemote
{ {
return fService.getAPath(desc); 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);
}
} }

View File

@ -1018,4 +1018,13 @@ public class AVMRemoteTransportService implements AVMRemoteTransport, Runnable
fAuthService.validate(ticket); fAuthService.validate(ticket);
return fAVMService.getAPath(desc); 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);
}
} }

View File

@ -51,6 +51,7 @@ import org.alfresco.service.cmr.repository.ContentData;
import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.util.GUID;
import org.alfresco.util.Pair; import org.alfresco.util.Pair;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
@ -2442,4 +2443,29 @@ public class AVMRepository
fLookupCount.set(null); 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);
}
}
} }

View File

@ -1458,4 +1458,17 @@ public class AVMServiceImpl implements AVMService
AlfrescoTransactionSupport.bindListener(fTransactionListener); AlfrescoTransactionSupport.bindListener(fTransactionListener);
fAVMRepository.revert(baseName[0], baseName[1], toRevertTo); 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);
}
} }

View File

@ -60,6 +60,8 @@ import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.avm.AVMStoreDescriptor; import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
import org.alfresco.service.cmr.avm.LayeringDescriptor; import org.alfresco.service.cmr.avm.LayeringDescriptor;
import org.alfresco.service.cmr.avm.VersionDescriptor; 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.AVMDifference;
import org.alfresco.service.cmr.avmsync.AVMSyncException; import org.alfresco.service.cmr.avmsync.AVMSyncException;
import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileFolderService;
@ -82,6 +84,73 @@ import org.alfresco.util.Pair;
*/ */
public class AVMServiceTest extends AVMServiceTestBase 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. * Test the revert to version action.
*/ */

View File

@ -470,4 +470,11 @@ public interface AVMStore
* @param toRevertTo The descriptor of the version to revert to. * @param toRevertTo The descriptor of the version to revert to.
*/ */
public void revert(String path, String name, AVMNodeDescriptor toRevertTo); 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);
}

View File

@ -58,6 +58,7 @@ import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.util.GUID;
/** /**
* A Repository contains a current root directory and a list of * 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(); AVMNode node = lPath.getCurrentNode();
node.setProperty(name, value); node.setProperty(name, value);
node.setGuid(GUID.generate());
} }
/** /**
@ -964,6 +966,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
node.setProperties(properties); node.setProperties(properties);
node.setGuid(GUID.generate());
} }
/** /**
@ -1014,6 +1017,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
throw new AVMNotFoundException("Path " + path + " not found."); throw new AVMNotFoundException("Path " + path + " not found.");
} }
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
node.setGuid(GUID.generate());
node.deleteProperty(name); node.deleteProperty(name);
} }
@ -1029,6 +1033,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
throw new AVMNotFoundException("Path " + path + " not found."); throw new AVMNotFoundException("Path " + path + " not found.");
} }
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
node.setGuid(GUID.generate());
node.deleteProperties(); node.deleteProperties();
} }
@ -1137,6 +1142,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
throw new AVMWrongTypeException("File Expected."); throw new AVMWrongTypeException("File Expected.");
} }
node.updateModTime(); node.updateModTime();
node.setGuid(GUID.generate());
return ((FileNode)node).getContentData(lPath); return ((FileNode)node).getContentData(lPath);
} }
@ -1174,6 +1180,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
node.copyMetaDataFrom(from); node.copyMetaDataFrom(from);
node.setGuid(GUID.generate());
} }
/** /**
@ -1197,6 +1204,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
new AVMAspectNameImpl(); new AVMAspectNameImpl();
newName.setNode(node); newName.setNode(node);
newName.setName(aspectName); newName.setName(aspectName);
node.setGuid(GUID.generate());
AVMDAOs.Instance().fAVMAspectNameDAO.save(newName); AVMDAOs.Instance().fAVMAspectNameDAO.save(newName);
} }
@ -1245,6 +1253,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
{ {
AVMDAOs.Instance().fAVMNodePropertyDAO.delete(node, name); AVMDAOs.Instance().fAVMNodePropertyDAO.delete(node, name);
} }
node.setGuid(GUID.generate());
} }
/** /**
@ -1279,6 +1288,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
node.setAcl(acl); node.setAcl(acl);
node.setGuid(GUID.generate());
} }
/** /**
@ -1355,4 +1365,18 @@ public class AVMStoreImpl implements AVMStore, Serializable
PropertyValue value = new PropertyValue(null, toRevertTo.getId()); PropertyValue value = new PropertyValue(null, toRevertTo.getId());
toLink.setProperty(WCMModel.PROP_REVERTED_ID, value); 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);
}
} }

View File

@ -28,6 +28,7 @@ import java.io.OutputStream;
import java.util.List; import java.util.List;
import org.alfresco.repo.remote.ClientTicketHolder; import org.alfresco.repo.remote.ClientTicketHolder;
import org.alfresco.repo.remote.ClientTicketHolderGlobal;
import org.alfresco.service.cmr.avm.AVMStoreDescriptor; import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
import org.alfresco.service.cmr.avmsync.AVMDifference; import org.alfresco.service.cmr.avmsync.AVMDifference;
import org.alfresco.service.cmr.avmsync.AVMSyncService; import org.alfresco.service.cmr.avmsync.AVMSyncService;
@ -72,7 +73,7 @@ public class AVMTestRemote extends TestCase
fAuthService = (AuthenticationService)fContext.getBean("authenticationService"); fAuthService = (AuthenticationService)fContext.getBean("authenticationService");
fAuthService.authenticate("admin", "admin".toCharArray()); fAuthService.authenticate("admin", "admin".toCharArray());
String ticket = fAuthService.getCurrentTicket(); String ticket = fAuthService.getCurrentTicket();
ClientTicketHolder.SetTicket(ticket); ((ClientTicketHolder)fContext.getBean("clientTicketHolder")).setTicket(ticket);
} }
@Override @Override

View File

@ -121,6 +121,7 @@ public class DeletedNodeImpl extends AVMNodeImpl implements DeletedNode
attrs.getModDate(), attrs.getModDate(),
attrs.getAccessDate(), attrs.getAccessDate(),
getId(), getId(),
getGuid(),
getVersionID(), getVersionID(),
null, null,
false, false,
@ -149,6 +150,7 @@ public class DeletedNodeImpl extends AVMNodeImpl implements DeletedNode
attrs.getModDate(), attrs.getModDate(),
attrs.getAccessDate(), attrs.getAccessDate(),
getId(), getId(),
getGuid(),
getVersionID(), getVersionID(),
null, null,
false, false,
@ -179,6 +181,7 @@ public class DeletedNodeImpl extends AVMNodeImpl implements DeletedNode
attrs.getModDate(), attrs.getModDate(),
attrs.getAccessDate(), attrs.getAccessDate(),
getId(), getId(),
getGuid(),
getVersionID(), getVersionID(),
null, null,
false, false,

View File

@ -719,6 +719,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
attrs.getModDate(), attrs.getModDate(),
attrs.getAccessDate(), attrs.getAccessDate(),
getId(), getId(),
getGuid(),
getVersionID(), getVersionID(),
indirect, indirect,
fPrimaryIndirection, fPrimaryIndirection,
@ -748,6 +749,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
attrs.getModDate(), attrs.getModDate(),
attrs.getAccessDate(), attrs.getAccessDate(),
getId(), getId(),
getGuid(),
getVersionID(), getVersionID(),
getUnderlying(lPath), getUnderlying(lPath),
fPrimaryIndirection, fPrimaryIndirection,
@ -788,6 +790,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
attrs.getModDate(), attrs.getModDate(),
attrs.getAccessDate(), attrs.getAccessDate(),
getId(), getId(),
getGuid(),
getVersionID(), getVersionID(),
indirection, indirection,
fPrimaryIndirection, fPrimaryIndirection,

View File

@ -165,6 +165,7 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode
attrs.getModDate(), attrs.getModDate(),
attrs.getAccessDate(), attrs.getAccessDate(),
getId(), getId(),
getGuid(),
getVersionID(), getVersionID(),
getUnderlying(lPath), getUnderlying(lPath),
false, false,
@ -193,6 +194,7 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode
attrs.getModDate(), attrs.getModDate(),
attrs.getAccessDate(), attrs.getAccessDate(),
getId(), getId(),
getGuid(),
getVersionID(), getVersionID(),
getUnderlying(lPath), getUnderlying(lPath),
false, false,
@ -223,6 +225,7 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode
attrs.getModDate(), attrs.getModDate(),
attrs.getAccessDate(), attrs.getAccessDate(),
getId(), getId(),
getGuid(),
getVersionID(), getVersionID(),
fIndirection, fIndirection,
false, false,

View File

@ -375,6 +375,7 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
attrs.getModDate(), attrs.getModDate(),
attrs.getAccessDate(), attrs.getAccessDate(),
getId(), getId(),
getGuid(),
getVersionID(), getVersionID(),
null, null,
false, false,
@ -403,6 +404,7 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
attrs.getModDate(), attrs.getModDate(),
attrs.getAccessDate(), attrs.getAccessDate(),
getId(), getId(),
getGuid(),
getVersionID(), getVersionID(),
null, null,
false, false,
@ -433,6 +435,7 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
attrs.getModDate(), attrs.getModDate(),
attrs.getAccessDate(), attrs.getAccessDate(),
getId(), getId(),
getGuid(),
getVersionID(), getVersionID(),
null, null,
false, false,

View File

@ -200,6 +200,7 @@ class PlainFileNodeImpl extends FileNodeImpl implements PlainFileNode
attrs.getModDate(), attrs.getModDate(),
attrs.getAccessDate(), attrs.getAccessDate(),
getId(), getId(),
getGuid(),
getVersionID(), getVersionID(),
null, null,
false, false,
@ -228,6 +229,7 @@ class PlainFileNodeImpl extends FileNodeImpl implements PlainFileNode
attrs.getModDate(), attrs.getModDate(),
attrs.getAccessDate(), attrs.getAccessDate(),
getId(), getId(),
getGuid(),
getVersionID(), getVersionID(),
null, null,
false, false,
@ -258,6 +260,7 @@ class PlainFileNodeImpl extends FileNodeImpl implements PlainFileNode
attrs.getModDate(), attrs.getModDate(),
attrs.getAccessDate(), attrs.getAccessDate(),
getId(), getId(),
getGuid(),
getVersionID(), getVersionID(),
null, null,
false, false,

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -32,6 +32,7 @@
won't cause violations in the db during saves. --> won't cause violations in the db during saves. -->
<property name="versionID" type="int" column="version_id" <property name="versionID" type="int" column="version_id"
not-null="true"/> not-null="true"/>
<property name="guid" type="string" length="36" column="guid" not-null="true"/>
<component name="basicAttributes" class="BasicAttributesImpl"> <component name="basicAttributes" class="BasicAttributesImpl">
<property name="creator" type="string" not-null="true"/> <property name="creator" type="string" not-null="true"/>
<property name="owner" type="string" not-null="true"/> <property name="owner" type="string" not-null="true"/>

View File

@ -12,6 +12,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import org.alfresco.repo.remote.ClientTicketHolder; import org.alfresco.repo.remote.ClientTicketHolder;
import org.alfresco.repo.remote.ClientTicketHolderGlobal;
import org.alfresco.service.cmr.avmsync.AVMSyncService; import org.alfresco.service.cmr.avmsync.AVMSyncService;
import org.alfresco.service.cmr.remote.AVMRemote; import org.alfresco.service.cmr.remote.AVMRemote;
import org.alfresco.service.cmr.remote.RepoRemote; import org.alfresco.service.cmr.remote.RepoRemote;
@ -71,7 +72,7 @@ public abstract class CltBase
fAuthenticationService = (AuthenticationService)fContext.getBean("authenticationService"); fAuthenticationService = (AuthenticationService)fContext.getBean("authenticationService");
fAuthenticationService.authenticate(System.getenv("ALFUSER"), System.getenv("ALFPASSWORD").toCharArray()); fAuthenticationService.authenticate(System.getenv("ALFUSER"), System.getenv("ALFPASSWORD").toCharArray());
String ticket = fAuthenticationService.getCurrentTicket(); String ticket = fAuthenticationService.getCurrentTicket();
ClientTicketHolder.SetTicket(ticket); ((ClientTicketHolder)fContext.getBean("clientTicketHolder")).setTicket(ticket);
} }
/** /**

View 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;
}
}

View File

@ -31,6 +31,11 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
private AVMRemoteTransport fTransport; private AVMRemoteTransport fTransport;
/**
* The client ticket holder.
*/
private ClientTicketHolder fTicketHolder;
/** /**
* Default constructor. * Default constructor.
*/ */
@ -46,12 +51,17 @@ public class AVMRemoteImpl implements AVMRemote
fTransport = transport; fTransport = transport;
} }
public void setClientTicketHolder(ClientTicketHolder ticketHolder)
{
fTicketHolder = ticketHolder;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#createAVMStore(java.lang.String) * @see org.alfresco.repo.avm.AVMRemote#createAVMStore(java.lang.String)
*/ */
public void createStore(String name) public void createStore(String name)
{ {
fTransport.createStore(ClientTicketHolder.GetTicket(), name); fTransport.createStore(fTicketHolder.getTicket(), name);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -60,7 +70,7 @@ public class AVMRemoteImpl implements AVMRemote
public void createBranch(int version, String srcPath, String dstPath, public void createBranch(int version, String srcPath, String dstPath,
String name) String name)
{ {
fTransport.createBranch(ClientTicketHolder.GetTicket(), version, fTransport.createBranch(fTicketHolder.getTicket(), version,
srcPath, dstPath, name); srcPath, dstPath, name);
} }
@ -69,7 +79,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void createDirectory(String path, String name) public void createDirectory(String path, String name)
{ {
fTransport.createDirectory(ClientTicketHolder.GetTicket(), path, name); fTransport.createDirectory(fTicketHolder.getTicket(), path, name);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -77,7 +87,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public OutputStream createFile(String path, String name) 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) /* (non-Javadoc)
@ -86,7 +96,7 @@ public class AVMRemoteImpl implements AVMRemote
public void createLayeredDirectory(String targetPath, String parent, public void createLayeredDirectory(String targetPath, String parent,
String name) String name)
{ {
fTransport.createLayeredDirectory(ClientTicketHolder.GetTicket(), targetPath, parent, name); fTransport.createLayeredDirectory(fTicketHolder.getTicket(), targetPath, parent, name);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -94,7 +104,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void createLayeredFile(String targetPath, String parent, String name) 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) /* (non-Javadoc)
@ -102,7 +112,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public int createSnapshot(String store, String label, String comment) 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) /* (non-Javadoc)
@ -110,7 +120,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void deleteNodeProperties(String path) public void deleteNodeProperties(String path)
{ {
fTransport.deleteNodeProperties(ClientTicketHolder.GetTicket(), path); fTransport.deleteNodeProperties(fTicketHolder.getTicket(), path);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -118,7 +128,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void deleteNodeProperty(String path, QName name) public void deleteNodeProperty(String path, QName name)
{ {
fTransport.deleteNodeProperty(ClientTicketHolder.GetTicket(), path, name); fTransport.deleteNodeProperty(fTicketHolder.getTicket(), path, name);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -126,7 +136,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void deleteStoreProperty(String store, QName name) public void deleteStoreProperty(String store, QName name)
{ {
fTransport.deleteStoreProperty(ClientTicketHolder.GetTicket(), store, name); fTransport.deleteStoreProperty(fTicketHolder.getTicket(), store, name);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -134,7 +144,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public AVMStoreDescriptor getStore(String name) public AVMStoreDescriptor getStore(String name)
{ {
return fTransport.getStore(ClientTicketHolder.GetTicket(), name); return fTransport.getStore(fTicketHolder.getTicket(), name);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -142,7 +152,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public AVMNodeDescriptor getStoreRoot(int version, String name) public AVMNodeDescriptor getStoreRoot(int version, String name)
{ {
return fTransport.getStoreRoot(ClientTicketHolder.GetTicket(), version, name); return fTransport.getStoreRoot(fTicketHolder.getTicket(), version, name);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -150,7 +160,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public List<VersionDescriptor> getStoreVersions(String name) public List<VersionDescriptor> getStoreVersions(String name)
{ {
return fTransport.getStoreVersions(ClientTicketHolder.GetTicket(), name); return fTransport.getStoreVersions(fTicketHolder.getTicket(), name);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -159,7 +169,7 @@ public class AVMRemoteImpl implements AVMRemote
public List<VersionDescriptor> getStoreVersions(String name, Date from, public List<VersionDescriptor> getStoreVersions(String name, Date from,
Date to) Date to)
{ {
return fTransport.getStoreVersions(ClientTicketHolder.GetTicket(), name); return fTransport.getStoreVersions(fTicketHolder.getTicket(), name);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -167,7 +177,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public List<AVMStoreDescriptor> getStores() public List<AVMStoreDescriptor> getStores()
{ {
return fTransport.getStores(ClientTicketHolder.GetTicket()); return fTransport.getStores(fTicketHolder.getTicket());
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -176,7 +186,7 @@ public class AVMRemoteImpl implements AVMRemote
public AVMNodeDescriptor getCommonAncestor(AVMNodeDescriptor left, public AVMNodeDescriptor getCommonAncestor(AVMNodeDescriptor left,
AVMNodeDescriptor right) AVMNodeDescriptor right)
{ {
return fTransport.getCommonAncestor(ClientTicketHolder.GetTicket(), left, right); return fTransport.getCommonAncestor(fTicketHolder.getTicket(), left, right);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -184,7 +194,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public List<String> getDeleted(int version, String path) public List<String> getDeleted(int version, String path)
{ {
return fTransport.getDeleted(ClientTicketHolder.GetTicket(), version, path); return fTransport.getDeleted(fTicketHolder.getTicket(), version, path);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -193,7 +203,7 @@ public class AVMRemoteImpl implements AVMRemote
public SortedMap<String, AVMNodeDescriptor> getDirectoryListing( public SortedMap<String, AVMNodeDescriptor> getDirectoryListing(
int version, String path) int version, String path)
{ {
return fTransport.getDirectoryListing(ClientTicketHolder.GetTicket(), version, path); return fTransport.getDirectoryListing(fTicketHolder.getTicket(), version, path);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -202,7 +212,7 @@ public class AVMRemoteImpl implements AVMRemote
public SortedMap<String, AVMNodeDescriptor> getDirectoryListing( public SortedMap<String, AVMNodeDescriptor> getDirectoryListing(
AVMNodeDescriptor dir) AVMNodeDescriptor dir)
{ {
return fTransport.getDirectoryListing(ClientTicketHolder.GetTicket(), dir); return fTransport.getDirectoryListing(fTicketHolder.getTicket(), dir);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -211,7 +221,7 @@ public class AVMRemoteImpl implements AVMRemote
public SortedMap<String, AVMNodeDescriptor> getDirectoryListingDirect( public SortedMap<String, AVMNodeDescriptor> getDirectoryListingDirect(
int version, String path) int version, String path)
{ {
return fTransport.getDirectoryListing(ClientTicketHolder.GetTicket(), version, path); return fTransport.getDirectoryListing(fTicketHolder.getTicket(), version, path);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -219,8 +229,8 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public InputStream getFileInputStream(int version, String path) public InputStream getFileInputStream(int version, String path)
{ {
return new AVMRemoteInputStream(fTransport.getInputHandle(ClientTicketHolder.GetTicket(), version, path), return new AVMRemoteInputStream(fTransport.getInputHandle(fTicketHolder.getTicket(), version, path),
fTransport); fTransport, fTicketHolder);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -228,8 +238,8 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public InputStream getFileInputStream(AVMNodeDescriptor desc) public InputStream getFileInputStream(AVMNodeDescriptor desc)
{ {
return new AVMRemoteInputStream(fTransport.getInputHandle(ClientTicketHolder.GetTicket(), desc), return new AVMRemoteInputStream(fTransport.getInputHandle(fTicketHolder.getTicket(), desc),
fTransport); fTransport, fTicketHolder);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -237,8 +247,8 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public OutputStream getFileOutputStream(String path) public OutputStream getFileOutputStream(String path)
{ {
return new AVMRemoteOutputStream(fTransport.getOutputHandle(ClientTicketHolder.GetTicket(), path), return new AVMRemoteOutputStream(fTransport.getOutputHandle(fTicketHolder.getTicket(), path),
fTransport); fTransport, fTicketHolder);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -246,7 +256,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public List<AVMNodeDescriptor> getHistory(AVMNodeDescriptor desc, int count) public List<AVMNodeDescriptor> getHistory(AVMNodeDescriptor desc, int count)
{ {
return fTransport.getHistory(ClientTicketHolder.GetTicket(), desc, count); return fTransport.getHistory(fTicketHolder.getTicket(), desc, count);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -254,7 +264,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public String getIndirectionPath(int version, String path) public String getIndirectionPath(int version, String path)
{ {
return fTransport.getIndirectionPath(ClientTicketHolder.GetTicket(), version, path); return fTransport.getIndirectionPath(fTicketHolder.getTicket(), version, path);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -262,7 +272,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public int getLatestSnapshotID(String storeName) public int getLatestSnapshotID(String storeName)
{ {
return fTransport.getLatestSnapshotID(ClientTicketHolder.GetTicket(), storeName); return fTransport.getLatestSnapshotID(fTicketHolder.getTicket(), storeName);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -270,7 +280,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public int getNextVersionID(String storeName) public int getNextVersionID(String storeName)
{ {
return fTransport.getNextVersionID(ClientTicketHolder.GetTicket(), storeName); return fTransport.getNextVersionID(fTicketHolder.getTicket(), storeName);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -278,7 +288,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public LayeringDescriptor getLayeringInfo(int version, String path) public LayeringDescriptor getLayeringInfo(int version, String path)
{ {
return fTransport.getLayeringInfo(ClientTicketHolder.GetTicket(), version, path); return fTransport.getLayeringInfo(fTicketHolder.getTicket(), version, path);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -286,7 +296,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public Map<QName, PropertyValue> getNodeProperties(int version, String path) 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) /* (non-Javadoc)
@ -294,7 +304,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public PropertyValue getNodeProperty(int version, String path, QName name) 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) /* (non-Javadoc)
@ -302,7 +312,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public Map<QName, PropertyValue> getStoreProperties(String store) public Map<QName, PropertyValue> getStoreProperties(String store)
{ {
return fTransport.getStoreProperties(ClientTicketHolder.GetTicket(), store); return fTransport.getStoreProperties(fTicketHolder.getTicket(), store);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -310,7 +320,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public PropertyValue getStoreProperty(String store, QName name) public PropertyValue getStoreProperty(String store, QName name)
{ {
return fTransport.getStoreProperty(ClientTicketHolder.GetTicket(), store, name); return fTransport.getStoreProperty(fTicketHolder.getTicket(), store, name);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -318,7 +328,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public AVMNodeDescriptor lookup(int version, String path) public AVMNodeDescriptor lookup(int version, String path)
{ {
return fTransport.lookup(ClientTicketHolder.GetTicket(), version, path); return fTransport.lookup(fTicketHolder.getTicket(), version, path);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -326,7 +336,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name) public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name)
{ {
return fTransport.lookup(ClientTicketHolder.GetTicket(), dir, name); return fTransport.lookup(fTicketHolder.getTicket(), dir, name);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -334,7 +344,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void makePrimary(String path) public void makePrimary(String path)
{ {
fTransport.makePrimary(ClientTicketHolder.GetTicket(), path); fTransport.makePrimary(fTicketHolder.getTicket(), path);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -342,7 +352,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void purgeStore(String name) public void purgeStore(String name)
{ {
fTransport.purgeStore(ClientTicketHolder.GetTicket(), name); fTransport.purgeStore(fTicketHolder.getTicket(), name);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -350,7 +360,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void purgeVersion(int version, String name) public void purgeVersion(int version, String name)
{ {
fTransport.purgeVersion(ClientTicketHolder.GetTicket(), version, name); fTransport.purgeVersion(fTicketHolder.getTicket(), version, name);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -359,7 +369,7 @@ public class AVMRemoteImpl implements AVMRemote
public Map<QName, PropertyValue> queryStorePropertyKey(String store, public Map<QName, PropertyValue> queryStorePropertyKey(String store,
QName keyPattern) QName keyPattern)
{ {
return fTransport.queryStorePropertyKey(ClientTicketHolder.GetTicket(), store, keyPattern); return fTransport.queryStorePropertyKey(fTicketHolder.getTicket(), store, keyPattern);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -368,7 +378,7 @@ public class AVMRemoteImpl implements AVMRemote
public Map<String, Map<QName, PropertyValue>> queryStoresPropertyKey( public Map<String, Map<QName, PropertyValue>> queryStoresPropertyKey(
QName keyPattern) QName keyPattern)
{ {
return fTransport.queryStoresPropertyKey(ClientTicketHolder.GetTicket(), keyPattern); return fTransport.queryStoresPropertyKey(fTicketHolder.getTicket(), keyPattern);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -376,7 +386,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void removeNode(String parent, String name) public void removeNode(String parent, String name)
{ {
fTransport.removeNode(ClientTicketHolder.GetTicket(), parent, name); fTransport.removeNode(fTicketHolder.getTicket(), parent, name);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -385,7 +395,7 @@ public class AVMRemoteImpl implements AVMRemote
public void rename(String srcParent, String srcName, String dstParent, public void rename(String srcParent, String srcName, String dstParent,
String dstName) String dstName)
{ {
fTransport.rename(ClientTicketHolder.GetTicket(), srcParent, srcName, dstParent, dstName); fTransport.rename(fTicketHolder.getTicket(), srcParent, srcName, dstParent, dstName);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -393,7 +403,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void retargetLayeredDirectory(String path, String target) public void retargetLayeredDirectory(String path, String target)
{ {
fTransport.retargetLayeredDirectory(ClientTicketHolder.GetTicket(), path, target); fTransport.retargetLayeredDirectory(fTicketHolder.getTicket(), path, target);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -402,7 +412,7 @@ public class AVMRemoteImpl implements AVMRemote
public void setNodeProperties(String path, public void setNodeProperties(String path,
Map<QName, PropertyValue> properties) Map<QName, PropertyValue> properties)
{ {
fTransport.setNodeProperties(ClientTicketHolder.GetTicket(), path, properties); fTransport.setNodeProperties(fTicketHolder.getTicket(), path, properties);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -410,7 +420,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void setNodeProperty(String path, QName name, PropertyValue value) 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) /* (non-Javadoc)
@ -418,7 +428,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void setOpacity(String path, boolean opacity) public void setOpacity(String path, boolean opacity)
{ {
fTransport.setOpacity(ClientTicketHolder.GetTicket(), path, opacity); fTransport.setOpacity(fTicketHolder.getTicket(), path, opacity);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -426,7 +436,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void setStoreProperties(String store, Map<QName, PropertyValue> props) public void setStoreProperties(String store, Map<QName, PropertyValue> props)
{ {
fTransport.setStoreProperties(ClientTicketHolder.GetTicket(), store, props); fTransport.setStoreProperties(fTicketHolder.getTicket(), store, props);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -434,7 +444,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void setStoreProperty(String store, QName name, PropertyValue value) 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) /* (non-Javadoc)
@ -442,7 +452,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void uncover(String dirPath, String name) public void uncover(String dirPath, String name)
{ {
fTransport.uncover(ClientTicketHolder.GetTicket(), dirPath, name); fTransport.uncover(fTicketHolder.getTicket(), dirPath, name);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -450,7 +460,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void renameStore(String sourceName, String destName) public void renameStore(String sourceName, String destName)
{ {
fTransport.renameStore(ClientTicketHolder.GetTicket(), sourceName, destName); fTransport.renameStore(fTicketHolder.getTicket(), sourceName, destName);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -458,7 +468,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void addAspect(String path, QName aspectName) public void addAspect(String path, QName aspectName)
{ {
fTransport.addAspect(ClientTicketHolder.GetTicket(), path, aspectName); fTransport.addAspect(fTicketHolder.getTicket(), path, aspectName);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -466,7 +476,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public List<QName> getAspects(int version, String path) public List<QName> getAspects(int version, String path)
{ {
return fTransport.getAspects(ClientTicketHolder.GetTicket(), version, path); return fTransport.getAspects(fTicketHolder.getTicket(), version, path);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -474,7 +484,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public boolean hasAspect(int version, String path, QName aspectName) 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) /* (non-Javadoc)
@ -482,7 +492,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void removeAspect(String path, QName aspectName) public void removeAspect(String path, QName aspectName)
{ {
fTransport.removeAspect(ClientTicketHolder.GetTicket(), path, aspectName); fTransport.removeAspect(fTicketHolder.getTicket(), path, aspectName);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -490,7 +500,7 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public void revert(String path, AVMNodeDescriptor toRevertTo) public void revert(String path, AVMNodeDescriptor toRevertTo)
{ {
fTransport.revert(ClientTicketHolder.GetTicket(), path, toRevertTo); fTransport.revert(fTicketHolder.getTicket(), path, toRevertTo);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -498,6 +508,14 @@ public class AVMRemoteImpl implements AVMRemote
*/ */
public Pair<Integer, String> getAPath(AVMNodeDescriptor desc) 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);
} }
} }

View File

@ -39,6 +39,11 @@ public class AVMRemoteInputStream extends InputStream
*/ */
private AVMRemoteTransport fAVMRemote; private AVMRemoteTransport fAVMRemote;
/**
* The client ticket holder.
*/
private ClientTicketHolder fTicketHolder;
/** /**
* The handle to the input stream. * The handle to the input stream.
*/ */
@ -49,10 +54,12 @@ public class AVMRemoteInputStream extends InputStream
* @param handle The handle returned by getInputStream(); * @param handle The handle returned by getInputStream();
* @param remote The AVMRemote instance. * @param remote The AVMRemote instance.
*/ */
public AVMRemoteInputStream(String handle, AVMRemoteTransport remote) public AVMRemoteInputStream(String handle, AVMRemoteTransport remote,
ClientTicketHolder ticketHolder)
{ {
fHandle = handle; fHandle = handle;
fAVMRemote = remote; fAVMRemote = remote;
fTicketHolder = ticketHolder;
} }
/** /**
@ -64,7 +71,7 @@ public class AVMRemoteInputStream extends InputStream
{ {
try try
{ {
byte [] buff = fAVMRemote.readInput(ClientTicketHolder.GetTicket(), fHandle, 1); byte [] buff = fAVMRemote.readInput(fTicketHolder.getTicket(), fHandle, 1);
if (buff.length == 0) if (buff.length == 0)
{ {
return -1; return -1;
@ -89,7 +96,7 @@ public class AVMRemoteInputStream extends InputStream
{ {
try try
{ {
byte [] buff = fAVMRemote.readInput(ClientTicketHolder.GetTicket(), fHandle, len); byte [] buff = fAVMRemote.readInput(fTicketHolder.getTicket(), fHandle, len);
if (buff.length == 0) if (buff.length == 0)
{ {
return -1; return -1;
@ -111,7 +118,7 @@ public class AVMRemoteInputStream extends InputStream
{ {
try try
{ {
fAVMRemote.closeInputHandle(ClientTicketHolder.GetTicket(), fHandle); fAVMRemote.closeInputHandle(fTicketHolder.getTicket(), fHandle);
} }
catch (Exception e) catch (Exception e)
{ {

View File

@ -33,15 +33,19 @@ public class AVMRemoteOutputStream extends OutputStream
private String fHandle; private String fHandle;
private ClientTicketHolder fTicketHolder;
/** /**
* Create a new one. * Create a new one.
* @param handle The handle returned from an AVMRemote call. * @param handle The handle returned from an AVMRemote call.
* @param remote The AVMRemote instance. * @param remote The AVMRemote instance.
*/ */
public AVMRemoteOutputStream(String handle, AVMRemoteTransport remote) public AVMRemoteOutputStream(String handle, AVMRemoteTransport remote,
ClientTicketHolder ticketHolder)
{ {
fAVMRemote = remote; fAVMRemote = remote;
fHandle = handle; fHandle = handle;
fTicketHolder = ticketHolder;
} }
/** /**
@ -66,7 +70,7 @@ public class AVMRemoteOutputStream extends OutputStream
{ {
try try
{ {
fAVMRemote.closeOutputHandle(ClientTicketHolder.GetTicket(), fHandle); fAVMRemote.closeOutputHandle(fTicketHolder.getTicket(), fHandle);
} }
catch (Exception e) catch (Exception e)
{ {
@ -88,13 +92,13 @@ public class AVMRemoteOutputStream extends OutputStream
{ {
if (off == 0) if (off == 0)
{ {
fAVMRemote.writeOutput(ClientTicketHolder.GetTicket(), fHandle, b, len); fAVMRemote.writeOutput(fTicketHolder.getTicket(), fHandle, b, len);
} }
else else
{ {
byte [] buff = new byte[len]; byte [] buff = new byte[len];
System.arraycopy(b, off, buff, 0, 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) catch (Exception e)

View File

@ -21,6 +21,11 @@ public class AVMSyncServiceClient implements AVMSyncService
*/ */
private AVMSyncServiceTransport fTransport; private AVMSyncServiceTransport fTransport;
/**
* The ticket holder.
*/
private ClientTicketHolder fTicketHolder;
/** /**
* Default constructor. * Default constructor.
*/ */
@ -36,13 +41,22 @@ public class AVMSyncServiceClient implements AVMSyncService
fTransport = transport; fTransport = transport;
} }
/**
* Setter.
* @param ticketHolder To set.
*/
public void setClientTicketHolder(ClientTicketHolder ticketHolder)
{
fTicketHolder = ticketHolder;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.alfresco.service.cmr.avmsync.AVMSyncService#compare(int, java.lang.String, int, java.lang.String) * @see org.alfresco.service.cmr.avmsync.AVMSyncService#compare(int, java.lang.String, int, java.lang.String)
*/ */
public List<AVMDifference> compare(int srcVersion, String srcPath, public List<AVMDifference> compare(int srcVersion, String srcPath,
int dstVersion, String dstPath, NameMatcher excluder) 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) /* (non-Javadoc)
@ -50,7 +64,7 @@ public class AVMSyncServiceClient implements AVMSyncService
*/ */
public void flatten(String layerPath, String underlyingPath) public void flatten(String layerPath, String underlyingPath)
{ {
fTransport.flatten(ClientTicketHolder.GetTicket(), layerPath, underlyingPath); fTransport.flatten(fTicketHolder.getTicket(), layerPath, underlyingPath);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -58,7 +72,7 @@ public class AVMSyncServiceClient implements AVMSyncService
*/ */
public void resetLayer(String layerPath) public void resetLayer(String layerPath)
{ {
fTransport.resetLayer(ClientTicketHolder.GetTicket(), layerPath); fTransport.resetLayer(fTicketHolder.getTicket(), layerPath);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -69,6 +83,6 @@ public class AVMSyncServiceClient implements AVMSyncService
boolean ignoreOlder, boolean overrideConflicts, boolean ignoreOlder, boolean overrideConflicts,
boolean overrideOlder, String tag, String description) 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);
} }
} }

View File

@ -1,32 +1,18 @@
/**
*
*/
package org.alfresco.repo.remote; package org.alfresco.repo.remote;
/** /**
* Remote client utility to hold an authentication ticket. * Interface for Authentication ticket caching.
* @author britt * @author britt
*/ */
public class ClientTicketHolder public interface ClientTicketHolder
{ {
/**
* Thread local tickets.
*/
private static String fTicket;
/** /**
* Set the ticket. * Set the ticket.
*/ */
public static void SetTicket(String ticket) public void setTicket(String ticket);
{
fTicket = ticket;
}
/** /**
* Get the ticket. * Get the ticket.
*/ */
public static String GetTicket() public String getTicket();
{
return fTicket;
}
} }

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -21,6 +21,11 @@ public class ReauthenticatingAdvice implements MethodInterceptor
*/ */
private AuthenticationService fAuthService; private AuthenticationService fAuthService;
/**
* The ticket holder.
*/
private ClientTicketHolder fTicketHolder;
/** /**
* The user name. * The user name.
*/ */
@ -52,6 +57,14 @@ public class ReauthenticatingAdvice implements MethodInterceptor
fAuthService = service; fAuthService = service;
} }
/**
* Setter.
*/
public void setClientTicketHolder(ClientTicketHolder ticketHolder)
{
fTicketHolder = ticketHolder;
}
/** /**
* Setter. * Setter.
*/ */
@ -104,7 +117,7 @@ public class ReauthenticatingAdvice implements MethodInterceptor
// Reauthenticate. // Reauthenticate.
fAuthService.authenticate(fUser, fPassword.toCharArray()); fAuthService.authenticate(fUser, fPassword.toCharArray());
String ticket = fAuthService.getCurrentTicket(); String ticket = fAuthService.getCurrentTicket();
ClientTicketHolder.SetTicket(ticket); fTicketHolder.setTicket(ticket);
// Modify the ticket argument. // Modify the ticket argument.
mi.getArguments()[0] = ticket; mi.getArguments()[0] = ticket;
} }

View File

@ -23,6 +23,11 @@ public class RepoRemoteImpl implements RepoRemote
*/ */
private RepoRemoteTransport fTransport; private RepoRemoteTransport fTransport;
/**
* The ticket holder.
*/
private ClientTicketHolder fTicketHolder;
/** /**
* Default constructor. * Default constructor.
*/ */
@ -38,12 +43,21 @@ public class RepoRemoteImpl implements RepoRemote
fTransport = transport; fTransport = transport;
} }
/**
* Setter.
* @param ticketHolder To set.
*/
public void setClientTicketHolder(ClientTicketHolder ticketHolder)
{
fTicketHolder = ticketHolder;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.alfresco.service.cmr.remote.RepoRemote#createDirectory(org.alfresco.service.cmr.repository.NodeRef, java.lang.String) * @see org.alfresco.service.cmr.remote.RepoRemote#createDirectory(org.alfresco.service.cmr.repository.NodeRef, java.lang.String)
*/ */
public NodeRef createDirectory(NodeRef base, String path) public NodeRef createDirectory(NodeRef base, String path)
{ {
return fTransport.createDirectory(ClientTicketHolder.GetTicket(), base, path); return fTransport.createDirectory(fTicketHolder.getTicket(), base, path);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -51,8 +65,8 @@ public class RepoRemoteImpl implements RepoRemote
*/ */
public OutputStream createFile(NodeRef base, String path) public OutputStream createFile(NodeRef base, String path)
{ {
return new RepoRemoteOutputStream(fTransport.createFile(ClientTicketHolder.GetTicket(), base, path), return new RepoRemoteOutputStream(fTransport.createFile(fTicketHolder.getTicket(), base, path),
fTransport); fTransport, fTicketHolder);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -60,7 +74,7 @@ public class RepoRemoteImpl implements RepoRemote
*/ */
public Map<String, Pair<NodeRef, Boolean>> getListing(NodeRef dir) public Map<String, Pair<NodeRef, Boolean>> getListing(NodeRef dir)
{ {
return fTransport.getListing(ClientTicketHolder.GetTicket(), dir); return fTransport.getListing(fTicketHolder.getTicket(), dir);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -68,7 +82,7 @@ public class RepoRemoteImpl implements RepoRemote
*/ */
public NodeRef getRoot() public NodeRef getRoot()
{ {
return fTransport.getRoot(ClientTicketHolder.GetTicket()); return fTransport.getRoot(fTicketHolder.getTicket());
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -76,7 +90,7 @@ public class RepoRemoteImpl implements RepoRemote
*/ */
public Pair<NodeRef, Boolean> lookup(NodeRef base, String path) 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) /* (non-Javadoc)
@ -84,8 +98,8 @@ public class RepoRemoteImpl implements RepoRemote
*/ */
public InputStream readFile(NodeRef fileRef) public InputStream readFile(NodeRef fileRef)
{ {
return new RepoRemoteInputStream(fTransport.readFile(ClientTicketHolder.GetTicket(), fileRef), return new RepoRemoteInputStream(fTransport.readFile(fTicketHolder.getTicket(), fileRef),
fTransport); fTransport, fTicketHolder);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -93,8 +107,8 @@ public class RepoRemoteImpl implements RepoRemote
*/ */
public InputStream readFile(NodeRef base, String path) public InputStream readFile(NodeRef base, String path)
{ {
return new RepoRemoteInputStream(fTransport.readFile(ClientTicketHolder.GetTicket(), base, path), return new RepoRemoteInputStream(fTransport.readFile(fTicketHolder.getTicket(), base, path),
fTransport); fTransport, fTicketHolder);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -102,7 +116,7 @@ public class RepoRemoteImpl implements RepoRemote
*/ */
public void removeNode(NodeRef toRemove) public void removeNode(NodeRef toRemove)
{ {
fTransport.removeNode(ClientTicketHolder.GetTicket(), toRemove); fTransport.removeNode(fTicketHolder.getTicket(), toRemove);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -110,7 +124,7 @@ public class RepoRemoteImpl implements RepoRemote
*/ */
public void removeNode(NodeRef base, String path) public void removeNode(NodeRef base, String path)
{ {
fTransport.removeNode(ClientTicketHolder.GetTicket(), base, path); fTransport.removeNode(fTicketHolder.getTicket(), base, path);
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -118,7 +132,7 @@ public class RepoRemoteImpl implements RepoRemote
*/ */
public void rename(NodeRef base, String src, String dst) 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) /* (non-Javadoc)
@ -126,7 +140,7 @@ public class RepoRemoteImpl implements RepoRemote
*/ */
public OutputStream writeFile(NodeRef base, String path) public OutputStream writeFile(NodeRef base, String path)
{ {
return new RepoRemoteOutputStream(fTransport.writeFile(ClientTicketHolder.GetTicket(), base, path), return new RepoRemoteOutputStream(fTransport.writeFile(fTicketHolder.getTicket(), base, path),
fTransport); fTransport, fTicketHolder);
} }
} }

View File

@ -20,6 +20,11 @@ public class RepoRemoteInputStream extends InputStream
*/ */
private RepoRemoteTransport fRepoRemote; private RepoRemoteTransport fRepoRemote;
/**
* The ticket holder.
*/
private ClientTicketHolder fTicketHolder;
/** /**
* The handle to the input stream. * The handle to the input stream.
*/ */
@ -30,10 +35,12 @@ public class RepoRemoteInputStream extends InputStream
* @param handle The handle returned by getInputStream(); * @param handle The handle returned by getInputStream();
* @param remote The AVMRemote instance. * @param remote The AVMRemote instance.
*/ */
public RepoRemoteInputStream(String handle, RepoRemoteTransport remote) public RepoRemoteInputStream(String handle, RepoRemoteTransport remote,
ClientTicketHolder ticketHolder)
{ {
fHandle = handle; fHandle = handle;
fRepoRemote = remote; fRepoRemote = remote;
fTicketHolder = ticketHolder;
} }
/** /**
@ -45,7 +52,7 @@ public class RepoRemoteInputStream extends InputStream
{ {
try try
{ {
byte [] buff = fRepoRemote.readInput(ClientTicketHolder.GetTicket(), fHandle, 1); byte [] buff = fRepoRemote.readInput(fTicketHolder.getTicket(), fHandle, 1);
if (buff.length == 0) if (buff.length == 0)
{ {
return -1; return -1;
@ -70,7 +77,7 @@ public class RepoRemoteInputStream extends InputStream
{ {
try try
{ {
byte [] buff = fRepoRemote.readInput(ClientTicketHolder.GetTicket(), fHandle, len); byte [] buff = fRepoRemote.readInput(fTicketHolder.getTicket(), fHandle, len);
if (buff.length == 0) if (buff.length == 0)
{ {
return -1; return -1;
@ -92,7 +99,7 @@ public class RepoRemoteInputStream extends InputStream
{ {
try try
{ {
fRepoRemote.closeInputHandle(ClientTicketHolder.GetTicket(), fHandle); fRepoRemote.closeInputHandle(fTicketHolder.getTicket(), fHandle);
} }
catch (Exception e) catch (Exception e)
{ {

View File

@ -19,15 +19,19 @@ public class RepoRemoteOutputStream extends OutputStream
private String fHandle; private String fHandle;
private ClientTicketHolder fTicketHolder;
/** /**
* Create a new one. * Create a new one.
* @param handle The handle returned from an RepoRemoteTransport call. * @param handle The handle returned from an RepoRemoteTransport call.
* @param remote The AVMRemote instance. * @param remote The AVMRemote instance.
*/ */
public RepoRemoteOutputStream(String handle, RepoRemoteTransport remote) public RepoRemoteOutputStream(String handle, RepoRemoteTransport remote,
ClientTicketHolder ticketHolder)
{ {
fRepoRemote = remote; fRepoRemote = remote;
fHandle = handle; fHandle = handle;
fTicketHolder = ticketHolder;
} }
/** /**
@ -52,7 +56,7 @@ public class RepoRemoteOutputStream extends OutputStream
{ {
try try
{ {
fRepoRemote.closeOutputHandle(ClientTicketHolder.GetTicket(), fHandle); fRepoRemote.closeOutputHandle(fTicketHolder.getTicket(), fHandle);
} }
catch (Exception e) catch (Exception e)
{ {
@ -74,13 +78,13 @@ public class RepoRemoteOutputStream extends OutputStream
{ {
if (off == 0) if (off == 0)
{ {
fRepoRemote.writeOutput(ClientTicketHolder.GetTicket(), fHandle, b, len); fRepoRemote.writeOutput(fTicketHolder.getTicket(), fHandle, b, len);
} }
else else
{ {
byte [] buff = new byte[len]; byte [] buff = new byte[len];
System.arraycopy(b, off, buff, 0, 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) catch (Exception e)

View File

@ -124,6 +124,11 @@ public class AVMNodeDescriptor implements Serializable
*/ */
private int fDeletedType; private int fDeletedType;
/**
* The GUID for the node.
*/
private String fGuid;
/** /**
* Make one up. * Make one up.
* @param path The looked up path. * @param path The looked up path.
@ -136,6 +141,7 @@ public class AVMNodeDescriptor implements Serializable
* @param accessDate The access date. * @param accessDate The access date.
* @param id The object id. * @param id The object id.
* @param versionID The version id. * @param versionID The version id.
* @param guid The GUID.
* @param indirection The indirection. * @param indirection The indirection.
* @param isPrimary Whether this is a primary indirection. * @param isPrimary Whether this is a primary indirection.
* @param layerID The layer id. * @param layerID The layer id.
@ -152,6 +158,7 @@ public class AVMNodeDescriptor implements Serializable
long modDate, long modDate,
long accessDate, long accessDate,
long id, long id,
String guid,
int versionID, int versionID,
String indirection, String indirection,
boolean isPrimary, boolean isPrimary,
@ -170,6 +177,7 @@ public class AVMNodeDescriptor implements Serializable
fModDate = modDate; fModDate = modDate;
fAccessDate = accessDate; fAccessDate = accessDate;
fID = id; fID = id;
fGuid = guid;
fVersionID = versionID; fVersionID = versionID;
fIndirection = indirection; fIndirection = indirection;
fIsPrimary = isPrimary; fIsPrimary = isPrimary;
@ -485,4 +493,12 @@ public class AVMNodeDescriptor implements Serializable
(fDeletedType == AVMNodeType.LAYERED_FILE || (fDeletedType == AVMNodeType.LAYERED_FILE ||
fDeletedType == AVMNodeType.PLAIN_FILE); fDeletedType == AVMNodeType.PLAIN_FILE);
} }
/**
* Get the GUID for the node.
*/
public String getGuid()
{
return fGuid;
}
} }

View File

@ -1209,4 +1209,12 @@ public interface AVMService
* @throws AVMNotFoundException * @throws AVMNotFoundException
*/ */
public void revert(String path, AVMNodeDescriptor toRevertTo); 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);
} }

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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();
}
}

View File

@ -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);
}

View File

@ -468,4 +468,11 @@ public interface AVMRemote
* @throws AVMNotFoundException * @throws AVMNotFoundException
*/ */
public Pair<Integer, String> getAPath(AVMNodeDescriptor desc); 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);
} }

View File

@ -480,4 +480,12 @@ public interface AVMRemoteTransport
* @return version and path. * @return version and path.
*/ */
public Pair<Integer, String> getAPath(String ticket, AVMNodeDescriptor desc); 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);
} }