Merged HEAD-BUG-FIX (5.0/Cloud) to HEAD (5.0/Cloud)

78403: Merged EOL (5.0/Cloud) to HEAD-BUG-FIX (5.0/Cloud)
      75700: ACE-2149: EOL AVM / WCM
       - Remove most of the AVM and WCM beans, scripts, classes, patches, etc
       - The Explorer client is very broken for compilation
         - TODO: Remove all WCM-related functionality, which I thought would be best left to a UI dev
                 I've murdered many of the classes and beans but there's more to do
       - The repository compiles
         TODO: Get it running again
       - TODO: Check if we can wipe the 'deployment' project as well


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@82540 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Erik Winlof
2014-09-03 12:01:49 +00:00
parent eaff240152
commit 0baa0f74f4
284 changed files with 206 additions and 58844 deletions

View File

@@ -157,11 +157,8 @@ alfresco.rmi.services.host=0.0.0.0
#
# Select 0 to use a random unused port.
#
#avm.rmi.service.port=50501
#avmsync.rmi.service.port=50502
#attribute.rmi.service.port=50503
#authentication.rmi.service.port=50504
#repo.rmi.service.port=50505
#action.rmi.service.port=50506
#wcm-deployment-receiver.rmi.service.port=50507
#monitor.rmi.service.port=50508

View File

@@ -1,36 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- Use substitution values in this config. -->
<bean id="configurationProperties"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>config/alfresco/avm-console.properties</value>
</list>
</property>
<property name="searchSystemEnvironment">
<value>false</value>
</property>
</bean>
<import resource="file:config/alfresco/avm-base-context.xml"/>
<bean id="bulkLoader" class="org.alfresco.repo.avm.util.BulkLoader">
<property name="avmService">
<ref bean="AVMService"/>
</property>
</bean>
<bean id="interactiveConsole" class="org.alfresco.repo.avm.AVMInterpreter">
<property name="avmService">
<ref bean="AVMService"/>
</property>
<property name="bulkLoader">
<ref bean="bulkLoader"/>
</property>
</bean>
</beans>

View File

@@ -1,16 +0,0 @@
# Database specifics.
db.driver=org.gjt.mm.mysql.Driver
db.url=jdbc:mysql://127.0.0.1/avm
db.username=root
db.password=
db.pool.initial=4
db.pool.max=32
# Hibernate properties
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
hibernate.current_session_context_class=thread
hibernate.connection.isolation=2
hibernate.default_batch_fetch_size=16
hibernate.jdbc.batch_versioned_data=true
hibernate.cache.use_second_level_cache=true
hibernate.hbm2ddl.auto=update
# AVM specific properties.

View File

@@ -1,267 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="avmNodeDAO" class="org.alfresco.repo.avm.ibatis.AVMNodeDAOIbatis"/>
<bean id="avmStoreDAO" class="org.alfresco.repo.avm.ibatis.AVMStoreDAOIbatis"/>
<bean id="versionRootDAO" class="org.alfresco.repo.avm.ibatis.VersionRootDAOIbatis"/>
<bean id="childEntryDAO" class="org.alfresco.repo.avm.ibatis.ChildEntryDAOIbatis"/>
<bean id="avmStorePropertyDAO" class="org.alfresco.repo.avm.ibatis.AVMStorePropertyDAOIbatis"/>
<bean id="versionLayeredNodeEntryDAO" class="org.alfresco.repo.avm.ibatis.VersionLayeredNodeEntryDAOIbatis"/>
<bean id="avmDAOs" class="org.alfresco.repo.avm.AVMDAOs" factory-method="Instance">
<property name="nodeDAO">
<ref bean="avmNodeDAO"/>
</property>
<property name="newAvmNodeDAO">
<ref bean="newAvmNodeDAO"/>
</property>
<property name="newAvmNodeLinksDAO">
<ref bean="newAvmNodeLinksDAO"/>
</property>
<property name="contentDataDAO">
<ref bean="contentDataDAO"/>
</property>
<property name="avmStoreDAO">
<ref bean="avmStoreDAO"/>
</property>
<property name="newAvmStoreDAO">
<ref bean="newAvmStoreDAO"/>
</property>
<property name="versionRootDAO">
<ref bean="versionRootDAO"/>
</property>
<property name="newAvmVersionRootDAO">
<ref bean="newAvmVersionRootDAO"/>
</property>
<property name="childEntryDAO">
<ref bean="childEntryDAO"/>
</property>
<property name="avmStorePropertyDAO">
<ref bean="avmStorePropertyDAO"/>
</property>
<property name="versionLayeredNodeEntryDAO">
<ref bean="versionLayeredNodeEntryDAO"/>
</property>
<property name="aclDAO">
<ref bean="aclDAO"/>
</property>
</bean>
<bean id="lookupCache" class="org.alfresco.repo.avm.NOOPLookupCache"/>
<bean id="rawServices" class="org.alfresco.repo.avm.util.RawServices"/>
<bean id="orphanReaper" class="org.alfresco.repo.avm.OrphanReaper"
depends-on="AVMService" destroy-method="shutDown">
<property name="activeBaseSleep">
<value>1000</value>
</property>
<property name="batchSize">
<value>50</value>
</property>
<property name="transactionService">
<ref bean="transactionService"/>
</property>
<property name="jobLockService">
<ref bean="jobLockService" />
</property>
<property name="lockRefreshTime">
<value>${orphanReaper.lockRefreshTime}</value>
</property>
<property name="lockTimeOut">
<value>${orphanReaper.lockTimeOut}</value>
</property>
</bean>
<bean id="createStoreTxnListener" class="org.alfresco.repo.avm.CreateStoreTxnListener"/>
<bean id="purgeStoreTxnListener" class="org.alfresco.repo.avm.PurgeStoreTxnListener"/>
<bean id="createVersionTxnListener" class="org.alfresco.repo.avm.CreateVersionTxnListener"/>
<bean id="purgeVersionTxnListener" class="org.alfresco.repo.avm.PurgeVersionTxnListener"/>
<bean id="avmRepository" class="org.alfresco.repo.avm.AVMRepository">
<property name="lookupCache">
<ref bean="lookupCache"/>
</property>
<property name="contentStore">
<ref bean="fileContentStore"/>
</property>
<property name="createStoreTxnListener">
<ref bean="createStoreTxnListener"/>
</property>
<property name="purgeStoreTxnListener">
<ref bean="purgeStoreTxnListener"/>
</property>
<property name="createVersionTxnListener">
<ref bean="createVersionTxnListener"/>
</property>
<property name="purgeVersionTxnListener">
<ref bean="purgeVersionTxnListener"/>
</property>
<property name="avmStoreDAO">
<ref bean="avmStoreDAO"/>
</property>
<property name="avmNodeDAO">
<ref bean="avmNodeDAO"/>
</property>
<property name="versionRootDAO">
<ref bean="versionRootDAO"/>
</property>
<property name="versionLayeredNodeEntryDAO">
<ref bean="versionLayeredNodeEntryDAO"/>
</property>
<property name="avmStorePropertyDAO">
<ref bean="avmStorePropertyDAO"/>
</property>
<property name="childEntryDAO">
<ref bean="childEntryDAO"/>
</property>
</bean>
<!-- A Local implementation of the Remote AVM interface. -->
<bean id="avmRemote" class="org.alfresco.repo.avm.AVMRemoteLocal">
<property name="avmService">
<ref bean="AVMService"/>
</property>
</bean>
<!-- Used to notify virtualization server occur after commit/rollback -->
<bean id="AVMSubmitTransactionListener"
class="org.alfresco.repo.avm.wf.AVMSubmitTransactionListener"/>
<!-- NameMatcher beans for filtering what shows up as different in compares. -->
<bean id="excludeRegexMatcher" class="org.alfresco.util.RegexNameMatcher">
<property name="patterns">
<!--
NOTE: Regexes are implicitly anchored with ^ and $ in this context.
-->
<list>
<value>.*/#[^/]*</value> <!-- A leaf starting with '#' -->
</list>
</property>
</bean>
<bean id="excludeExtensionMatcher" class="org.alfresco.repo.avm.util.FileExtensionNameMatcher">
<property name="extensions">
<list>
<value>.o</value>
<value>.bak</value>
<value>.tmp</value>
<value>~</value>
</list>
</property>
</bean>
<bean id="globalPathExcluder" class="org.alfresco.util.OrCompositeNameMatcher">
<property name="matchers">
<list>
<ref bean="excludeExtensionMatcher"/>
<ref bean="excludeRegexMatcher"/>
</list>
</property>
</bean>
<!-- Bean used to process content that has expired in AVM staging areas -->
<bean id="avmExpiredContentProcessor" class="org.alfresco.repo.avm.AVMExpiredContentProcessor">
<property name="adminUserName">
<value>admin</value>
</property>
<property name="workflowName">
<value>jbpm$wcmwf:changerequest</value>
</property>
<property name="avmService">
<ref bean="AVMService" />
</property>
<property name="avmSyncService">
<ref bean="AVMSyncService" />
</property>
<property name="avmLockingAwareService">
<ref bean="AVMLockingAwareService" />
</property>
<property name="avmLockingService">
<ref bean="AVMLockingService" />
</property>
<property name="nodeService">
<ref bean="NodeService" />
</property>
<property name="workflowService">
<ref bean="WorkflowService" />
</property>
<property name="personService">
<ref bean="PersonService" />
</property>
<property name="permissionService">
<ref bean="PermissionService" />
</property>
<property name="transactionService">
<ref bean="TransactionService" />
</property>
<property name="virtServerRegistry">
<ref bean="VirtServerRegistry" />
</property>
<property name="searchService">
<ref bean="SearchService" />
</property>
<!-- Sparta: disable/remove WCM/AVM (note: sandboxFactory is defined in wcm-services-context.xml)
<property name="sandboxFactory">
<ref bean="sandboxFactory" />
</property>
-->
</bean>
<!-- AVM Locking. -->
<bean id="avmLockingService" class="org.alfresco.repo.avm.locking.AVMLockingServiceImpl">
<property name="attributeService">
<ref bean="attributeService"/>
</property>
<property name="authorityService">
<ref bean="authorityService"/>
</property>
<property name="personService">
<ref bean="personService"/>
</property>
<property name="nodeService">
<ref bean="nodeService"/>
</property>
<property name="searchService">
<ref bean="searchService"/>
</property>
<property name="webProjectStore">
<value>workspace://SpacesStore</value>
</property>
<property name="avmLockDAO">
<ref bean="avmLockDAO"/>
</property>
</bean>
<!-- LayeredFolderType -->
<bean id="layeredFolderType" class="org.alfresco.repo.avm.LayeredFolderType" init-method="init">
<property name="policyComponent">
<ref bean="policyComponent" />
</property>
<property name="fileFolderService">
<ref bean="fileFolderService" />
</property>
<property name="avmService">
<ref bean="avmService" />
</property>
<property name="maxTime" >
<value>${wcm.rename.max.time.milliseconds}</value>
</property>
</bean>
</beans>

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- Use substitution values in this config. -->
<!--
<bean id="configurationProperties"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>config/alfresco/avm-test.properties</value>
</list>
</property>
<property name="searchSystemEnvironment">
<value>false</value>
</property>
</bean>
-->
<import resource="file:config/alfresco/application-context.xml"/>
</beans>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<view:view xmlns:view="http://www.alfresco.org/view/repository/1.0">
<cm:folder xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:alf="http://www.alfresco.org" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:custom="custom.model" xmlns=""
<cm:folder xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:alf="http://www.alfresco.org" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:custom="custom.model" xmlns=""
view:childName="app:messages">
<view:aspects>
<app:uifacets></app:uifacets>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<view:view xmlns:view="http://www.alfresco.org/view/repository/1.0">
<cm:folder xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:alf="http://www.alfresco.org" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:custom="custom.model" xmlns=""
<cm:folder xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:alf="http://www.alfresco.org" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:custom="custom.model" xmlns=""
view:childName="app:webclient_extension">
<view:aspects>
<app:uifacets></app:uifacets>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<view:view xmlns:view="http://www.alfresco.org/view/repository/1.0">
<cm:folder xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:alf="http://www.alfresco.org" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:custom="custom.model" xmlns="" view:childName="cm:webscripts">
<cm:folder xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:alf="http://www.alfresco.org" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:custom="custom.model" xmlns="" view:childName="cm:webscripts">
<view:aspects>
<app:uifacets></app:uifacets>
</view:aspects>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<view:view xmlns:view="http://www.alfresco.org/view/repository/1.0">
<cm:folder xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:alf="http://www.alfresco.org" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:custom="custom.model" xmlns="" view:childName="cm:extensionwebscripts">
<cm:folder xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:alf="http://www.alfresco.org" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:custom="custom.model" xmlns="" view:childName="cm:extensionwebscripts">
<view:aspects>
<app:uifacets></app:uifacets>
</view:aspects>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<view:view xmlns:view="http://www.alfresco.org/view/repository/1.0">
<view:reference xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:alf="http://www.alfresco.org" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:custom="custom.model" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns="" view:pathref="/app:company_home/app:dictionary/cm:webscripts">
<view:reference xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:alf="http://www.alfresco.org" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:custom="custom.model" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns="" view:pathref="/app:company_home/app:dictionary/cm:webscripts">
<view:aspects>
<cm:templatable></cm:templatable>
</view:aspects>
@@ -8,7 +8,7 @@
<cm:template>/app:company_home/app:dictionary/app:content_templates/cm:readme.ftl</cm:template>
</view:properties>
</view:reference>
<view:reference xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:alf="http://www.alfresco.org" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:custom="custom.model" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns="" view:pathref="/app:company_home/app:dictionary/cm:extensionwebscripts">
<view:reference xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:alf="http://www.alfresco.org" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:custom="custom.model" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns="" view:pathref="/app:company_home/app:dictionary/cm:extensionwebscripts">
<view:aspects>
<cm:templatable></cm:templatable>
</view:aspects>

View File

@@ -268,49 +268,6 @@ cache.ticketsCache.eviction-policy=LRU
cache.ticketsCache.eviction-percentage=25
cache.ticketsCache.merge-policy=hz.ADD_NEW_ENTRY
cache.avmEntitySharedCache.tx.maxItems=5000
cache.avmEntitySharedCache.maxItems=5000
cache.avmEntitySharedCache.timeToLiveSeconds=0
cache.avmEntitySharedCache.maxIdleSeconds=0
cache.avmEntitySharedCache.cluster.type=fully-distributed
cache.avmEntitySharedCache.backup-count=1
cache.avmEntitySharedCache.eviction-policy=LRU
cache.avmEntitySharedCache.eviction-percentage=25
cache.avmEntitySharedCache.merge-policy=hz.ADD_NEW_ENTRY
cache.avmVersionRootEntitySharedCache.maxItems=1000
cache.avmVersionRootEntitySharedCache.timeToLiveSeconds=0
cache.avmVersionRootEntitySharedCache.maxIdleSeconds=0
cache.avmVersionRootEntitySharedCache.cluster.type=fully-distributed
cache.avmVersionRootEntitySharedCache.backup-count=1
cache.avmVersionRootEntitySharedCache.eviction-policy=LRU
cache.avmVersionRootEntitySharedCache.eviction-percentage=25
cache.avmVersionRootEntitySharedCache.merge-policy=hz.ADD_NEW_ENTRY
cache.avmNodeSharedCache.tx.maxItems=5000
cache.avmNodeSharedCache.maxItems=5000
cache.avmNodeSharedCache.timeToLiveSeconds=0
cache.avmNodeSharedCache.maxIdleSeconds=0
cache.avmNodeSharedCache.cluster.type=fully-distributed
cache.avmNodeSharedCache.backup-count=1
cache.avmNodeSharedCache.eviction-policy=LRU
cache.avmNodeSharedCache.eviction-percentage=25
cache.avmNodeSharedCache.merge-policy=hz.ADD_NEW_ENTRY
cache.avmNodeAspectsSharedCache.tx.maxItems=5000
cache.avmNodeAspectsSharedCache.maxItems=5000
cache.avmNodeAspectsSharedCache.timeToLiveSeconds=0
cache.avmNodeAspectsSharedCache.maxIdleSeconds=0
cache.avmNodeAspectsSharedCache.cluster.type=fully-distributed
cache.avmNodeAspectsSharedCache.backup-count=1
cache.avmNodeAspectsSharedCache.eviction-policy=LRU
cache.avmNodeAspectsSharedCache.eviction-percentage=25
cache.avmNodeAspectsSharedCache.merge-policy=hz.ADD_NEW_ENTRY
cache.avmStoreSharedCache.tx.maxItems=1000
cache.avmVersionRootEntityCache.tx.maxItems=100
cache.authorityEntitySharedCache.tx.maxItems=50000
cache.webServicesQuerySessionSharedCache.tx.maxItems=50

View File

@@ -108,11 +108,6 @@
<property name="contentService" >
<ref bean="contentService" />
</property>
<!-- Sparta: remove WCM/AVM
<property name="avmNodeDAO">
<ref bean="newAvmNodeDAO"/>
</property>
-->
<property name="transactionService" >
<ref bean="transactionService" />
</property>
@@ -156,9 +151,6 @@
<property name="mimetypeService">
<ref bean="mimetypeService"/>
</property>
<property name="avmService">
<ref bean="avmService"/>
</property>
<property name="imageMagickContentTransformer">
<ref bean="transformer.ImageMagick" />
</property>

View File

@@ -223,43 +223,6 @@
<property name="propertyValueDAO" ref="propertyValueDAO"/>
</bean>
<!-- AVM -->
<!-- Sparta: remove WCM/AVM
<bean id="newAvmStoreDAO" class="org.alfresco.repo.domain.avm.ibatis.AVMStoreDAOImpl">
<property name="sqlSessionTemplate" ref="avmSqlSessionTemplate"/>
<property name="qnameDAO" ref="qnameDAO"/>
<property name="avmStoreCache" ref="avmStoreCache"/>
<property name="avmStorePropertyCache" ref="avmEntityCache"/>
</bean>
<bean id="newAvmNodeDAO" class="org.alfresco.repo.domain.avm.ibatis.AVMNodeDAOImpl">
<property name="sqlSessionTemplate" ref="avmSqlSessionTemplate"/>
<property name="qnameDAO" ref="qnameDAO"/>
<property name="avmNodeCache" ref="avmNodeCache"/>
<property name="avmNodePropertyCache" ref="avmEntityCache"/>
<property name="avmNodeAspectsCache" ref="avmNodeAspectsCache"/>
</bean>
<bean id="newAvmNodeLinksDAO" class="org.alfresco.repo.domain.avm.ibatis.AVMNodeLinksDAOImpl">
<property name="sqlSessionTemplate" ref="avmSqlSessionTemplate"/>
<property name="avmChildEntryCache" ref="avmEntityCache"/>
<property name="avmHistoryLinkCache" ref="avmEntityCache"/>
</bean>
<bean id="newAvmVersionRootDAO" class="org.alfresco.repo.domain.avm.ibatis.AVMVersionRootDAOImpl">
<property name="sqlSessionTemplate" ref="avmSqlSessionTemplate"/>
<property name="versionRootEntityCache" ref="avmVersionRootEntityCache"/>
</bean>
<bean id="avmLockDAO" class="org.alfresco.repo.domain.avm.ibatis.AVMLockDAOImpl">
<property name="sqlSessionTemplate" ref="avmSqlSessionTemplate"/>
<property name="propertyValueDAO" ref="propertyValueDAO"/>
<property name="propertyUniqueContextCache" ref="propertyUniqueContextCache"/>
</bean>
-->
<!-- Permissions (including ACLs / ACEs) -->
<bean id="permissionsDaoComponent" class="org.alfresco.repo.service.StoreRedirectorProxyFactory">
@@ -273,31 +236,10 @@
<map>
<entry key="workspace"><ref bean="admPermissionsDaoComponent"></ref></entry>
<entry key="versionStore"><ref bean="admPermissionsDaoComponent"></ref></entry>
<!-- Sparta: remove WCM/AVM
<entry key="avm"><ref bean="avmPermissionsDaoComponent"/></entry>
-->
</map>
</property>
</bean>
<!-- Sparta: remove WCM/AVM
<bean id="avmPermissionsDaoComponent" class="org.alfresco.repo.domain.permissions.AVMPermissionsDaoComponentImpl">
<property name="aclDAO">
<ref bean="aclDAO"/>
</property>
<property name="protocolToACLDAO">
<map>
<entry key="workspace"><ref bean="admNodeACLDAO"></ref></entry>
<entry key="avm"><ref bean="avmNodeACLDAO"/></entry>
</map>
</property>
<property name="defaultACLDAO">
<ref bean="admNodeACLDAO"/>
</property>
</bean>
-->
<bean id="admPermissionsDaoComponent" class="org.alfresco.repo.domain.permissions.ADMPermissionsDaoComponentImpl">
<property name="aclDAO">
<ref bean="aclDAO"/>
@@ -305,9 +247,6 @@
<property name="protocolToACLDAO">
<map>
<entry key="workspace"><ref bean="admNodeACLDAO"></ref></entry>
<!-- Sparta: remove WCM/AVM
<entry key="avm"><ref bean="avmNodeACLDAO"/></entry>
-->
</map>
</property>
<property name="defaultACLDAO">
@@ -322,15 +261,6 @@
<property name="preserveAuditableData" value="${system.auditableData.ACLs}"></property>
</bean>
<!-- Sparta: remove WCM/AVM
<bean id="avmNodeACLDAO" class="org.alfresco.repo.domain.permissions.AVMAccessControlListDAO">
<property name="avmRepository" ref="avmRepository"/>
<property name="avmService" ref="avmService"/>
<property name="aclDAO" ref="aclDAO"/>
<property name="avmNodeDAO" ref="newAvmNodeDAO"/>
</bean>
-->
<bean id="aclCrudDAO" class="org.alfresco.repo.domain.permissions.ibatis.AclCrudDAOImpl">
<property name="sqlSessionTemplate" ref="repoSqlSessionTemplate"/>
<property name="qnameDAO" ref="qnameDAO"/>

View File

@@ -1,248 +0,0 @@
--
-- Title: Create AVM tables
-- Database: MySQL InnoDB
-- Since: V3.2.0 Schema 3002
-- Author: janv
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
create table avm_aspects (
node_id bigint not null,
qname_id bigint not null,
primary key (node_id, qname_id)
) ENGINE=InnoDB;
create table avm_child_entries (
parent_id bigint not null,
lc_name varchar(160) not null,
name varchar(160) not null,
child_id bigint not null,
primary key (parent_id, lc_name)
) ENGINE=InnoDB;
create table avm_history_links (
ancestor bigint not null,
descendent bigint not null,
primary key (ancestor, descendent)
) ENGINE=InnoDB;
create table avm_merge_links (
mfrom bigint not null,
mto bigint not null,
primary key (mfrom, mto)
) ENGINE=InnoDB;
create table avm_node_properties (
node_id bigint not null,
actual_type_n integer not null,
persisted_type_n integer not null,
multi_valued bit not null,
boolean_value bit,
long_value bigint,
float_value float,
double_value double precision,
string_value text,
serializable_value blob,
qname_id bigint not null,
primary key (node_id, qname_id)
) ENGINE=InnoDB;
create table avm_nodes (
id bigint not null auto_increment,
class_type varchar(20) not null,
vers bigint not null,
version_id integer not null,
guid varchar(36),
creator varchar(255) not null,
owner varchar(255) not null,
lastModifier varchar(255) not null,
createDate bigint not null,
modDate bigint not null,
accessDate bigint not null,
is_root bit,
store_new_id bigint,
acl_id bigint,
deletedType integer,
layer_id bigint,
indirection text,
indirection_version integer,
primary_indirection bit,
opacity bit,
content_url varchar(128),
mime_type varchar(100),
encoding varchar(16),
length bigint,
primary key (id)
) ENGINE=InnoDB;
create table avm_store_properties (
id bigint not null auto_increment,
avm_store_id bigint,
qname_id bigint not null,
actual_type_n integer not null,
persisted_type_n integer not null,
multi_valued bit not null,
boolean_value bit,
long_value bigint,
float_value float,
double_value double precision,
string_value text,
serializable_value blob,
primary key (id)
) ENGINE=InnoDB;
create table avm_stores (
id bigint not null auto_increment,
vers bigint not null,
name varchar(255) unique,
next_version_id integer not null,
current_root_id bigint,
acl_id bigint,
primary key (id)
) ENGINE=InnoDB;
create table avm_version_layered_node_entry (
version_root_id bigint not null,
md5sum varchar(32) not null,
path text,
primary key (version_root_id, md5sum)
) ENGINE=InnoDB;
create table avm_version_roots (
id bigint not null auto_increment,
version_id integer not null,
avm_store_id bigint not null,
create_date bigint not null,
creator varchar(255) not null,
root_id bigint not null,
tag varchar(255),
description text,
primary key (id),
constraint unique index idx_avm_vr_uq (avm_store_id, version_id)
) ENGINE=InnoDB;
alter table avm_aspects
add index fk_avm_nasp_n (node_id),
add constraint fk_avm_nasp_n
foreign key (node_id)
references avm_nodes (id);
alter table avm_child_entries
add index fk_avm_ce_child (child_id),
add constraint fk_avm_ce_child
foreign key (child_id)
references avm_nodes (id);
alter table avm_child_entries
add index fk_avm_ce_parent (parent_id),
add constraint fk_avm_ce_parent
foreign key (parent_id)
references avm_nodes (id);
alter table avm_history_links
add index fk_avm_hl_desc (descendent),
add constraint fk_avm_hl_desc
foreign key (descendent)
references avm_nodes (id);
alter table avm_history_links
add index fk_avm_hl_ancestor (ancestor),
add constraint fk_avm_hl_ancestor
foreign key (ancestor)
references avm_nodes (id);
alter table avm_merge_links
add index fk_avm_ml_from (mfrom),
add constraint fk_avm_ml_from
foreign key (mfrom)
references avm_nodes (id);
alter table avm_merge_links
add index fk_avm_ml_to (mto),
add constraint fk_avm_ml_to
foreign key (mto)
references avm_nodes (id);
alter table avm_node_properties
add index fk_avm_nprop_n (node_id),
add constraint fk_avm_nprop_n
foreign key (node_id)
references avm_nodes (id);
create index idx_avm_n_pi on avm_nodes (primary_indirection);
alter table avm_nodes
add index fk_avm_n_acl (acl_id),
add constraint fk_avm_n_acl
foreign key (acl_id)
references alf_access_control_list (id);
alter table avm_nodes
add index fk_avm_n_store (store_new_id),
add constraint fk_avm_n_store
foreign key (store_new_id)
references avm_stores (id);
alter table avm_store_properties
add index fk_avm_sprop_store (avm_store_id),
add constraint fk_avm_sprop_store
foreign key (avm_store_id)
references avm_stores (id);
alter table avm_stores
add index fk_avm_s_root (current_root_id),
add constraint fk_avm_s_root
foreign key (current_root_id)
references avm_nodes (id);
alter table avm_stores
add index fk_avm_s_acl (acl_id),
add constraint fk_avm_s_acl
foreign key (acl_id)
references alf_access_control_list (id);
alter table avm_version_layered_node_entry
add index fk_avm_vlne_vr (version_root_id),
add constraint fk_avm_vlne_vr
foreign key (version_root_id)
references avm_version_roots (id);
create index idx_avm_vr_version on avm_version_roots (version_id);
alter table avm_version_roots
add index fk_avm_vr_store (avm_store_id),
add constraint fk_avm_vr_store
foreign key (avm_store_id)
references avm_stores (id);
alter table avm_version_roots
add index fk_avm_vr_root (root_id),
add constraint fk_avm_vr_root
foreign key (root_id)
references avm_nodes (id);
CREATE INDEX fk_avm_nasp_qn ON avm_aspects (qname_id);
ALTER TABLE avm_aspects ADD CONSTRAINT fk_avm_nasp_qn FOREIGN KEY (qname_id) REFERENCES alf_qname (id);
CREATE INDEX fk_avm_nprop_qn ON avm_node_properties (qname_id);
ALTER TABLE avm_node_properties ADD CONSTRAINT fk_avm_nprop_qn FOREIGN KEY (qname_id) REFERENCES alf_qname (id);
CREATE INDEX fk_avm_sprop_qname ON avm_store_properties (qname_id);
ALTER TABLE avm_store_properties ADD CONSTRAINT fk_avm_sprop_qname FOREIGN KEY (qname_id) REFERENCES alf_qname (id);
CREATE INDEX idx_avm_hl_revpk ON avm_history_links (descendent, ancestor);
CREATE INDEX idx_avm_ce_lc_name ON avm_child_entries (lc_name, parent_id);
--
-- Record script finish
--
DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.2-AvmTables';
INSERT INTO alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES
(
'patch.db-V3.2-AvmTables', 'Manually executed script upgrade V3.2: AVM Tables',
0, 3001, -1, 3002, null, 'UNKNOWN', ${TRUE}, ${TRUE}, 'Script completed'
);

View File

@@ -1,742 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.alfresco.org/repo/db-schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.alfresco.org/repo/db-schema db-schema.xsd" name="" dbprefix="avm_" version="5026">
<validators>
<validator class="org.alfresco.util.schemacomp.validator.NameValidator">
<properties>
<property name="pattern">.*</property>
</properties>
</validator>
<validator class="org.alfresco.util.schemacomp.validator.SchemaVersionValidator"/>
</validators>
<objects>
<table name="avm_aspects">
<columns>
<column name="node_id" order="1">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="qname_id" order="2">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="PRIMARY">
<columnnames>
<columnname order="1">node_id</columnname>
<columnname order="2">qname_id</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_nasp_qn">
<localcolumn>qname_id</localcolumn>
<targettable>alf_qname</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_nasp_n">
<localcolumn>node_id</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="fk_avm_nasp_n" unique="false">
<columnnames>
<columnname>node_id</columnname>
</columnnames>
</index>
<index name="fk_avm_nasp_qn" unique="false">
<columnnames>
<columnname>qname_id</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_child_entries">
<columns>
<column name="parent_id" order="1">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="lc_name" order="2">
<type>varchar(160)</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="name" order="3">
<type>varchar(160)</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="child_id" order="4">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="PRIMARY">
<columnnames>
<columnname order="2">lc_name</columnname>
<columnname order="1">parent_id</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_ce_parent">
<localcolumn>parent_id</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_ce_child">
<localcolumn>child_id</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="fk_avm_ce_child" unique="false">
<columnnames>
<columnname>child_id</columnname>
</columnnames>
</index>
<index name="fk_avm_ce_parent" unique="false">
<columnnames>
<columnname>parent_id</columnname>
</columnnames>
</index>
<index name="idx_avm_ce_lc_name" unique="false">
<columnnames>
<columnname>lc_name</columnname>
<columnname>parent_id</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_history_links">
<columns>
<column name="ancestor" order="1">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="descendent" order="2">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="PRIMARY">
<columnnames>
<columnname order="1">ancestor</columnname>
<columnname order="2">descendent</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_hl_ancestor">
<localcolumn>ancestor</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_hl_desc">
<localcolumn>descendent</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="fk_avm_hl_desc" unique="false">
<columnnames>
<columnname>descendent</columnname>
</columnnames>
</index>
<index name="fk_avm_hl_ancestor" unique="false">
<columnnames>
<columnname>ancestor</columnname>
</columnnames>
</index>
<index name="idx_avm_hl_revpk" unique="false">
<columnnames>
<columnname>descendent</columnname>
<columnname>ancestor</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_merge_links">
<columns>
<column name="mfrom" order="1">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="mto" order="2">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="PRIMARY">
<columnnames>
<columnname order="1">mfrom</columnname>
<columnname order="2">mto</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_ml_to">
<localcolumn>mto</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_ml_from">
<localcolumn>mfrom</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="fk_avm_ml_from" unique="false">
<columnnames>
<columnname>mfrom</columnname>
</columnnames>
</index>
<index name="fk_avm_ml_to" unique="false">
<columnnames>
<columnname>mto</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_node_properties">
<columns>
<column name="node_id" order="1">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="actual_type_n" order="2">
<type>int</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="persisted_type_n" order="3">
<type>int</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="multi_valued" order="4">
<type>bit</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="boolean_value" order="5">
<type>bit</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="long_value" order="6">
<type>bigint</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="float_value" order="7">
<type>float</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="double_value" order="8">
<type>double</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="string_value" order="9">
<type>text</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="serializable_value" order="10">
<type>blob</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="qname_id" order="11">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="PRIMARY">
<columnnames>
<columnname order="1">node_id</columnname>
<columnname order="2">qname_id</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_nprop_qn">
<localcolumn>qname_id</localcolumn>
<targettable>alf_qname</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_nprop_n">
<localcolumn>node_id</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="fk_avm_nprop_n" unique="false">
<columnnames>
<columnname>node_id</columnname>
</columnnames>
</index>
<index name="fk_avm_nprop_qn" unique="false">
<columnnames>
<columnname>qname_id</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_nodes">
<columns>
<column name="id" order="1">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>true</autoincrement>
</column>
<column name="class_type" order="2">
<type>varchar(20)</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="vers" order="3">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="version_id" order="4">
<type>int</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="guid" order="5">
<type>varchar(36)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="creator" order="6">
<type>varchar(255)</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="owner" order="7">
<type>varchar(255)</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="lastModifier" order="8">
<type>varchar(255)</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="createDate" order="9">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="modDate" order="10">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="accessDate" order="11">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="is_root" order="12">
<type>bit</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="store_new_id" order="13">
<type>bigint</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="acl_id" order="14">
<type>bigint</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="deletedType" order="15">
<type>int</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="layer_id" order="16">
<type>bigint</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="indirection" order="17">
<type>text</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="indirection_version" order="18">
<type>int</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="primary_indirection" order="19">
<type>bit</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="opacity" order="20">
<type>bit</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="content_url" order="21">
<type>varchar(128)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="mime_type" order="22">
<type>varchar(100)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="encoding" order="23">
<type>varchar(16)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="length" order="24">
<type>bigint</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="PRIMARY">
<columnnames>
<columnname order="1">id</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_n_store">
<localcolumn>store_new_id</localcolumn>
<targettable>avm_stores</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_n_acl">
<localcolumn>acl_id</localcolumn>
<targettable>alf_access_control_list</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="idx_avm_n_pi" unique="false">
<columnnames>
<columnname>primary_indirection</columnname>
</columnnames>
</index>
<index name="fk_avm_n_acl" unique="false">
<columnnames>
<columnname>acl_id</columnname>
</columnnames>
</index>
<index name="fk_avm_n_store" unique="false">
<columnnames>
<columnname>store_new_id</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_store_properties">
<columns>
<column name="id" order="1">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>true</autoincrement>
</column>
<column name="avm_store_id" order="2">
<type>bigint</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="qname_id" order="3">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="actual_type_n" order="4">
<type>int</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="persisted_type_n" order="5">
<type>int</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="multi_valued" order="6">
<type>bit</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="boolean_value" order="7">
<type>bit</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="long_value" order="8">
<type>bigint</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="float_value" order="9">
<type>float</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="double_value" order="10">
<type>double</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="string_value" order="11">
<type>text</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="serializable_value" order="12">
<type>blob</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="PRIMARY">
<columnnames>
<columnname order="1">id</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_sprop_qname">
<localcolumn>qname_id</localcolumn>
<targettable>alf_qname</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_sprop_store">
<localcolumn>avm_store_id</localcolumn>
<targettable>avm_stores</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="fk_avm_sprop_store" unique="false">
<columnnames>
<columnname>avm_store_id</columnname>
</columnnames>
</index>
<index name="fk_avm_sprop_qname" unique="false">
<columnnames>
<columnname>qname_id</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_stores">
<columns>
<column name="id" order="1">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>true</autoincrement>
</column>
<column name="vers" order="2">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="name" order="3">
<type>varchar(255)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="next_version_id" order="4">
<type>int</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="current_root_id" order="5">
<type>bigint</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="acl_id" order="6">
<type>bigint</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="PRIMARY">
<columnnames>
<columnname order="1">id</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_s_acl">
<localcolumn>acl_id</localcolumn>
<targettable>alf_access_control_list</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_s_root">
<localcolumn>current_root_id</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="name" unique="true">
<columnnames>
<columnname>name</columnname>
</columnnames>
</index>
<index name="fk_avm_s_root" unique="false">
<columnnames>
<columnname>current_root_id</columnname>
</columnnames>
</index>
<index name="fk_avm_s_acl" unique="false">
<columnnames>
<columnname>acl_id</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_version_layered_node_entry">
<columns>
<column name="version_root_id" order="1">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="md5sum" order="2">
<type>varchar(32)</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="path" order="3">
<type>text</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="PRIMARY">
<columnnames>
<columnname order="2">md5sum</columnname>
<columnname order="1">version_root_id</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_vlne_vr">
<localcolumn>version_root_id</localcolumn>
<targettable>avm_version_roots</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="fk_avm_vlne_vr" unique="false">
<columnnames>
<columnname>version_root_id</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_version_roots">
<columns>
<column name="id" order="1">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>true</autoincrement>
</column>
<column name="version_id" order="2">
<type>int</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="avm_store_id" order="3">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="create_date" order="4">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="creator" order="5">
<type>varchar(255)</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="root_id" order="6">
<type>bigint</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="tag" order="7">
<type>varchar(255)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="description" order="8">
<type>text</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="PRIMARY">
<columnnames>
<columnname order="1">id</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_vr_root">
<localcolumn>root_id</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_vr_store">
<localcolumn>avm_store_id</localcolumn>
<targettable>avm_stores</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="idx_avm_vr_version" unique="false">
<columnnames>
<columnname>version_id</columnname>
</columnnames>
</index>
<index name="fk_avm_vr_store" unique="false">
<columnnames>
<columnname>avm_store_id</columnname>
</columnnames>
</index>
<index name="fk_avm_vr_root" unique="false">
<columnnames>
<columnname>root_id</columnname>
</columnnames>
</index>
<index name="idx_avm_vr_uq" unique="true">
<columnnames>
<columnname>avm_store_id</columnname>
<columnname>version_id</columnname>
</columnnames>
</index>
</indexes>
</table>
</objects>
</schema>

View File

@@ -1,255 +0,0 @@
--
-- Title: Create AVM tables
-- Database: PostgreSql
-- Since: V3.2.0 Schema 3002
-- Author: Pavel Yurkevich
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
create table avm_aspects (
node_id INT8 not null,
qname_id INT8 not null,
primary key (node_id, qname_id)
);
create table avm_child_entries (
parent_id INT8 not null,
lc_name varchar(160) not null,
name varchar(160) not null,
child_id INT8 not null,
primary key (parent_id, lc_name)
);
create table avm_history_links (
ancestor INT8 not null,
descendent INT8 not null,
primary key (ancestor, descendent)
);
create table avm_merge_links (
mfrom INT8 not null,
mto INT8 not null,
primary key (mfrom, mto)
);
create table avm_node_properties (
node_id INT8 not null,
actual_type_n INT4 not null,
persisted_type_n INT4 not null,
multi_valued BOOL not null,
boolean_value BOOL,
long_value INT8,
float_value FLOAT4,
double_value FLOAT8,
string_value VARCHAR(1024),
serializable_value BYTEA,
qname_id INT8 not null,
primary key (node_id, qname_id)
);
create sequence avm_nodes_seq start with 1 increment by 1;
create table avm_nodes (
id INT8 not null,
class_type varchar(20) not null,
vers INT8 not null,
version_id INT4 not null,
guid varchar(36),
creator varchar(255) not null,
owner varchar(255) not null,
lastModifier varchar(255) not null,
createDate INT8 not null,
modDate INT8 not null,
accessDate INT8 not null,
is_root BOOL,
store_new_id INT8,
acl_id INT8,
deletedType INT4,
layer_id INT8,
indirection VARCHAR(1024),
indirection_version INT4,
primary_indirection BOOL,
opacity BOOL,
content_url varchar(128),
mime_type varchar(100),
encoding varchar(16),
length INT8,
primary key (id)
);
create sequence avm_store_properties_seq start with 1 increment by 1;
create table avm_store_properties (
id INT8 not null,
avm_store_id INT8,
qname_id INT8 not null,
actual_type_n INT4 not null,
persisted_type_n INT4 not null,
multi_valued BOOL not null,
boolean_value BOOL,
long_value INT8,
float_value FLOAT4,
double_value FLOAT8,
string_value VARCHAR(1024),
serializable_value BYTEA,
primary key (id)
);
create sequence avm_stores_seq start with 1 increment by 1;
create table avm_stores (
id INT8 not null,
vers INT8 not null,
name varchar(255) unique,
next_version_id INT4 not null,
current_root_id INT8,
acl_id INT8,
primary key (id)
);
create table avm_version_layered_node_entry (
version_root_id INT8 not null,
md5sum varchar(32) not null,
path VARCHAR(1024),
primary key (version_root_id, md5sum)
);
create sequence avm_version_roots_seq start with 1 increment by 1;
create table avm_version_roots (
id INT8 not null,
version_id INT4 not null,
avm_store_id INT8 not null,
create_date INT8 not null,
creator varchar(255) not null,
root_id INT8 not null,
tag varchar(255),
description VARCHAR(1024),
primary key (id)
);
alter table avm_version_roots
add constraint idx_avm_vr_uq
unique (avm_store_id, version_id);
alter table avm_aspects
add constraint fk_avm_nasp_n
foreign key (node_id)
references avm_nodes (id);
create index fk_avm_nasp_n on avm_aspects(node_id);
alter table avm_child_entries
add constraint fk_avm_ce_child
foreign key (child_id)
references avm_nodes (id);
create index fk_avm_ce_child on avm_child_entries(child_id);
alter table avm_child_entries
add constraint fk_avm_ce_parent
foreign key (parent_id)
references avm_nodes (id);
create index fk_avm_ce_parent on avm_child_entries(parent_id);
alter table avm_history_links
add constraint fk_avm_hl_desc
foreign key (descendent)
references avm_nodes (id);
create index fk_avm_hl_desc on avm_history_links(descendent);
alter table avm_history_links
add constraint fk_avm_hl_ancestor
foreign key (ancestor)
references avm_nodes (id);
create index fk_avm_hl_ancestor on avm_history_links(ancestor);
alter table avm_merge_links
add constraint fk_avm_ml_from
foreign key (mfrom)
references avm_nodes (id);
create index fk_avm_ml_from on avm_merge_links(mfrom);
alter table avm_merge_links
add constraint fk_avm_ml_to
foreign key (mto)
references avm_nodes (id);
create index fk_avm_ml_to on avm_merge_links(mto);
alter table avm_node_properties
add constraint fk_avm_nprop_n
foreign key (node_id)
references avm_nodes (id);
create index fk_avm_nprop_n on avm_node_properties(node_id);
create index idx_avm_n_pi on avm_nodes (primary_indirection);
alter table avm_nodes
add constraint fk_avm_n_acl
foreign key (acl_id)
references alf_access_control_list (id);
create index fk_avm_n_acl on avm_nodes(acl_id);
alter table avm_nodes
add constraint fk_avm_n_store
foreign key (store_new_id)
references avm_stores (id);
create index fk_avm_n_store on avm_nodes(store_new_id);
alter table avm_store_properties
add constraint fk_avm_sprop_store
foreign key (avm_store_id)
references avm_stores (id);
create index fk_avm_sprop_store on avm_store_properties(avm_store_id);
alter table avm_stores
add constraint fk_avm_s_root
foreign key (current_root_id)
references avm_nodes (id);
create index fk_avm_s_root on avm_stores(current_root_id);
alter table avm_stores
add constraint fk_avm_s_acl
foreign key (acl_id)
references alf_access_control_list (id);
create index fk_avm_s_acl on avm_stores(acl_id);
alter table avm_version_layered_node_entry
add constraint fk_avm_vlne_vr
foreign key (version_root_id)
references avm_version_roots (id);
create index fk_avm_vlne_vr on avm_version_layered_node_entry(version_root_id);
create index idx_avm_vr_version on avm_version_roots (version_id);
alter table avm_version_roots
add constraint fk_avm_vr_store
foreign key (avm_store_id)
references avm_stores (id);
create index fk_avm_vr_store on avm_version_roots(avm_store_id);
alter table avm_version_roots
add constraint fk_avm_vr_root
foreign key (root_id)
references avm_nodes (id);
create index fk_avm_vr_root on avm_version_roots(root_id);
CREATE INDEX fk_avm_nasp_qn ON avm_aspects (qname_id);
ALTER TABLE avm_aspects ADD CONSTRAINT fk_avm_nasp_qn FOREIGN KEY (qname_id) REFERENCES alf_qname (id);
CREATE INDEX fk_avm_nprop_qn ON avm_node_properties (qname_id);
ALTER TABLE avm_node_properties ADD CONSTRAINT fk_avm_nprop_qn FOREIGN KEY (qname_id) REFERENCES alf_qname (id);
CREATE INDEX fk_avm_sprop_qname ON avm_store_properties (qname_id);
ALTER TABLE avm_store_properties ADD CONSTRAINT fk_avm_sprop_qname FOREIGN KEY (qname_id) REFERENCES alf_qname (id);
CREATE INDEX idx_avm_hl_revpk ON avm_history_links (descendent, ancestor);
CREATE INDEX idx_avm_ce_lc_name ON avm_child_entries (lc_name, parent_id);
--
-- Record script finish
--
DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.2-AvmTables';
INSERT INTO alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES
(
'patch.db-V3.2-AvmTables', 'Manually executed script upgrade V3.2: AVM Tables',
0, 3001, -1, 3002, null, 'UNKOWN', TRUE, TRUE, 'Script completed'
);

View File

@@ -1,753 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.alfresco.org/repo/db-schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.alfresco.org/repo/db-schema db-schema.xsd" name="" dbprefix="avm_" version="5026">
<validators>
<validator class="org.alfresco.util.schemacomp.validator.NameValidator">
<properties>
<property name="pattern">.*</property>
</properties>
</validator>
<validator class="org.alfresco.util.schemacomp.validator.SchemaVersionValidator"/>
</validators>
<objects>
<sequence name="avm_nodes_seq"/>
<sequence name="avm_store_properties_seq"/>
<sequence name="avm_stores_seq"/>
<sequence name="avm_version_roots_seq"/>
<table name="avm_aspects">
<columns>
<column name="node_id" order="1">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="qname_id" order="2">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="avm_aspects_pkey">
<columnnames>
<columnname order="1">node_id</columnname>
<columnname order="2">qname_id</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_nasp_qn">
<localcolumn>qname_id</localcolumn>
<targettable>alf_qname</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_nasp_n">
<localcolumn>node_id</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="fk_avm_nasp_n" unique="false">
<columnnames>
<columnname>node_id</columnname>
</columnnames>
</index>
<index name="fk_avm_nasp_qn" unique="false">
<columnnames>
<columnname>qname_id</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_child_entries">
<columns>
<column name="parent_id" order="1">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="lc_name" order="2">
<type>varchar(160)</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="name" order="3">
<type>varchar(160)</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="child_id" order="4">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="avm_child_entries_pkey">
<validators>
<validator class="org.alfresco.util.schemacomp.validator.NameValidator">
<properties>
<property name="pattern">.*</property>
</properties>
</validator>
</validators>
<columnnames>
<columnname order="1">parent_id</columnname>
<columnname order="2">lc_name</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_ce_parent">
<localcolumn>parent_id</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_ce_child">
<localcolumn>child_id</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="fk_avm_ce_child" unique="false">
<columnnames>
<columnname>child_id</columnname>
</columnnames>
</index>
<index name="fk_avm_ce_parent" unique="false">
<columnnames>
<columnname>parent_id</columnname>
</columnnames>
</index>
<index name="idx_avm_ce_lc_name" unique="false">
<columnnames>
<columnname>lc_name</columnname>
<columnname>parent_id</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_history_links">
<columns>
<column name="ancestor" order="1">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="descendent" order="2">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="avm_history_links_pkey">
<columnnames>
<columnname order="1">ancestor</columnname>
<columnname order="2">descendent</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_hl_ancestor">
<localcolumn>ancestor</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_hl_desc">
<localcolumn>descendent</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="fk_avm_hl_ancestor" unique="false">
<columnnames>
<columnname>ancestor</columnname>
</columnnames>
</index>
<index name="fk_avm_hl_desc" unique="false">
<columnnames>
<columnname>descendent</columnname>
</columnnames>
</index>
<index name="idx_avm_hl_revpk" unique="false">
<columnnames>
<columnname>descendent</columnname>
<columnname>ancestor</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_merge_links">
<columns>
<column name="mfrom" order="1">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="mto" order="2">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="avm_merge_links_pkey">
<columnnames>
<columnname order="1">mfrom</columnname>
<columnname order="2">mto</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_ml_to">
<localcolumn>mto</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_ml_from">
<localcolumn>mfrom</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="fk_avm_ml_from" unique="false">
<columnnames>
<columnname>mfrom</columnname>
</columnnames>
</index>
<index name="fk_avm_ml_to" unique="false">
<columnnames>
<columnname>mto</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_node_properties">
<columns>
<column name="node_id" order="1">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="actual_type_n" order="2">
<type>int4</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="persisted_type_n" order="3">
<type>int4</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="multi_valued" order="4">
<type>bool</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="boolean_value" order="5">
<type>bool</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="long_value" order="6">
<type>int8</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="float_value" order="7">
<type>float4</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="double_value" order="8">
<type>float8</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="string_value" order="9">
<type>varchar(1024)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="serializable_value" order="10">
<type>bytea</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="qname_id" order="11">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="avm_node_properties_pkey">
<columnnames>
<columnname order="1">node_id</columnname>
<columnname order="2">qname_id</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_nprop_qn">
<localcolumn>qname_id</localcolumn>
<targettable>alf_qname</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_nprop_n">
<localcolumn>node_id</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="fk_avm_nprop_n" unique="false">
<columnnames>
<columnname>node_id</columnname>
</columnnames>
</index>
<index name="fk_avm_nprop_qn" unique="false">
<columnnames>
<columnname>qname_id</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_nodes">
<columns>
<column name="id" order="1">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="class_type" order="2">
<type>varchar(20)</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="vers" order="3">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="version_id" order="4">
<type>int4</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="guid" order="5">
<type>varchar(36)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="creator" order="6">
<type>varchar(255)</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="owner" order="7">
<type>varchar(255)</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="lastmodifier" order="8">
<type>varchar(255)</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="createdate" order="9">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="moddate" order="10">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="accessdate" order="11">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="is_root" order="12">
<type>bool</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="store_new_id" order="13">
<type>int8</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="acl_id" order="14">
<type>int8</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="deletedtype" order="15">
<type>int4</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="layer_id" order="16">
<type>int8</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="indirection" order="17">
<type>varchar(1024)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="indirection_version" order="18">
<type>int4</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="primary_indirection" order="19">
<type>bool</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="opacity" order="20">
<type>bool</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="content_url" order="21">
<type>varchar(128)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="mime_type" order="22">
<type>varchar(100)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="encoding" order="23">
<type>varchar(16)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="length" order="24">
<type>int8</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="avm_nodes_pkey">
<columnnames>
<columnname order="1">id</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_n_acl">
<localcolumn>acl_id</localcolumn>
<targettable>alf_access_control_list</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_n_store">
<localcolumn>store_new_id</localcolumn>
<targettable>avm_stores</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="fk_avm_n_acl" unique="false">
<columnnames>
<columnname>acl_id</columnname>
</columnnames>
</index>
<index name="fk_avm_n_store" unique="false">
<columnnames>
<columnname>store_new_id</columnname>
</columnnames>
</index>
<index name="idx_avm_n_pi" unique="false">
<columnnames>
<columnname>primary_indirection</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_store_properties">
<columns>
<column name="id" order="1">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="avm_store_id" order="2">
<type>int8</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="qname_id" order="3">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="actual_type_n" order="4">
<type>int4</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="persisted_type_n" order="5">
<type>int4</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="multi_valued" order="6">
<type>bool</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="boolean_value" order="7">
<type>bool</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="long_value" order="8">
<type>int8</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="float_value" order="9">
<type>float4</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="double_value" order="10">
<type>float8</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="string_value" order="11">
<type>varchar(1024)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="serializable_value" order="12">
<type>bytea</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="avm_store_properties_pkey">
<columnnames>
<columnname order="1">id</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_sprop_qname">
<localcolumn>qname_id</localcolumn>
<targettable>alf_qname</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_sprop_store">
<localcolumn>avm_store_id</localcolumn>
<targettable>avm_stores</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="fk_avm_sprop_qname" unique="false">
<columnnames>
<columnname>qname_id</columnname>
</columnnames>
</index>
<index name="fk_avm_sprop_store" unique="false">
<columnnames>
<columnname>avm_store_id</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_stores">
<columns>
<column name="id" order="1">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="vers" order="2">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="name" order="3">
<type>varchar(255)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="next_version_id" order="4">
<type>int4</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="current_root_id" order="5">
<type>int8</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="acl_id" order="6">
<type>int8</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="avm_stores_pkey">
<columnnames>
<columnname order="1">id</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_s_acl">
<localcolumn>acl_id</localcolumn>
<targettable>alf_access_control_list</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_s_root">
<localcolumn>current_root_id</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="avm_stores_name_key" unique="true">
<columnnames>
<columnname>name</columnname>
</columnnames>
</index>
<index name="fk_avm_s_acl" unique="false">
<columnnames>
<columnname>acl_id</columnname>
</columnnames>
</index>
<index name="fk_avm_s_root" unique="false">
<columnnames>
<columnname>current_root_id</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_version_layered_node_entry">
<columns>
<column name="version_root_id" order="1">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="md5sum" order="2">
<type>varchar(32)</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="path" order="3">
<type>varchar(1024)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="avm_version_layered_node_entry_pkey">
<columnnames>
<columnname order="1">version_root_id</columnname>
<columnname order="2">md5sum</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_vlne_vr">
<localcolumn>version_root_id</localcolumn>
<targettable>avm_version_roots</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="fk_avm_vlne_vr" unique="false">
<columnnames>
<columnname>version_root_id</columnname>
</columnnames>
</index>
</indexes>
</table>
<table name="avm_version_roots">
<columns>
<column name="id" order="1">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="version_id" order="2">
<type>int4</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="avm_store_id" order="3">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="create_date" order="4">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="creator" order="5">
<type>varchar(255)</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="root_id" order="6">
<type>int8</type>
<nullable>false</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="tag" order="7">
<type>varchar(255)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
<column name="description" order="8">
<type>varchar(1024)</type>
<nullable>true</nullable>
<autoincrement>false</autoincrement>
</column>
</columns>
<primarykey name="avm_version_roots_pkey">
<columnnames>
<columnname order="1">id</columnname>
</columnnames>
</primarykey>
<foreignkeys>
<foreignkey name="fk_avm_vr_root">
<localcolumn>root_id</localcolumn>
<targettable>avm_nodes</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
<foreignkey name="fk_avm_vr_store">
<localcolumn>avm_store_id</localcolumn>
<targettable>avm_stores</targettable>
<targetcolumn>id</targetcolumn>
</foreignkey>
</foreignkeys>
<indexes>
<index name="fk_avm_vr_root" unique="false">
<columnnames>
<columnname>root_id</columnname>
</columnnames>
</index>
<index name="fk_avm_vr_store" unique="false">
<columnnames>
<columnname>avm_store_id</columnname>
</columnnames>
</index>
<index name="idx_avm_vr_uq" unique="true">
<columnnames>
<columnname>avm_store_id</columnname>
<columnname>version_id</columnname>
</columnnames>
</index>
<index name="idx_avm_vr_version" unique="false">
<columnnames>
<columnname>version_id</columnname>
</columnnames>
</index>
</indexes>
</table>
</objects>
</schema>

View File

@@ -1,26 +0,0 @@
--
-- Title: Upgrade to V3.2 - Remove AVM Issuer
-- Database: Generic
-- Since: V3.2 schema 2008
-- Author: janv
--
-- remove AVM node issuer
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
-- drop issuer table
drop table avm_issuer_ids;
--
-- Record script finish
--
DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.2-Remove-AVM-Issuer';
INSERT INTO alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES
(
'patch.db-V3.2-Remove-AVM-Issuer', 'Manually executed script upgrade V3.2 to remove AVM Issuer',
0, 2007, -1, 2008, null, 'UNKNOWN', ${TRUE}, ${TRUE}, 'Script completed'
);

View File

@@ -1,24 +0,0 @@
--
-- Title: Upgrade to V3.2 - modify AVM mimetype
-- Database: MySQL
-- Since: V3.2 schema 2017
-- Author: janv
--
-- modify AVM mimetype (increase column size)
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
ALTER TABLE avm_nodes MODIFY mime_type VARCHAR(100);
--
-- Record script finish
--
DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.2-Modify-AVM-MimeType';
INSERT INTO alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES
(
'patch.db-V3.2-Modify-AVM-MimeType', 'Manually executed script upgrade V3.2 to modify AVM mimetype',
0, 2016, -1, 2017, null, 'UNKOWN', ${TRUE}, ${TRUE}, 'Script completed'
);

View File

@@ -1,57 +0,0 @@
--
-- Title: Upgrade to V3.2 - Remove AVM Issuer
-- Database: MySQL
-- Since: V3.2 schema 2008
-- Author: janv
--
-- remove AVM node issuer - replace with auto-increment id
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
-- -----------------------------
-- Enable auto-increment --
-- -----------------------------
insert into avm_nodes (id, class_type, vers, version_id, guid, creator, owner, lastModifier, createDate, modDate, accessDate, is_root, store_new_id, acl_id, deletedType, layer_id, indirection, indirection_version, primary_indirection, opacity, content_url, mime_type, encoding, length)
select
(select max(id)+1 from avm_nodes),
class_type, vers, version_id, guid, creator, owner, lastModifier, createDate, modDate, accessDate, is_root, store_new_id, acl_id, deletedType, layer_id, indirection, indirection_version, primary_indirection, opacity, content_url, mime_type, encoding, length
from avm_nodes where id = 0;
update avm_aspects set node_id = (select max(id) from avm_nodes) where node_id = 0;
update avm_child_entries set parent_id = (select max(id) from avm_nodes) where parent_id = 0;
update avm_child_entries set child_id = (select max(id) from avm_nodes) where child_id = 0;
update avm_history_links set ancestor = (select max(id) from avm_nodes) where ancestor = 0;
update avm_history_links set descendent = (select max(id) from avm_nodes) where descendent = 0;
update avm_merge_links set mfrom = (select max(id) from avm_nodes) where mfrom = 0;
update avm_merge_links set mto = (select max(id) from avm_nodes) where mto = 0;
update avm_node_properties set node_id = (select max(id) from avm_nodes) where node_id = 0;
update avm_stores set current_root_id = (select max(id) from avm_nodes) where current_root_id = 0;
update avm_version_roots set root_id = (select max(id) from avm_nodes) where root_id = 0;
delete from avm_nodes where id = 0;
alter table avm_nodes modify column id bigint not null auto_increment;
-- drop issuer table
drop table avm_issuer_ids;
--
-- Record script finish
--
DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.2-Remove-AVM-Issuer';
INSERT INTO alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES
(
'patch.db-V3.2-Remove-AVM-Issuer', 'Manually executed script upgrade V3.2 to remove AVM Issuer',
0, 2007, -1, 2008, null, 'UNKNOWN', ${TRUE}, ${TRUE}, 'Script completed'
);

View File

@@ -1,24 +0,0 @@
--
-- Title: Upgrade to V3.2 - modify AVM mimetype
-- Database: PostgreSQL
-- Since: V3.2 schema 2017
-- Author:
--
-- modify AVM mimetype (increase column size)
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
ALTER TABLE avm_nodes ALTER COLUMN mime_type TYPE VARCHAR(100);
--
-- Record script finish
--
DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.2-Modify-AVM-MimeType';
INSERT INTO alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES
(
'patch.db-V3.2-Modify-AVM-MimeType', 'Manually executed script upgrade V3.2 to modify AVM mimetype',
0, 2016, -1, 2017, null, 'UNKOWN', TRUE, TRUE, 'Script completed'
);

View File

@@ -1,50 +0,0 @@
--
-- Title: Upgrade to V3.2 - Remove AVM Issuer
-- Database: PostgreSQL
-- Since: V3.2 schema 2008
-- Author: janv
--
-- remove AVM node issuer - replace with sequence
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
-- update sequence, if needed
SELECT SETVAL('hibernate_sequence', GREATEST((MAX(id)+1), NEXTVAL('hibernate_sequence'))) FROM avm_nodes;
insert into avm_nodes (id, class_type, vers, version_id, guid, creator, owner, lastModifier, createDate, modDate, accessDate, is_root, store_new_id, acl_id, deletedType, layer_id, indirection, indirection_version, primary_indirection, opacity, content_url, mime_type, encoding, length)
select
(select max(id)+1 from avm_nodes),
class_type, vers, version_id, guid, creator, owner, lastModifier, createDate, modDate, accessDate, is_root, store_new_id, acl_id, deletedType, layer_id, indirection, indirection_version, primary_indirection, opacity, content_url, mime_type, encoding, length
from avm_nodes where id = 0;
update avm_aspects set node_id = (select max(id) from avm_nodes) where node_id = 0;
update avm_child_entries set parent_id = (select max(id) from avm_nodes) where parent_id = 0;
update avm_child_entries set child_id = (select max(id) from avm_nodes) where child_id = 0;
update avm_history_links set ancestor = (select max(id) from avm_nodes) where ancestor = 0;
update avm_history_links set descendent = (select max(id) from avm_nodes) where descendent = 0;
update avm_merge_links set mfrom = (select max(id) from avm_nodes) where mfrom = 0;
update avm_merge_links set mto = (select max(id) from avm_nodes) where mto = 0;
update avm_node_properties set node_id = (select max(id) from avm_nodes) where node_id = 0;
update avm_stores set current_root_id = (select max(id) from avm_nodes) where current_root_id = 0;
update avm_version_roots set root_id = (select max(id) from avm_nodes) where root_id = 0;
delete from avm_nodes where id = 0;
-- drop issuer table
DROP TABLE avm_issuer_ids;
--
-- Record script finish
--
DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.2-Remove-AVM-Issuer';
INSERT INTO alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES
(
'patch.db-V3.2-Remove-AVM-Issuer', 'Manually executed script upgrade V3.2 to remove AVM Issuer',
0, 2007, -1, 2008, null, 'UNKOWN', TRUE, TRUE, 'Script completed'
);

View File

@@ -1,23 +0,0 @@
--
-- Title: Upgrade to V3.4 - Create AVM sequences
-- Database: Generic
-- Since: V3.4 schema 4105
-- Author: unknown
--
-- creates sequences for AVM tables
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
--
-- Record script finish
--
DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.3-Fix-AVM-Seqs';
INSERT INTO alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES
(
'patch.db-V3.3-Fix-AVM-Seqs', 'Manually executed script upgrade V3.3 to create AVM sequences',
0, 4104, -1, 4105, null, 'UNKOWN', ${TRUE}, ${TRUE}, 'Script completed'
);

View File

@@ -1,33 +0,0 @@
--
-- Title: Upgrade to V3.4 - Create AVM sequences
-- Database: PostgreSQL
-- Since: V3.4 schema 4105
-- Author: unknown
--
-- creates sequences for AVM tables
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
--ASSIGN:hibernate_seq_next_value=value
SELECT NEXTVAL('hibernate_sequence') AS value;
CREATE SEQUENCE avm_stores_seq START WITH ${hibernate_seq_next_value} INCREMENT BY 1; -- (optional)
CREATE SEQUENCE avm_store_properties_seq START WITH ${hibernate_seq_next_value} INCREMENT BY 1; -- (optional)
CREATE SEQUENCE avm_nodes_seq START WITH ${hibernate_seq_next_value} INCREMENT BY 1; -- (optional)
CREATE SEQUENCE avm_version_roots_seq START WITH ${hibernate_seq_next_value} INCREMENT BY 1; -- (optional)
--
-- Record script finish
--
DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.3-Fix-AVM-Seqs';
INSERT INTO alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES
(
'patch.db-V3.3-Fix-AVM-Seqs', 'Manually executed script upgrade V3.3 to create AVM sequences',
0, 4104, -1, 4105, null, 'UNKOWN', ${TRUE}, ${TRUE}, 'Script completed'
);

View File

@@ -1,61 +0,0 @@
--
-- Title: Upgrade to V3.4 - AVM rename duplicates (if any)
-- Database: Generic
-- Since: V3.4 schema 4201
-- Author: janv
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
CREATE table avm_tmp_child_entries AS
SELECT
ce.parent_id, ce.name, ce.child_id
FROM
avm_child_entries ce,
(
SELECT
ce2.parent_id, LOWER(ce2.name) as lname, MAX(ce2.child_id) as max_child_id
FROM
avm_child_entries ce2
GROUP BY
ce2.parent_id, LOWER(ce2.name)
HAVING
COUNT(*) > 1
) entities
WHERE
ce.parent_id = entities.parent_id AND
LOWER(ce.name) = entities.lname AND
ce.child_id != entities.max_child_id;
UPDATE avm_child_entries ce
SET name = ce.name || '-renamed.duplicate.mark-' || ce.child_id || '.temp'
WHERE EXISTS
(SELECT
1
FROM
avm_tmp_child_entries tmp
WHERE
ce.parent_id = tmp.parent_id AND
ce.name = tmp.name AND
ce.child_id = tmp.child_id);
--ASSIGN:update_count=value
SELECT
COUNT(*) as value
FROM
avm_tmp_child_entries;
DROP TABLE avm_tmp_child_entries;
--
-- Record script finish
--
DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.4-AVM-rename-dupes';
INSERT INTO alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES
(
'patch.db-V3.4-AVM-rename-dupes', 'Manually executed script upgrade V3.4',
0, 4200, -1, 4201, null, 'UNKNOWN', ${TRUE}, ${TRUE}, 'Script completed: rows updated = ${update_count}'
);

View File

@@ -1,51 +0,0 @@
--
-- Title: Removing Link Validation related metadata
-- Database: Generic
-- Since: V3.4
-- Author: Dmitry Velichkevich
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
-- ALF-5185: WCM: upgrade / re-index can fail on 3.4 if link validation (now removed) was previously being used
--
-- Removing Link Validation Reports
--
DELETE
FROM
avm_store_properties
WHERE
qname_id in (
SELECT
id
FROM
alf_qname
WHERE
local_name = '.link.validation.report'
);
--
-- Removing Link Validation QName
--
DELETE
FROM
alf_qname
WHERE
local_name = '.link.validation.report';
--
-- Record script finish
--
DELETE
FROM
alf_applied_patch
WHERE
id = 'patch.db-V3.4-RemovingLinkValidationMetadata';
INSERT INTO
alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES (
'patch.db-V3.4-RemovingLinkValidationMetadata', 'Link Validation reports metadata removed V3.4',
0, 4113, -1, 4114, null, 'UNKOWN', ${TRUE}, ${TRUE}, 'Script completed'
);

View File

@@ -1,50 +0,0 @@
--
-- Title: Upgrade to V3.4 - AVM rename duplicates (if any)
-- Database: MySQL
-- Since: V3.4 schema 4209
-- Author: dward
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
create table t_avm_child_entries (
parent_id bigint not null,
lc_name varchar(160) not null,
name varchar(160) not null,
child_id bigint not null,
primary key (parent_id, lc_name)
) ENGINE=InnoDB;
--FOREACH avm_child_entries.child_id system.upgrade.t_avm_child_entries.batchsize
INSERT INTO t_avm_child_entries (parent_id, lc_name, name, child_id)
SELECT parent_id, LOWER(name), name, child_id
FROM avm_child_entries
WHERE child_id >= ${LOWERBOUND} AND child_id <= ${UPPERBOUND};
DROP TABLE avm_child_entries;
ALTER TABLE t_avm_child_entries RENAME TO avm_child_entries;
alter table avm_child_entries
add index fk_avm_ce_child (child_id),
add constraint fk_avm_ce_child
foreign key (child_id)
references avm_nodes (id);
alter table avm_child_entries
add index fk_avm_ce_parent (parent_id),
add constraint fk_avm_ce_parent
foreign key (parent_id)
references avm_nodes (id);
CREATE INDEX idx_avm_ce_lc_name ON avm_child_entries (lc_name, parent_id);
--
-- Record script finish
--
DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.4-AVM-index-child-entries-lower';
INSERT INTO alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES
(
'patch.db-V3.4-AVM-index-child-entries-lower', 'Manually executed script upgrade V3.4',
0, 6002, -1, 6003, null, 'UNKNOWN', ${TRUE}, ${TRUE}, 'Script completed'
);

View File

@@ -1,51 +0,0 @@
--
-- Title: Upgrade to V3.4 - AVM rename duplicates (if any)
-- Database: PostgreSQL
-- Since: V3.4 schema 4209
-- Author: dward
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
create table t_avm_child_entries (
parent_id INT8 not null,
lc_name varchar(160) not null,
name varchar(160) not null,
child_id INT8 not null,
primary key (parent_id, lc_name)
);
--FOREACH avm_child_entries.child_id system.upgrade.t_avm_child_entries.batchsize
INSERT INTO t_avm_child_entries (parent_id, lc_name, name, child_id)
SELECT parent_id, LOWER(name), name, child_id
FROM avm_child_entries
WHERE child_id >= ${LOWERBOUND} AND child_id <= ${UPPERBOUND};
DROP TABLE avm_child_entries;
ALTER TABLE t_avm_child_entries RENAME TO avm_child_entries;
alter table avm_child_entries
add constraint fk_avm_ce_child
foreign key (child_id)
references avm_nodes (id);
create index fk_avm_ce_child on avm_child_entries(child_id);
alter table avm_child_entries
add constraint fk_avm_ce_parent
foreign key (parent_id)
references avm_nodes (id);
create index fk_avm_ce_parent on avm_child_entries(parent_id);
CREATE INDEX idx_avm_ce_lc_name ON avm_child_entries (lc_name, parent_id);
--
-- Record script finish
--
DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.4-AVM-index-child-entries-lower';
INSERT INTO alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES
(
'patch.db-V3.4-AVM-index-child-entries-lower', 'Manually executed script upgrade V3.4',
0, 6002, -1, 6003, null, 'UNKNOWN', ${TRUE}, ${TRUE}, 'Script completed'
);

View File

@@ -1,24 +0,0 @@
--
-- Title: DROP Indexes
-- Database: Generic
-- Since: V4.1 Schema 6030
-- Author: Alex Mukha
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
-- MNT-9275: When upgrading on Oracle RAC from version 3.2.2 to version 3.3 or higher, values returned by sequences are not ordered.
-- Used only for Oracle
--
-- Record script finish
--
DELETE FROM alf_applied_patch WHERE id = 'patch.db-V4.1-fix-AVM-seqs-order';
INSERT INTO alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES
(
'patch.db-V4.1-fix-AVM-seqs-order', 'Manually executed script to set ORDER bit for sequences',
0, 6030, -1, 6031, null, 'UNKNOWN', ${TRUE}, ${TRUE}, 'Script completed'
);

View File

@@ -1,26 +0,0 @@
--
-- Title: DROP unused IDX_AVM_VR_REVUQ index
-- Database: InnoDB
-- Since: V4.2 Schema 6031
-- Author: Alex Mukha
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
-- ALF-19487 : ORACLE: AVM: Schema difference is present after upgrade from 3.4.13/4.0.2/4.1.5
DROP INDEX idx_avm_vr_revuq ON avm_version_roots;
DROP INDEX version_id ON avm_version_roots;
ALTER TABLE avm_version_roots ADD CONSTRAINT UNIQUE INDEX idx_avm_vr_uq (avm_store_id, version_id);
--
-- Record script finish
--
DELETE FROM alf_applied_patch WHERE id = 'patch.db-V4.2-drop-AVM-index';
INSERT INTO alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES
(
'patch.db-V4.2-drop-AVM-index', 'Manually executed script to drop unnecessary index',
0, 6031, -1, 6032, null, 'UNKNOWN', ${TRUE}, ${TRUE}, 'Script completed'
);

View File

@@ -1,27 +0,0 @@
--
-- Title: DROP unused IDX_AVM_VR_REVUQ index
-- Database: PostgreSQL
-- Since: V4.2 Schema 6031
-- Author: Alex Mukha
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
-- ALF-19487 : ORACLE: AVM: Schema difference is present after upgrade from 3.4.13/4.0.2/4.1.5
DROP INDEX idx_avm_vr_revuq;
ALTER TABLE avm_version_roots DROP CONSTRAINT avm_version_roots_version_id_avm_store_id_key; --(optional)
ALTER TABLE avm_version_roots DROP CONSTRAINT avm_version_roots_version_id_key; --(optional)
ALTER TABLE avm_version_roots ADD CONSTRAINT idx_avm_vr_uq UNIQUE (avm_store_id, version_id);
--
-- Record script finish
--
DELETE FROM alf_applied_patch WHERE id = 'patch.db-V4.2-drop-AVM-index';
INSERT INTO alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES
(
'patch.db-V4.2-drop-AVM-index', 'Manually executed script to drop unnecessary index',
0, 6031, -1, 6032, null, 'UNKNOWN', ${TRUE}, ${TRUE}, 'Script completed'
);

View File

@@ -1,40 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
<!-- Bean definition to support synchronous indexing of the staging area -->
<!-- By default, indexing of the staging area is asynchronous -->
<bean id="avmSnapShotTriggeredIndexingMethodInterceptor" class="org.alfresco.repo.search.AVMSnapShotTriggeredIndexingMethodInterceptor">
<property name="avmService">
<ref bean="avmService" />
</property>
<property name="indexerAndSearcher">
<ref bean="avmLuceneIndexerAndSearcherFactory" />
</property>
<!-- Disable or enable indexing -->
<property name="enableIndexing">
<value>true</value>
</property>
<!-- the defaukt index mode if none of the patterns below match -->
<property name="defaultMode">
<value>SYNCHRONOUS</value>
</property>
<!-- Indexing patterns: evaluated in order; if none match, the defaultMode is used -->
<!-- Entries are of the form [SYNCHRONOUS | ASYNCHRONOUS |UNINDEXED]:[TYPE | NAME]:regexp -->
<property name="indexingDefinitions">
<list>
<value>ASYNCHRONOUS:TYPE:STAGING</value>
<value>UNINDEXED:TYPE:STAGING_PREVIEW</value>
<value>UNINDEXED:TYPE:AUTHOR</value>
<value>UNINDEXED:TYPE:AUTHOR_PREVIEW</value>
<value>UNINDEXED:TYPE:WORKFLOW</value>
<value>UNINDEXED:TYPE:WORKFLOW_PREVIEW</value>
<value>UNINDEXED:TYPE:AUTHOR_WORKFLOW</value>
<value>UNINDEXED:TYPE:AUTHOR_WORKFLOW_PREVIEW</value>
<value>ASYNCHRONOUS:NAME:avmAsynchronousTest</value>
<value>SYNCHRONOUS:NAME:.*</value>
</list>
</property>
</bean>
</beans>

View File

@@ -1,156 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<!--
Sample configuration of a XmlMetadataExtracter in use within the WCM environment.
This show how XML metadata extraction can be set up to extract metadata from different
formats of XML. It also shows how metadata can be extracted in WCM projects.
Since: 2.1
Author: Derek Hulley
-->
<beans>
<!--
In order to limit the number of extractors active for Web Content Management, a separate registry
must be created for the extractors.
-->
<bean id="avmMetadataExtracterRegistry" class="org.alfresco.repo.content.metadata.MetadataExtracterRegistry" />
<!--
Configure the AVM services to broadcast the content update notifications.
-->
<bean id="avmNodeService" class="org.alfresco.repo.avm.AVMNodeService" init-method="init">
<property name="dictionaryService">
<ref bean="dictionaryService"/>
</property>
<property name="avmService">
<ref bean="avmLockingAwareService"/>
</property>
<property name="policyComponent">
<ref bean="policyComponent"/>
</property>
<property name="tenantService">
<ref bean="tenantService"/>
</property>
<property name="invokePolicies">
<value>true</value>
</property>
</bean>
<bean id="avmMetadataExtracter" class="org.alfresco.repo.avm.AvmMetadataExtracter" init-method="init">
<property name="policyComponent">
<ref bean="policyComponent"/>
</property>
<property name="extracterAction">
<bean class="org.alfresco.repo.action.executer.ContentMetadataExtracter" >
<property name="dictionaryService">
<ref bean="dictionaryService"/>
</property>
<property name="nodeService">
<ref bean="avmNodeService" />
</property>
<property name="contentService">
<ref bean="contentService" />
</property>
<property name="metadataExtracterRegistry">
<ref bean="avmMetadataExtracterRegistry" />
</property>
<property name="carryAspectProperties">
<value>true</value>
</property>
</bean>
</property>
</bean>
<!--
Configure an extractor that targets Alfresco Model XML files.
Although this inherits from the base extracter bean, the use of the 'init' method
means that it isn't automatically registered.
-->
<bean id="extracter.xml.sample.AlfrescoModelMetadataExtracter"
class="org.alfresco.repo.content.metadata.xml.XPathMetadataExtracter"
parent="baseMetadataExtracter"
init-method="init" >
<property name="mappingProperties">
<!--
The properties can also be specified using a properties file on the classpath, e.g.:
<bean class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location">
<value>classpath:alfresco/extension/xml-metadata/AlfrescoModel-xpath-mappings.properties</value>
</property>
</bean>
-->
<bean class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="namespace.prefix.cm">http://www.alfresco.org/model/content/1.0</prop>
<prop key="author">cm:author</prop>
<prop key="title">cm:title</prop>
<prop key="description">cm:description</prop>
</props>
</property>
</bean>
</property>
<property name="xpathMappingProperties">
<bean class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="namespace.prefix.fm">http://www.alfresco.org/model/forum/1.0</prop>
<prop key="author">/model/author/text()</prop>
<prop key="title">/model/@name</prop>
<prop key="description">/model/description/text()</prop>
<prop key="version">/model/version/text()</prop>
</props>
</property>
</bean>
</property>
</bean>
<!--
This selector examines the XML documents, executing the given XPath statements until a
match is made.
-->
<bean
id="extracter.xml.sample.selector.XPathSelector"
class="org.alfresco.repo.content.selector.XPathContentWorkerSelector"
init-method="init">
<property name="workers">
<map>
<entry key="/my:test">
<null />
</entry>
<entry key="/model">
<ref bean="extracter.xml.sample.AlfrescoModelMetadataExtracter" />
</entry>
</map>
</property>
</bean>
<!--
This is the face of the XML metadata extraction. If passes the XML document to each of
the selectors, until one of them gives back a MetadataExtracter (via the selectors),
which is then used as normal to extract the values.
Note the use of the AVM-specific registry.
The overwrite policy of the embedded extracters has no effect. It is only this extractor's
policy that is used.
-->
<bean
id="extracter.xml.sample.XMLMetadataExtracter"
class="org.alfresco.repo.content.metadata.xml.XmlMetadataExtracter"
parent="baseMetadataExtracter">
<property name="registry">
<ref bean="avmMetadataExtracterRegistry" />
</property>
<property name="overwritePolicy">
<value>EAGER</value>
</property>
<property name="selectors">
<list>
<ref bean="extracter.xml.sample.selector.XPathSelector" />
</list>
</property>
</bean>
</beans>

View File

@@ -111,6 +111,7 @@ Inbound settings from iBatis
<!-- Patch -->
<typeAlias alias="SizeCurrentParams" type="org.alfresco.repo.domain.patch.ibatis.SizeCurrentParams"/>
<typeAlias alias="IdListOfIdsParam" type="org.alfresco.repo.domain.patch.ibatis.IdListOfIdsParam"/>
<!-- Permissions -->
@@ -157,20 +158,6 @@ Inbound settings from iBatis
<typeAlias alias="UsageDelta" type="org.alfresco.repo.domain.usage.UsageDeltaEntity"/>
<!-- AVM -->
<typeAlias alias="AVMStore" type="org.alfresco.repo.domain.avm.AVMStoreEntity"/>
<typeAlias alias="AVMNode" type="org.alfresco.repo.domain.avm.AVMNodeEntity"/>
<typeAlias alias="AVMNodeAspect" type="org.alfresco.repo.domain.avm.AVMAspectEntity"/>
<typeAlias alias="AVMChildEntry" type="org.alfresco.repo.domain.avm.AVMChildEntryEntity"/>
<typeAlias alias="AVMVersionRoot" type="org.alfresco.repo.domain.avm.AVMVersionRootEntity"/>
<typeAlias alias="AVMHistoryLink" type="org.alfresco.repo.domain.avm.AVMHistoryLinkEntity"/>
<typeAlias alias="AVMMergeLink" type="org.alfresco.repo.domain.avm.AVMMergeLinkEntity"/>
<typeAlias alias="AVMVersionLayeredNodeEntry" type="org.alfresco.repo.domain.avm.AVMVersionLayeredNodeEntryEntity"/>
<typeAlias alias="AVMStoreProperty" type="org.alfresco.repo.domain.avm.AVMStorePropertyEntity"/>
<typeAlias alias="AVMNodeProperty" type="org.alfresco.repo.domain.avm.AVMNodePropertyEntity"/>
<typeAlias alias="IdListOfIdsParam" type="org.alfresco.repo.domain.patch.ibatis.IdListOfIdsParam"/>
<!-- Canned Queries Test -->
<!-- Subscriptions -->

View File

@@ -35,12 +35,6 @@
</property>
</bean>
<bean id="avmSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="repoSqlSessionFactory"/>
</bean>
<bean id="repoSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="repoSqlSessionFactory"/>
</bean>

View File

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="alfresco.avm.insert">
<insert id="insert_AVMStore" parameterType="AVMStore" useGeneratedKeys="true" keyProperty="id">
<include refid="alfresco.avm.insert_AVMStore_AutoIncrement"/>
</insert>
<insert id="insert_AVMStoreProperty" parameterMap="alfresco.avm.parameter_StorePropertyPatternMap" useGeneratedKeys="true" keyProperty="id">
<include refid="alfresco.avm.insert_AVMStoreProperty_AutoIncrement"/>
</insert>
<insert id="insert_AVMNode" parameterType="AVMNode" useGeneratedKeys="true" keyProperty="id">
<include refid="alfresco.avm.insert_AVMNode_AutoIncrement"/>
</insert>
<insert id="insert_AVMVersionRoot" parameterType="AVMVersionRoot" useGeneratedKeys="true" keyProperty="id">
<include refid="alfresco.avm.insert_AVMVersionRoot_AutoIncrement"/>
</insert>
</mapper>

View File

@@ -1,47 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="alfresco.avm.insert">
<insert id="insert_AVMStore" parameterType="AVMStore">
<selectKey resultType="long" keyProperty="id" order="BEFORE" >
select nextVal('avm_stores_seq')
</selectKey>
<include refid="alfresco.avm.insert_AVMStore_Sequence"/>
</insert>
<insert id="insert_AVMStoreProperty" parameterMap="alfresco.avm.parameter_IdStorePropertyPatternMap">
<selectKey resultType="long" keyProperty="id" order="BEFORE" >
select nextVal('avm_store_properties_seq')
</selectKey>
<include refid="alfresco.avm.insert_AVMStoreProperty_Sequence"/>
</insert>
<insert id="insert_AVMNode" parameterType="AVMNode">
<selectKey resultType="long" keyProperty="id" order="BEFORE" >
select nextVal('avm_nodes_seq')
</selectKey>
<include refid="alfresco.avm.insert_AVMNode_Sequence"/>
</insert>
<insert id="insert_AVMVersionRoot" parameterType="AVMVersionRoot">
<selectKey resultType="long" keyProperty="id" order="BEFORE" >
select nextVal('avm_version_roots_seq')
</selectKey>
<include refid="alfresco.avm.insert_AVMVersionRoot_Sequence"/>
</insert>
</mapper>

View File

@@ -9,8 +9,6 @@
<value>{http://www.jcp.org/jcr/nt/1.0}*</value>
<value>{http://www.jcp.org/jcr/mix/1.0}*</value>
<value>{http://www.jcp.org/jcr/sv/1.0}*</value>
<value>{http://www.alfresco.org/model/wcmappmodel/1.0}*</value>
<value>{http://www.alfresco.org/model/wcmmodel/1.0}*</value>
</list>
</property>
</bean>

View File

@@ -464,16 +464,6 @@
<value>3.3</value>
</property>
</bean>
<bean id="patch.AVMGuidPatch" class="org.alfresco.repo.admin.patch.impl.NoLongerSupportedPatch" parent="basePatch">
<property name="id"><value>patch.AVMGuidPatch</value></property>
<property name="description"><value>patch.AVMGuidPatch.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>51</value></property>
<property name="targetSchema"><value>52</value></property>
<property name="lastSupportedVersion" >
<value>3.3</value>
</property>
</bean>
<bean id="patch.webscripts" class="org.alfresco.repo.admin.patch.impl.NoLongerSupportedPatch" parent="basePatch" >
<property name="id"><value>patch.webscripts</value></property>
<property name="description"><value>patch.webscripts.description</value></property>
@@ -494,16 +484,6 @@
<value>3.3</value>
</property>
</bean>
<bean id="patch.AVMLayeredSnapshot" class="org.alfresco.repo.admin.patch.impl.NoLongerSupportedPatch" parent="basePatch">
<property name="id"><value>patch.AVMLayeredSnapshot</value></property>
<property name="description"><value>patch.AVMLayeredSnapshot.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>55</value></property>
<property name="targetSchema"><value>56</value></property>
<property name="lastSupportedVersion" >
<value>3.3</value>
</property>
</bean>
<bean id="patch.groupMembersAsIdentifiers" class="org.alfresco.repo.admin.patch.impl.NoLongerSupportedPatch" parent="basePatch" >
<property name="id"><value>patch.groupMembersAsIdentifiers</value></property>
<property name="description"><value>patch.groupMembersAsIdentifiers.description</value></property>
@@ -634,16 +614,6 @@
<value>3.4.x</value>
</property>
</bean>
<bean id="patch.db-V2.1-RemoveWcmSubmittedAspect" class="org.alfresco.repo.admin.patch.impl.NoLongerSupportedPatch" parent="basePatch">
<property name="id"><value>patch.db-V2.1-RemoveWcmSubmittedAspect</value></property>
<property name="description"><value>patch.schemaUpgradeScript.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>103</value></property>
<property name="targetSchema"><value>104</value></property>
<property name="lastSupportedVersion" >
<value>3.4.x</value>
</property>
</bean>
<bean id="patch.webscripts3" class="org.alfresco.repo.admin.patch.impl.NoLongerSupportedPatch" parent="basePatch" >
<property name="id"><value>patch.webscripts3</value></property>
<property name="description"><value>patch.webscripts3.description</value></property>
@@ -664,26 +634,6 @@
<value>3.4.x</value>
</property>
</bean>
<bean id="patch.avmStoreAsIdentifier" class="org.alfresco.repo.admin.patch.impl.NoLongerSupportedPatch" parent="basePatch" >
<property name="id"><value>patch.avmStoreAsIdentifier</value></property>
<property name="description"><value>patch.avmStoreAsIdentifier.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>109</value></property>
<property name="targetSchema"><value>110</value></property>
<property name="lastSupportedVersion" >
<value>3.4.x</value>
</property>
</bean>
<bean id="patch.avmFormPropertyIdentifier" class="org.alfresco.repo.admin.patch.impl.NoLongerSupportedPatch" parent="basePatch" >
<property name="id"><value>patch.avmFormPropertyIdentifier</value></property>
<property name="description"><value>patch.avmFormPropertyIdentifier.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>111</value></property>
<property name="targetSchema"><value>112</value></property>
<property name="lastSupportedVersion" >
<value>3.4.x</value>
</property>
</bean>
<bean id="patch.formsFolder" class="org.alfresco.repo.admin.patch.impl.NoLongerSupportedPatch" parent="basePatch" >
<property name="id"><value>patch.formsFolder</value></property>
<property name="description"><value>patch.formsFolder.description</value></property>
@@ -776,22 +726,6 @@
</property>
</bean>
<bean id="patch.updateAvmPermissionData" class="org.alfresco.repo.admin.patch.impl.AVMPermissionDataPatch" parent="basePatch" >
<property name="id"><value>patch.updateAvmPermissionData</value></property>
<property name="description"><value>patch.updateAvmPermissionData.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>119</value></property>
<property name="targetSchema"><value>120</value></property>
<property name="dependsOn" >
<list>
<ref bean="patch.db-V2.2-ACL" />
</list>
</property>
<property name="aclCrudDAO">
<ref bean="aclCrudDAO" />
</property>
</bean>
<bean id="patch.db-V2.2-CleanNodeStatuses" class="org.alfresco.repo.admin.patch.impl.SchemaUpgradeScriptPatch" parent="basePatch">
<property name="id"><value>patch.db-V2.2-CleanNodeStatuses</value></property>
<property name="description"><value>patch.schemaUpgradeScript.description</value></property>
@@ -874,25 +808,6 @@
</property>
</bean>
<bean id="patch.avmWebProjectInheritPermissions02" class="org.alfresco.repo.admin.patch.impl.AVMWebProjectInheritPermissionsPatch" parent="basePatch">
<property name="id"><value>patch.avmWebProjectInheritPermissions02</value></property>
<property name="description"><value>patch.avmWebProjectInheritPermissions.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>122</value></property>
<property name="targetSchema"><value>123</value></property>
<property name="dependsOn" >
<list>
<ref bean="patch.updateDmPermissions" />
</list>
</property>
<property name="spacesImporterBootstrap">
<ref bean="spacesBootstrap" />
</property>
<property name="permissionService">
<ref bean="permissionService"/>
</property>
</bean>
<bean id="patch.updateDmPermissions" class="org.alfresco.repo.admin.patch.impl.DmPermissionsPatch" parent="basePatch" >
<property name="id"><value>patch.updateDmPermissions</value></property>
<property name="description"><value>patch.updateDmPermissions.description</value></property>
@@ -1120,242 +1035,6 @@
</property>
</bean>
<bean id="patch.redeploySubmitProcess4" class="org.alfresco.repo.admin.patch.impl.GenericWorkflowPatch" parent="baseWorkflowPatch" >
<property name="id"><value>patch.redeploySubmitProcess4</value></property>
<property name="description"><value>patch.redeploySubmitProcess.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>1000</value></property>
<property name="targetSchema"><value>1001</value></property>
<property name="dependsOn" >
<list>
<ref bean="patch.updateDmPermissions" />
<ref bean="patch.updateDmPermissions" />
</list>
</property>
<property name="workflowDefinitions">
<list>
<props>
<!-- WCM workflow definition -->
<prop key="engineId">jbpm</prop>
<prop key="location">alfresco/workflow/submit_processdefinition.xml</prop>
<prop key="mimetype">text/xml</prop>
</props>
</list>
</property>
</bean>
<bean id="patch.redeploySubmitProcess5" class="org.alfresco.repo.admin.patch.impl.GenericWorkflowPatch" parent="baseWorkflowPatch" >
<property name="id"><value>patch.redeploySubmitProcess5</value></property>
<property name="description"><value>patch.redeploySubmitProcess.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>2000</value></property>
<property name="targetSchema"><value>2001</value></property>
<property name="dependsOn" >
<list>
<ref bean="patch.updateDmPermissions" />
</list>
</property>
<property name="workflowDefinitions">
<list>
<props>
<!-- WCM workflow definition -->
<prop key="engineId">jbpm</prop>
<prop key="location">alfresco/workflow/submit_processdefinition.xml</prop>
<prop key="mimetype">text/xml</prop>
</props>
</list>
</property>
</bean>
<bean id="patch.deploySubmitDirectProcess" class="org.alfresco.repo.admin.patch.impl.GenericWorkflowPatch" parent="baseWorkflowPatch" >
<property name="id"><value>patch.deploySubmitDirectProcess</value></property>
<property name="description"><value>patch.deploySubmitDirectProcess.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>2000</value></property>
<property name="targetSchema"><value>2001</value></property>
<property name="dependsOn" >
<list>
<ref bean="patch.updateDmPermissions" />
</list>
</property>
<property name="workflowDefinitions">
<list>
<props>
<!-- WCM workflow definition -->
<prop key="engineId">jbpm</prop>
<prop key="location">alfresco/workflow/submitdirect_processdefinition.xml</prop>
<prop key="mimetype">text/xml</prop>
</props>
</list>
</property>
</bean>
<!-- Sparta: remove WCM/AVM
<bean id="patch.resetWCMToGroupBasedPermissionsPatch" class="org.alfresco.repo.admin.patch.impl.ResetWCMToGroupBasedPermissionsPatch" parent="basePatch" >
<property name="id"><value>patch.resetWCMToGroupBasedPermissionsPatch</value></property>
<property name="description"><value>patch.resetWCMToGroupBasedPermissionsPatch.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>2001</value></property>
<property name="targetSchema"><value>2002</value></property>
<property name="dependsOn">
<list>
<ref bean="patch.updateAvmPermissionData" />
<ref bean="patch.zonedAuthorities" />
</list>
</property>
<property name="alternatives" >
<list>
<ref bean="patch.moveWCMToGroupBasedPermissionsPatch" />
</list>
</property>
<property name="avmService">
<ref bean="avmService" />
</property>
<property name="permissionService">
<ref bean="permissionService" />
</property>
<property name="personService">
<ref bean="personService" />
</property>
<property name="authorityService">
<ref bean="authorityService" />
</property>
<property name="avmStoreDAO">
<ref bean="newAvmStoreDAO" />
</property>
<property name="avmNodeLinksDAO">
<ref bean="newAvmNodeLinksDAO" />
</property>
<property name="aclCrudDAO">
<ref bean="aclCrudDAO" />
</property>
<property name="patchDAO">
<ref bean="patchDAO" />
</property>
<property name="replaceAllWith">
<value>ContentManager</value>
</property>
</bean>
-->
<!-- note: does not need to be run if patch.wcmPostPermissionSnapshotPatch2 already applied -->
<!-- Sparta: remove WCM/AVM
<bean id="patch.wcmPostPermissionSnapshotPatch3" class="org.alfresco.repo.admin.patch.impl.WCMPostPermissionSnapshotPatch" parent="basePatch" >
<property name="id"><value>patch.wcmPostPermissionSnapshotPatch3</value></property>
<property name="description"><value>patch.wcmPostPermissionSnapshotPatch.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>2001</value></property>
<property name="targetSchema"><value>2002</value></property>
<property name="dependsOn" >
<list>
<ref bean="patch.updateDmPermissions" />
<ref bean="patch.resetWCMToGroupBasedPermissionsPatch" />
</list>
</property>
<property name="alternatives" >
<list>
<ref bean="patch.wcmPostPermissionSnapshotPatch2" />
</list>
</property>
<property name="avmService">
<ref bean="AVMService" />
</property>
<property name="avmSnapShotTriggeredIndexingMethodInterceptor">
<ref bean="avmSnapShotTriggeredIndexingMethodInterceptor" />
</property>
<property name="patchDAO">
<ref bean="patchDAO"/>
</property>
</bean>
-->
<!-- note: NOOP - superceded by patch.resetWCMToGroupBasedPermissionsPatch -->
<!-- Sparta: remove WCM/AVM
<bean id="patch.moveWCMToGroupBasedPermissionsPatch" class="org.alfresco.repo.admin.patch.impl.NoOpPatch" parent="basePatch" >
<property name="id"><value>patch.moveWCMToGroupBasedPermissionsPatch</value></property>
<property name="description"><value>patch.noOpPatch.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>2001</value></property>
<property name="targetSchema"><value>2002</value></property>
<property name="dependsOn" >
<list>
<ref bean="patch.resetWCMToGroupBasedPermissionsPatch" />
</list>
</property>
</bean>
-->
<!-- note: NOOP - superceded by patch.wcmPostPermissionSnapshotPatch3 -->
<!-- Sparta: remove WCM/AVM
<bean id="patch.wcmPostPermissionSnapshotPatch2" class="org.alfresco.repo.admin.patch.impl.NoOpPatch" parent="basePatch" >
<property name="id"><value>patch.wcmPostPermissionSnapshotPatch2</value></property>
<property name="description"><value>patch.noOpPatch.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>2001</value></property>
<property name="targetSchema"><value>2002</value></property>
<property name="dependsOn" >
<list>
<ref bean="patch.wcmPostPermissionSnapshotPatch3" />
</list>
</property>
</bean>
-->
<!-- Redeploy both direct and indirect submit processes for addition submit failure handling -->
<bean id="patch.redeploySubmitProcess6" class="org.alfresco.repo.admin.patch.impl.GenericWorkflowPatch" parent="baseWorkflowPatch" >
<property name="id"><value>patch.redeploySubmitProcess6</value></property>
<property name="description"><value>patch.redeploySubmitProcess.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>2002</value></property>
<property name="targetSchema"><value>2003</value></property>
<property name="dependsOn" >
<list>
<ref bean="patch.updateDmPermissions" />
</list>
</property>
<property name="workflowDefinitions">
<list>
<props>
<prop key="engineId">jbpm</prop>
<prop key="location">alfresco/workflow/submit_processdefinition.xml</prop>
<prop key="mimetype">text/xml</prop>
</props>
<props>
<prop key="engineId">jbpm</prop>
<prop key="location">alfresco/workflow/submitdirect_processdefinition.xml</prop>
<prop key="mimetype">text/xml</prop>
</props>
</list>
</property>
</bean>
<bean id="patch.redeploySubmitProcess7" class="org.alfresco.repo.admin.patch.impl.GenericWorkflowPatch" parent="baseWorkflowPatch" >
<property name="id"><value>patch.redeploySubmitProcess7</value></property>
<property name="description"><value>patch.redeploySubmitProcess.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>2003</value></property>
<property name="targetSchema"><value>2004</value></property>
<property name="dependsOn" >
<list>
<ref bean="patch.updateDmPermissions" />
</list>
</property>
<property name="workflowDefinitions">
<list>
<props>
<prop key="engineId">jbpm</prop>
<prop key="location">alfresco/workflow/submit_processdefinition.xml</prop>
<prop key="mimetype">text/xml</prop>
</props>
<props>
<prop key="engineId">jbpm</prop>
<prop key="location">alfresco/workflow/submitdirect_processdefinition.xml</prop>
<prop key="mimetype">text/xml</prop>
</props>
</list>
</property>
</bean>
<bean id="patch.db-V2.2-Person-3" class="org.alfresco.repo.admin.patch.impl.SchemaUpgradeScriptPatch" parent="basePatch">
<property name="id"><value>patch.db-V2.2-Person-3</value></property>
<property name="description"><value>patch.schemaUpgradeScript.description</value></property>
@@ -1408,17 +1087,6 @@
</property>
</bean>
<bean id="patch.db-V3.2-Remove-AVM-Issuer" class="org.alfresco.repo.admin.patch.impl.SchemaUpgradeScriptPatch" parent="basePatch">
<property name="id"><value>patch.db-V3.2-Remove-AVM-Issuer</value></property>
<property name="description"><value>patch.schemaUpgradeScript.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>2007</value></property>
<property name="targetSchema"><value>2008</value></property>
<property name="scriptUrl">
<value>classpath:alfresco/dbscripts/upgrade/3.2/${db.script.dialect}/remove-AVM-issuer.sql</value>
</property>
</bean>
<bean id="patch.mtShareExistingTenants" class="org.alfresco.repo.admin.patch.impl.MultiTShareExistingTenantsPatch" parent="basePatch">
<property name="id"><value>patch.mtShareExistingTenants</value></property>
<property name="description"><value>patch.mtShareExistingTenants.description</value></property>
@@ -1556,9 +1224,6 @@
<property name="authorityService">
<ref bean="authorityService" />
</property>
<property name="avmService">
<ref bean="avmService" />
</property>
<property name="siteService">
<ref bean="siteService" />
</property>
@@ -1575,17 +1240,6 @@
</property>
</bean>
<bean id="patch.db-V3.2-Modify-AVM-MimeType" class="org.alfresco.repo.admin.patch.impl.SchemaUpgradeScriptPatch" parent="basePatch">
<property name="id"><value>patch.db-V3.2-Modify-AVM-MimeType</value></property>
<property name="description"><value>patch.schemaUpgradeScript.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>2016</value></property>
<property name="targetSchema"><value>2017</value></property>
<property name="scriptUrl">
<value>classpath:alfresco/dbscripts/upgrade/3.2/${db.script.dialect}/modify-AVM-mimetype.sql</value>
</property>
</bean>
<bean id="patch.imapFolders" class="org.alfresco.repo.admin.patch.impl.ImapFoldersPatch" parent="basePatch" >
<property name="id"><value>patch.imapFolders</value></property>
<property name="description"><value>patch.imapFolders.description</value></property>
@@ -1992,17 +1646,6 @@
</property>
</bean>
<bean id="patch.db-V3.3-Fix-AVM-Seqs" class="org.alfresco.repo.admin.patch.impl.SchemaUpgradeScriptPatch" parent="basePatch">
<property name="id"><value>patch.db-V3.3-Fix-AVM-Seqs</value></property>
<property name="description"><value>patch.schemaUpgradeScript.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>4104</value></property>
<property name="targetSchema"><value>4105</value></property>
<property name="scriptUrl">
<value>classpath:alfresco/dbscripts/upgrade/3.3/${db.script.dialect}/fix-AVM-seqs.sql</value>
</property>
</bean>
<bean id="patch.db-V3.4-property-unique-ctx-value" class="org.alfresco.repo.admin.patch.impl.SchemaUpgradeScriptPatch" parent="basePatch">
<property name="id"><value>patch.db-V3.4-property-unique-ctx-value</value></property>
<property name="description"><value>patch.schemaUpgradeScript.description</value></property>
@@ -2090,26 +1733,6 @@
</list>
</property>
</bean>
<bean id="patch.migrateAttrAVMLocks" class="org.alfresco.repo.admin.patch.impl.MigrateAttrAVMLocksPatch" parent="basePatch">
<property name="id"><value>patch.migrateAttrAVMLocks</value></property>
<property name="description"><value>patch.migrateAttrAVMLocks.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>4106</value></property>
<property name="targetSchema"><value>4107</value></property>
<property name="applyToTenants"><value>false</value></property>
<property name="attributeService">
<ref bean="attributeService"/>
</property>
<property name="patchDAO">
<ref bean="patchDAO"/>
</property>
<property name="dependsOn" >
<list>
<ref bean="patch.db-V3.4-property-unique-ctx-value"/>
<ref bean="patch.db-V3.4-AVM-rename-dupes"/>
</list>
</property>
</bean>
<bean id="patch.migrateAttrPropBackedBeans" class="org.alfresco.repo.admin.patch.impl.MigrateAttrPropBackedBeanPatch" parent="basePatch">
<property name="id"><value>patch.migrateAttrPropBackedBeans</value></property>
<property name="description"><value>patch.migrateAttrPropBackedBeans.description</value></property>
@@ -2165,7 +1788,6 @@
<property name="dependsOn" >
<list>
<ref bean="patch.migrateAttrTenants"/>
<ref bean="patch.migrateAttrAVMLocks"/>
<ref bean="patch.migrateAttrPropBackedBeans"/>
<ref bean="patch.migrateAttrChainingURS"/>
</list>
@@ -2354,31 +1976,6 @@
</property>
</bean>
<!-- note: superceded by "patch.db-V3.4-AVM-rename-dupes" -->
<bean id="patch.eliminateDuplicates" class="org.alfresco.repo.admin.patch.impl.NoOpPatch" parent="basePatch" >
<property name="id" value="patch.eliminateDuplicates" />
<property name="description" value="patch.eliminateDuplicates.description" />
<property name="fixesFromSchema" value="0" />
<property name="fixesToSchema" value="4112" />
<property name="targetSchema" value="4113" />
<property name="alternatives" >
<list>
<ref bean="patch.db-V3.4-AVM-rename-dupes" />
</list>
</property>
</bean>
<bean id="patch.db-V3.4-RemovingLinkValidationMetadata" class="org.alfresco.repo.admin.patch.impl.SchemaUpgradeScriptPatch" parent="basePatch">
<property name="id" value="patch.db-V3.4-RemovingLinkValidationMetadata" />
<property name="description" value="patch.removingLinkValidationMetadata.description" />
<property name="fixesFromSchema" value="0" />
<property name="fixesToSchema" value="5001" />
<property name="targetSchema" value="5002" />
<property name="scriptUrl">
<value>classpath:alfresco/dbscripts/upgrade/3.4/${db.script.dialect}/link-validation-metadata-removing.sql</value>
</property>
</bean>
<bean id="patch.mtFixAdminExistingTenants" class="org.alfresco.repo.admin.patch.impl.MultiTFixAdminExistingTenantsPatch" parent="basePatch" >
<property name="id"><value>patch.mtFixAdminExistingTenants</value></property>
<property name="description"><value>patch.mtFixAdminExistingTenants.description</value></property>
@@ -2438,17 +2035,6 @@
</property>
</bean>
<bean id="patch.db-V3.4-AVM-rename-dupes" class="org.alfresco.repo.admin.patch.impl.SchemaUpgradeScriptPatch" parent="basePatch">
<property name="id"><value>patch.db-V3.4-AVM-rename-dupes</value></property>
<property name="description"><value>patch.schemaUpgradeScript.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>5005</value></property>
<property name="targetSchema"><value>5006</value></property>
<property name="scriptUrl">
<value>classpath:alfresco/dbscripts/upgrade/3.4/${db.script.dialect}/AVM-rename-dupes.sql</value>
</property>
</bean>
<bean id="patch.activitiesEmailTemplate" class="org.alfresco.repo.admin.patch.impl.GenericBootstrapPatch" parent="basePatch" >
<property name="id"><value>patch.activitiesEmailTemplate</value></property>
<property name="description"><value>patch.activitiesEmailTemplate.description</value></property>
@@ -2774,30 +2360,6 @@
</property>
</bean>
<!-- AVM Remote Store to ADM Remote Store migration patch -->
<bean id="patch.avmToAdmRemoteStore" class="org.alfresco.repo.admin.patch.impl.AVMToADMRemoteStorePatch" parent="basePatch">
<property name="id"><value>patch.avmToAdmRemoteStore</value></property>
<property name="description"><value>patch.avmToAdmRemoteStore.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>5011</value></property>
<property name="targetSchema"><value>5012</value></property>
<property name="requiresTransaction"><value>false</value></property>
<property name="fileFolderService" ref="fileFolderService" />
<property name="contentService" ref="contentService" />
<property name="siteService" ref="SiteService" />
<property name="ruleService" ref="RuleService" />
<property name="avmService" ref="AVMService" />
<property name="hiddenAspect" ref="hiddenAspect" />
<property name="avmStore"><value>sitestore</value></property>
<property name="avmRootPath"><value>/alfresco/site-data</value></property>
<property name="dependsOn" >
<list>
<ref bean="patch.migrateTenantsFromAttrsToTable" />
<ref bean="patch.migrateAttrTenants" />
</list>
</property>
</bean>
<!-- Fix data related to cm:copiedfrom aspect -->
<bean id="patch.copiedFromAspect" class="org.alfresco.repo.admin.patch.impl.CopiedFromAspectPatch" parent="basePatch">
<property name="id"><value>patch.copiedFromAspect</value></property>
@@ -3106,17 +2668,6 @@
</property>
</bean>
<bean id="patch.db-V3.4-AVM-index-child-entries-lower" class="org.alfresco.repo.admin.patch.impl.SchemaUpgradeScriptPatch" parent="basePatch">
<property name="id"><value>patch.db-V3.4-AVM-index-child-entries-lower</value></property>
<property name="description"><value>patch.avmIndexChildEntriesLower.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>6002</value></property>
<property name="targetSchema"><value>6003</value></property>
<property name="scriptUrl">
<value>classpath:alfresco/dbscripts/upgrade/3.4/${db.script.dialect}/AVM-index-child-entries-lower.sql</value>
</property>
</bean>
<bean id="patch.db-V4.0-Activiti-task-id-indexes" class="org.alfresco.repo.admin.patch.impl.SchemaUpgradeScriptPatch" parent="basePatch">
<property name="id" value="patch.db-V4.0-Activiti-task-id-indexes" />
<property name="description" value="patch.schemaUpgradeScript.description" />
@@ -3631,27 +3182,6 @@
</property>
</bean>
<bean id="patch.db-V4.1-fix-AVM-seqs-order" class="org.alfresco.repo.admin.patch.impl.SchemaUpgradeScriptPatch" parent="basePatch">
<property name="id" value="patch.db-V4.1-fix-AVM-seqs-order" />
<property name="description" value="patch.schemaUpgradeScript.description" />
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>6030</value></property>
<property name="targetSchema"><value>6031</value></property>
<property name="scriptUrl">
<value>classpath:alfresco/dbscripts/upgrade/4.1/${db.script.dialect}/fix-AVM-seqs-order.sql</value>
</property>
</bean>
<bean id="patch.db-V4.2-drop-AVM-index" class="org.alfresco.repo.admin.patch.impl.SchemaUpgradeScriptPatch" parent="basePatch">
<property name="id" value="patch.db-V4.2-drop-AVM-index" />
<property name="description" value="patch.schemaUpgradeScript.description" />
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>6031</value></property>
<property name="targetSchema"><value>6032</value></property>
<property name="scriptUrl">
<value>classpath:alfresco/dbscripts/upgrade/4.2/${db.script.dialect}/drop-AVM-index.sql</value>
</property>
</bean>
<bean id="patch.db-V4.1-ChildAssoc-OrderBy" class="org.alfresco.repo.admin.patch.impl.SchemaUpgradeScriptPatch" parent="basePatch">
<property name="id"><value>patch.db-V4.1-ChildAssoc-OrderBy</value></property>
<property name="description"><value>patch.schemaUpgradeScript.description</value></property>

View File

@@ -779,135 +779,6 @@
</property>
</bean>
<!-- The CrossRepositoryCopyService -->
<bean id="crossRepositoryCopyService" class="org.alfresco.repo.copy.CrossRepositoryCopyServiceImpl">
<property name="avmService">
<ref bean="avmLockingAwareService"/>
</property>
<property name="nodeService">
<ref bean="nodeService"/>
</property>
<property name="fileFolderService">
<ref bean="fileFolderService"/>
</property>
<property name="contentService">
<ref bean="contentService"/>
</property>
<property name="copyService">
<ref bean="copyService"/>
</property>
<property name="dictionaryService">
<ref bean="dictionaryService"/>
</property>
</bean>
<bean id="crossRepositoryCopyServiceWriteTxnAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice">
<ref bean="retryingWriteTxnAdvice"/>
</property>
<property name="mappedNames">
<list>
<value>copy</value>
</list>
</property>
</bean>
<bean id="CrossRepositoryCopyService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>org.alfresco.service.cmr.repository.CrossRepositoryCopyService</value>
</list>
</property>
<property name="targetName">
<value>crossRepositoryCopyService</value>
</property>
<property name="interceptorNames">
<list>
<value>crossRepositoryCopyServiceWriteTxnAdvisor</value>
<value>checkTxnAdvisor</value>
</list>
</property>
</bean>
<!-- The AVMLockingAwareService -->
<bean id="avmLockingAwareService" class="org.alfresco.repo.avm.AVMLockingAwareService">
<!-- Because of circular dependendencies, this bean's dependencies
are grabbed at bootstrap time.x -->
</bean>
<bean id="AVMLockingAwareService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>org.alfresco.service.cmr.avm.AVMService</value>
</list>
</property>
<property name="targetName">
<value>avmLockingAwareService</value>
</property>
<property name="interceptorNames">
<list>
<value>avmServiceWriteTxnAdvisor</value>
<value>avmServiceReadTxnAdvisor</value>
<value>checkTxnAdvisor</value>
<!-- Sparta: remove WCM/AVM
<value>avmSnapShotTriggeredIndexingMethodInterceptor</value>
-->
</list>
</property>
</bean>
<!-- deprecated (since 3.2) - refer to AVMLockingAwareService -->
<bean id="indexingAVMLockingAwareService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>org.alfresco.service.cmr.avm.AVMService</value>
</list>
</property>
<property name="targetName">
<value>avmLockingAwareService</value>
</property>
<property name="interceptorNames">
<list>
<value>avmSnapShotTriggeredIndexingMethodInterceptor</value>
</list>
</property>
</bean>
<!-- The AVMService -->
<bean id="avmService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>org.alfresco.service.cmr.avm.AVMService</value>
</property>
<property name="target">
<ref bean="avmServiceMT"/>
</property>
<property name="interceptorNames">
<list>
<value>checkTxnAdvisor</value>
</list>
</property>
</bean>
<bean id="avmServiceMT" class="org.alfresco.repo.avm.MultiTAVMService">
<property name="avmService">
<ref bean="avmServiceBase"/>
</property>
<property name="tenantService">
<ref bean="tenantService"/>
</property>
</bean>
<bean id="avmServiceBase" class="org.alfresco.repo.avm.AVMServiceNOOPImpl">
<!-- Sparta: remove WCM/AVM - use NOOP impl for now (see also AVMSyncServiceNOOPImpl)
<property name="avmRepository">
<ref bean="avmRepository"/>
</property>
-->
</bean>
<bean id="checkTxnAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref bean="checkTxnAdvice"/>
@@ -919,212 +790,6 @@
</property>
</bean>
<bean id="avmServiceReadTxnAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice">
<ref bean="retryingReadTxnAdvice"/>
</property>
<property name="mappedNames">
<list>
<value>getFileInputStream</value>
<value>getContentReader</value>
<value>getDirectoryListing</value>
<value>getDirectoryListingDirect</value>
<value>getDirectoryListingArray</value>
<value>getDeleted</value>
<value>getNextVersionID</value>
<value>getLatestSnapshotID</value>
<value>getStoreVersions</value>
<value>getStores</value>
<value>getStore</value>
<value>getStoreRoot</value>
<value>lookup</value>
<value>getPaths</value>
<value>getHeadPaths</value>
<value>getPathsInStoreHead</value>
<value>getPathsInStoreVersion</value>
<value>getIndirectionPath</value>
<value>getHistory</value>
<value>getCommonAncestor</value>
<value>getLayeringInfo</value>
<value>getNodeProperty</value>
<value>getNodeProperties</value>
<value>getStoreProperty</value>
<value>getStoreProperties</value>
<value>queryStorePropertyKey</value>
<value>queryStoresPropertyKeys</value>
<value>getContentDataForRead</value>
<value>getAspects</value>
<value>hasAspect</value>
<value>getAPath</value>
<value>getGuid</value>
<value>getStoreVersionsFrom</value>
<value>getStoreVersionsTo</value>
<value>getStoreVersionsBetween</value>
</list>
</property>
</bean>
<bean id="avmServiceWriteTxnAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice">
<ref bean="retryingWriteTxnAdvice"/>
</property>
<property name="mappedNames">
<list>
<value>getFileOutputStream</value>
<value>getContentWriter</value>
<value>createFile</value>
<value>createDirectory</value>
<value>createLayeredFile</value>
<value>createLayeredDirectory</value>
<value>retargetLayeredDirectory</value>
<value>createStore</value>
<value>createBranch</value>
<value>removeNode</value>
<value>rename</value>
<value>uncover</value>
<value>makeTransparent</value>
<value>createSnapshot</value>
<value>purgeStore</value>
<value>purgeVersion</value>
<value>makePrimary</value>
<value>setOpacity</value>
<value>setNodeProperty</value>
<value>setNodeProperties</value>
<value>deleteNodeProperty</value>
<value>deleteNodeProperties</value>
<value>setStoreProperty</value>
<value>setStoreProperties</value>
<value>deleteStoreProperty</value>
<value>getContentDataForWrite</value>
<value>setContentData</value>
<value>setMetaDataFrom</value>
<value>addAspect</value>
<value>removeAspect</value>
<value>link</value>
<value>forceCopy</value>
<value>copy</value>
<value>renameStore</value>
<value>getSystemStore</value>
<value>revert</value>
<value>setGuid</value>
<value>setEncoding</value>
<value>setMimeType</value>
</list>
</property>
</bean>
<bean id="AVMService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>org.alfresco.service.cmr.avm.AVMService</value>
</list>
</property>
<property name="targetName">
<value>avmService</value>
</property>
<property name="interceptorNames">
<list>
<value>avmServiceWriteTxnAdvisor</value>
<value>avmServiceReadTxnAdvisor</value>
<value>checkTxnAdvisor</value>
<!-- Sparta: remove WCM/AVM
<value>avmSnapShotTriggeredIndexingMethodInterceptor</value>
-->
</list>
</property>
</bean>
<!-- deprecated (since 3.2) - refer to AVMService -->
<bean id="indexingAVMService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>org.alfresco.service.cmr.avm.AVMService</value>
</list>
</property>
<property name="targetName">
<value>avmService</value>
</property>
<property name="interceptorNames">
<list>
<value>avmSnapShotTriggeredIndexingMethodInterceptor</value>
</list>
</property>
</bean>
<!-- Sparta: remove WCM/AVM
<bean id="avmSnapShotTriggeredIndexingMethodInterceptor" class="org.alfresco.repo.management.subsystems.SubsystemProxyFactory">
<property name="sourceApplicationContextFactory">
<ref bean="Search" />
</property>
<property name="sourceBeanName">
<value>search.avmSnapShotTriggeredIndexingMethodInterceptor</value>
</property>
<property name="interfaces">
<list>
<value>org.alfresco.repo.search.AVMSnapShotTriggeredIndexingMethodInterceptor</value>
</list>
</property>
</bean>
-->
<!-- The AVMSyncService -->
<bean id="avmSyncService" class="org.alfresco.repo.avm.AVMSyncServiceNOOPImpl">
<!-- Sparta: remove WCM/AVM - use NOOP impl for now (see also AVMServiceNOOPImpl)
<property name="avmService">
<ref bean="AVMService"/>
</property>
<property name="avmRepository">
<ref bean="avmRepository"/>
</property>
-->
</bean>
<!-- Read transaction advisor for sync service. -->
<bean id="avmSyncServiceReadTxnAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice">
<ref bean="retryingReadTxnAdvice"/>
</property>
<property name="mappedNames">
<list>
<value>compare</value>
</list>
</property>
</bean>
<!-- Write transaction advisor for sync service. -->
<bean id="avmSyncServiceWriteTxnAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice">
<ref bean="retryingWriteTxnAdvice"/>
</property>
<property name="mappedNames">
<list>
<value>update</value>
<value>flatten</value>
<value>resetLayer</value>
</list>
</property>
</bean>
<bean id="AVMSyncService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>org.alfresco.service.cmr.avmsync.AVMSyncService</value>
</list>
</property>
<property name="targetName">
<value>avmSyncService</value>
</property>
<property name="interceptorNames">
<list>
<value>avmSyncServiceWriteTxnAdvisor</value>
<value>avmSyncServiceReadTxnAdvisor</value>
<value>checkTxnAdvisor</value>
</list>
</property>
</bean>
<!-- Attribute Service -->
<!-- Read transaction advisor for attribute service. -->
@@ -1175,54 +840,6 @@
</property>
</bean>
<!-- AVM Locking Service. -->
<bean id="avmLockingServiceReadTxnAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice">
<ref bean="retryingReadTxnAdvice"/>
</property>
<property name="mappedNames">
<list>
<value>getLockOwner</value>
<value>getLockData</value>
<value>getLockState</value>
<value>hasAccess</value>
</list>
</property>
</bean>
<bean id="avmLockingServiceWriteTxnAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice">
<ref bean="retryingWriteTxnAdvice"/>
</property>
<property name="mappedNames">
<list>
<value>lock</value>
<value>modifyLock</value>
<value>removeLock</value>
<value>removeLocks</value>
</list>
</property>
</bean>
<bean id="AVMLockingService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>org.alfresco.service.cmr.avm.locking.AVMLockingService</value>
</list>
</property>
<property name="targetName">
<value>avmLockingService</value>
</property>
<property name="interceptorNames">
<list>
<value>avmLockingServiceWriteTxnAdvisor</value>
<value>avmLockingServiceReadTxnAdvisor</value>
<value>checkTxnAdvisor</value>
</list>
</property>
</bean>
<!-- Workflow Service -->
<bean id="WorkflowService" class="org.springframework.aop.framework.ProxyFactoryBean">

View File

@@ -125,7 +125,6 @@ index.recovery.maximumPoolSize=5
# See http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html
index.tracking.cronExpression=0/5 * * * * ?
index.tracking.adm.cronExpression=${index.tracking.cronExpression}
index.tracking.avm.cronExpression=${index.tracking.cronExpression}
# Other properties.
index.tracking.maxTxnDurationMinutes=10
index.tracking.reindexLagMs=1000
@@ -476,8 +475,6 @@ spaces.templates.email.following.childname=app:following
spaces.templates.rss.childname=app:rss_templates
spaces.savedsearches.childname=app:saved_searches
spaces.scripts.childname=app:scripts
spaces.wcm.childname=app:wcm
spaces.wcm_content_forms.childname=app:wcm_forms
spaces.content_forms.childname=app:forms
spaces.user_homes.childname=app:user_homes
spaces.user_homes.regex.key=userName
@@ -488,7 +485,6 @@ spaces.templates.email.invite.childname=cm:invite
spaces.templates.email.activities.childname=cm:activities
spaces.rendition.rendering_actions.childname=app:rendering_actions
spaces.replication.replication_actions.childname=app:replication_actions
spaces.wcm_deployed.childname=cm:wcm_deployed
spaces.transfers.childname=app:transfers
spaces.transfer_groups.childname=app:transfer_groups
spaces.transfer_temp.childname=app:temp
@@ -559,9 +555,6 @@ user.name.caseSensitive=false
domain.name.caseSensitive=false
domain.separator=
# AVM Specific properties.
avm.remote.idlestream.timeout=30000
#Format caption extracted from the XML Schema.
xforms.formatCaption=true
@@ -613,23 +606,17 @@ alfresco.rmi.services.retries=4
#
# Specify 0 to use a random unused port.
#
avm.rmi.service.port=50501
avmsync.rmi.service.port=50502
authentication.rmi.service.port=50504
repo.rmi.service.port=50505
action.rmi.service.port=50506
deployment.rmi.service.port=50507
monitor.rmi.service.port=50508
#
# enable or disable individual RMI services
#
avm.rmi.service.enabled=true
avmsync.rmi.service.enabled=true
authentication.rmi.service.enabled=true
repo.rmi.service.enabled=true
action.rmi.service.enabled=true
deployment.rmi.service.enabled=true
monitor.rmi.service.enabled=true
@@ -834,43 +821,6 @@ transferservice.receiver.lockRetryWait=100
# time" for both source and destination. Default 5 minutes.
transferservice.receiver.lockTimeOut=300000
# Max time allowed for WCM folder rename operation issued by external clients (CIFS, FTP)
wcm.rename.max.time.milliseconds=2000
; DM Receiever Properties
;
; The name of the DM Receiver target - you deploy to this target name
deployment.dmr.name=alfresco
; consolidate staging, author and workflow sandboxes to one
deployment.dmr.consolidate=true
; The name of the Alfresco receiver targer
deployment.avm.name=avm
;Where should the root of the web project be stored, by default /www/avm_webapps
deployment.avm.rootPath=/www/avm_webapps
; Pattern for live stores deployment by the alfresco receiver
deployment.avm.storeNamePattern=%storeName%-live
; Built in deployment receiver properties for the default
; filesystem receiver
; filesystem receiver configuration
deployment.filesystem.rootdir=./wcm
deployment.filesystem.datadir=${deployment.filesystem.rootdir}/depdata
deployment.filesystem.logdir=${deployment.filesystem.rootdir}/deplog
deployment.filesystem.metadatadir=${deployment.filesystem.rootdir}/depmetadata
deployment.filesystem.autofix=true
deployment.filesystem.errorOnOverwrite=false
; default filesystem target configuration
deployment.filesystem.default.rootdir=./www
deployment.filesystem.default.name=filesystem
deployment.filesystem.default.metadatadir=${deployment.filesystem.metadatadir}/default
# OrphanReaper
orphanReaper.lockRefreshTime=60000
orphanReaper.lockTimeOut=3600000

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<view:view xmlns:view="http://www.alfresco.org/view/repository/1.0">
<cm:folder view:childName="app:following" xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0">
<cm:folder view:childName="app:following" xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0">
<view:properties>
<cm:name>${spaces.templates.email.following.name}</cm:name>
<cm:title>${spaces.templates.email.following.name}</cm:title>

View File

@@ -3,7 +3,7 @@
<view:metadata>
<view:exportOf>/app:company_home/app:dictionary/app:email_templates/cm:invite</view:exportOf>
</view:metadata>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:invite-email.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:invite-email.html.ftl">
<view:aspects>
<cm:auditable></cm:auditable>
<sys:referenceable></sys:referenceable>
@@ -19,7 +19,7 @@
</view:properties>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:invite-email_fr.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:invite-email_fr.html.ftl">
<view:aspects>
<cm:auditable></cm:auditable>
<sys:referenceable></sys:referenceable>
@@ -35,7 +35,7 @@
</view:properties>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:invite-email_es.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:invite-email_es.html.ftl">
<view:aspects>
<cm:auditable></cm:auditable>
<sys:referenceable></sys:referenceable>
@@ -51,7 +51,7 @@
</view:properties>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:invite-email_de.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:invite-email_de.html.ftl">
<view:aspects>
<cm:auditable></cm:auditable>
<sys:referenceable></sys:referenceable>
@@ -67,7 +67,7 @@
</view:properties>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:invite-email_it.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:invite-email_it.html.ftl">
<view:aspects>
<cm:auditable></cm:auditable>
<sys:referenceable></sys:referenceable>
@@ -83,7 +83,7 @@
</view:properties>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:invite-email_ja.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:invite-email_ja.html.ftl">
<view:aspects>
<cm:auditable></cm:auditable>
<sys:referenceable></sys:referenceable>
@@ -99,7 +99,7 @@
</view:properties>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:invite-email_nl.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:invite-email_nl.html.ftl">
<view:aspects>
<cm:auditable></cm:auditable>
<sys:referenceable></sys:referenceable>

View File

@@ -3,7 +3,7 @@
<view:metadata>
<view:exportOf>/app:company_home/app:dictionary/app:email_templates/cm:invite</view:exportOf>
</view:metadata>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:new-user-email.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:new-user-email.html.ftl">
<view:aspects>
<cm:auditable></cm:auditable>
<sys:referenceable></sys:referenceable>
@@ -19,7 +19,7 @@
</view:properties>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:new-user-email_fr.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:new-user-email_fr.html.ftl">
<view:aspects>
<cm:auditable></cm:auditable>
<sys:referenceable></sys:referenceable>
@@ -35,7 +35,7 @@
</view:properties>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:new-user-email_es.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:new-user-email_es.html.ftl">
<view:aspects>
<cm:auditable></cm:auditable>
<sys:referenceable></sys:referenceable>
@@ -51,7 +51,7 @@
</view:properties>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:new-user-email_de.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:new-user-email_de.html.ftl">
<view:aspects>
<cm:auditable></cm:auditable>
<sys:referenceable></sys:referenceable>
@@ -67,7 +67,7 @@
</view:properties>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:new-user-email_it.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:new-user-email_it.html.ftl">
<view:aspects>
<cm:auditable></cm:auditable>
<sys:referenceable></sys:referenceable>
@@ -83,7 +83,7 @@
</view:properties>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:new-user-email_ja.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:new-user-email_ja.html.ftl">
<view:aspects>
<cm:auditable></cm:auditable>
<sys:referenceable></sys:referenceable>
@@ -99,7 +99,7 @@
</view:properties>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:new-user-email_nl.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:new-user-email_nl.html.ftl">
<view:aspects>
<cm:auditable></cm:auditable>
<sys:referenceable></sys:referenceable>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<view:view xmlns:view="http://www.alfresco.org/view/repository/1.0">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:notify_user_email.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:notify_user_email.html.ftl">
<view:aspects>
<cm:titled></cm:titled>
<app:inlineeditable></app:inlineeditable>
@@ -15,7 +15,7 @@
<view:associations></view:associations>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:notify_user_email_de.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:notify_user_email_de.html.ftl">
<view:aspects>
<cm:titled></cm:titled>
<app:inlineeditable></app:inlineeditable>
@@ -30,7 +30,7 @@
<view:associations></view:associations>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:notify_user_email_es.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:notify_user_email_es.html.ftl">
<view:aspects>
<cm:titled></cm:titled>
<app:inlineeditable></app:inlineeditable>
@@ -45,7 +45,7 @@
<view:associations></view:associations>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:notify_user_email_fr.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:notify_user_email_fr.html.ftl">
<view:aspects>
<cm:titled></cm:titled>
<app:inlineeditable></app:inlineeditable>
@@ -60,7 +60,7 @@
<view:associations></view:associations>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:notify_user_email_it.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:notify_user_email_it.html.ftl">
<view:aspects>
<cm:titled></cm:titled>
<app:inlineeditable></app:inlineeditable>
@@ -75,7 +75,7 @@
<view:associations></view:associations>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:notify_user_email_ja.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:notify_user_email_ja.html.ftl">
<view:aspects>
<cm:titled></cm:titled>
<app:inlineeditable></app:inlineeditable>
@@ -90,7 +90,7 @@
<view:associations></view:associations>
</cm:content>
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:notify_user_email_nl.html.ftl">
<cm:content xmlns="" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rn="http://www.alfresco.org/model/rendition/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:lnk="http://www.alfresco.org/model/linksmodel/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cmiscustom="http://www.alfresco.org/model/cmis/custom" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:emailserver="http://www.alfresco.org/model/emailserver/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:ia="http://www.alfresco.org/model/calendar" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:dl="http://www.alfresco.org/model/datalist/1.0" xmlns:st="http://www.alfresco.org/model/site/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:custom="custom.model" xmlns:exif="http://www.alfresco.org/model/exif/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:blg="http://www.alfresco.org/model/blogintegration/1.0" xmlns:alf="http://www.alfresco.org" xmlns:cmis="http://www.alfresco.org/model/cmis/1.0/cs01" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:inwf="http://www.alfresco.org/model/workflow/invite/nominated/1.0" xmlns:imap="http://www.alfresco.org/model/imap/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:ver2="http://www.alfresco.org/model/versionstore/2.0" xmlns:stcp="http://www.alfresco.org/model/sitecustomproperty/1.0" xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:imwf="http://www.alfresco.org/model/workflow/invite/moderated/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:trx="http://www.alfresco.org/model/transfer/1.0" view:childName="cm:notify_user_email_nl.html.ftl">
<view:aspects>
<cm:titled></cm:titled>
<app:inlineeditable></app:inlineeditable>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<view:view xmlns:view="http://www.alfresco.org/view/repository/1.0">
<cm:content xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:alf="http://www.alfresco.org" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:wcmwf="http://www.alfresco.org/model/wcmworkflow/1.0" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:custom="custom.model" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns="" view:childName="cm:readme.ftl">
<cm:content xmlns:view="http://www.alfresco.org/view/repository/1.0" xmlns:d="http://www.alfresco.org/model/dictionary/1.0" xmlns:alf="http://www.alfresco.org" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:act="http://www.alfresco.org/model/action/1.0" xmlns:wf="http://www.alfresco.org/model/workflow/1.0" xmlns:app="http://www.alfresco.org/model/application/1.0" xmlns:usr="http://www.alfresco.org/model/user/1.0" xmlns:ver="http://www.alfresco.org/model/versionstore/1.0" xmlns:cm="http://www.alfresco.org/model/content/1.0" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:wcm="http://www.alfresco.org/model/wcmmodel/1.0" xmlns:wca="http://www.alfresco.org/model/wcmappmodel/1.0" xmlns:sys="http://www.alfresco.org/model/system/1.0" xmlns:rule="http://www.alfresco.org/model/rule/1.0" xmlns:bpm="http://www.alfresco.org/model/bpm/1.0" xmlns:fm="http://www.alfresco.org/model/forum/1.0" xmlns:custom="custom.model" xmlns:reg="http://www.alfresco.org/system/registry/1.0" xmlns:module="http://www.alfresco.org/system/modules/1.0" xmlns="" view:childName="cm:readme.ftl">
<view:aspects>
<cm:titled></cm:titled>
<cm:author></cm:author>

View File

@@ -341,81 +341,6 @@
</bean>
<!-- The transactional cache for AVM Store entities -->
<bean name="avmStoreCache" class="org.alfresco.repo.cache.TransactionalCache">
<property name="sharedCache">
<ref bean="avmStoreSharedCache" />
</property>
<property name="name">
<value>org.alfresco.cache.avmStoreTransactionalCache</value>
</property>
<property name="maxCacheSize" value="${cache.avmStoreSharedCache.tx.maxItems}" />
<property name="mutable" value="true" />
<property name="disableSharedCache" value="${system.cache.disableMutableSharedCaches}" />
</bean>
<!-- The transactional cache for AVM entities (various - using cache region) -->
<bean name="avmEntityCache" class="org.alfresco.repo.cache.TransactionalCache">
<property name="sharedCache">
<ref bean="avmEntitySharedCache" />
</property>
<property name="name">
<value>org.alfresco.cache.avmEntityTransactionalCache</value>
</property>
<property name="maxCacheSize" value="${cache.avmEntitySharedCache.tx.maxItems}" />
<property name="mutable" value="true" />
<property name="disableSharedCache" value="${system.cache.disableMutableSharedCaches}" />
</bean>
<!-- The transactional cache for AVM VersionRoot entities -->
<bean name="avmVersionRootEntityCache" class="org.alfresco.repo.cache.TransactionalCache">
<property name="sharedCache">
<ref bean="avmVersionRootEntitySharedCache" />
</property>
<property name="name">
<value>org.alfresco.cache.avmVersionRootEntityTransactionalCache</value>
</property>
<property name="maxCacheSize" value="${cache.avmVersionRootEntityCache.tx.maxItems}" />
<property name="mutable" value="true" />
<property name="disableSharedCache" value="${system.cache.disableMutableSharedCaches}" />
</bean>
<!-- The transactional cache for AVM Node entities -->
<bean name="avmNodeCache" class="org.alfresco.repo.cache.TransactionalCache">
<property name="sharedCache">
<ref bean="avmNodeSharedCache" />
</property>
<property name="name">
<value>org.alfresco.cache.avmNodeTransactionalCache</value>
</property>
<property name="maxCacheSize" value="${cache.avmNodeSharedCache.tx.maxItems}" />
<property name="mutable" value="true" />
<property name="disableSharedCache" value="${system.cache.disableMutableSharedCaches}" />
</bean>
<!-- The transactional cache for AVM Node Aspects entities -->
<bean name="avmNodeAspectsCache" class="org.alfresco.repo.cache.TransactionalCache">
<property name="sharedCache">
<ref bean="avmNodeAspectsSharedCache" />
</property>
<property name="name">
<value>org.alfresco.cache.avmNodeAspectsTransactionalCache</value>
</property>
<property name="maxCacheSize" value="${cache.avmNodeAspectsSharedCache.tx.maxItems}" />
<property name="mutable" value="true" />
<property name="disableSharedCache" value="${system.cache.disableMutableSharedCaches}" />
</bean>
<!-- The transactional cache for Node Ownership -->
<bean name="aclCache" class="org.alfresco.repo.cache.TransactionalCache">

View File

@@ -1,343 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
<!-- Web Project Service -->
<!-- Web Project service bean -->
<bean id="WebProjectService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>org.alfresco.wcm.webproject.WebProjectService</value>
</property>
<property name="target">
<ref bean="webProjectService"/>
</property>
<property name="interceptorNames">
<list>
<idref local="WebProjectService_transaction"/>
<idref bean="AuditMethodInterceptor"/>
<idref bean="exceptionTranslator"/>
<idref local="WebProjectService_security"/>
</list>
</property>
</bean>
<!-- Web Project service transaction bean -->
<bean id="WebProjectService_transaction" class="org.alfresco.repo.transaction.RetryingTransactionInterceptor">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionService" ref="transactionService"/>
<property name="transactionAttributes">
<props>
<prop key="get*">${server.transaction.mode.readOnly}</prop>
<prop key="list*">${server.transaction.mode.readOnly}</prop>
<prop key="is*">${server.transaction.mode.readOnly}</prop>
<prop key="find*">${server.transaction.mode.readOnly}</prop>
<prop key="*">${server.transaction.mode.default}</prop>
</props>
</property>
</bean>
<!-- Web Project service security bean -->
<bean id="WebProjectService_security" class="org.alfresco.repo.security.permissions.impl.AlwaysProceedMethodInterceptor" />
<bean id="webProjectService" class="org.alfresco.wcm.webproject.WebProjectServiceImpl">
<property name="nodeService" ref="NodeService"/>
<property name="namespaceService" ref="NamespaceService"/>
<property name="searchService" ref="SearchService"/>
<property name="avmService" ref="AVMService"/>
<property name="authorityService" ref="AuthorityService"/>
<property name="permissionService" ref="PermissionService"/>
<property name="personService" ref="PersonService"/>
<property name="sandboxFactory" ref="sandboxFactory"/>
<property name="virtServerRegistry" ref="VirtServerRegistry"/>
<property name="previewURIServiceRegistry" ref="previewURIServiceRegistry"/>
<property name="transactionService" ref="transactionService"/>
<property name="avmLockingService" ref="AVMLockingService"/>
</bean>
<!-- Asset Service -->
<!-- Asset service bean -->
<bean id="AssetService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>org.alfresco.wcm.asset.AssetService</value>
</property>
<property name="target">
<ref bean="assetService"/>
</property>
<property name="interceptorNames">
<list>
<idref local="AssetService_transaction"/>
<idref bean="AuditMethodInterceptor"/>
<idref bean="exceptionTranslator"/>
<idref local="AssetService_security"/>
</list>
</property>
</bean>
<!-- Asset service transaction bean -->
<bean id="AssetService_transaction" class="org.alfresco.repo.transaction.RetryingTransactionInterceptor">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionService" ref="transactionService"/>
<property name="transactionAttributes">
<props>
<prop key="get*">${server.transaction.mode.readOnly}</prop>
<prop key="getContentWriter">${server.transaction.mode.default}</prop>
<prop key="getContentReader">${server.transaction.mode.default}</prop>
<prop key="list*">${server.transaction.mode.readOnly}</prop>
<prop key="is*">${server.transaction.mode.readOnly}</prop>
<prop key="find*">${server.transaction.mode.readOnly}</prop>
<prop key="*">${server.transaction.mode.default}</prop>
</props>
</property>
</bean>
<!-- Asset service security bean -->
<bean id="AssetService_security" class="org.alfresco.repo.security.permissions.impl.AlwaysProceedMethodInterceptor" />
<bean id="assetService" class="org.alfresco.wcm.asset.AssetServiceImpl">
<property name="avmService" ref="AVMLockingAwareService"/>
<property name="avmLockingService" ref="AVMLockingService"/>
<property name="nodeService" ref="avmLockingAwareNodeService"/> <!-- locking-aware AVMNodeService -->
<property name="virtServerRegistry" ref="VirtServerRegistry"/>
</bean>
<!-- or can make avmNodeService locking-aware by default (and then inject NodeService above) -->
<bean id="mlPropertyInterceptorLockingAware" class="org.alfresco.repo.node.MLPropertyInterceptor">
<property name="nodeService">
<ref bean="mlAwareLockingAwareNodeService" />
</property>
<property name="multilingualContentService">
<ref bean="multilingualContentService" />
</property>
<property name="dictionaryService">
<ref bean="dictionaryService" />
</property>
</bean>
<bean id="avmLockingAwareNodeService" class="org.springframework.aop.framework.ProxyFactoryBean" >
<property name="targetName">
<value>mlAwareLockingAwareNodeService</value>
</property>
<property name="proxyInterfaces">
<list>
<value>org.alfresco.service.cmr.repository.NodeService</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>mlPropertyInterceptorLockingAware</value>
</list>
</property>
</bean>
<bean id="mlAwareLockingAwareNodeService" class="org.alfresco.repo.avm.AVMNodeService" init-method="init">
<property name="dictionaryService">
<ref bean="dictionaryService"/>
</property>
<property name="avmService">
<ref bean="AVMLockingAwareService"/>
</property>
<property name="policyComponent">
<ref bean="policyComponent"/>
</property>
</bean>
<!-- Sandbox Service -->
<!-- Sandbox service bean -->
<bean id="SandboxService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>org.alfresco.wcm.sandbox.SandboxService</value>
</property>
<property name="target">
<ref bean="sandboxService"/>
</property>
<property name="interceptorNames">
<list>
<idref local="SandboxService_transaction"/>
<idref bean="AuditMethodInterceptor"/>
<idref bean="exceptionTranslator"/>
<idref local="SandboxService_security"/>
</list>
</property>
</bean>
<!-- Sandbox service transaction bean -->
<bean id="SandboxService_transaction" class="org.alfresco.repo.transaction.RetryingTransactionInterceptor">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionService" ref="transactionService"/>
<property name="transactionAttributes">
<props>
<prop key="get*">${server.transaction.mode.readOnly}</prop>
<prop key="list*">${server.transaction.mode.readOnly}</prop>
<prop key="is*">${server.transaction.mode.readOnly}</prop>
<prop key="find*">${server.transaction.mode.readOnly}</prop>
<prop key="*">${server.transaction.mode.default}</prop>
</props>
</property>
</bean>
<!-- Sandbox service security bean -->
<bean id="SandboxService_security" class="org.alfresco.repo.security.permissions.impl.AlwaysProceedMethodInterceptor" />
<bean id="sandboxService" class="org.alfresco.wcm.sandbox.SandboxServiceImpl">
<property name="webProjectService" ref="WebProjectService"/>
<property name="assetService" ref="AssetService"/>
<property name="sandboxFactory" ref="sandboxFactory"/>
<property name="avmService" ref="AVMService"/>
<property name="avmSyncService" ref="AVMSyncService"/>
<property name="nameMatcher" ref="globalPathExcluder"/>
<property name="virtServerRegistry" ref="VirtServerRegistry"/>
<property name="transactionService" ref="transactionService"/>
<property name="workflowService" ref="WorkflowService"/>
<property name="avmLockingService" ref="AVMLockingService"/>
</bean>
<!--
<bean id="sandboxScript" parent="baseJavaScriptExtension" class="org.alfresco.wcm.sandbox.script.Sandboxes">
<property name="extensionName">
<value>sandboxes</value>
</property>
<property name="serviceRegistry" ref="ServiceRegistry"/>
<property name="sandboxService" ref="SandboxService"/>
</bean>
-->
<bean id="sandboxFactory" class="org.alfresco.wcm.sandbox.SandboxFactory">
<property name="nodeService" ref="NodeService"/>
<property name="permissionService" ref="PermissionService"/>
<property name="avmService" ref="AVMService"/>
<property name="virtServerRegistry" ref="VirtServerRegistry"/>
<property name="authorityService" ref="AuthorityService"/>
<property name="avmLockingService" ref="AVMLockingService"/>
</bean>
<!-- Java script API ROOT Scopeable object for WCM -->
<bean id="webProjectsScript" parent="baseJavaScriptExtension" class="org.alfresco.wcm.webproject.script.WebProjects">
<property name="extensionName">
<value>webprojects</value>
</property>
<property name="serviceRegistry" ref="ServiceRegistry"/>
<property name="webProjectService" ref="WebProjectService"/>
<property name="sandboxService" ref="SandboxService"/>
<property name="assetService" ref="AssetService"/>
<property name="namespaceService" ref="NamespaceService"/>
</bean>
<!-- PreviewURI Service -->
<!-- PreviewURI service bean - note: named WCMPreviewURIService to allow backwards compatibility with deprecated "PreviewURIService" (as hard-coded in AVMUtil) -->
<bean id="WCMPreviewURIService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>org.alfresco.wcm.preview.PreviewURIService</value>
</property>
<property name="target">
<ref bean="previewURIService"/>
</property>
<property name="interceptorNames">
<list>
<idref local="PreviewURIService_transaction"/>
<idref bean="AuditMethodInterceptor"/>
<idref bean="exceptionTranslator"/>
<idref local="PreviewURIService_security"/>
</list>
</property>
</bean>
<!-- PreviewURI Service service transaction bean -->
<bean id="PreviewURIService_transaction" class="org.alfresco.repo.transaction.RetryingTransactionInterceptor">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionService" ref="transactionService"/>
<property name="transactionAttributes">
<props>
<prop key="get*">${server.transaction.mode.readOnly}</prop>
<prop key="*">${server.transaction.mode.default}</prop>
</props>
</property>
</bean>
<!-- PreviewURIService service security bean -->
<bean id="PreviewURIService_security" class="org.alfresco.repo.security.permissions.impl.AlwaysProceedMethodInterceptor" />
<bean id="previewURIService" class="org.alfresco.wcm.preview.PreviewURIServiceImpl">
<property name="webProjectService" ref="WebProjectService"/>
<property name="previewURIServiceRegistry" ref="previewURIServiceRegistry"/>
</bean>
<!-- override this bean in a custom-wcm-preview-context.xml file to extend/change list of preview providers -->
<bean id="previewURIServiceRegistry" class="org.alfresco.wcm.preview.PreviewURIServiceRegistryImpl">
<property name="defaultProviderName">
<value>Virtualisation Server Preview</value>
</property>
<property name="previewURIServiceProvidersByName">
<map>
<entry key="Virtualisation Server Preview">
<ref bean="virtServerPreviewURIService"/>
</entry>
<!--
<entry key="NOOP Preview">
<ref bean="nullPreviewURIService"/>
</entry>
-->
</map>
</property>
</bean>
<bean id="basePreviewURIServiceProvider" class="org.alfresco.wcm.preview.AbstractPreviewURIServiceProvider" abstract="true"/>
<bean id="virtServerPreviewURIService" class="org.alfresco.wcm.preview.VirtualisationServerPreviewURIService" parent="basePreviewURIServiceProvider">
<property name="avmService" ref="AVMService"/>
<property name="virtServerRegistry" ref="VirtServerRegistry"/>
</bean>
<bean id="nullPreviewURIService" class="org.alfresco.wcm.preview.NullPreviewURIService" parent="basePreviewURIServiceProvider"/>
<!-- WCM example actions -->
<bean id="wcm-submit" class="org.alfresco.wcm.actions.WCMSandboxSubmitAction" parent="action-executer">
<property name="sandboxService">
<ref bean="SandboxService"/>
</property>
<property name="publicAction">
<value>false</value>
</property>
</bean>
<bean id="wcm-revert-snapshot" class="org.alfresco.wcm.actions.WCMSandboxRevertSnapshotAction" parent="action-executer">
<property name="sandboxService">
<ref bean="SandboxService"/>
</property>
<property name="publicAction">
<value>false</value>
</property>
</bean>
<bean id="wcm-undo" class="org.alfresco.wcm.actions.WCMSandboxUndoAction" parent="action-executer">
<property name="sandboxService">
<ref bean="SandboxService"/>
</property>
<property name="publicAction">
<value>false</value>
</property>
</bean>
<!-- I18N -->
<bean id="wcmServicesResourceBundles" class="org.alfresco.i18n.ResourceBundleBootstrapComponent">
<property name="resourceBundles">
<list>
<value>alfresco.messages.wcm-services</value>
</list>
</property>
</bean>
</beans>

View File

@@ -27,7 +27,6 @@
<property name="workflowPackageComponent" ref="workflowPackageImpl"/>
<property name="nodeService" ref="nodeService"/>
<property name="contentService" ref="contentService"/>
<property name="avmSyncService" ref="AVMSyncService"/>
<property name="dictionaryService" ref="dictionaryService"/>
<property name="protectedNodeService" ref="NodeService"/>
<property name="workflowAdminService" ref="workflowAdminService"/>
@@ -62,8 +61,6 @@
<bean id="workflowInterpreter" class="org.alfresco.repo.workflow.WorkflowInterpreter" parent="interpreterBase">
<property name="workflowService" ref="WorkflowService"/>
<property name="AVMService" ref="AVMService"/>
<property name="AVMSyncService" ref="AVMSyncService"/>
<property name="nodeService" ref="NodeService"/>
<property name="namespaceService" ref="namespaceService"/>
<property name="personService" ref="PersonService"/>

View File

@@ -1,667 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.filesys.avm;
import java.util.StringTokenizer;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.filesys.alfresco.AlfrescoContext;
import org.alfresco.filesys.alfresco.AlfrescoDiskDriver;
import org.alfresco.filesys.alfresco.IOControlHandler;
import org.alfresco.jlan.server.filesys.DiskInterface;
import org.alfresco.jlan.server.filesys.FileName;
import org.alfresco.jlan.server.filesys.FileSystem;
import org.alfresco.jlan.server.filesys.NotifyChange;
import org.alfresco.jlan.server.filesys.cache.FileState;
import org.alfresco.jlan.server.filesys.cache.FileStateCache;
import org.alfresco.jlan.util.StringList;
import org.alfresco.repo.avm.CreateStoreCallback;
import org.alfresco.repo.avm.CreateVersionCallback;
import org.alfresco.repo.avm.PurgeStoreCallback;
import org.alfresco.repo.avm.PurgeVersionCallback;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* AVM Filesystem Context Class
*
* <p>Contains per filesystem context.
*
* @author GKSpencer
*/
public class AVMContext extends AlfrescoContext
implements CreateStoreCallback, PurgeStoreCallback, CreateVersionCallback, PurgeVersionCallback {
// Logging
private static final Log logger = LogFactory.getLog(AVMContext.class);
// Constants
//
// Version id that indicates the head version
public static final int VERSION_HEAD = -1;
// Store types to show in the virtualization view
public static final int ShowNormalStores = 0x0001;
public static final int ShowSiteStores = 0x0002;
public static final int ShowStagingStores = 0x0004;
public static final int ShowAuthorStores = 0x0008;
public static final int ShowPreviewStores = 0x0010;
// Store, root path and version
private String m_storePath;
private int m_version = VERSION_HEAD;
// Flag to indicate if the virtualization view is enabled
//
// The first set of folders then map to the stores and the second layer map to the versions with
// paths below.
private boolean m_virtualView;
// Virtualization view filtering options
private int m_showOptions = ShowStagingStores + ShowAuthorStores;
// List of newly created store names that need adding into the virtualization view
private StringList m_newStores;
private Object m_newStoresLock;
// Allow admin user to write to web project staging stores
private boolean m_allowAdminStagingWrites;
// Auto create the store if it doesn't exist?
private boolean m_createStore;
/**
* Default constructor allowing initialization by container.
*/
public AVMContext()
{
}
/**
* Class constructor
*
* <p>Construct a context for a normal view onto a single store/version within AVM.
*
* @param filesysName String
* @param storePath String
* @param version int
*/
public AVMContext( String filesysName, String storePath, int version)
{
setDeviceName(filesysName);
// Set the store root path
setStorePath(storePath);
// Set the store version to use
setVersion(version);
}
/**
* Class constructor
*
* <p>Construct a context for a virtualization view onto all stores/versions within AVM.
*
* @param filesysName String
* @param showOptions int
* @param avmDriver AVMDiskDriver
*/
public AVMContext( String filesysName, int showOptions, AVMDiskDriver avmDriver)
{
setDeviceName(filesysName);
// Enable the virtualization view
setVirtualView(true);
setShowOptions(showOptions);
}
public void setStorePath(String path)
{
this.m_storePath = path;
}
public void setVersion(int version)
{
this.m_version = version;
}
public void setShowOptions(int showOptions)
{
this.m_showOptions = showOptions;
}
public void setStores(String showAttr)
{
if ( showAttr != null)
{
// Split the show options string
StringTokenizer tokens = new StringTokenizer( showAttr, ",");
StringList optList = new StringList();
while ( tokens.hasMoreTokens())
optList.addString( tokens.nextToken().trim().toLowerCase());
// Build the show options mask
this.m_showOptions = 0;
if ( optList.containsString("normal"))
this.m_showOptions += ShowNormalStores;
if ( optList.containsString("site"))
this.m_showOptions += ShowSiteStores;
if ( optList.containsString("author"))
this.m_showOptions += ShowAuthorStores;
if ( optList.containsString("preview"))
this.m_showOptions += ShowPreviewStores;
if ( optList.containsString("staging"))
this.m_showOptions += ShowStagingStores;
}
}
public void setVirtualView(boolean isVirtualView)
{
this.m_virtualView = isVirtualView;
}
public boolean getCreateStore()
{
return m_createStore;
}
public void setCreateStore(boolean createStore)
{
m_createStore = createStore;
}
@Override
public void initialize(AlfrescoDiskDriver filesysDriver)
{
if (m_virtualView)
{
// A context for a view onto all stores/versions within AVM.
m_newStoresLock = new Object();
m_newStores = new StringList();
setShareName("VirtualView");
}
else
{
if (m_storePath == null
|| m_storePath.length() == 0)
throw new AlfrescoRuntimeException("Device missing init value: storePath");
// A context for a normal view onto a single store/version within AVM.
if (m_storePath.endsWith("/"))
m_storePath = m_storePath.substring(0, m_storePath.length() - 1);
// Range check the version id
if (m_version < 0 && m_version != AVMContext.VERSION_HEAD)
throw new AlfrescoRuntimeException("Invalid store version id specified, " + m_version);
setShareName(m_storePath + "(" + m_version + ")");
}
super.initialize(filesysDriver);
}
/**
* Return the filesystem type, either FileSystem.TypeFAT or FileSystem.TypeNTFS.
*
* @return String
*/
public String getFilesystemType()
{
return FileSystem.TypeNTFS;
}
/**
* Return the store path
*
* @return String
*/
public final String getStorePath()
{
return m_storePath;
}
/**
* Return the version
*
* @return int
*/
public final int isVersion()
{
return m_version;
}
/**
* Check if the virtualization view is enabled
*
* @return boolean
*/
public final boolean isVirtualizationView()
{
return m_virtualView;
}
/**
* Check if the admin user is allowed to write to web project staging stores
*
* @return boolean
*/
public final boolean allowAdminStagingWrites() {
return m_allowAdminStagingWrites;
}
/**
* Set the admin web project staging store writeable status
*
* @param writeable boolean
*/
public final void setAllowAdminStagingWrites(boolean writeable) {
m_allowAdminStagingWrites = writeable;
}
/**
* Check if there are any new stores queued for adding to the virtualization view
*
* @return boolean
*/
protected final boolean hasNewStoresQueued() {
if ( m_newStores == null || m_newStores.numberOfStrings() == 0)
return false;
return true;
}
/**
* Return the new stores queue, and reset the current queue
*
* @return StringList
*/
protected StringList getNewStoresQueue() {
StringList storesQueue = null;
synchronized ( m_newStoresLock) {
storesQueue = m_newStores;
m_newStores = new StringList();
}
return storesQueue;
}
/**
* Check if normal stores should be shown in the virtualization view
*
* @return boolean
*/
public final boolean showNormalStores()
{
return (m_showOptions & ShowNormalStores) != 0 ? true : false;
}
/**
* Check if site data stores should be shown in the virtualization view
*
* @return boolean
*/
public final boolean showSiteStores()
{
return (m_showOptions & ShowSiteStores) != 0 ? true : false;
}
/**
* Check if author stores should be shown in the virtualization view
*
* @return boolean
*/
public final boolean showAuthorStores()
{
return (m_showOptions & ShowAuthorStores) != 0 ? true : false;
}
/**
* Check if preview stores should be shown in the virtualization view
*
* @return boolean
*/
public final boolean showPreviewStores()
{
return (m_showOptions & ShowPreviewStores) != 0 ? true : false;
}
/**
* Check if staging stores should be shown in the virtualization view
*
* @return boolean
*/
public final boolean showStagingStores()
{
return (m_showOptions & ShowStagingStores) != 0 ? true : false;
}
/**
* Check if the specified store type should be visible
*
* @param storeType int
* @return boolean
*/
public final boolean showStoreType(int storeType)
{
boolean showStore = false;
switch (storeType)
{
case StoreType.Normal:
showStore = showNormalStores();
break;
case StoreType.SiteStore:
showStore = showSiteStores();
break;
case StoreType.WebAuthorMain:
showStore = showAuthorStores();
break;
case StoreType.WebStagingMain:
showStore = showStagingStores();
break;
case StoreType.WebAuthorPreview:
case StoreType.WebStagingPreview:
showStore = showPreviewStores();
break;
}
return showStore;
}
/**
* Close the filesystem context
*/
public void CloseContext() {
// Call the base class
super.CloseContext();
}
/**
* Create the I/O control handler for this filesystem type
*
* @param filesysDriver DiskInterface
* @return IOControlHandler
*/
protected IOControlHandler createIOHandler( DiskInterface filesysDriver)
{
return null;
}
/**
* Create store call back handler
*
* @param storeName String
* @param versionID int
*/
public void storeCreated(String storeName)
{
// Not interested if the virtualization view is not enabled
if ( isVirtualizationView() == false)
return;
// Make sure the file state cache is enabled
FileStateCache fsTable = getStateCache();
if ( fsTable == null)
return;
// Find the file state for the root folder
FileState rootState = fsTable.findFileState( FileName.DOS_SEPERATOR_STR, true);
if ( rootState != null)
{
// DEBUG
if ( logger.isDebugEnabled())
logger.debug("Queueing new store " + storeName + " for addition to virtualization view");
// Add the new store name to the list to be picked up by the next file server access
// to the filesystem
synchronized ( m_newStoresLock) {
// Add the new store name
m_newStores.addString( storeName);
}
}
}
/**
* Purge store call back handler
*
* @param storeName String
*/
public void storePurged(String storeName)
{
// Not interested if the virtualization view is not enabled
if ( isVirtualizationView() == false)
return;
// Make sure the file state cache is enabled
FileStateCache fsTable = getStateCache();
if ( fsTable == null)
return;
// Find the file state for the root folder
FileState rootState = fsTable.findFileState( FileName.DOS_SEPERATOR_STR);
if ( rootState != null && rootState.hasPseudoFiles())
{
// Remove the pseudo folder for the store
rootState.getPseudoFileList().removeFile( storeName, false);
// Build the filesystem relative path to the deleted store folder
StringBuilder pathStr = new StringBuilder();
pathStr.append( FileName.DOS_SEPERATOR);
pathStr.append( storeName);
// Remove the file state for the deleted store
String storePath = pathStr.toString();
fsTable.removeFileState( storePath);
// DEBUG
if ( logger.isDebugEnabled())
logger.debug( "Removed pseudo folder for purged store " + storeName);
// Update the file state modify time
rootState.updateModifyDateTime();
// Send a change notification for the deleted folder
if ( hasChangeHandler())
{
// Send the change notification
getChangeHandler().notifyDirectoryChanged(NotifyChange.ActionRemoved, storePath);
}
}
}
/**
* Create version call back handler
*
* @param storeName String
* @param versionID int
*/
public void versionCreated(String storeName, int versionID)
{
// Not interested if the virtualization view is not enabled
if ( isVirtualizationView() == false)
return;
// Make sure the file state cache is enabled
FileStateCache fsTable = getStateCache();
if ( fsTable == null)
return;
// Build the path to the store version folder
StringBuilder pathStr = new StringBuilder();
pathStr.append( FileName.DOS_SEPERATOR);
pathStr.append( storeName);
pathStr.append( FileName.DOS_SEPERATOR);
pathStr.append( AVMPath.VersionsFolder);
// Find the file state for the store versions folder
FileState verState = fsTable.findFileState( pathStr.toString());
if ( verState != null)
{
// Create the version folder name
StringBuilder verStr = new StringBuilder();
verStr.append( AVMPath.VersionFolderPrefix);
verStr.append( versionID);
String verName = verStr.toString();
// Add a pseudo folder for the new version
pathStr.append( FileName.DOS_SEPERATOR);
pathStr.append( verName);
verState.addPseudoFile( new VersionPseudoFile( verName, pathStr.toString()));
// DEBUG
if ( logger.isDebugEnabled())
logger.debug( "Added pseudo folder for new version " + storeName + ":/" + verName);
// Send a change notification for the new folder
if ( hasChangeHandler())
{
// Build the filesystem relative path to the new version folder
pathStr.append( FileName.DOS_SEPERATOR);
pathStr.append( verName);
// Send the change notification
getChangeHandler().notifyDirectoryChanged(NotifyChange.ActionAdded, pathStr.toString());
}
}
}
/**
* Purge version call back handler
*
* @param storeName String
*/
public void versionPurged(String storeName, int versionID)
{
// Not interested if the virtualization view is not enabled
if ( isVirtualizationView() == false)
return;
// Make sure the file state cache is enabled
FileStateCache fsTable = getStateCache();
if ( fsTable == null)
return;
// Build the path to the store version folder
StringBuilder pathStr = new StringBuilder();
pathStr.append( FileName.DOS_SEPERATOR);
pathStr.append( storeName);
pathStr.append( FileName.DOS_SEPERATOR);
pathStr.append( AVMPath.VersionsFolder);
// Find the file state for the store versions folder
FileState verState = fsTable.findFileState( pathStr.toString());
if ( verState != null && verState.hasPseudoFiles())
{
// Create the version folder name
StringBuilder verStr = new StringBuilder();
verStr.append( AVMPath.VersionFolderPrefix);
verStr.append( versionID);
String verName = verStr.toString();
// Remove the pseudo folder for the purged version
verState.getPseudoFileList().removeFile( verName, true);
// DEBUG
if ( logger.isDebugEnabled())
logger.debug( "Removed pseudo folder for purged version " + storeName + ":/" + verName);
// Send a change notification for the deleted folder
if ( hasChangeHandler())
{
// Build the filesystem relative path to the deleted version folder
pathStr.append( FileName.DOS_SEPERATOR);
pathStr.append( verName);
// Send the change notification
getChangeHandler().notifyDirectoryChanged(NotifyChange.ActionRemoved, pathStr.toString());
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,565 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.filesys.avm;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.filesys.alfresco.AlfrescoNetworkFile;
import org.alfresco.jlan.server.filesys.AccessDeniedException;
import org.alfresco.jlan.server.filesys.DiskFullException;
import org.alfresco.jlan.server.filesys.FileAttribute;
import org.alfresco.jlan.server.filesys.NetworkFile;
import org.alfresco.jlan.smb.SeekType;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.avm.AVMNodeConverter;
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
import org.alfresco.repo.transaction.RetryingTransactionHelper;
import org.alfresco.repo.transaction.TransactionListenerAdapter;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.repository.ContentData;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.usage.ContentQuotaException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* AVM Network File Class
*
* <p>Holds the details of an open file, and provides access to the file data.
*
* @author GKSpencer
*/
public class AVMNetworkFile extends AlfrescoNetworkFile {
// Logging
private static final Log logger = LogFactory.getLog(AVMNetworkFile.class);
// Node Service
private NodeService m_nodeService;
// AVM service
private AVMService m_avmService;
// AVM path to the file/folder and store version
private String m_avmPath;
private int m_avmVersion;
// Flag to indicate if the file has been modified
private boolean m_modified;
// Access to the file data, flag to indicate if the file channel is writable
private FileChannel m_channel;
private ContentWriter m_content;
private boolean m_writable;
// Mime type, if a writer is opened
private String m_mimeType;
/**
* Class constructor
*
* @param details AVMNodeDescriptor
* @param avmPath String
* @param avmVersion int
* @param nodeService NodeService
* @param avmService AVMService
*/
public AVMNetworkFile( AVMNodeDescriptor details, String avmPath, int avmVersion, NodeService nodeService, AVMService avmService)
{
super( details.getName());
// Save the service, apth and version
m_nodeService = nodeService;
m_avmService = avmService;
m_avmPath = avmPath;
m_avmVersion = avmVersion;
// Copy the file details
setAccessDate( details.getAccessDate());
setCreationDate( details.getCreateDate());
setModifyDate( details.getModDate());
if ( details.isFile())
setFileSize( details.getLength());
else
setFileSize( 0L);
int attr = 0;
if ( details.isDirectory())
attr += FileAttribute.Directory;
if ( avmVersion != AVMContext.VERSION_HEAD)
attr += FileAttribute.ReadOnly;
setAttributes( attr);
}
/**
* Check if there is an open file channel to the content
*
* @return boolean
*/
public final boolean hasContentChannel()
{
return m_channel != null ? true : false;
}
/**
* Return the mime type
*
* @return String
*/
public final String getMimeType()
{
return m_mimeType;
}
/**
* Set the mime type
*
* @param mimeType String
*/
public final void setMimeType(String mimeType)
{
m_mimeType = mimeType;
}
/**
* Open the file
*
* @param createFlag boolean
* @exception IOException
*/
public void openFile(boolean createFlag)
throws IOException
{
// Nothing to do, content is opened on first read/write
}
/**
* Read from the file.
*
* @param buf byte[]
* @param len int
* @param pos int
* @param fileOff long
* @return Length of data read.
* @exception IOException
*/
public int readFile(byte[] buf, int len, int pos, long fileOff)
throws java.io.IOException
{
// DEBUG
if ( logger.isDebugEnabled())
logger.debug("Read file " + getName() + ", len=" + len + ", offset=" + fileOff);
// Open the channel for reading
openContent(false, false);
// Read from the channel
ByteBuffer byteBuffer = ByteBuffer.wrap(buf, pos, len);
int count = m_channel.read(byteBuffer, fileOff);
if (count < 0)
{
// Return a zero count at end of file
count = 0;
}
// Return the length of data read
return count;
}
/**
* Write a block of data to the file.
*
* @param buf byte[]
* @param len int
* @param pos int
* @param fileOff long
* @exception IOException
*/
public void writeFile(byte[] buf, int len, int pos, long fileOff)
throws java.io.IOException
{
// DEBUG
if ( logger.isDebugEnabled())
logger.debug("Write file " + getName() + ", len=" + len + ", offset=" + fileOff);
// Open the channel for writing
openContent(true, false);
// Write to the channel
ByteBuffer byteBuffer = ByteBuffer.wrap(buf, pos, len);
m_channel.write(byteBuffer, fileOff);
// Set modification flag
m_modified = true;
incrementWriteCount();
// Update the current file size
setFileSize( m_channel.size());
}
/**
* Seek to the specified file position.
*
* @param pos long
* @param typ int
* @return int
* @exception IOException
*/
public long seekFile(long pos, int typ)
throws IOException
{
// Open the file, if not already open
openContent( false, false);
// Check if the current file position is the required file position
long curPos = m_channel.position();
switch (typ) {
// From start of file
case SeekType.StartOfFile :
if (curPos != pos)
m_channel.position( pos);
break;
// From current position
case SeekType.CurrentPos :
m_channel.position( curPos + pos);
break;
// From end of file
case SeekType.EndOfFile :
{
long newPos = m_channel.size() + pos;
m_channel.position(newPos);
}
break;
}
// Return the new file position
return m_channel.position();
}
/**
* Flush any buffered output to the file
*
* @throws IOException
*/
public void flushFile()
throws IOException
{
// If the file channel is open for write then flush the channel
if ( m_channel != null && m_writable)
m_channel.force( false);
}
/**
* Truncate the file to the specified file size
*
* @param siz long
* @exception IOException
*/
public void truncateFile(long siz)
throws IOException
{
// DEBUG
if ( logger.isDebugEnabled())
logger.debug("Truncate file " + getName() + ", size=" + siz);
// If the content data channel has not been opened yet and the requested size is zero
// then this is an open for overwrite so the existing content data is not copied
if ( m_channel == null && siz == 0L)
{
// Open content for overwrite, no need to copy existing content data
openContent(true, true);
}
else
{
// Normal open for write
openContent(true, false);
// Truncate or extend the channel
m_channel.truncate(siz);
}
// Set modification flag
m_modified = true;
incrementWriteCount();
}
/**
* Close the database file
*/
public void closeFile()
throws IOException
{
// If the file is a directory or the file channel has not been opened then there is nothing to do
if ( isDirectory() || m_channel == null && m_content == null)
return;
// We may be in a retry block, in which case this section will already have executed and channel will be null
if (m_channel != null)
{
// Close the file channel
try
{
m_channel.close();
m_channel = null;
}
catch ( IOException ex)
{
if (RetryingTransactionHelper.extractRetryCause(ex) != null)
{
throw ex;
}
logger.error("Failed to close file channel for " + getName(), ex);
}
}
if (m_content != null)
{
// Retrieve the content data and stop the content URL from being 'eagerly deleted', in case we need to
// retry the transaction
final ContentData contentData = m_content.getContentData();
try
{
NodeRef nodeRef = AVMNodeConverter.ToNodeRef(-1, m_avmPath);
m_nodeService.setProperty(nodeRef, ContentModel.PROP_CONTENT, contentData);
}
catch (ContentQuotaException qe)
{
throw new DiskFullException(qe.getMessage());
}
// Tidy up after ourselves after a successful commit. Otherwise leave things to allow a
AlfrescoTransactionSupport.bindListener(new TransactionListenerAdapter()
{
@Override
public void afterCommit()
{
m_content = null;
}
});
}
}
/**
* Open a file channel to the file content, switching to a writable file channel if required.
*
* @param write boolean
* @param trunc boolean
* @throws AccessDeniedException If this network file is read only
* @throws AlfrescoRuntimeException If this network file represents a directory
*/
private void openContent(boolean write, boolean trunc)
throws AccessDeniedException, AlfrescoRuntimeException
{
// Check if this network file is a directory, no content to open
if ( isDirectory())
throw new AlfrescoRuntimeException("Unable to open channel for a directory network file: " + this);
// Check if write access is required and the current channel is read-only
long curPos = 0L;
if ( write && m_writable == false && m_channel != null)
{
// Close the existing read-only channel
try
{
// Save the current file position
curPos = m_channel.position();
// Close the read-only file channel
m_channel.close();
m_channel = null;
}
catch (IOException ex)
{
logger.error("Error closing read-only channel", ex);
}
// Debug
if ( logger.isDebugEnabled())
logger.debug("Switching to writable channel for " + getName());
}
else if ( m_channel != null)
{
// File channel already open
return;
}
// We need to create the channel
if (write && getGrantedAccess() <= NetworkFile.READONLY)
throw new AccessDeniedException("The network file was created for read-only: " + this);
// Access the content data and get a file channel to the data
if ( write )
{
// Access the content data for write
m_content = null;
try {
// Create a writer to access the file data
m_content = m_avmService.getContentWriter(m_avmPath, false);
// Set the mime-type
m_content.setMimetype( getMimeType());
}
catch (Exception ex) {
logger.debug( ex);
ex.printStackTrace();
// Rethrow exception, convert to access denied
throw new AccessDeniedException("Failed to open file for write access, " + m_avmPath);
}
// Indicate that we have a writable channel to the file
m_writable = true;
// Get the writable channel, do not copy existing content data if the file is to be truncated
m_channel = m_content.getFileChannel( trunc);
// Reset the file position to match the read-only file channel position, unless we truncated the file
if ( curPos != 0L && trunc == false)
{
try
{
m_channel.position( curPos);
}
catch (IOException ex)
{
logger.error("Failed to set file position for " + getName(), ex);
}
}
}
else
{
// Access the content data for read
ContentReader cReader = m_avmService.getContentReader( m_avmVersion, m_avmPath);
// Indicate that we only have a read-only channel to the data
m_writable = false;
// Get the read-only channel
m_channel = cReader.getFileChannel();
}
}
/**
* Return the writable state of the content channel
*
* @return boolean
*/
public final boolean isWritable()
{
return m_writable;
}
/**
* Return the network file details as a string
*
* @return String
*/
public String toString()
{
StringBuilder str = new StringBuilder();
str.append( "[");
str.append( getName());
str.append( ":");
str.append( isDirectory() ? "Dir," : "File,");
str.append( getFileSize());
str.append( "-Channel=");
str.append( m_channel);
str.append( m_writable ? ",Write" : ",Read");
str.append( m_modified ? ",Modified" : "");
str.append( "]");
return str.toString();
}
}

View File

@@ -1,727 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.filesys.avm;
import org.alfresco.jlan.server.filesys.FileName;
/**
* AVM Path Class
*
* <p>Parses a share relative path into store, version and remaining path values.
*
* @author gkspencer
*/
public class AVMPath {
// Constants
//
// Invalid version id value
private static final int InvalidVersionId = -2;
// Version id string for the head version
public static final String VersionNameHead = "HEAD";
// Folder name for the versions folder
public static final String VersionsFolder = "VERSION";
// Head and version sub-folders
public static final String DataFolder = "DATA";
public static final String MetaDataFolder = "METADATA";
// Version folder prefix
public static final String VersionFolderPrefix = "v";
// AVM path seperator
public static final char AVM_SEPERATOR = '/';
public static final String AVM_SEPERATOR_STR = "/";
// Level identifiers
public enum LevelId { Invalid, Root, StoreRoot, Head, HeadData, HeadMetaData, VersionRoot, Version, VersionData, VersionMetaData, StoreRootPath, StorePath };
// Level identifier for this path
private LevelId m_levelId = LevelId.Invalid;
// Store name
private String m_storeName;
// Version id
private int m_version = InvalidVersionId;
// Remaining path
private String m_path;
// AVM style path
private String m_avmPath;
// Path is read-only access
private boolean m_readOnly;
/**
* Default constructor
*/
public AVMPath()
{
}
/**
* Class constructor
*
* <p>Construct an AVM path for the virtualization view, with store and version folders
*
* @param shrPath String
*/
public AVMPath(String shrPath)
{
// Parse the path
parsePath( shrPath);
}
/**
* Class constructor
*
* <p>Construct an AVM path for a standard view onto a store/version
*
* @param storeName String
* @param version int
* @param path String
*/
public AVMPath(String storeName, int version, String path)
{
// Parse the path
parsePath( storeName, version, path);
}
/**
* Return the level id for the path
*
* @return LevelId
*/
public LevelId isLevel()
{
return m_levelId;
}
/**
* Check if the path is read-only
*
* @return boolean
*/
public final boolean isReadOnlyAccess() {
return m_readOnly;
}
/**
* Return the store name
*
* @return String
*/
public final String getStoreName()
{
return m_storeName;
}
/**
* Check if the version id was specified in the path
*
* @return boolean
*/
public final boolean hasVersion()
{
return m_version != InvalidVersionId ? true : false;
}
/**
* Return the version id
*
* @return int
*/
public final int getVersion()
{
return m_version;
}
/**
* Return the version as a string
*
* @return String
*/
public final String getVersionString()
{
if ( m_version == -1)
return VersionNameHead;
return "" + m_version;
}
/**
* Check if there is a share relative path
*
* @return boolean
*/
public final boolean hasRelativePath()
{
return m_path != null ? true : false;
}
/**
* Return the share relative path
*
* @return String
*/
public final String getRelativePath()
{
return m_path;
}
/**
* Return the AVM style path, in <store>:/<path> format
*
* @return String
*/
public final String getAVMPath()
{
return m_avmPath;
}
/**
* Check if the path is valid
*
* @return boolean
*/
public final boolean isValid()
{
return m_levelId == LevelId.Invalid ? false : true;
}
/**
* Check if the path is to a pseudo folder in the virtualization view
*
* @return boolean
*/
public final boolean isPseudoPath()
{
return m_levelId == LevelId.Invalid || m_levelId == LevelId.StorePath || m_levelId == LevelId.StoreRootPath ? false : true;
}
/**
* Check if hte path is a read-only part of the pseudo folder tree
*
* @return boolean
*/
public final boolean isReadOnlyPseudoPath()
{
if ( isLevel() == LevelId.Root || isLevel() == LevelId.StoreRoot || isLevel() == LevelId.VersionRoot ||
isLevel() == LevelId.Head || isLevel() == LevelId.Version)
return true;
return false;
}
/**
* Check if the path is the root path
*
* @return boolean
*/
public final boolean isRootPath()
{
return m_levelId == LevelId.Root ? true : false;
}
/**
* Parse the path, for the virtualization view onto all stores/versions
*
* @param path String
*/
public final void parsePath( String path)
{
// Clear current settings
m_storeName = null;
m_version = InvalidVersionId;
m_path = null;
m_avmPath = null;
// Split the path
String[] paths = FileName.splitAllPaths(path);
if ( paths == null || paths.length == 0)
{
m_path = FileName.DOS_SEPERATOR_STR;
m_levelId = LevelId.Root;
return;
}
// Set the store name
m_storeName = paths[0];
m_levelId = LevelId.StoreRoot;
if ( paths.length > 1)
{
// Validate the next element, should be either the HEAD or VERSIONS folder
String levelStr = paths[1];
if ( levelStr.equalsIgnoreCase( VersionNameHead))
{
m_version = -1;
m_levelId = LevelId.Head;
}
else if ( levelStr.equalsIgnoreCase( VersionsFolder))
{
m_levelId = LevelId.VersionRoot;
}
else
{
// Invalid folder at the current level
m_levelId = LevelId.Invalid;
return;
}
// Check the next level, if available
if ( paths.length > 2)
{
// If the previous level is the versions root then the next level should be a
// version id folder
String folderName = paths[2];
int pathIdx = 3;
if ( isLevel() == LevelId.VersionRoot)
{
// Check that the folder name starts with the version folder prefix
if ( folderName != null && folderName.startsWith( VersionFolderPrefix) &&
folderName.length() > VersionFolderPrefix.length())
{
try
{
// Parse the version id
m_version = Integer.parseInt( folderName.substring( VersionFolderPrefix.length()));
m_levelId = LevelId.Version;
// Validate the version id
if ( m_version < -1)
{
// Invalid version id
m_levelId = LevelId.Invalid;
return;
}
}
catch ( NumberFormatException ex)
{
m_levelId = LevelId.Invalid;
return;
}
// Check for the next level
if ( paths.length > 3)
{
// Get the next level name
folderName = paths[3];
pathIdx++;
// Check for the data folder
if ( folderName.equalsIgnoreCase( DataFolder))
{
m_levelId = LevelId.VersionData;
// Set the path to the root of the store
m_path = FileName.DOS_SEPERATOR_STR;
}
else if ( folderName.equalsIgnoreCase( MetaDataFolder))
{
m_levelId = LevelId.VersionMetaData;
// Set the path to the root of the metadata
m_path = FileName.DOS_SEPERATOR_STR;
}
else
{
m_levelId = LevelId.Invalid;
return;
}
}
}
else
{
m_levelId = LevelId.Invalid;
return;
}
}
// If the previous level is head the next level should be the data or metadata folder
else if ( isLevel() == LevelId.Head)
{
// Check for the data folder
if ( folderName.equalsIgnoreCase( DataFolder))
{
m_levelId = LevelId.HeadData;
// Set the path to the root of the store
m_path = FileName.DOS_SEPERATOR_STR;
}
else if ( folderName.equalsIgnoreCase( MetaDataFolder))
{
m_levelId = LevelId.HeadMetaData;
// Set the path to the root of the metadata
m_path = FileName.DOS_SEPERATOR_STR;
}
else
{
m_levelId = LevelId.Invalid;
return;
}
}
// If there are remaining paths then build a relative path
if ( paths.length > pathIdx)
{
StringBuilder pathStr = new StringBuilder();
for ( int i = pathIdx; i < paths.length; i++)
{
pathStr.append( FileName.DOS_SEPERATOR);
pathStr.append( paths[i]);
}
m_path = pathStr.toString();
// ALF-1719: make "www" and "avm_webapps" read only by setting their level to
// StoreRootPath (which is checked in AVMDiskDriver.checkPathAccess).
String lastPath = paths[paths.length-1].toLowerCase();
if(lastPath.equals("www") || lastPath.equals("avm_webapps"))
{
// Set the level to indicate a store root path i.e. "www",
// "avm_webapps"
m_levelId = LevelId.StoreRootPath;
}
else
{
// Set the level to indicate a store relative path
m_levelId = LevelId.StorePath;
}
}
// Build the AVM path, in <store>:/<path> format
if ( m_path != null)
{
StringBuilder pathStr = new StringBuilder();
pathStr.append( m_storeName);
pathStr.append( ":");
pathStr.append( m_path.replace( FileName.DOS_SEPERATOR, AVM_SEPERATOR));
m_avmPath = pathStr.toString();
}
}
}
}
/**
* Parse the path, to generate a path for a single store/version
*
* @param storeName String
* @param version int
* @param path String
*/
public final void parsePath( String storeName, int version, String path)
{
// Clear current settings
m_levelId = LevelId.Invalid;
m_storeName = null;
m_version = InvalidVersionId;
m_path = null;
m_avmPath = null;
// Set the store/version
m_storeName = storeName;
m_version = version;
// Save the relative path
m_path = path;
// Build the store path
StringBuilder avmPath = new StringBuilder();
avmPath.append( m_storeName);
if ( storeName.indexOf( ":") == -1)
avmPath.append( ":");
if ( path == null || path.length() == 0)
{
avmPath.append( AVM_SEPERATOR);
// Set the share relative path as the root path
m_path = FileName.DOS_SEPERATOR_STR;
}
else
{
if ( path.startsWith( FileName.DOS_SEPERATOR_STR) == false)
avmPath.append( AVM_SEPERATOR);
avmPath.append( path.replace( FileName.DOS_SEPERATOR, AVM_SEPERATOR));
}
m_avmPath = avmPath.toString();
// Indicate that the path is to a store relative path
String lowerPath = path.toLowerCase();
String[] paths = FileName.splitAllPaths(lowerPath);
if(paths[paths.length - 1].equals("www") || paths[paths.length - 1].equals("avm_webapps"))
{
// Set the level to indicate a store root path i.e. "www",
// "avm_webapps"
m_levelId = LevelId.StoreRootPath;
}
else
{
m_levelId = LevelId.StorePath;
}
}
/**
* Generate a file id for the path
*
* @return int
*/
public final int generateFileId()
{
// Check if the path is a store path or pseudo path
int fid = -1;
if ( isLevel() == LevelId.StorePath || isLevel() == LevelId.StoreRootPath)
{
// Use the share relative path to generate the file id
fid = getRelativePath().hashCode();
}
else if ( isPseudoPath())
{
// Create a relative path to the pseudo folder
StringBuilder relStr = new StringBuilder();
relStr.append( FileName.DOS_SEPERATOR);
switch( isLevel())
{
case StoreRoot:
relStr.append( getStoreName());
break;
case Head:
relStr.append( getStoreName());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionNameHead);
break;
case HeadData:
relStr.append( getStoreName());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionNameHead);
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.DataFolder);
break;
case HeadMetaData:
relStr.append( getStoreName());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionNameHead);
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.MetaDataFolder);
break;
case VersionRoot:
relStr.append( getStoreName());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionsFolder);
break;
case Version:
relStr.append( getStoreName());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionsFolder);
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionFolderPrefix);
relStr.append( getVersion());
break;
case VersionData:
relStr.append( getStoreName());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionsFolder);
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionFolderPrefix);
relStr.append( getVersion());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.DataFolder);
break;
case VersionMetaData:
relStr.append( getStoreName());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionsFolder);
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.VersionFolderPrefix);
relStr.append( getVersion());
relStr.append( FileName.DOS_SEPERATOR);
relStr.append( AVMPath.MetaDataFolder);
break;
}
// Generate the file id using the pseudo folder relative path
fid = relStr.toString().hashCode();
}
// Return the file id
return fid;
}
/**
* Set the path access, true for read-only access
*
* @param access boolean
*/
public final void setReadOnlyAccess( boolean readOnly)
{
m_readOnly = readOnly;
}
/**
* Return the AVM path details as a string
*
* @return String
*/
public String toString()
{
StringBuilder str = new StringBuilder();
switch ( m_levelId)
{
case Invalid:
str.append("[Invalid");
break;
case Root:
str.append("[Root");
break;
case StoreRoot:
str.append("[StoresRoot");
break;
case Head:
str.append("[");
str.append(getStoreName());
str.append(":HEAD");
break;
case HeadData:
str.append("[");
str.append(getStoreName());
str.append(":HEAD\\");
str.append( DataFolder);
break;
case HeadMetaData:
str.append("[");
str.append(getStoreName());
str.append(":HEAD\\");
str.append( MetaDataFolder);
break;
case VersionRoot:
str.append("[");
str.append(getStoreName());
str.append(":Versions");
break;
case Version:
str.append("[");
str.append(getStoreName());
str.append(":");
str.append(VersionFolderPrefix);
str.append(getVersion());
break;
case VersionData:
str.append("[");
str.append(getStoreName());
str.append(":");
str.append(VersionFolderPrefix);
str.append(getVersion());
str.append("\\");
str.append( DataFolder);
break;
case VersionMetaData:
str.append("[");
str.append(getStoreName());
str.append(":");
str.append(VersionFolderPrefix);
str.append(getVersion());
str.append("\\");
str.append( MetaDataFolder);
break;
case StoreRootPath:
case StorePath:
str.append("[");
str.append(getStoreName());
str.append(":");
str.append(VersionFolderPrefix);
str.append(getVersion());
str.append(",");
str.append(getRelativePath());
str.append(":");
str.append(getAVMPath());
break;
}
if ( isReadOnlyAccess())
str.append("-ReadOnly");
str.append("]");
return str.toString();
}
}

View File

@@ -1,324 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.filesys.avm;
import org.alfresco.jlan.server.filesys.FileAttribute;
import org.alfresco.jlan.server.filesys.FileInfo;
import org.alfresco.jlan.server.filesys.FileName;
import org.alfresco.jlan.server.filesys.SearchContext;
import org.alfresco.jlan.util.WildCard;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
/**
* AVM Filesystem Search Context Class
*
* <p>Contains the details of a wildcard folder search.
*
* @author GKSpencer
*/
public class AVMSearchContext extends SearchContext {
// File list and current index
private AVMNodeDescriptor[] m_fileList;
private int m_fileIdx;
// File attributes
private int m_attrib;
// Optional wildcard filter
private WildCard m_filter;
// Relative path to the parent folder being searched
private String m_parentPath;
// Mark all files/folders as read-only
private boolean m_readOnly;
/**
* Class constructor
*
* @param fileList SortedMap<String, AVMNodeDescriptor>
* @param attrib int
* @param filter WildCard
* @param parentPath String
* @param readOnly boolean
*/
public AVMSearchContext( AVMNodeDescriptor[] fileList, int attrib, WildCard filter, String parentPath, boolean readOnly)
{
m_attrib = attrib;
m_filter = filter;
m_fileList = fileList;
m_parentPath = parentPath;
if ( m_parentPath != null && m_parentPath.endsWith( FileName.DOS_SEPERATOR_STR) == false)
m_parentPath = m_parentPath + FileName.DOS_SEPERATOR_STR;
m_readOnly = readOnly;
}
/**
* Determine if there are more files for the active search.
*
* @return boolean
*/
public boolean hasMoreFiles()
{
return m_fileIdx < m_fileList.length ? true : false;
}
/**
* Return file information for the next file in the active search. Returns false if the search
* is complete.
*
* @param info FileInfo to return the file information.
* @return true if the file information is valid, else false
*/
public boolean nextFileInfo(FileInfo info)
{
// Check if there is another file record to return
if ( m_fileIdx >= m_fileList.length)
return false;
// Search for the next valid file
boolean foundMatch = false;
AVMNodeDescriptor curFile = null;
while (foundMatch == false && m_fileIdx < m_fileList.length)
{
// Get the next file from the list
curFile = m_fileList[ m_fileIdx++];
// Check if the file name matches the search pattern
if ( m_filter.matchesPattern(curFile.getName()) == true)
{
// Check if the file matches the search attributes
if (FileAttribute.hasAttribute(m_attrib, FileAttribute.Directory) &&
curFile.isDirectory())
{
// Found a match
foundMatch = true;
}
else if ( curFile.isFile())
{
// Found a match
foundMatch = true;
}
// Check if we found a match
if ( foundMatch == false)
{
// Get the next file from the list
if ( ++m_fileIdx < m_fileList.length)
curFile = m_fileList[ m_fileIdx];
}
}
}
// If we found a match then fill in the file information
if ( foundMatch)
{
// Fill in the file information
info.setFileName( curFile.getName());
if ( curFile.isFile())
{
info.setFileSize( curFile.getLength());
info.setAllocationSize((curFile.getLength() + 512L) & 0xFFFFFFFFFFFFFE00L);
}
else
info.setFileSize( 0L);
info.setAccessDateTime( curFile.getAccessDate());
info.setCreationDateTime( curFile.getCreateDate());
info.setModifyDateTime( curFile.getModDate());
// Build the file attributes
int attr = 0;
if ( curFile.isDirectory())
attr += FileAttribute.Directory;
if ( curFile.getName().startsWith( ".") ||
curFile.getName().equalsIgnoreCase( "Desktop.ini") ||
curFile.getName().equalsIgnoreCase( "Thumbs.db"))
attr += FileAttribute.Hidden;
if ( isReadOnly())
attr += FileAttribute.ReadOnly;
if ( attr == 0)
attr = FileAttribute.NTNormal;
info.setFileAttributes( attr);
// Generate a file id for the current file
StringBuilder pathStr = new StringBuilder( m_parentPath);
pathStr.append ( curFile.getName());
info.setFileId( pathStr.toString().hashCode());
}
// Indicate if the file information is valid
return foundMatch;
}
/**
* Return the file name of the next file in the active search. Returns null is the search is
* complete.
*
* @return String
*/
public String nextFileName()
{
// Check if there is another file record to return
// Find the next matching file name
while ( m_fileIdx < m_fileList.length) {
// Check if the current file name matches the search pattern
String fname = m_fileList[m_fileIdx++].getName();
if ( m_filter.matchesPattern(fname))
return fname;
}
// No more matching file names
return null;
}
/**
* Return the total number of file entries for this search if known, else return -1
*
* @return int
*/
public int numberOfEntries()
{
return m_fileList.length;
}
/**
* Return the resume id for the current file/directory in the search.
*
* @return int
*/
public int getResumeId()
{
return m_fileIdx;
}
/**
* Restart a search at the specified resume point.
*
* @param resumeId Resume point id.
* @return true if the search can be restarted, else false.
*/
public boolean restartAt(int resumeId)
{
// Range check the resume id
int resId = resumeId - 1;
if ( resId < 0 || resId >= m_fileList.length)
return false;
// Reset the current file index
m_fileIdx = resId;
return true;
}
/**
* Restart the current search at the specified file.
*
* @param info File to restart the search at.
* @return true if the search can be restarted, else false.
*/
public boolean restartAt(FileInfo info)
{
// Search backwards from the current file
int curFileIdx = m_fileIdx;
if (m_fileIdx >= m_fileList.length)
{
m_fileIdx = m_fileList.length - 1;
}
while ( m_fileIdx > 0) {
// Check if the current file is the required search restart point
if ( m_fileList[ m_fileIdx].getName().equals( info.getFileName()))
return true;
else
m_fileIdx--;
}
// Failed to find the restart file
m_fileIdx = curFileIdx;
return false;
}
/**
* Check if all files/folders returned by the search should be marked as read-only
*
* @return boolean
*/
public final boolean isReadOnly()
{
return m_readOnly;
}
/**
* Set all files/folders returned by the search as read-only
*
* @param readOnly boolean
*/
public final void setReadOnly( boolean readOnly)
{
m_readOnly = readOnly;
}
}

View File

@@ -1,393 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.filesys.avm;
import java.util.Enumeration;
import org.springframework.extensions.config.ConfigElement;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.filesys.config.ServerConfigurationBean;
import org.alfresco.jlan.server.SrvSession;
import org.alfresco.jlan.server.config.InvalidConfigurationException;
import org.alfresco.jlan.server.config.ServerConfiguration;
import org.alfresco.jlan.server.core.InvalidDeviceInterfaceException;
import org.alfresco.jlan.server.core.ShareMapper;
import org.alfresco.jlan.server.core.ShareType;
import org.alfresco.jlan.server.core.SharedDevice;
import org.alfresco.jlan.server.core.SharedDeviceList;
import org.alfresco.jlan.server.filesys.DiskSharedDevice;
import org.alfresco.jlan.server.filesys.FilesystemsConfigSection;
import org.alfresco.jlan.util.StringList;
import org.alfresco.service.cmr.avm.AVMNotFoundException;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.avm.AVMWrongTypeException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
/**
* AVM Filesystem Share Mapper Class
*
* <p>Provides access to store versions using the share name '<storename>_<version>'.
*
* @author gkspencer
*/
public class AVMShareMapper implements ShareMapper, InitializingBean {
// Logging
private static final Log logger = LogFactory.getLog("org.alfresco.smb.protocol");
// Regular expression to test for AVM versioned share name
private static final String AVM_SHAREPATTERN = "[a-zA-Z0-9-]*_[0-9]+";
// Server configuration
private ServerConfiguration m_config;
private FilesystemsConfigSection m_filesysConfig;
// List of available AVM shares
private StringList m_avmShareNames;
// Filesystem driver to be used to create home shares
private AVMDiskDriver m_driver;
// Debug enable flag
private boolean m_debug;
/**
* Default constructor
*/
public AVMShareMapper()
{
}
public void setServerConfiguration(ServerConfiguration config)
{
this.m_config = config;
}
public void setDebug(boolean debug)
{
this.m_debug = debug;
}
/**
* Initialize the share mapper
*
* @param config ServerConfiguration
* @param params ConfigElement
* @exception InvalidConfigurationException
*/
public void initializeMapper(ServerConfiguration config, ConfigElement params) throws InvalidConfigurationException
{
// Save the server configuration
setServerConfiguration(config);
// Check if debug is enabled
if (params != null && params.getChild("debug") != null)
setDebug(true);
// Complete the initialization
afterPropertiesSet();
}
public void afterPropertiesSet()
{
// Save the server configuration
m_filesysConfig = (FilesystemsConfigSection) m_config.getConfigSection(FilesystemsConfigSection.SectionName);
// Build the list of available AVM share names
m_avmShareNames = new StringList();
SharedDeviceList shrList = m_filesysConfig.getShares();
Enumeration<SharedDevice> shrEnum = shrList.enumerateShares();
while ( shrEnum.hasMoreElements())
{
// Get the current shared device and check if it is an AVM filesystem device
SharedDevice curShare = shrEnum.nextElement();
try
{
if ( curShare.getInterface() instanceof AVMDiskDriver)
{
// Add the shared filesystem name to the list of AVM shares
m_avmShareNames.addString( curShare.getName());
// Set the AVM filesystem driver to be used when creating dynamic shares
if ( m_driver == null)
m_driver = (AVMDiskDriver) curShare.getInterface();
}
}
catch ( InvalidDeviceInterfaceException ex)
{
}
}
}
/**
* Check if debug output is enabled
*
* @return boolean
*/
public final boolean hasDebug()
{
return m_debug;
}
/**
* Return the list of available shares.
*
* @param host String
* @param sess SrvSession
* @param allShares boolean
* @return SharedDeviceList
*/
public SharedDeviceList getShareList(String host, SrvSession sess, boolean allShares)
{
// Make a copy of the global share list and add the per session dynamic shares
SharedDeviceList shrList = new SharedDeviceList(m_filesysConfig.getShares());
if ( sess != null && sess.hasDynamicShares()) {
// Add the per session dynamic shares
shrList.addShares(sess.getDynamicShareList());
}
// Remove unavailable shares from the list and return the list
if ( allShares == false)
shrList.removeUnavailableShares();
return shrList;
}
/**
* Find a share using the name and type for the specified client.
*
* @param host String
* @param name String
* @param typ int
* @param sess SrvSession
* @param create boolean
* @return SharedDevice
* @exception InvalidUserException
*/
public SharedDevice findShare(String tohost, String name, int typ, SrvSession sess, boolean create)
throws Exception
{
// Find the required share by name/type. Use a case sensitive search first, if that fails use a case
// insensitive search.
SharedDevice share = m_filesysConfig.getShares().findShare(name, typ, false);
if ( share == null)
{
// Try a case insensitive search for the required share
share = m_filesysConfig.getShares().findShare(name, typ, true);
}
// If the share was not found then check if the share is in the AVM versioned share format - '<storename>_<version>'
if ( share == null && ( typ == ShareType.DISK || typ == ShareType.UNKNOWN))
{
// Check if the share has already been created for the session
if ( sess.hasDynamicShares())
{
// Check if the required share exists in the sessions dynamic share list
share = sess.getDynamicShareList().findShare(name, typ, false);
// DEBUG
if ( logger.isDebugEnabled())
logger.debug(" Reusing existing dynamic share for " + name);
}
// Check if the share name matches the AVM versioned share name pattern
if ( share == null && create == true && name.matches( AVM_SHAREPATTERN))
{
// DEBUG
if ( logger.isDebugEnabled())
logger.debug("Map dynamic share " + name + ", type=" + ShareType.TypeAsString(typ));
// Split the store name and version id from the share name
int pos = name.indexOf( '_');
String storePath = name.substring(0, pos) + ":/";
int storeVersion = -1;
try
{
String storeVer = name.substring( pos + 1);
storeVersion = Integer.parseInt( storeVer);
if ( storeVersion < 0)
storeVersion = -1;
}
catch ( NumberFormatException ex)
{
logger.error( "Invalid store version id, name=" + name);
}
// Create the disk driver and context
if ( storePath.length() > 0 && storeVersion != -1)
{
// Validate the store name and version
AVMService avmService = m_driver.getAvmService();
m_driver.beginReadTransaction( sess);
try
{
// Validate the store name/version
avmService.lookup( storeVersion, storePath);
// Create a dynamic share mapped to the AVM store/version
AVMContext avmCtx = new AVMContext( name, storePath, storeVersion);
if(m_config instanceof ServerConfigurationBean)
{
ServerConfigurationBean config = (ServerConfigurationBean)m_config;
config.initialiseRuntimeContext("cifs.avm" + name, avmCtx);
// Enable file state caching
// diskCtx.enableStateCache(serverConfigurationBean, true);
}
else
{
throw new AlfrescoRuntimeException("configuration error, unknown configuration bean");
}
// Create a dynamic shared device for the store version
DiskSharedDevice diskShare = new DiskSharedDevice( name, m_driver, avmCtx, SharedDevice.Temporary);
// Add the new share to the sessions dynamic share list
sess.addDynamicShare(diskShare);
share = diskShare;
// DEBUG
if (logger.isDebugEnabled())
logger.debug(" Mapped share " + name + " - " + diskShare);
}
catch ( AVMNotFoundException ex)
{
// DEBUG
if ( logger.isDebugEnabled())
logger.debug( "Failed to map share to " + name + ", not such store/version");
}
catch ( AVMWrongTypeException ex)
{
// DEBUG
if ( logger.isDebugEnabled())
logger.debug( "Failed to map share to " + name + ", wrong type");
}
}
}
}
// Check if the share is available
if ( share != null && share.getContext() != null && share.getContext().isAvailable() == false)
share = null;
// Return the shared device, or null if no matching device was found
return share;
}
/**
* Delete temporary shares for the specified session
*
* @param sess SrvSession
*/
public void deleteShares(SrvSession sess)
{
// Check if the session has any dynamic shares
if ( sess.hasDynamicShares() == false)
return;
// Delete the dynamic shares
SharedDeviceList shares = sess.getDynamicShareList();
Enumeration<SharedDevice> enm = shares.enumerateShares();
while ( enm.hasMoreElements()) {
// Get the current share from the list
SharedDevice shr = (SharedDevice) enm.nextElement();
// Close the shared device
shr.getContext().CloseContext();
// DEBUG
if (logger.isDebugEnabled())
logger.debug("Deleted dynamic share " + shr);
}
// Clear the dynamic share list
shares.removeAllShares();
}
/**
* Close the share mapper, release any resources.
*/
public void closeMapper()
{
// TODO Auto-generated method stub
}
}

View File

@@ -1,196 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.filesys.avm;
import org.alfresco.jlan.server.filesys.FileAttribute;
import org.alfresco.jlan.server.filesys.FileInfo;
import org.alfresco.jlan.server.filesys.SearchContext;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
/**
* AVM Filesystem Single File Search Context Class
*
* <p>Contains the details of a non-wildcard file/folder search, where there is only one result to return.
*
* @author GKSpencer
*/
public class AVMSingleFileSearchContext extends SearchContext {
// Details of the single file/folder
private AVMNodeDescriptor m_fileDetails;
// Flag to indicate file details have been returned
private boolean m_endOfSearch;
// Relative path to the file/folder
private String m_relativePath;
// Mark thel file/folder as read-only
private boolean m_readOnly;
/**
* Class constructor
*
* @param fileDetails AVMNodeDescriptor
* @param relPath String
* @param readOnly boolean
*/
public AVMSingleFileSearchContext( AVMNodeDescriptor fileDetails, String relPath, boolean readOnly)
{
m_fileDetails = fileDetails;
m_relativePath = relPath;
m_readOnly = readOnly;
}
/**
* Determine if there are more files for the active search.
*
* @return boolean
*/
public boolean hasMoreFiles()
{
return m_endOfSearch == false ? true : false;
}
/**
* Return file information for the next file in the active search. Returns false if the search
* is complete.
*
* @param info FileInfo to return the file information.
* @return true if the file information is valid, else false
*/
public boolean nextFileInfo(FileInfo info)
{
// Check if the file details have been returned
if ( m_endOfSearch == true)
return false;
// Fill in the file information details
info.setFileName( m_fileDetails.getName());
if ( m_fileDetails.isFile())
{
info.setFileSize( m_fileDetails.getLength());
info.setAllocationSize((m_fileDetails.getLength() + 512L) & 0xFFFFFFFFFFFFFE00L);
}
else
info.setFileSize( 0L);
info.setAccessDateTime( m_fileDetails.getAccessDate());
info.setCreationDateTime( m_fileDetails.getCreateDate());
info.setModifyDateTime( m_fileDetails.getModDate());
// Build the file attributes
int attr = 0;
if ( m_fileDetails.isDirectory())
attr += FileAttribute.Directory;
if ( m_fileDetails.getName().startsWith( ".") ||
m_fileDetails.getName().equalsIgnoreCase( "Desktop.ini") ||
m_fileDetails.getName().equalsIgnoreCase( "Thumbs.db"))
attr += FileAttribute.Hidden;
if ( m_readOnly == true)
attr += FileAttribute.ReadOnly;
info.setFileAttributes( attr);
info.setFileId( m_relativePath.hashCode());
// Set the end of search flag, indicate that the file informatin is valid
m_endOfSearch = true;
return true;
}
/**
* Return the file name of the next file in the active search. Returns null is the search is
* complete.
*
* @return String
*/
public String nextFileName()
{
// Check if the file details have been returned
if ( m_endOfSearch == true)
return null;
// Return the file/folder name, set the end of search flag
m_endOfSearch = true;
return m_fileDetails.getName();
}
/**
* Return the total number of file entries for this search if known, else return -1
*
* @return int
*/
public int numberOfEntries()
{
return 1;
}
/**
* Return the resume id for the current file/directory in the search.
*
* @return int
*/
public int getResumeId()
{
return 1;
}
/**
* Restart a search at the specified resume point.
*
* @param resumeId Resume point id.
* @return true if the search can be restarted, else false.
*/
public boolean restartAt(int resumeId)
{
// Validate the resume id and clear the end of search flag
if ( resumeId == 1)
m_endOfSearch = false;
else
return false;
return true;
}
/**
* Restart the current search at the specified file.
*
* @param info File to restart the search at.
* @return true if the search can be restarted, else false.
*/
public boolean restartAt(FileInfo info)
{
return true;
}
}

View File

@@ -1,91 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.filesys.avm;
import org.alfresco.jlan.server.filesys.FileAttribute;
import org.alfresco.jlan.server.filesys.FileInfo;
import org.alfresco.jlan.server.filesys.FileName;
import org.alfresco.jlan.server.filesys.NetworkFile;
import org.alfresco.jlan.server.filesys.pseudo.PseudoFile;
import org.alfresco.jlan.server.filesys.pseudo.PseudoFolderNetworkFile;
/**
* Dummy Folder Pseudo File Class
*
* <p>Represents a dummy folder within the virtualization filesystem view.
*
* @author gkspencer
*/
public class DummyFolderPseudoFile extends PseudoFile {
/**
* Class constructor
*
* @param fname String
* @param relPath String
*/
public DummyFolderPseudoFile( String fname, String relPath)
{
super( fname, FileAttribute.Directory + FileAttribute.ReadOnly);
// Create static file information from the folder details
FileInfo fInfo = new FileInfo( fname, 0L, FileAttribute.Directory + FileAttribute.ReadOnly);
fInfo.setCreationDateTime( System.currentTimeMillis());
fInfo.setPath( relPath);
fInfo.setFileId( relPath.hashCode());
long timeNow = System.currentTimeMillis();
fInfo.setCreationDateTime( timeNow);
fInfo.setModifyDateTime( timeNow);
fInfo.setAccessDateTime( timeNow);
fInfo.setChangeDateTime( timeNow);
setFileInfo( fInfo);
}
/**
* Return a network file for reading/writing the pseudo file
*
* @param netPath String
* @return NetworkFile
*/
@Override
public NetworkFile getFile(String netPath) {
// Split the path to get the name
String[] paths = FileName.splitPath( netPath);
// Create a network file for the folder
return new PseudoFolderNetworkFile( paths[1], netPath);
}
/**
* Return the file information for the pseudo file
*
* @return FileInfo
*/
@Override
public FileInfo getFileInfo() {
return getInfo();
}
}

View File

@@ -1,296 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.filesys.avm;
import org.alfresco.jlan.server.filesys.FileAttribute;
import org.alfresco.jlan.server.filesys.FileInfo;
import org.alfresco.jlan.server.filesys.SearchContext;
import org.alfresco.jlan.server.filesys.pseudo.PseudoFile;
import org.alfresco.jlan.server.filesys.pseudo.PseudoFileList;
import org.alfresco.jlan.util.WildCard;
/**
* Pseudo File List Search Context Class
*
* <p>Returns files from a pseudo file list for a wildcard search.
*
* @author gkspencer
*/
public class PseudoFileListSearchContext extends SearchContext {
// Pseudo file list and current index
private PseudoFileList m_fileList;
private int m_fileIdx;
// File attributes
private int m_attrib;
// Optional wildcard filter
private WildCard m_filter;
// Mark all files/folders as read-only
private boolean m_readOnly;
/**
* Class constructor
*
* @param fileList PseudoFileList
* @param attrib int
* @param filter WildCard
* @param readOnly boolean
*/
public PseudoFileListSearchContext( PseudoFileList fileList, int attrib, WildCard filter, boolean readOnly)
{
m_attrib = attrib;
m_filter = filter;
m_fileList = fileList;
m_readOnly = readOnly;
}
/**
* Determine if there are more files for the active search.
*
* @return boolean
*/
public boolean hasMoreFiles()
{
return m_fileIdx < m_fileList.numberOfFiles() ? true : false;
}
/**
* Return file information for the next file in the active search. Returns false if the search
* is complete.
*
* @param info FileInfo to return the file information.
* @return true if the file information is valid, else false
*/
public boolean nextFileInfo(FileInfo info)
{
// Check if there is another file record to return
if ( m_fileIdx >= m_fileList.numberOfFiles())
return false;
// Search for the next valid file
boolean foundMatch = false;
PseudoFile curFile = null;
while (foundMatch == false && m_fileIdx < m_fileList.numberOfFiles())
{
// Get the next file from the list
curFile = m_fileList.getFileAt( m_fileIdx++);
// Check if the file name matches the search pattern
if ( m_filter != null)
{
// Check if the current file matches the wildcard pattern
if ( m_filter.matchesPattern(curFile.getFileName()) == true)
{
// Check if the file matches the search attributes
if (FileAttribute.hasAttribute(m_attrib, FileAttribute.Directory) &&
curFile.isDirectory())
{
// Found a match
foundMatch = true;
}
else if ( curFile.isFile())
{
// Found a match
foundMatch = true;
}
// Check if we found a match
if ( foundMatch == false)
{
// Get the next file from the list
if ( ++m_fileIdx < m_fileList.numberOfFiles())
curFile = m_fileList.getFileAt( m_fileIdx);
}
}
}
else
foundMatch = true;
}
// If we found a match then fill in the file information
if ( foundMatch)
{
// Fill in the file information
info.setFileName( curFile.getFileName());
// Get the file information from the pseudo file
FileInfo pfInfo = curFile.getFileInfo();
if ( curFile.isFile())
{
info.setFileSize( pfInfo.getSize());
info.setAllocationSize( pfInfo.getAllocationSize());
}
else
info.setFileSize( 0L);
info.setAccessDateTime( pfInfo.getAccessDateTime());
info.setCreationDateTime( pfInfo.getCreationDateTime());
info.setModifyDateTime( pfInfo.getModifyDateTime());
// Build the file attributes
int attr = pfInfo.getFileAttributes();
if ( pfInfo.isHidden() == false &&
curFile.getFileName().startsWith( ".") ||
curFile.getFileName().equalsIgnoreCase( "Desktop.ini") ||
curFile.getFileName().equalsIgnoreCase( "Thumbs.db"))
attr += FileAttribute.Hidden;
// Check if the file/folder should be marked as read-only
if ( m_readOnly && pfInfo.isReadOnly() == false)
attr += FileAttribute.ReadOnly;
info.setFileAttributes( attr);
info.setFileId( pfInfo.getFileId());
}
// Indicate if the file information is valid
return foundMatch;
}
/**
* Return the file name of the next file in the active search. Returns null is the search is
* complete.
*
* @return String
*/
public String nextFileName()
{
// Check if there is another file record to return
// Find the next matching file name
while ( m_fileIdx < m_fileList.numberOfFiles()) {
// Check if the current file name matches the search pattern
String fname = m_fileList.getFileAt( m_fileIdx++).getFileName();
if ( m_filter.matchesPattern(fname))
return fname;
}
// No more matching file names
return null;
}
/**
* Return the total number of file entries for this search if known, else return -1
*
* @return int
*/
public int numberOfEntries()
{
return m_fileList.numberOfFiles();
}
/**
* Return the resume id for the current file/directory in the search.
*
* @return int
*/
public int getResumeId()
{
return m_fileIdx;
}
/**
* Restart a search at the specified resume point.
*
* @param resumeId Resume point id.
* @return true if the search can be restarted, else false.
*/
public boolean restartAt(int resumeId)
{
// Range check the resume id
int resId = resumeId - 1;
if ( resId < 0 || resId >= m_fileList.numberOfFiles())
return false;
// Reset the current file index
m_fileIdx = resId;
return true;
}
/**
* Restart the current search at the specified file.
*
* @param info File to restart the search at.
* @return true if the search can be restarted, else false.
*/
public boolean restartAt(FileInfo info)
{
// Search backwards from the current file
int curFileIdx = m_fileIdx;
if (m_fileIdx >= m_fileList.numberOfFiles())
{
m_fileIdx = m_fileList.numberOfFiles() - 1;
}
while ( m_fileIdx > 0) {
// Check if the current file is the required search restart point
if ( m_fileList.getFileAt( m_fileIdx).getFileName().equals( info.getFileName()))
return true;
else
m_fileIdx--;
}
// Failed to find the restart file
m_fileIdx = curFileIdx;
return false;
}
}

View File

@@ -1,211 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.filesys.avm;
import org.alfresco.jlan.server.filesys.FileAttribute;
import org.alfresco.jlan.server.filesys.FileInfo;
import org.alfresco.jlan.server.filesys.FileName;
import org.alfresco.jlan.server.filesys.NetworkFile;
import org.alfresco.jlan.server.filesys.pseudo.PseudoFile;
import org.alfresco.jlan.server.filesys.pseudo.PseudoFolderNetworkFile;
import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
/**
* Store Pseudo File Class
*
* <p>Represents an AVM store as a folder.
*
* @author gkspencer
*/
public class StorePseudoFile extends PseudoFile {
// Store type
private int m_storeType = StoreType.Normal;
// Web project this sandbox links to, or null if this store is not linked
private String m_webProject;
// User name if this is an author sandbox for a web project
private String m_userName;
/**
* Class constructor
*
* @param storeDesc AVMStoreDescriptor
* @param relPath String
* @param storeType int
*/
public StorePseudoFile( AVMStoreDescriptor storeDesc, String relPath, int storeType)
{
super( storeDesc.getName(), FileAttribute.Directory + FileAttribute.ReadOnly);
// Create static file information from the store details
FileInfo fInfo = new FileInfo( storeDesc.getName(), 0L, FileAttribute.Directory + FileAttribute.ReadOnly);
fInfo.setCreationDateTime( storeDesc.getCreateDate());
fInfo.setModifyDateTime( storeDesc.getCreateDate());
fInfo.setAccessDateTime( storeDesc.getCreateDate());
fInfo.setChangeDateTime( storeDesc.getCreateDate());
fInfo.setPath( relPath);
fInfo.setFileId( relPath.hashCode());
setFileInfo( fInfo);
setStoreType( storeType);
}
/**
* Class constructor
*
* @param storeName String
* @param relPath String
*/
public StorePseudoFile( String storeName, String relPath)
{
super( storeName, FileAttribute.Directory + FileAttribute.ReadOnly);
// Create static file information from the store details
FileInfo fInfo = new FileInfo( storeName, 0L, FileAttribute.Directory + FileAttribute.ReadOnly);
long timeNow = System.currentTimeMillis();
fInfo.setCreationDateTime( timeNow);
fInfo.setModifyDateTime( timeNow);
fInfo.setAccessDateTime( timeNow);
fInfo.setChangeDateTime( timeNow);
fInfo.setPath( relPath);
fInfo.setFileId( relPath.hashCode());
setFileInfo( fInfo);
}
/**
* Return a network file for reading/writing the pseudo file
*
* @param netPath String
* @return NetworkFile
*/
@Override
public NetworkFile getFile(String netPath) {
// Split the path to get the name
String[] paths = FileName.splitPath( netPath);
// Create a network file for the folder
return new PseudoFolderNetworkFile( paths[1], netPath);
}
/**
* Return the file information for the pseudo file
*
* @return FileInfo
*/
@Override
public FileInfo getFileInfo() {
return getInfo();
}
/**
* Return the store type
*
* @return int
*/
public final int isStoreType()
{
return m_storeType;
}
/**
* Check if this store is linked to a web project
*
* @return boolean
*/
public final boolean hasWebProject()
{
return m_webProject != null ? true : false;
}
/**
* Get the web project that this store links to, or null if not linked
*
* @return String
*/
public final String getWebProject()
{
return m_webProject;
}
/**
* Set the web project that this store is linked to
*
* @param webProject String
*/
public final void setWebProject(String webProject)
{
m_webProject = webProject;
}
/**
* Check if this store is an author sandbox
*
* @return boolean
*/
public final boolean hasUserName()
{
return m_userName != null ? true : false;
}
/**
* Get the owner of this sandbox
*
* @return String
*/
public final String getUserName()
{
return m_userName;
}
/**
* Set the owner of this sandbox
*
* @param userName String
*/
public final void setUserName(String userName)
{
m_userName = userName;
}
/**
* Set the store type
*
* @param storeType int
*/
public final void setStoreType(int storeType)
{
m_storeType = storeType;
}
}

View File

@@ -1,59 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.filesys.avm;
/**
* Store Types Class
*
* @author gkspencer
*/
public class StoreType {
// Store types
public static final int Normal = 0;
// Site data store types
public static final int SiteStore = 1;
// Web project store types
public static final int WebAuthorMain = 2;
public static final int WebAuthorPreview = 3;
public static final int WebStagingPreview = 4;
public static final int WebStagingMain = 5;
// Store type strings
private static final String[] _types = { "Normal", "SiteStore", "AuthorMain", "AuthorPreview", "StagingPreview", "StagingMain" };
/**
* Return a store type as a string
*
* @param typ int
* @return String
*/
public final static String asString( int typ)
{
if ( typ < 0 || typ > _types.length)
return "Invalid";
return _types[ typ];
}
}

View File

@@ -1,119 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.filesys.avm;
import org.alfresco.jlan.server.filesys.FileAttribute;
import org.alfresco.jlan.server.filesys.FileInfo;
import org.alfresco.jlan.server.filesys.FileName;
import org.alfresco.jlan.server.filesys.NetworkFile;
import org.alfresco.jlan.server.filesys.pseudo.PseudoFile;
import org.alfresco.jlan.server.filesys.pseudo.PseudoFolderNetworkFile;
import org.alfresco.service.cmr.avm.VersionDescriptor;
/**
* Version Pseudo File Class
*
* <p>Represents an AVM store version as a folder.
*
* @author gkspencer
*/
public class VersionPseudoFile extends PseudoFile {
/**
* Class constructor
*
* @param name String
* @param relPath String
*/
public VersionPseudoFile( String name, String relPath)
{
super( name, FileAttribute.Directory + FileAttribute.ReadOnly);
// Create static file information from the store details
FileInfo fInfo = new FileInfo( name, 0L, FileAttribute.Directory + FileAttribute.ReadOnly);
fInfo.setPath( relPath);
fInfo.setFileId( relPath.hashCode());
long timeNow = System.currentTimeMillis();
fInfo.setCreationDateTime( timeNow);
fInfo.setModifyDateTime( timeNow);
fInfo.setAccessDateTime( timeNow);
fInfo.setChangeDateTime( timeNow);
setFileInfo( fInfo);
}
/**
* Class constructor
*
* @param name String
* @param verDesc VersionDescriptor
* @param relPath String
*/
public VersionPseudoFile( String name, VersionDescriptor verDesc, String relPath)
{
super( name, FileAttribute.Directory + FileAttribute.ReadOnly);
// Create static file information from the store details
FileInfo fInfo = new FileInfo( name, 0L, FileAttribute.Directory + FileAttribute.ReadOnly);
fInfo.setCreationDateTime( verDesc.getCreateDate());
fInfo.setPath( relPath);
fInfo.setFileId( relPath.hashCode());
long timeNow = System.currentTimeMillis();
fInfo.setCreationDateTime( timeNow);
fInfo.setModifyDateTime( timeNow);
fInfo.setAccessDateTime( timeNow);
fInfo.setChangeDateTime( timeNow);
setFileInfo( fInfo);
}
/**
* Return a network file for reading/writing the pseudo file
*
* @param netPath String
* @return NetworkFile
*/
@Override
public NetworkFile getFile(String netPath) {
// Split the path to get the name
String[] paths = FileName.splitPath( netPath);
// Create a network file for the folder
return new PseudoFolderNetworkFile( paths[1], netPath);
}
/**
* Return the file information for the pseudo file
*
* @return FileInfo
*/
@Override
public FileInfo getFileInfo() {
return getInfo();
}
}

View File

@@ -1,181 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.filesys.avm;
import java.util.Hashtable;
import org.alfresco.jlan.server.filesys.FileAttribute;
import org.alfresco.jlan.server.filesys.FileInfo;
import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
import org.alfresco.service.cmr.repository.NodeRef;
/**
* Web Project Store Pseudo File Class
*
* <p>Represents an AVM store as a folder.
*
* @author gkspencer
*/
public class WebProjectStorePseudoFile extends StorePseudoFile {
// Store/web project user access roles
public static final int RoleNone = 0;
public static final int RolePublisher = 1;
public static final int RoleContentManager = 2;
// Node ref for this store
private NodeRef m_noderef;
// List of users that are content managers/publishers for this web project store
private Hashtable<String, Integer> m_users;
/**
* Class constructor
*
* @param storeDesc AVMStoreDescriptor
* @param relPath String
* @param nodeRef NodeRef
*/
public WebProjectStorePseudoFile( AVMStoreDescriptor storeDesc, String relPath, NodeRef nodeRef)
{
super( storeDesc, relPath, StoreType.WebStagingMain);
// Create static file information from the store details
FileInfo fInfo = new FileInfo( storeDesc.getName(), 0L, FileAttribute.Directory + FileAttribute.ReadOnly);
fInfo.setCreationDateTime( storeDesc.getCreateDate());
fInfo.setModifyDateTime( storeDesc.getCreateDate());
fInfo.setAccessDateTime( storeDesc.getCreateDate());
fInfo.setChangeDateTime( storeDesc.getCreateDate());
fInfo.setPath( relPath);
fInfo.setFileId( relPath.hashCode());
setFileInfo( fInfo);
// Set the associated node ref for the web project
m_noderef = nodeRef;
}
/**
* Class constructor
*
* @param storeName String
* @param relPath String
* @param nodeRef NodeRef
*/
public WebProjectStorePseudoFile( String storeName, String relPath, NodeRef nodeRef)
{
super( storeName, relPath);
// Create static file information from the store details
FileInfo fInfo = new FileInfo( storeName, 0L, FileAttribute.Directory + FileAttribute.ReadOnly);
long timeNow = System.currentTimeMillis();
fInfo.setCreationDateTime( timeNow);
fInfo.setModifyDateTime( timeNow);
fInfo.setAccessDateTime( timeNow);
fInfo.setChangeDateTime( timeNow);
fInfo.setPath( relPath);
fInfo.setFileId( relPath.hashCode());
setFileInfo( fInfo);
// Set the associated node ref for the web project
m_noderef = nodeRef;
}
/**
* Check if the associated node ref is valid
*
* @return boolean
*/
public final boolean hasNodeRef()
{
return m_noderef != null ? true : false;
}
/**
* Get the associated node ref for the store
*
* @return NodeRef
*/
public final NodeRef getNodeRef()
{
return m_noderef;
}
/**
* Set the associated node ref for the store
*
* @param node NodeRef
*/
public final void setNodeRef(NodeRef node)
{
m_noderef = node;
}
/**
* Return the role for the specified user within this web project
*
* @param userName String
* @return int
*/
public final int getUserRole(String userName)
{
if ( m_users == null)
return RoleNone;
Integer role = m_users.get( userName);
return role != null ? role.intValue() : RoleNone;
}
/**
* Add a user role for this web project
*
* @param userName String
* @param role int
*/
public final void addUserRole(String userName, int role)
{
if ( m_users == null)
m_users = new Hashtable<String, Integer>();
m_users.put(userName, Integer.valueOf(role));
}
/**
* Remove a user role for this project
*
* @param userName String
*/
public final void removeUserRole(String userName)
{
if ( m_users != null)
m_users.remove(userName);
}
}

View File

@@ -1,5 +0,0 @@
/**
*/
@PackageMarker
package org.alfresco.filesys.avm;
import org.alfresco.util.PackageMarker;

View File

@@ -40,8 +40,6 @@ import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.filesys.AbstractServerConfigurationBean;
import org.alfresco.filesys.alfresco.AlfrescoContext;
import org.alfresco.filesys.alfresco.ExtendedDiskInterface;
import org.alfresco.filesys.avm.AVMContext;
import org.alfresco.filesys.avm.AVMDiskDriver;
import org.alfresco.filesys.config.acl.AccessControlListBean;
import org.alfresco.filesys.repo.BufferedContentDiskDriver;
import org.alfresco.filesys.repo.ContentContext;
@@ -107,7 +105,6 @@ public class ServerConfigurationBean extends AbstractServerConfigurationBean imp
private FTPConfigBean ftpConfigBean;
private NFSConfigBean nfsConfigBean;
private List<DeviceContext> filesystemContexts;
private boolean avmAllStores;
private SecurityConfigBean securityConfigBean;
private CoreServerConfigBean coreServerConfigBean;
@@ -153,11 +150,6 @@ public class ServerConfigurationBean extends AbstractServerConfigurationBean imp
this.filesystemContexts = filesystemContexts;
}
public void setAvmAllStores(boolean avmAllStores)
{
this.avmAllStores = avmAllStores;
}
public void setSecurityConfigBean(SecurityConfigBean securityConfigBean)
{
this.securityConfigBean = securityConfigBean;
@@ -1742,134 +1734,87 @@ public class ServerConfigurationBean extends AbstractServerConfigurationBean imp
DiskSharedDevice filesys = null;
if (filesystem instanceof AVMContext)
// Create a new filesystem driver instance and register a context for
// the new filesystem
ExtendedDiskInterface filesysDriver = getRepoDiskInterface();
ContentContext filesysContext = (ContentContext) filesystem;
if(clusterConfigBean != null && clusterConfigBean.getClusterEnabled())
{
// Create a new filesystem driver instance and register a context for
// the new filesystem
ExtendedDiskInterface filesysDriver = getAvmDiskInterface();
DiskDeviceContext diskCtx = (DiskDeviceContext) filesystem;
if(clusterConfigBean != null && clusterConfigBean.getClusterEnabled())
if(logger.isDebugEnabled())
{
if(logger.isDebugEnabled())
{
logger.debug("start hazelcast cache : " + clusterConfigBean.getClusterName() + ", shareName: "+ diskCtx.getShareName());
}
GenericConfigElement hazelConfig = createClusterConfig("cifs.avm."+diskCtx.getShareName());
HazelCastClusterFileStateCache hazel = new HazelCastClusterFileStateCache();
hazel.initializeCache(hazelConfig, this);
diskCtx.setStateCache(hazel);
logger.debug("start hazelcast cache : " + clusterConfigBean.getClusterName() + ", shareName: "+ filesysContext.getShareName());
}
else
{
// Check if the filesystem uses the file state cache, if so then add to the file state reaper
StandaloneFileStateCache standaloneCache = new StandaloneFileStateCache();
standaloneCache.initializeCache( new GenericConfigElement( ""), this);
diskCtx.setStateCache(standaloneCache);
}
if ( diskCtx.hasStateCache()) {
// Register the state cache with the reaper thread
fsysConfig.addFileStateCache( filesystem.getDeviceName(), diskCtx.getStateCache());
}
filesysDriver.registerContext(filesystem);
// Create the shared filesystem
filesys = new DiskSharedDevice(filesystem.getDeviceName(), filesysDriver, (AVMContext)filesystem);
filesys.setConfiguration( this);
// Start the filesystem
((AVMContext)filesystem).startFilesystem(filesys);
GenericConfigElement hazelConfig = createClusterConfig("cifs.filesys."+filesysContext.getShareName());
HazelCastClusterFileStateCache hazel = new HazelCastClusterFileStateCache();
hazel.initializeCache(hazelConfig, this);
filesysContext.setStateCache(hazel);
}
else
{
// Create a new filesystem driver instance and register a context for
// the new filesystem
ExtendedDiskInterface filesysDriver = getRepoDiskInterface();
ContentContext filesysContext = (ContentContext) filesystem;
if(clusterConfigBean != null && clusterConfigBean.getClusterEnabled())
{
if(logger.isDebugEnabled())
{
logger.debug("start hazelcast cache : " + clusterConfigBean.getClusterName() + ", shareName: "+ filesysContext.getShareName());
}
GenericConfigElement hazelConfig = createClusterConfig("cifs.filesys."+filesysContext.getShareName());
HazelCastClusterFileStateCache hazel = new HazelCastClusterFileStateCache();
hazel.initializeCache(hazelConfig, this);
filesysContext.setStateCache(hazel);
}
else
{
// Create state cache here and inject
StandaloneFileStateCache standaloneCache = new StandaloneFileStateCache();
standaloneCache.initializeCache( new GenericConfigElement( ""), this);
filesysContext.setStateCache(standaloneCache);
}
if ( filesysContext.hasStateCache()) {
// Register the state cache with the reaper thread
// has many side effects including initialisation of the cache
fsysConfig.addFileStateCache( filesystem.getDeviceName(), filesysContext.getStateCache());
// Create the lock manager for the context.
FileStateLockManager lockMgr = new FileStateLockManager(filesysContext.getStateCache());
filesysContext.setLockManager(lockMgr);
filesysContext.setOpLockManager(lockMgr);
}
if ((!cifsConfigBean.getServerEnabled() && !ftpConfigBean.getServerEnabled())
&& isContentDiskDriver2(filesysDriver))
{
((ContentContext) filesystem).setDisableNodeMonitor(true);
}
filesysDriver.registerContext(filesystem);
// Check if an access control list has been specified
AccessControlList acls = null;
AccessControlListBean accessControls = filesysContext.getAccessControlList();
if (accessControls != null)
{
// Parse the access control list
acls = accessControls.toAccessControlList(secConfig);
}
else if (secConfig.hasGlobalAccessControls())
{
// Use the global access control list for this disk share
acls = secConfig.getGlobalAccessControls();
}
// Create the shared filesystem
filesys = new DiskSharedDevice(filesystem.getDeviceName(), filesysDriver, filesysContext);
filesys.setConfiguration( this);
// Add any access controls to the share
filesys.setAccessControlList(acls);
// Check if change notifications should be enabled
if ( filesysContext.getDisableChangeNotifications() == false)
filesysContext.enableChangeHandler( true);
// Start the filesystem
filesysContext.startFilesystem(filesys);
// Create state cache here and inject
StandaloneFileStateCache standaloneCache = new StandaloneFileStateCache();
standaloneCache.initializeCache( new GenericConfigElement( ""), this);
filesysContext.setStateCache(standaloneCache);
}
if ( filesysContext.hasStateCache()) {
// Register the state cache with the reaper thread
// has many side effects including initialisation of the cache
fsysConfig.addFileStateCache( filesystem.getDeviceName(), filesysContext.getStateCache());
// Create the lock manager for the context.
FileStateLockManager lockMgr = new FileStateLockManager(filesysContext.getStateCache());
filesysContext.setLockManager(lockMgr);
filesysContext.setOpLockManager(lockMgr);
}
if ((!cifsConfigBean.getServerEnabled() && !ftpConfigBean.getServerEnabled())
&& isContentDiskDriver2(filesysDriver))
{
((ContentContext) filesystem).setDisableNodeMonitor(true);
}
filesysDriver.registerContext(filesystem);
// Check if an access control list has been specified
AccessControlList acls = null;
AccessControlListBean accessControls = filesysContext.getAccessControlList();
if (accessControls != null)
{
// Parse the access control list
acls = accessControls.toAccessControlList(secConfig);
}
else if (secConfig.hasGlobalAccessControls())
{
// Use the global access control list for this disk share
acls = secConfig.getGlobalAccessControls();
}
// Create the shared filesystem
filesys = new DiskSharedDevice(filesystem.getDeviceName(), filesysDriver, filesysContext);
filesys.setConfiguration( this);
// Add any access controls to the share
filesys.setAccessControlList(acls);
// Check if change notifications should be enabled
if ( filesysContext.getDisableChangeNotifications() == false)
filesysContext.enableChangeHandler( true);
// Start the filesystem
filesysContext.startFilesystem(filesys);
// Add the new filesystem
fsysConfig.addShare(filesys);
@@ -1891,50 +1836,6 @@ public class ServerConfigurationBean extends AbstractServerConfigurationBean imp
logger.warn("No filesystems defined");
}
// Check if shares should be added for all AVM stores
if (this.avmAllStores && getAvmDiskInterface() != null)
{
// Get the list of store names
AVMDiskDriver avmDriver = (AVMDiskDriver) getAvmDiskInterface();
StringList storeNames = avmDriver.getAVMStoreNames();
// Add shares for each of the store names, if the share name does not already exist
if (storeNames != null && storeNames.numberOfStrings() > 0)
{
// Add a share for each store
for (int i = 0; i < storeNames.numberOfStrings(); i++)
{
String storeName = storeNames.getStringAt(i);
// Check if a share of the same name already exists
if (fsysConfig.getShares().findShare(storeName, ShareType.DISK, true) == null)
{
// Create the new share for the store
AVMContext avmContext = new AVMContext(storeName, storeName + ":/", AVMContext.VERSION_HEAD);
// avmContext.enableStateCache(this, true);
// Create the shared filesystem
DiskSharedDevice filesys = new DiskSharedDevice(storeName, avmDriver, avmContext);
filesys.setConfiguration( this);
fsysConfig.addShare( filesys);
// DEBUG
if (logger.isDebugEnabled())
logger.debug("Added AVM share " + storeName);
}
}
}
}
// home folder share mapper could be declared in security config
}

View File

@@ -1,167 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.model;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
/**
* @author Kevin Roast
*/
public interface WCMAppModel
{
// AVM web folder
static final QName TYPE_AVMWEBFOLDER = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webfolder");
static final QName PROP_AVMSTORE = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "avmstore");
static final QName PROP_DEFAULTWEBAPP = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "defaultwebapp");
static final QName PROP_DEPLOYTO = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployto");
static final QName PROP_SELECTEDDEPLOYTO = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "selecteddeployto");
static final QName PROP_SELECTEDDEPLOYVERSION = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "selecteddeployversion");
static final QName PROP_ISSOURCE = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "issource");
static final QName PROP_PREVIEW_PROVIDER = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "previewprovidername");
static final QName ASSOC_WEBUSER = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webuser");
static final QName ASSOC_WEBFORM = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webform");
static final QName ASSOC_WEBWORKFLOWDEFAULTS = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webworkflowdefaults");
static final QName ASSOC_DEPLOYMENTSERVER = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deploymentserver");
static final QName ASSOC_DEPLOYMENTATTEMPT = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deploymentattempt");
static final QName ASSOC_DEPLOYMENTREPORT = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deploymentreport");
// AVM web user reference
static final QName TYPE_WEBUSER = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webuser");
static final QName PROP_WEBUSERNAME = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "username");
static final QName PROP_WEBUSERROLE = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "role");
// AVM web form
static final QName TYPE_WEBFORM = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webform");
static final QName PROP_FORMNAME = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "formname");
static final QName ASSOC_WEBFORMTEMPLATE = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webformtemplate");
static final QName ASSOC_WORKFLOWDEFAULTS = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "workflowdefaults");
// AVM web form template
static final QName TYPE_WEBFORMTEMPLATE = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webformtemplate");
static final QName PROP_BASE_RENDERING_ENGINE_TEMPLATE_NAME = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "baserenderingenginetemplatename");
// AVM workflow defaults
static final QName TYPE_WORKFLOW_DEFAULTS = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "workflowdefaults");
static final QName PROP_WORKFLOW_NAME = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "workflowname");
static final QName PROP_WORKFLOW_DEFAULT_PROPERTIES = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "workflowdefaultproperties");
// AVM web workflow defaults
static final QName TYPE_WEBWORKFLOWDEFAULTS = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webworkflowdefaults");
// AVM website deployment server
static final String CONSTRAINT_ALFDEPLOY = "alfresco";
static final String CONSTRAINT_FILEDEPLOY = "file";
static final String CONSTRAINT_LIVESERVER = "live";
static final String CONSTRAINT_TESTSERVER = "test";
static final QName TYPE_DEPLOYMENTSERVER = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deploymentserver");
static final QName PROP_DEPLOYTYPE = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deploytype");
static final QName PROP_DEPLOYSERVERTYPE = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployservertype");
static final QName PROP_DEPLOYSERVERHOST = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployserverhost");
static final QName PROP_DEPLOYSERVERPORT = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployserverport");
static final QName PROP_DEPLOYSERVERNAME = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployservername");
static final QName PROP_DEPLOYSERVERUSERNAME = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployserverusername");
static final QName PROP_DEPLOYSERVERPASSWORD = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployserverpassword");
static final QName PROP_DEPLOYSERVERGROUP = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployservergroup");
static final QName PROP_DEPLOYSERVERADPTERNAME = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployserveradaptername");
static final QName PROP_DEPLOYSERVERURL = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployserverurl");
static final QName PROP_DEPLOYSERVERTARGET = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployservertarget");
static final QName PROP_DEPLOYSOURCEPATH = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deploysourcepath");
static final QName PROP_DEPLOYEXCLUDES = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployexcludes");
static final QName PROP_DEPLOYSERVERALLOCATEDTO = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployserverallocatedto");
static final QName PROP_DEPLOYONAPPROVAL = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployonapproval");
// AVM website deployment attempt
static final QName TYPE_DEPLOYMENTATTEMPT = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deploymentattempt");
static final QName PROP_DEPLOYATTEMPTID = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployattemptid");
static final QName PROP_DEPLOYATTEMPTTYPE = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployattempttype");
static final QName PROP_DEPLOYATTEMPTSTORE = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployattemptstore");
static final QName PROP_DEPLOYATTEMPTVERSION = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployattemptversion");
static final QName PROP_DEPLOYATTEMPTSERVERS = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployattemptservers");
static final QName PROP_DEPLOYATTEMPTTIME = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployattempttime");
static final QName ASSOC_DEPLOYMENTREPORTS = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deploymentreports");
// 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");
static final QName PROP_DEPLOYSERVERNAMEUSED = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployservernameused");
static final QName PROP_DEPLOYSERVERUSERNAMEUSED = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployserverusernameused");
static final QName PROP_DEPLOYSERVERTARGETUSED = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployservertargetused");
static final QName PROP_DEPLOYSOURCEPATHUSED = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deploysourcepathused");
static final QName PROP_DEPLOYEXCLUDESUSED = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployexcludesused");
static final QName PROP_DEPLOYSERVERURLUSED = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployserverurlused");
// AVM webapp aspect
static final QName ASPECT_WEBAPP = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webapp");
// AVM filename pattern aspect
static final QName ASPECT_FILENAMEPATTERN = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "filenamepattern");
static final QName PROP_FILENAMEPATTERN = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "filenamepattern");
// AVM output path pattern aspect
static final QName ASPECT_OUTPUT_PATH_PATTERN = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "outputpathpattern");
static final QName PROP_OUTPUT_PATH_PATTERN = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "outputpathpattern");
// The XForms data capture form aspect.
static final QName TYPE_FORMFOLDER = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "formfolder");
static final QName ASPECT_FORM = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "form");
/**
* there was a mismapping between this definition of PROP_XML_SCHEMA here and in wcmAppModel.xml.
* leaving in this definition for now as a failover.
*/
static final QName PROP_XML_SCHEMA_OLD = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "schema");
static final QName PROP_XML_SCHEMA = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "xmlschema");
static final QName PROP_XML_SCHEMA_ROOT_ELEMENT_NAME = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "xmlschemarootelementname");
static final QName ASSOC_RENDERING_ENGINE_TEMPLATES = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "renderingenginetemplates");
static final QName ASSOC_FORM_WORKFLOW_DEFAULTS = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "formworkflowdefaults");
// An XML to something else tranformer aspect.
static final QName ASPECT_RENDERING_ENGINE_TEMPLATE = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "renderingenginetemplate");
static final QName PROP_PARENT_RENDERING_ENGINE_NAME = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "parentrenderingenginename");
static final QName PROP_FORM_SOURCE = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "formsource");
static final QName ASSOC_RENDITION_PROPERTIES = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "renditionproperties");
static final QName ASPECT_FORM_INSTANCE_DATA = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "forminstancedata");
static final QName PROP_PARENT_FORM_NAME = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "parentformname");
static final QName PROP_RENDITIONS = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "renditions");
static final QName PROP_ORIGINAL_PARENT_PATH = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "orginalparentpath");
static final QName ASPECT_RENDITION = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "rendition");
static final QName PROP_PARENT_RENDERING_ENGINE_TEMPLATE = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "parentrenderingenginetemplate");
static final QName PROP_PARENT_RENDITION_PROPERTIES = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "parentrenditionproperties");
static final QName PROP_PRIMARY_FORM_INSTANCE_DATA = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "primaryforminstancedata");
static final QName TYPE_RENDITION_PROPERTIES = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "renditionproperties");
static final QName PROP_MIMETYPE_FOR_RENDITION = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "mimetypeforrendition");
// Aspect to track content that expires
static final QName ASPECT_EXPIRES = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "expires");
static final QName PROP_EXPIRATIONDATE = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "expirationDate");
// Aspect to track dm deployed content
static final QName ASPECT_DEPLOYED = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "deployed");
static final QName PROP_GUID = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "guid");
}

View File

@@ -1,44 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.model;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
/**
* QName definitions for WCM.
* @author britt
*/
public interface WCMModel
{
// content
static final QName TYPE_AVM_CONTENT = QName.createQName(NamespaceService.WCM_MODEL_1_0_URI, "avmcontent");
static final QName TYPE_AVM_PLAIN_CONTENT = QName.createQName(NamespaceService.WCM_MODEL_1_0_URI, "avmplaincontent");
static final QName TYPE_AVM_LAYERED_CONTENT = QName.createQName(NamespaceService.WCM_MODEL_1_0_URI, "avmlayeredcontent");
static final QName PROP_AVM_FILE_INDIRECTION = QName.createQName(NamespaceService.WCM_MODEL_1_0_URI, "avmfileindirection");
// folders
static final QName TYPE_AVM_FOLDER = QName.createQName(NamespaceService.WCM_MODEL_1_0_URI, "avmfolder");
static final QName TYPE_AVM_PLAIN_FOLDER = QName.createQName(NamespaceService.WCM_MODEL_1_0_URI, "avmplainfolder");
static final QName TYPE_AVM_LAYERED_FOLDER = QName.createQName(NamespaceService.WCM_MODEL_1_0_URI, "avmlayeredfolder");
static final QName PROP_AVM_DIR_INDIRECTION = QName.createQName(NamespaceService.WCM_MODEL_1_0_URI, "avmdirindirection");
// Reverted Aspect.
static final QName ASPECT_REVERTED = QName.createQName(NamespaceService.WCM_MODEL_1_0_URI, "reverted");
static final QName PROP_REVERTED_ID = QName.createQName(NamespaceService.WCM_MODEL_1_0_URI, "revertedid");
}

View File

@@ -1,36 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.model;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
/**
* @author Gavin Cornwell
*/
public interface WCMWorkflowModel
{
// submission workflow properties and aspects
static final QName PROP_FROM_PATH = QName.createQName(NamespaceService.WCMWF_MODEL_1_0_URI, "fromPath");
static final QName PROP_LABEL = QName.createQName(NamespaceService.WCMWF_MODEL_1_0_URI, "label");
static final QName PROP_LAUNCH_DATE = QName.createQName(NamespaceService.WCMWF_MODEL_1_0_URI, "launchDate");
static final QName PROP_AUTO_DEPLOY = QName.createQName(NamespaceService.WCMWF_MODEL_1_0_URI, "autoDeploy");
static final QName PROP_WEBAPP = QName.createQName(NamespaceService.WCMWF_MODEL_1_0_URI, "webapp");
static final QName ASSOC_WEBPROJECT = QName.createQName(NamespaceService.WCMWF_MODEL_1_0_URI, "webproject");
}

View File

@@ -81,22 +81,6 @@ public class IndexConfigurationCheckerImpl implements IndexConfigurationChecker
this.searchService = searchService;
}
/**
* avm trigger
* @param avmSnapShotTriggeredIndexingMethodInterceptor
*/
/* Sparta: remove WCM/AVM
public void setAvmSnapShotTriggeredIndexingMethodInterceptor(AVMSnapShotTriggeredIndexingMethodInterceptor avmSnapShotTriggeredIndexingMethodInterceptor)
{
this.avmSnapShotTriggeredIndexingMethodInterceptor = avmSnapShotTriggeredIndexingMethodInterceptor;
}
*/
/* (non-Javadoc)
* @see org.alfresco.repo.admin.IndexConfigurationChecker#checkIndexConfiguration()
*/
@Override
public List<StoreRef> checkIndexConfiguration()
{
@@ -105,7 +89,6 @@ public class IndexConfigurationCheckerImpl implements IndexConfigurationChecker
List<StoreRef> missingIndexStoreRefs = new ArrayList<StoreRef>(0);
for (StoreRef storeRef : storeRefs)
{
@SuppressWarnings("unused")
NodeRef rootNodeRef = null;
try
{
@@ -127,32 +110,6 @@ public class IndexConfigurationCheckerImpl implements IndexConfigurationChecker
if (indexRecoveryMode != RecoveryMode.FULL)
{
if (storeRef.getProtocol().equals(StoreRef.PROTOCOL_AVM))
{
/* Sparta: remove WCM/AVM
if (avmSnapShotTriggeredIndexingMethodInterceptor.isIndexingEnabled())
{
IndexMode storeIndexMode = avmSnapShotTriggeredIndexingMethodInterceptor.getIndexMode(storeRef.getIdentifier());
if (storeIndexMode.equals(IndexMode.UNINDEXED))
{
if (logger.isDebugEnabled())
{
logger.debug("Skipping index check for store: " + storeRef + " (unindexed AVM store)");
}
continue;
}
}
else
{
if (logger.isDebugEnabled())
{
logger.debug("Skipping index check for store: " + storeRef + " (AVM indexing is disabled)");
}
continue;
}
*/
}
if (logger.isDebugEnabled())
{
logger.debug("Checking index for store: " + storeRef);

View File

@@ -1,58 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.admin.patch.impl;
import org.springframework.extensions.surf.util.I18NUtil;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
/**
* The roles defined in permissionsDefinition.xml moved from <b>wca:webfolder</b> to <b>cm:cmobject</b>.
* This effects the data stored in the <b>permission</b> table.
* <p>
*
*/
public class AVMPermissionDataPatch extends AbstractPermissionChangePatch
{
private static final String MSG_SUCCESS = "patch.updateAvmPermissionData.result";
private static final QName TYPE_QNAME_OLD = QName.createQName(NamespaceService.WCMAPP_MODEL_1_0_URI, "webfolder");
private static final QName TYPE_QNAME_NEW = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "cmobject");
private static final String[] NAMES = new String[] {"ContentManager", "ContentPublisher", "ContentContributor", "ContentReviewer"};
@Override
protected String applyInternal() throws Exception
{
int updateCount = 0;
for (String permissionName : NAMES)
{
updateCount += super.renamePermission(
AVMPermissionDataPatch.TYPE_QNAME_OLD,
permissionName,
AVMPermissionDataPatch.TYPE_QNAME_NEW,
permissionName);
}
// build the result message
String msg = I18NUtil.getMessage(MSG_SUCCESS, updateCount);
// done
return msg;
}
}

View File

@@ -1,697 +0,0 @@
/*
* Copyright (C) 2005-2011 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.admin.patch.impl;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.StringTokenizer;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.admin.patch.AbstractPatch;
import org.alfresco.repo.batch.BatchProcessWorkProvider;
import org.alfresco.repo.batch.BatchProcessor;
import org.alfresco.repo.batch.BatchProcessor.BatchProcessWorker;
import org.alfresco.repo.model.filefolder.HiddenAspect;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.model.FileExistsException;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.model.FileFolderUtil;
import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.DuplicateChildNodeNameException;
import org.alfresco.service.cmr.repository.InvalidNodeRefException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.rule.RuleService;
import org.alfresco.service.cmr.site.SiteInfo;
import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.dao.ConcurrencyFailureException;
import org.springframework.extensions.surf.util.I18NUtil;
import org.springframework.extensions.surf.util.URLDecoder;
/**
* Patch to migrate the AVM 'sitestore' Remote Store content to the new ADM
* location for surf-configuration under the Sites folder in 4.0.
*
* @see org.alfresco.repo.web.scripts.bean.ADMRemoteStore
* @author Kevin Roast
* @since 4.0
*/
public class AVMToADMRemoteStorePatch extends AbstractPatch
{
private static final Log logger = LogFactory.getLog(AVMToADMRemoteStorePatch.class);
private static final String MSG_MIGRATION_COMPLETE = "patch.avmToAdmRemoteStore.complete";
private static final String SITE_CACHE_ID = "_SITE_CACHE";
// patterns used to match site and user specific configuration locations
// @see org.alfresco.repo.web.scripts.bean.ADMRemoteStore
private static final Pattern USER_PATTERN_1 = Pattern.compile(".*/components/.*\\.user~(.*)~.*");
private static final Pattern USER_PATTERN_2 = Pattern.compile(".*/pages/user/(.*?)(/.*)?$");
private static final Pattern SITE_PATTERN_1 = Pattern.compile(".*/components/.*\\.site~(.*)~.*");
private static final Pattern SITE_PATTERN_2 = Pattern.compile(".*/pages/site/(.*?)(/.*)?$");
// name of the surf config folder
private static final String SURF_CONFIG = "surf-config";
private static final int SITE_BATCH_THREADS = 4;
private static final int SITE_BATCH_SIZE = 250;
private static final int MIGRATE_BATCH_THREADS = 4;
private static final int MIGRATE_BATCH_SIZE = 250;
private static final String SEPARATOR = "@";
private Map<String, NodeRef> siteReferenceCache = null;
private SortedMap<String, AVMNodeDescriptor> paths;
private SortedMap<String, AVMNodeDescriptor> retryPaths;
private NodeRef surfConfigRef = null;
private ThreadLocal<Pair<String, NodeRef>> lastFolderCache = new ThreadLocal<Pair<String,NodeRef>>()
{
protected Pair<String,NodeRef> initialValue()
{
return new Pair<String, NodeRef>("", null);
};
};
private ContentService contentService;
private FileFolderService fileFolderService;
private SiteService siteService;
private AVMService avmService;
private RuleService ruleService;
private HiddenAspect hiddenAspect;
private String avmStore;
private String avmRootPath = "/";
/**
* @param contentService the ContentService to set
*/
public void setContentService(ContentService contentService)
{
this.contentService = contentService;
}
/**
* @param fileFolderService the FileFolderService to set
*/
public void setFileFolderService(FileFolderService fileFolderService)
{
this.fileFolderService = fileFolderService;
}
/**
* @param siteService the SiteService to set
*/
public void setSiteService(SiteService siteService)
{
this.siteService = siteService;
}
/**
* @param avmService the avmService to set
*/
public void setAvmService(AVMService avmService)
{
this.avmService = avmService;
}
/**
* @param ruleService the rule service to set
*/
public void setRuleService(RuleService ruleService)
{
this.ruleService = ruleService;
}
/**
* @param avmStore the avmStore to set
*/
public void setAvmStore(String avmStore)
{
this.avmStore = avmStore;
}
/**
* @param avmRootPath the avmRootPath to set
*/
public void setAvmRootPath(String avmRootPath)
{
if (avmRootPath != null && avmRootPath.length() != 0)
{
this.avmRootPath = avmRootPath;
}
}
public void setHiddenAspect(HiddenAspect hiddenAspect)
{
this.hiddenAspect = hiddenAspect;
}
@Override
protected void checkProperties()
{
super.checkProperties();
checkPropertyNotNull(avmService, "avmService");
checkPropertyNotNull(avmStore, "avmStore");
}
/* (non-Javadoc)
* @see org.alfresco.repo.admin.patch.AbstractPatch#applyInternal()
*/
@Override
protected String applyInternal() throws Exception
{
this.retryPaths = new TreeMap<String, AVMNodeDescriptor>();
// get user names that will be used to RunAs and set permissions later
final String systemUser = AuthenticationUtil.getSystemUserName();
// firstly retrieve all AVM paths and descriptors that we need to process
// execute in a single transaction to retrieve the stateless object list
RetryingTransactionCallback<String> work = new RetryingTransactionCallback<String>()
{
public String execute() throws Exception
{
long start = System.currentTimeMillis();
paths = retrieveAVMPaths();
logger.info("Retrieved: " + paths.size() + " AVM paths in " + (System.currentTimeMillis()-start) + "ms");
// also calculate the surf-config reference under the Sites folder while in the txn
surfConfigRef = getSurfConfigNodeRef(siteService.getSiteRoot());
// pre-create folders that may cause contention later during multi-threaded batch processing
List<String> folderPath = new ArrayList<String>(4);
folderPath.add("components");
FileFolderUtil.makeFolders(fileFolderService, surfConfigRef, folderPath, ContentModel.TYPE_FOLDER);
folderPath.clear();
folderPath.add("pages");
folderPath.add("user");
FileFolderUtil.makeFolders(fileFolderService, surfConfigRef, folderPath, ContentModel.TYPE_FOLDER);
// return the tenant system user name while in the txn
return tenantAdminService.getDomainUser(systemUser, tenantAdminService.getCurrentUserDomain());
}
};
final String tenantSystemUser = this.transactionHelper.doInTransaction(work, false, true);
try
{
// init the siteid to surf-config noderef cache
this.siteReferenceCache = new ConcurrentHashMap<String, NodeRef>(16384);
// build a set of unique site names
final Set<String> sites = new HashSet<String>(paths.size());
Matcher matcher;
for (String path: paths.keySet())
{
String siteName = null;
if ((matcher = SITE_PATTERN_1.matcher(path)).matches())
{
siteName = matcher.group(1);
}
else if ((matcher = SITE_PATTERN_2.matcher(path)).matches())
{
siteName = matcher.group(1);
}
if (siteName != null)
{
sites.add(siteName);
}
}
// retrieve the sites for the batch work provider
final Iterator<String> siteItr = sites.iterator();
// the work provider for the site 'surf-config' folder pre-create step
BatchProcessWorkProvider<String> siteWorkProvider = new BatchProcessWorkProvider<String>()
{
@Override
public synchronized Collection<String> getNextWork()
{
int batchCount = 0;
List<String> siteBatch = new ArrayList<String>(SITE_BATCH_SIZE);
while (siteItr.hasNext() && batchCount++ != SITE_BATCH_SIZE)
{
siteBatch.add(siteItr.next());
}
return siteBatch;
}
@Override
public synchronized int getTotalEstimatedWorkSize()
{
return sites.size();
}
};
// batch process the sites in the set and pre-create the 'surf-config' folders for each site
// add each config folder noderef to our cache ready for the config file migration processing
BatchProcessor<String> siteBatchProcessor = new BatchProcessor<String>(
"AVMToADMRemoteStorePatch",
this.transactionHelper,
siteWorkProvider,
SITE_BATCH_THREADS,
SITE_BATCH_SIZE,
this.applicationEventPublisher,
logger,
SITE_BATCH_SIZE * 10);
BatchProcessWorker<String> siteWorker = new BatchProcessWorker<String>()
{
@Override
public void beforeProcess() throws Throwable
{
ruleService.disableRules();
AuthenticationUtil.setRunAsUser(tenantSystemUser);
}
@Override
public void afterProcess() throws Throwable
{
ruleService.enableRules();
AuthenticationUtil.clearCurrentSecurityContext();
}
@Override
public String getIdentifier(String entry)
{
return entry;
}
@Override
public void process(String siteName) throws Throwable
{
// get the Site NodeRef
SiteInfo siteInfo = AVMToADMRemoteStorePatch.this.siteService.getSite(siteName);
// ALF-16256: We've actually looked up the site by case insensitive name. But there may actually be
// paths in existence for the same site name but with different cases. We are only interested in the
// site whose name matches EXACTLY.
if (siteInfo != null && siteInfo.getShortName().equals(siteName))
{
// create the 'surf-config' folder for the site and cache the NodeRef to it
NodeRef surfConfigRef = getSurfConfigNodeRef(siteInfo.getNodeRef());
siteReferenceCache.put(siteName, surfConfigRef);
// pre-create folders that may cause contention later during multi-threaded batch processing
List<String> folderPath = new ArrayList<String>(4);
folderPath.add("components");
FileFolderUtil.makeFolders(fileFolderService, surfConfigRef, folderPath, ContentModel.TYPE_FOLDER);
folderPath.clear();
folderPath.add("pages");
folderPath.add("site");
FileFolderUtil.makeFolders(fileFolderService, surfConfigRef, folderPath, ContentModel.TYPE_FOLDER);
}
else
{
logger.info("WARNING: unable to find site id: " + siteName);
}
}
};
long start = System.currentTimeMillis();
siteBatchProcessor.process(siteWorker, true);
logger.info("Created 'surf-config' folders for: " + this.siteReferenceCache.size() + " sites in " + (System.currentTimeMillis()-start) + "ms");
// retrieve AVM NodeDescriptor objects for the paths
final Iterator<String> pathItr = this.paths.keySet().iterator();
// the work provider for the config file migration
BatchProcessWorkProvider<AVMNodeDescriptor> migrateWorkProvider = new BatchProcessWorkProvider<AVMNodeDescriptor>()
{
@Override
public synchronized Collection<AVMNodeDescriptor> getNextWork()
{
int batchCount = 0;
List<AVMNodeDescriptor> nodes = new ArrayList<AVMNodeDescriptor>(MIGRATE_BATCH_SIZE);
while (pathItr.hasNext() && batchCount++ != MIGRATE_BATCH_SIZE)
{
nodes.add(paths.get(pathItr.next()));
}
return nodes;
}
@Override
public synchronized int getTotalEstimatedWorkSize()
{
return paths.size();
}
};
// prepare the batch processor and worker object
BatchProcessor<AVMNodeDescriptor> batchProcessor = new BatchProcessor<AVMNodeDescriptor>(
"AVMToADMRemoteStorePatch",
this.transactionHelper,
migrateWorkProvider,
MIGRATE_BATCH_THREADS,
MIGRATE_BATCH_SIZE,
this.applicationEventPublisher,
logger,
MIGRATE_BATCH_SIZE * 10);
BatchProcessWorker<AVMNodeDescriptor> worker = new BatchProcessWorker<AVMNodeDescriptor>()
{
@Override
public void beforeProcess() throws Throwable
{
ruleService.disableRules();
AuthenticationUtil.setRunAsUser(tenantSystemUser);
}
@Override
public void afterProcess() throws Throwable
{
ruleService.enableRules();
AuthenticationUtil.clearCurrentSecurityContext();
}
@Override
public String getIdentifier(AVMNodeDescriptor entry)
{
return entry.getPath();
}
@Override
public void process(AVMNodeDescriptor entry) throws Throwable
{
migrateNode(entry);
}
};
batchProcessor.process(worker, true);
// retry the paths that were blocked due to multiple threads attemping to create
// the same folder at the same time - these are dealt with now in a single thread!
if (this.retryPaths.size() != 0)
{
logger.info("Retrying " + this.retryPaths.size() + " paths...");
RetryingTransactionCallback<Void> retrywork = new RetryingTransactionCallback<Void>()
{
public Void execute() throws Exception
{
for (String path : retryPaths.keySet())
{
migrateNode(retryPaths.get(path));
}
return null;
}
};
this.transactionHelper.doInTransaction(retrywork, false, true);
}
logger.info("Migrated: " + this.paths.size() + " AVM nodes to DM in " + (System.currentTimeMillis()-start) + "ms");
}
finally
{
// dispose of our cache
this.siteReferenceCache = null;
}
return I18NUtil.getMessage(MSG_MIGRATION_COMPLETE);
}
/**
* Migrate a single AVM node. Match, convert and copy the AVM surf config path to
* the new ADM surf-config folder location, creating appropriate sub-folders and
* finally copying the content from the AVM to the DM.
*
* @param avmNode AVMNodeDescriptor
*/
private void migrateNode(final AVMNodeDescriptor avmNode)
{
String path = avmNode.getPath();
final boolean debug = logger.isDebugEnabled();
// what type of path is this?
int index = path.indexOf(this.avmRootPath);
if (index != -1)
{
// crop path removing the early paths we are not interested in
path = path.substring(index + this.avmRootPath.length());
if (debug) logger.debug("...processing path: " + path);
// break down the path into its component elements to generate the parent folders
List<String> pathElements = new ArrayList<String>(4);
final StringTokenizer t = new StringTokenizer(path, "/");
// the remainining path is of the form /<objecttype>[/<folder>]/<file>.xml
while (t.hasMoreTokens())
{
pathElements.add(t.nextToken());
}
// match path against generic, user and site
String userId = null;
String siteName = null;
Matcher matcher;
if ((matcher = USER_PATTERN_1.matcher(path)).matches())
{
userId = URLDecoder.decode(matcher.group(1));
}
else if ((matcher = USER_PATTERN_2.matcher(path)).matches())
{
userId = URLDecoder.decode(matcher.group(1));
}
else if ((matcher = SITE_PATTERN_1.matcher(path)).matches())
{
siteName = matcher.group(1);
}
else if ((matcher = SITE_PATTERN_2.matcher(path)).matches())
{
siteName = matcher.group(1);
}
NodeRef surfConfigRef;
if (siteName != null)
{
if (debug) logger.debug("...resolved site id: " + siteName);
surfConfigRef = siteReferenceCache.get(siteName);
if (surfConfigRef == null)
{
logger.info("WARNING: unable to migrate path as site id cannot be found: " + siteName);
}
}
else if (userId != null)
{
if (debug) logger.debug("...resolved user id: " + userId);
surfConfigRef = this.surfConfigRef;
}
else
{
if (debug) logger.debug("...resolved generic path.");
surfConfigRef = this.surfConfigRef;
}
// ensure folders exist down to the specified parent
List<String> folderPath = pathElements.subList(0, pathElements.size() - 1);
NodeRef parentFolder = null;
Pair<String, NodeRef> lastFolderCache = this.lastFolderCache.get();
String folderKey = (siteName != null) ? siteName + folderPath.toString() : folderPath.toString();
if (folderKey.equals(lastFolderCache.getFirst()))
{
// found match to last used folder NodeRef
if (debug) logger.debug("...cache hit - matched last folder reference: " + folderKey);
parentFolder = lastFolderCache.getSecond();
}
if (parentFolder == null)
{
try
{
parentFolder = FileFolderUtil.makeFolders(
this.fileFolderService,
surfConfigRef,
folderPath,
ContentModel.TYPE_FOLDER).getNodeRef();
}
catch (FileExistsException fe)
{
// this occurs if a different thread running a separate txn has created a folder
// that we expected to exist - save a reference to this path to retry it again later
logger.warn("Unable to create folder: " + fe.getName() + " for path: " + avmNode.getPath() +
" - as another txn is busy, will retry later.");
retryPaths.put(avmNode.getPath(), avmNode);
return;
}
// save in last folder cache
lastFolderCache.setFirst(folderKey);
lastFolderCache.setSecond(parentFolder);
}
try
{
if (userId != null)
{
// run as the appropriate user id to execute
AuthenticationUtil.pushAuthentication();
AuthenticationUtil.setFullyAuthenticatedUser(userId);
try
{
// create new node and perform writer content copy of the content from the AVM to the DM store
FileInfo fileInfo = fileFolderService.create(
parentFolder, avmNode.getName(), ContentModel.TYPE_CONTENT);
Map<QName, Serializable> aspectProperties = new HashMap<QName, Serializable>(1, 1.0f);
aspectProperties.put(ContentModel.PROP_IS_INDEXED, false);
nodeService.addAspect(fileInfo.getNodeRef(), ContentModel.ASPECT_INDEX_CONTROL, aspectProperties);
ContentWriter writer = contentService.getWriter(
fileInfo.getNodeRef(), ContentModel.PROP_CONTENT, true);
writer.guessMimetype(fileInfo.getName());
writer.putContent(avmService.getContentReader(-1, avmNode.getPath()));
}
finally
{
AuthenticationUtil.popAuthentication();
}
}
else
{
// create new node and perform writer content copy of the content from the AVM to the DM store
FileInfo fileInfo = fileFolderService.create(
parentFolder, avmNode.getName(), ContentModel.TYPE_CONTENT);
Map<QName, Serializable> aspectProperties = new HashMap<QName, Serializable>(1, 1.0f);
aspectProperties.put(ContentModel.PROP_IS_INDEXED, false);
nodeService.addAspect(fileInfo.getNodeRef(), ContentModel.ASPECT_INDEX_CONTROL, aspectProperties);
ContentWriter writer = contentService.getWriter(
fileInfo.getNodeRef(), ContentModel.PROP_CONTENT, true);
writer.guessMimetype(fileInfo.getName());
writer.putContent(avmService.getContentReader(-1, avmNode.getPath()));
}
}
catch (InvalidNodeRefException refErr)
{
// this occurs if a different thread running a separate txn has not yet created a folder
// that we expected to exist - save a reference to this path to retry it again later
logger.warn("Parent folder does not exist yet: " + refErr.getNodeRef() + " for path: " + avmNode.getPath() +
" - as another txn is busy, will retry later.");
retryPaths.put(avmNode.getPath(), avmNode);
}
}
}
/**
* Return the "surf-config" noderef under the given root. Create the folder if it
* does not exist yet.
*
* @param rootRef Parent node reference where the "surf-config" folder should be
*
* @return surf-config folder ref
*/
private NodeRef getSurfConfigNodeRef(final NodeRef rootRef)
{
NodeRef surfConfigRef = this.nodeService.getChildByName(
rootRef, ContentModel.ASSOC_CONTAINS, SURF_CONFIG);
if (surfConfigRef == null)
{
if (logger.isDebugEnabled())
logger.debug("'surf-config' folder not found under current path, creating...");
QName assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, SURF_CONFIG);
Map<QName, Serializable> properties = new HashMap<QName, Serializable>(1, 1.0f);
properties.put(ContentModel.PROP_NAME, (Serializable) SURF_CONFIG);
try
{
ChildAssociationRef ref = this.nodeService.createNode(
rootRef, ContentModel.ASSOC_CONTAINS, assocQName, ContentModel.TYPE_FOLDER, properties);
surfConfigRef = ref.getChildRef();
// surf-config needs to be hidden - applies index control aspect as part of the hidden aspect
hiddenAspect.hideNode(ref.getChildRef(), false, false, false);
}
catch (DuplicateChildNodeNameException dupErr)
{
// This exception is excepted in multi-threaded creation scenarios - but since fix for
// ALF-10280 rev 30468 - it no longer automatically retries in the txn - therefore we
// throw out an exception that does retry instead.
throw new ConcurrencyFailureException("Forcing batch retry due to DuplicateChildNodeNameException" , dupErr);
}
}
return surfConfigRef;
}
/**
* @return the AVM paths for surf config object in the AVM sitestore
*/
private SortedMap<String, AVMNodeDescriptor> retrieveAVMPaths() throws Exception
{
logger.info("Retrieving paths from AVM store: " + this.avmStore + ":" + this.avmRootPath);
SortedMap<String, AVMNodeDescriptor> paths = new TreeMap<String, AVMNodeDescriptor>();
String avmPath;
if (this.tenantAdminService.getCurrentUserDomain().isEmpty())
{
avmPath = this.avmStore + ":" + this.avmRootPath;
}
else
{
avmPath = SEPARATOR + this.tenantAdminService.getCurrentUserDomain() + SEPARATOR + this.avmStore + ":" + this.avmRootPath;
}
AVMNodeDescriptor node = this.avmService.lookup(-1, avmPath);
if (node != null)
{
traverseNode(paths, node);
}
logger.info("Found: " + paths.size() + " AVM files nodes to migrate");
return paths;
}
private void traverseNode(final SortedMap<String, AVMNodeDescriptor> paths, final AVMNodeDescriptor node)
throws IOException
{
final boolean debug = logger.isDebugEnabled();
final SortedMap<String, AVMNodeDescriptor> listing = this.avmService.getDirectoryListing(node);
for (final AVMNodeDescriptor n : listing.values())
{
if (n.isFile())
{
if (debug) logger.debug("...adding path: " + n.getPath());
paths.put(n.getPath(), n);
if (paths.size() % 10000 == 0)
{
logger.info("Collected " + paths.size() + " AVM paths...");
}
}
else if (n.isDirectory())
{
traverseNode(paths, n);
}
}
}
}

View File

@@ -1,105 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.admin.patch.impl;
import java.util.List;
import org.alfresco.model.WCMAppModel;
import org.alfresco.repo.admin.patch.AbstractPatch;
import org.alfresco.repo.importer.ImporterBootstrap;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.ResultSetRow;
import org.alfresco.service.cmr.search.SearchParameters;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.RegexQNamePattern;
import org.springframework.extensions.surf.util.I18NUtil;
/**
* Patch to break the inheritance of permissions on AVM Web Project Folders.
* This removes the need for admins to write a script or similar to by default hide web folders
* to all users except those explicitly invited (given permissions) to the project.
*
* @author Kevin Roast
*/
public class AVMWebProjectInheritPermissionsPatch extends AbstractPatch
{
private static final String MSG_SUCCESS = "patch.avmWebProjectInheritPermissions.result";
private ImporterBootstrap spacesImporterBootstrap;
private PermissionService permissionService;
public void setSpacesImporterBootstrap(ImporterBootstrap spacesImporterBootstrap)
{
this.spacesImporterBootstrap = spacesImporterBootstrap;
}
public void setPermissionService(PermissionService permissionService)
{
this.permissionService = permissionService;
}
/* (non-Javadoc)
* @see org.alfresco.repo.admin.patch.AbstractPatch#applyInternal()
*/
@Override
protected String applyInternal() throws Exception
{
SearchParameters sp = new SearchParameters();
sp.setLanguage(SearchService.LANGUAGE_LUCENE);
sp.setQuery("TYPE:\"wca:webfolder\"");
sp.addStore(spacesImporterBootstrap.getStoreRef());
ResultSet rs = null;
try
{
rs = searchService.query(sp);
for (ResultSetRow row : rs)
{
// break permission inheritance for the Web Project nodes
this.permissionService.setInheritParentPermissions(row.getNodeRef(), false);
// ensure that permissions are explicitly assigned for all Content Manager roles
List<ChildAssociationRef> userInfoRefs = this.nodeService.getChildAssocs(
row.getNodeRef(), WCMAppModel.ASSOC_WEBUSER, RegexQNamePattern.MATCH_ALL);
for (ChildAssociationRef ref : userInfoRefs)
{
NodeRef userInfoRef = ref.getChildRef();
String username = (String)nodeService.getProperty(userInfoRef, WCMAppModel.PROP_WEBUSERNAME);
String userrole = (String)nodeService.getProperty(userInfoRef, WCMAppModel.PROP_WEBUSERROLE);
if ("ContentManager".equals(userrole))
{
this.permissionService.setPermission(row.getNodeRef(), username, "ContentManager", true);
}
}
}
}
finally
{
if (rs != null)
{
rs.close();
}
}
return I18NUtil.getMessage(MSG_SUCCESS);
}
}

View File

@@ -25,8 +25,6 @@ import java.util.Set;
import org.alfresco.repo.admin.patch.AbstractPatch;
import org.alfresco.repo.admin.patch.PatchExecuter;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.AuthorityType;
import org.alfresco.service.cmr.site.SiteInfo;
@@ -50,7 +48,6 @@ public class AuthorityDefaultZonesPatch extends AbstractPatch
/** The authority service. */
private AuthorityService authorityService;
private AVMService avmService;
private SiteService siteService;
/**
@@ -64,18 +61,8 @@ public class AuthorityDefaultZonesPatch extends AbstractPatch
this.authorityService = authorityService;
}
/**
* Set the avm service
* @param avmService
*/
public void setAvmService(AVMService avmService)
{
this.avmService = avmService;
}
/**
* Set the site service
* @param siteService
*/
public void setSiteService(SiteService siteService)
{
@@ -126,17 +113,9 @@ public class AuthorityDefaultZonesPatch extends AbstractPatch
shareZones.add(AuthorityService.ZONE_APP_SHARE);
shareZones.add(AuthorityService.ZONE_AUTH_ALFRESCO);
List<AVMStoreDescriptor> stores = avmService.getStores();
List<SiteInfo> sites = siteService.listSites(null, null);
List<Action> groupActions = new ArrayList<Action>(stores.size() * 4 + sites.size() * 5 + 1);
for (AVMStoreDescriptor store : stores)
{
groupActions.add(new Action("GROUP_"+store.getName()+"-ContentManager", wcmZones, ActionType.SET));
groupActions.add(new Action("GROUP_"+store.getName()+"-ContentPublisher", wcmZones, ActionType.SET));
groupActions.add(new Action("GROUP_"+store.getName()+"-ContentContributor", wcmZones, ActionType.SET));
groupActions.add(new Action("GROUP_"+store.getName()+"-ContentReviewer", wcmZones, ActionType.SET));
}
List<Action> groupActions = new ArrayList<Action>(sites.size() * 5 + 1);
for (SiteInfo site : sites)
{
groupActions.add(new Action("GROUP_site_" + site.getShortName(), shareZones, ActionType.SET));

View File

@@ -1,125 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.admin.patch.impl;
import java.util.HashMap;
import java.util.Map;
import org.alfresco.repo.admin.patch.AbstractPatch;
import org.alfresco.repo.avm.locking.AVMLockingServiceImpl;
import org.alfresco.repo.domain.patch.PatchDAO;
import org.alfresco.service.cmr.attributes.AttributeService;
import org.alfresco.wcm.util.WCMUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;
import org.springframework.extensions.surf.util.I18NUtil;
/**
* Migrate AVM lock attributes (from 'alf_*attribute*' to 'alf_prop_*')
*
* @author janv
* @since 3.4
*/
public class MigrateAttrAVMLocksPatch extends AbstractPatch
{
private Log logger = LogFactory.getLog(this.getClass());
private static final String MSG_SUCCESS = "patch.migrateAttrAVMLocks.result";
private AttributeService attributeService;
private PatchDAO patchDAO;
public void setAttributeService(AttributeService attributeService)
{
this.attributeService = attributeService;
}
public void setPatchDAO(PatchDAO patchDAO)
{
this.patchDAO = patchDAO;
}
@Override
protected String applyInternal() throws Exception
{
long startTime = System.currentTimeMillis();
AVMLockResultHandler handler = new AVMLockResultHandler();
patchDAO.migrateOldAttrAVMLocks(handler);
if (handler.total > 0)
{
logger.info("Processed "+handler.total+" AVM Lock attrs in "+(System.currentTimeMillis()-startTime)/1000+" secs");
}
// build the result message
String msg = I18NUtil.getMessage(MSG_SUCCESS, handler.total);
// done
return msg;
}
/**
* Row handler for migrating AVM Locks
*/
private class AVMLockResultHandler implements ResultHandler
{
private int total = 0;
private AVMLockResultHandler()
{
}
@SuppressWarnings("unchecked")
public void handleResult(ResultContext context)
{
Map<String, Object> result = (Map<String, Object>)context.getResultObject();
String wpStoreId = (String)result.get("wpStoreId");
String path = (String)result.get("relPath");
String avmStore = (String)result.get("avmStore");
String lockOwner = (String)result.get("owner1");
String relPath = AVMLockingServiceImpl.normalizePath(path);
HashMap<String, String> lockData = new HashMap<String, String>(2);
lockData.put(AVMLockingServiceImpl.KEY_LOCK_OWNER, lockOwner);
lockData.put(WCMUtil.LOCK_KEY_STORE_NAME, avmStore);
if (!attributeService.exists(AVMLockingServiceImpl.KEY_AVM_LOCKS, wpStoreId, relPath))
{
attributeService.createAttribute(lockData, AVMLockingServiceImpl.KEY_AVM_LOCKS, wpStoreId, relPath);
if (logger.isTraceEnabled())
{
logger.trace("Set AVM Lock attr [wpStoreId=" + wpStoreId + ", relPath=" + relPath + ", lockOwner=" + lockOwner + ", avmStore=" + avmStore + "]");
}
total++;
}
else
{
logger.warn("'" + path + "' path has duplicates in normalized form. AVM lock unique attribute creation has been skipped");
}
if (logger.isDebugEnabled() && (total == 0 || (total % 1000 == 0) ))
{
logger.debug(" Handled " + total + " AVM Lock attributes");
}
}
}
}

View File

@@ -23,7 +23,6 @@ import java.util.Properties;
import org.springframework.extensions.surf.util.I18NUtil;
import org.alfresco.repo.admin.patch.AbstractPatch;
import org.alfresco.repo.site.SiteAVMBootstrap;
import org.alfresco.repo.tenant.TenantService;
import org.alfresco.repo.workflow.WorkflowDeployer;

View File

@@ -1,329 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.repo.avm;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import net.sf.acegisecurity.Authentication;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
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.repository.ContentIOException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.dao.ConcurrencyFailureException;
/**
* This is another tester designed to emulate more typical use patterns.
* @author britt
*/
class AVMCrawler implements Runnable
{
private static Log logger = LogFactory.getLog(AVMCrawler.class);
/**
* The AVMService to use.
*/
private AVMService fService;
private Authentication authentication;
/**
* The Operation count.
*/
private int fOpCount;
/**
* Whether we are done.
*/
private boolean fDone;
/**
* Whether an error has occurred.
*/
private boolean fError;
private String fErrorStackTrace = null;
/**
* Random number generator.
*/
private Random fRandom;
/**
* Make up a new one.
* @param service The AVMService.
*/
public AVMCrawler(AVMService service, Authentication authentication)
{
fService = service;
this.authentication = authentication;
fOpCount = 0;
fDone = false;
fError = false;
fRandom = new Random();
}
/**
* Tell this thread it is done.
*/
public void setDone()
{
fDone = true;
}
/**
* Is this thread in an error state.
*/
public boolean getError()
{
return fError;
}
/**
* Get error stack trace
*/
public String getErrorStackTrace()
{
return fErrorStackTrace;
}
/**
* Implementation of run.
*/
public void run()
{
try
{
AuthenticationUtil.setFullAuthentication(authentication);
while (!fDone)
{
doCrawl();
}
}
catch (Throwable t)
{
t.printStackTrace();
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
t.printStackTrace(pw);
fError = true;
fErrorStackTrace = sw.toString();
}
finally
{
AuthenticationUtil.clearCurrentSecurityContext();
}
}
/**
* Do one crawl.
*/
public void doCrawl()
{
try
{
List<AVMStoreDescriptor> reps = fService.getStores();
fOpCount++;
if (reps.size() == 0)
{
logger.warn("No AVM stores");
return;
}
AVMStoreDescriptor repDesc = reps.get(fRandom.nextInt(reps.size()));
Map<String, AVMNodeDescriptor> rootListing = fService.getDirectoryListing(-1, repDesc.getName() + ":/");
fOpCount++;
// Get all the directories in the root.
List<AVMNodeDescriptor> dirs = new ArrayList<AVMNodeDescriptor>();
for (AVMNodeDescriptor desc : rootListing.values())
{
if (desc.isDirectory())
{
dirs.add(desc);
}
}
if (dirs.size() == 0)
{
logger.warn("No dirs in root: "+repDesc.getName() + ":/");
}
else
{
AVMNodeDescriptor dir = dirs.get(fRandom.nextInt(dirs.size()));
int depth = 1;
while (dir != null)
{
Map<String, AVMNodeDescriptor> listing = fService.getDirectoryListing(-1, dir.getPath());
fOpCount++;
List<AVMNodeDescriptor> files = new ArrayList<AVMNodeDescriptor>();
dirs = new ArrayList<AVMNodeDescriptor>();
for (AVMNodeDescriptor desc : listing.values())
{
if (desc.isDirectory())
{
dirs.add(desc);
}
else
{
files.add(desc);
}
}
// Read some files if there are any.
if (files.size() > 0)
{
for (int i = 0; i < 6; i++)
{
String path = files.get(fRandom.nextInt(files.size())).getPath();
logger.info("Reading: " + path);
BufferedReader
reader = new BufferedReader
(new InputStreamReader
(fService.getFileInputStream(-1, path)));
fOpCount++;
String line = reader.readLine();
if (logger.isDebugEnabled())
{
logger.debug(line);
}
reader.close();
}
// Modify some files.
for (int i = 0; i < 2; i++)
{
String path = files.get(fRandom.nextInt(files.size())).getPath();
logger.info("Modifying: " + path);
PrintStream out = new PrintStream(fService.getFileOutputStream(path));
out.println("I am " + path);
out.close();
fOpCount++;
}
}
if (fRandom.nextInt(depth) < depth - 1)
{
// Create some files.
for (int i = 0; i < 1; i++)
{
String name = randomName();
if (listing.containsKey(name))
{
break;
}
logger.info("Creating File: " + name);
fService.createFile(dir.getPath(), name,
new ByteArrayInputStream(("I am " + name).getBytes()));
fOpCount++;
}
}
// 1 in 100 times create a directory.
if (fRandom.nextInt(100) == 0)
{
String name = randomName();
if (listing.containsKey(name))
{
break;
}
logger.info("Creating Directory: " + name);
fService.createDirectory(dir.getPath(), name);
fOpCount++;
}
if (listing.size() > 0)
{
// 1 in 100 times remove something
if (fRandom.nextInt(100) == 0)
{
List<String> names = new ArrayList<String>(listing.keySet());
String name = names.get(fRandom.nextInt(names.size()));
logger.info("Removing: " + name);
fService.removeNode(dir.getPath(),
name);
fOpCount++;
}
}
if (dirs.size() > 0)
{
dir = dirs.get(fRandom.nextInt(dirs.size()));
}
else
{
dir = null;
}
depth++;
}
}
if (fRandom.nextInt(16) == 0)
{
logger.info("Snapshotting: " + repDesc.getName());
fService.createSnapshot(repDesc.getName(), null, null);
fOpCount++;
}
}
catch (Exception e)
{
if ((e instanceof AVMNotFoundException) ||
(e instanceof AVMException) ||
(e instanceof ContentIOException) ||
(e instanceof ConcurrencyFailureException))
{
logger.warn(e.getMessage());
return;
}
e.printStackTrace(System.err);
throw new AVMException("Failure", e);
}
}
/**
* Get a random two character string.
* @return A random name.
*/
private String randomName()
{
char [] chars = new char[2];
chars[0] = (char)('a' + fRandom.nextInt(12));
chars[1] = (char)('a' + fRandom.nextInt(12));
return new String(chars);
}
/**
* Get the operation count.
*/
public int getOpCount()
{
return fOpCount;
}
}

View File

@@ -1,166 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.avm;
import java.util.Calendar;
import java.util.Date;
import org.alfresco.model.WCMAppModel;
import org.alfresco.repo.importer.ImporterBootstrap;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.transaction.TransactionService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Bean that is responsible for locating expired content and routing
* it for review to the most relevant user.
*
* @author gavinc
*/
public class AVMDeploymentAttemptCleaner
{
// defaults in case these properties are not configured in Spring
protected long maxAge = 180L;
protected NodeService nodeService;
protected TransactionService transactionService;
protected SearchService searchService;
protected ImporterBootstrap importerBootstrap;
private static Log logger = LogFactory.getLog(AVMDeploymentAttemptCleaner.class);
public AVMDeploymentAttemptCleaner()
{
}
public void setMaxAge(long maxAge)
{
this.maxAge = new Long(maxAge);
}
public void setNodeService(NodeService nodeService)
{
this.nodeService = nodeService;
}
public void setTransactionService(TransactionService transactionService)
{
this.transactionService = transactionService;
}
public void setSearchService(SearchService searchService)
{
this.searchService = searchService;
}
public void setImporterBootstrap(ImporterBootstrap importerBootstrap)
{
this.importerBootstrap = importerBootstrap;
}
/**
* Executes the expired content processor.
* The work is performed within a transaction running as the system user.
*/
public void execute()
{
// setup a wrapper object to run the processor within a transaction.
AuthenticationUtil.RunAsWork<String> authorisedWork = new AuthenticationUtil.RunAsWork<String>()
{
public String doWork() throws Exception
{
RetryingTransactionCallback<String> expiredContentWork = new RetryingTransactionCallback<String>()
{
public String execute() throws Exception
{
cleanAttempts();
return null;
}
};
return transactionService.getRetryingTransactionHelper().doInTransaction(expiredContentWork);
}
};
// perform the work as the system user
AuthenticationUtil.runAs(authorisedWork, AuthenticationUtil.getAdminUserName());
}
/**
* Entry point.
*/
private void cleanAttempts()
{
// calculate the date 'maxAge' days before today
long daysInMs = 1000L*60L*60L*24L*this.maxAge;
Date toDate = new Date(new Date().getTime() - daysInMs);
// build the query to find deployment attempts older than this.maxAge
Calendar cal = Calendar.getInstance();
cal.setTime(toDate);
StringBuilder query = new StringBuilder("@");
query.append(NamespaceService.WCMAPP_MODEL_PREFIX);
query.append("\\:");
query.append(WCMAppModel.PROP_DEPLOYATTEMPTTIME.getLocalName());
query.append(":[0001\\-01\\-01T00:00:00 TO ");
query.append(cal.get(Calendar.YEAR));
query.append("\\-");
query.append((cal.get(Calendar.MONTH)+1));
query.append("\\-");
query.append(cal.get(Calendar.DAY_OF_MONTH));
query.append("T00:00:00]");
if (logger.isDebugEnabled())
logger.debug("Finding old deploymentattempt nodes using query: " + query.toString());
// do the query
ResultSet results = null;
try
{
// execute the query
results = searchService.query(this.importerBootstrap.getStoreRef(),
SearchService.LANGUAGE_LUCENE, query.toString());
if (logger.isDebugEnabled())
logger.debug("Deleting " + results.length() + " old deployment attempts");
// iterate through the attempt nodes and delete them
for (NodeRef attempt : results.getNodeRefs())
{
this.nodeService.deleteNode(attempt);
if (logger.isDebugEnabled())
logger.debug("Deleted deployment attempt: " + attempt);
}
}
finally
{
if (results != null)
{
results.close();
}
}
}
}

View File

@@ -1,56 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.avm;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* Job to periodically execute the deployment attempt cleaner.
*
* <p>
* The following parameters are required:
* <ul>
* <li><b>deploymentAttemptCleaner</b>: The deployment attempt cleaner instance</li>
* </ul>
*
* @author gavinc
*/
public class AVMDeploymentAttemptCleanerJob implements Job
{
/**
* Searches for old deployment attempts and removes them.
*
* @param context The job context
*/
public void execute(JobExecutionContext context) throws JobExecutionException
{
// get the expired content processor bean from the job context
AVMDeploymentAttemptCleaner cleaner =
(AVMDeploymentAttemptCleaner)context.getJobDetail().getJobDataMap().get("deploymentAttemptCleaner");
if (cleaner == null)
{
throw new JobExecutionException("Missing job data: deploymentAttemptCleaner");
}
// execute the cleaner to do the actual work
cleaner.execute();
}
}

View File

@@ -1,57 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.avm;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* Job to periodically execute the expired content processor.
*
* <p>
* The following parameters are required:
* <ul>
* <li><b>expiredContent</b>: The expired content processor instance</li>
* </ul>
*
* @author gavinc
*/
public class AVMExpiredContentJob implements Job
{
/**
* Searches for expired content in web project's staging area and
* prompt the last modifier of the content to review it.
*
* @param context The job context
*/
public void execute(JobExecutionContext context) throws JobExecutionException
{
// get the expired content processor bean from the job context
AVMExpiredContentProcessor expiredContentProcessor =
(AVMExpiredContentProcessor)context.getJobDetail().getJobDataMap().get("expiredContentProcessor");
if (expiredContentProcessor == null)
{
throw new JobExecutionException("Missing job data: expiredContentProcessor");
}
// execute the processor to do the actual work
expiredContentProcessor.execute();
}
}

View File

@@ -1,492 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.avm;
import java.io.Serializable;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.alfresco.config.JNDIConstants;
import org.alfresco.mbeans.VirtServerRegistry;
import org.alfresco.model.ContentModel;
import org.alfresco.model.WCMAppModel;
import org.alfresco.repo.domain.PropertyValue;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
import org.alfresco.service.cmr.avm.locking.AVMLockingService;
import org.alfresco.service.cmr.avmsync.AVMSyncService;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
import org.alfresco.service.cmr.workflow.WorkflowPath;
import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.Pair;
import org.alfresco.wcm.sandbox.SandboxConstants;
import org.alfresco.wcm.sandbox.SandboxFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.surf.util.I18NUtil;
/**
* Bean that is responsible for locating expired content and routing
* it for review to the most relevant user.
*
* @author gavinc
*/
public class AVMExpiredContentProcessor
{
// defaults in case these properties are not configured in Spring
protected String workflowName = "jbpm$wcmwf:changerequest";
protected List<String> workflowStores;
protected Map<String, Map<String, List<String>>> expiredContent;
protected AVMService avmService;
protected AVMSyncService avmSyncService;
protected AVMService avmLockingAwareService;
protected AVMLockingService avmLockingService;
protected NodeService nodeService;
protected WorkflowService workflowService;
protected PersonService personService;
protected PermissionService permissionService;
protected TransactionService transactionService;
protected VirtServerRegistry virtServerRegistry;
protected SearchService searchService;
private SandboxFactory sandboxFactory;
private static Log logger = LogFactory.getLog(AVMExpiredContentProcessor.class);
private static final String STORE_SEPARATOR = "--";
private final static Pattern STORE_RELATIVE_PATH_PATTERN = Pattern.compile("[^:]+:(.+)");
public AVMExpiredContentProcessor()
{
}
public void setAdminUserName(String adminUserName)
{
// NOTE: ignore, just for backwards compatible Spring config
}
public void setWorkflowName(String workflowName)
{
this.workflowName = workflowName;
}
public void setAvmService(AVMService avmService)
{
this.avmService = avmService;
}
public void setAvmLockingService(AVMLockingService avmLockingService)
{
this.avmLockingService = avmLockingService;
}
public void setAvmSyncService(AVMSyncService avmSyncService)
{
this.avmSyncService = avmSyncService;
}
public void setNodeService(NodeService nodeService)
{
this.nodeService = nodeService;
}
public void setPermissionService(PermissionService permissionService)
{
this.permissionService = permissionService;
}
public void setPersonService(PersonService personService)
{
this.personService = personService;
}
public void setWorkflowService(WorkflowService workflowService)
{
this.workflowService = workflowService;
}
public void setTransactionService(TransactionService transactionService)
{
this.transactionService = transactionService;
}
public void setVirtServerRegistry(VirtServerRegistry virtServerRegistry)
{
this.virtServerRegistry = virtServerRegistry;
}
public void setSearchService(SearchService searchService)
{
this.searchService = searchService;
}
public void setAvmLockingAwareService(AVMService avmLockingAwareService)
{
this.avmLockingAwareService = avmLockingAwareService;
}
public void setSandboxFactory(SandboxFactory sandboxFactory)
{
this.sandboxFactory = sandboxFactory;
}
/**
* Executes the expired content processor.
* The work is performed within a transaction running as the system user.
*/
public void execute()
{
// setup a wrapper object to run the processor within a transaction.
AuthenticationUtil.RunAsWork<String> authorisedWork = new AuthenticationUtil.RunAsWork<String>()
{
public String doWork() throws Exception
{
RetryingTransactionCallback<String> expiredContentWork = new RetryingTransactionCallback<String>()
{
public String execute() throws Exception
{
processExpiredContent();
return null;
}
};
return transactionService.getRetryingTransactionHelper().doInTransaction(expiredContentWork);
}
};
// perform the work as the system user
AuthenticationUtil.runAs(authorisedWork, AuthenticationUtil.getAdminUserName());
// now we know everything worked ok, let the virtualisation server
// know about all the new workflow sandboxes created (just the main stores)
for (String path : this.workflowStores)
{
this.virtServerRegistry.updateAllWebapps(-1, path, true);
}
}
/**
* Entry point.
*/
private void processExpiredContent()
{
// create the maps to hold the expired content for each user in each web project
this.expiredContent = new HashMap<String, Map<String, List<String>>>(8);
this.workflowStores = new ArrayList<String>(4);
// iterate through all AVM stores and focus only on staging main stores
List<AVMStoreDescriptor> stores = avmService.getStores();
if (logger.isDebugEnabled())
logger.debug("Checking " + stores.size() + " AVM stores...");
for (AVMStoreDescriptor storeDesc : stores)
{
String storeName = storeDesc.getName();
PropertyValue val = avmService.getStoreProperty(storeName, SandboxConstants.PROP_SANDBOX_STAGING_MAIN);
if (val != null)
{
if (logger.isDebugEnabled())
logger.debug("Searching store '" + storeName + "' for expired content...");
// find ant nodes with an expiration *date* of today or before
Calendar cal = Calendar.getInstance();
StringBuilder query = new StringBuilder("@wca\\:expirationDate:[0001\\-01\\-01T00:00:00 TO ");
query.append(cal.get(Calendar.YEAR));
query.append("\\-");
query.append((cal.get(Calendar.MONTH)+1));
query.append("\\-");
query.append(cal.get(Calendar.DAY_OF_MONTH));
query.append("T00:00:00]");
// do the query
StoreRef storeRef = new StoreRef(StoreRef.PROTOCOL_AVM, storeName);
ResultSet results = this.searchService.query(storeRef, SearchService.LANGUAGE_LUCENE,
query.toString());
try
{
if (logger.isDebugEnabled())
logger.debug("Found " + results.length() + " potential expired item(s) in store '" + storeName + "'");
if (results.length() > 0)
{
for (NodeRef resultNode : results.getNodeRefs())
{
// get the AVMNodeDescriptor object for each node found
Pair<Integer, String> path = AVMNodeConverter.ToAVMVersionPath(resultNode);
AVMNodeDescriptor node = this.avmService.lookup(path.getFirst(), path.getSecond());
// process the node to see whether the date and time has passed
processNode(storeName, node);
}
}
}
finally
{
results.close();
}
}
else
{
if (logger.isDebugEnabled())
logger.debug("Skipping store '" + storeName + "' as it is not a main staging store");
}
}
// show all the expired content if debug is on
if (logger.isDebugEnabled())
logger.debug("Expired content to action:\n" + this.expiredContent);
// iterate through each store that has expired content, then iterate through
// each user that has expired content in that store. For each user start
// a workflow assigned to them to review the expired content.
for (String storeName: this.expiredContent.keySet())
{
// get the name of the store and create the workflow title
// using it's name
NodeRef webProjectNodeRef = (NodeRef)avmService.getStoreProperty(storeName,
SandboxConstants.PROP_WEB_PROJECT_NODE_REF).getValue(DataTypeDefinition.NODE_REF);
String webProjectName = (String)this.nodeService.getProperty(webProjectNodeRef,
ContentModel.PROP_NAME);
String pattern = I18NUtil.getMessage("expiredcontent.workflow.title");
String workflowTitle = MessageFormat.format(pattern, new Object[] {webProjectName});
Map<String, List<String>> users = this.expiredContent.get(storeName);
for (String userName: users.keySet())
{
List<String> expiredContent = users.get(userName);
startWorkflow(userName, storeName, expiredContent, workflowTitle);
}
}
}
/**
* Processes the given node.
* <p>
* This method is called if the node has been identified as being expired,
* the date and time is checked to make sure it has actually passed i.e. the
* date maybe todat but the time set to later in the day. If the item is
* indeed expired it's added to the expired list and the date reset.
* </p>
*
* @param storeName The name of the store the folder belongs to
* @param node The node to examine
*/
private void processNode(String storeName, AVMNodeDescriptor node)
{
// check supplied node is a file
if (node.isFile())
{
// check for existence of expires aspect
String nodePath = node.getPath();
PropertyValue expirationDateProp = this.avmService.getNodeProperty(-1, nodePath,
WCMAppModel.PROP_EXPIRATIONDATE);
if (logger.isDebugEnabled())
logger.debug("Examining expiration date for '" + nodePath + "': " +
expirationDateProp);
if (expirationDateProp != null)
{
Date now = new Date();
Date expirationDate = (Date)expirationDateProp.getValue(DataTypeDefinition.DATETIME);
if (expirationDate != null && expirationDate.before(now))
{
// before doing anything else see whether the item is locked by any user,
// if it is then just log a warning messge and wait until the next time around
String[] splitPath = nodePath.split(":");
String lockOwner = this.avmLockingService.getLockOwner(storeName, splitPath[1]);
if (logger.isDebugEnabled())
logger.debug("lock details for '" + nodePath + "': " + lockOwner);
if (lockOwner == null)
{
// get the map of expired content for the store
Map<String, List<String>> storeExpiredContent = this.expiredContent.get(storeName);
if (storeExpiredContent == null)
{
storeExpiredContent = new HashMap<String, List<String>>(4);
this.expiredContent.put(storeName, storeExpiredContent);
}
// get the list of expired content for the last modifier of the node
String modifier = node.getLastModifier();
List<String> userExpiredContent = storeExpiredContent.get(modifier);
if (userExpiredContent == null)
{
userExpiredContent = new ArrayList<String>(4);
storeExpiredContent.put(modifier, userExpiredContent);
}
// add the content to the user's list for the current store
userExpiredContent.add(nodePath);
if (logger.isDebugEnabled())
logger.debug("Added " + nodePath + " to " + modifier + "'s list of expired content");
// reset the expiration date
this.avmService.setNodeProperty(nodePath, WCMAppModel.PROP_EXPIRATIONDATE,
new PropertyValue(DataTypeDefinition.DATETIME, null));
if (logger.isDebugEnabled())
logger.debug("Reset expiration date for: " + nodePath);
}
else
{
if (logger.isWarnEnabled())
{
logger.warn("ignoring '" + nodePath + "', although it has expired, it's currently locked");
}
}
}
}
}
}
/**
* Starts a workflow for the given user prompting them to review the list of given
* expired content in the given store.
*
* @param userName The user the expired content should be sent to
* @param storeName The store the expired content is in
* @param expiredContent List of paths to expired content
* @param workflowTitle The title to apply to the workflow
*/
private void startWorkflow(String userName, String storeName, List<String> expiredContent,
String workflowTitle)
{
// find the 'Change Request' workflow
WorkflowDefinition wfDef = workflowService.getDefinitionByName(this.workflowName);
WorkflowPath path = this.workflowService.startWorkflow(wfDef.id, null);
if (path != null)
{
// extract the start task
List<WorkflowTask> tasks = this.workflowService.getTasksForWorkflowPath(path.id);
if (tasks.size() == 1)
{
WorkflowTask startTask = tasks.get(0);
if (startTask.state == WorkflowTaskState.IN_PROGRESS)
{
// determine the user to assign the workflow to
String userStore = storeName + STORE_SEPARATOR + userName;
if (this.avmService.getStore(userStore) == null)
{
// use the creator of the store (the web project creator) to assign the
// workflow to
String storeCreator = this.avmService.getStore(storeName).getCreator();
if (logger.isDebugEnabled())
logger.debug("'" + userName + "' is no longer assigned to web project. Using '" +
storeCreator + "' as they created store '" + storeName + "'");
userName = storeCreator;
userStore = storeName + STORE_SEPARATOR + userName;
}
// lookup the NodeRef for the user
NodeRef assignee = this.personService.getPerson(userName);
// create a workflow store layered over the users store
String workflowStoreName = sandboxFactory.createUserWorkflowSandbox(storeName, userStore);
// create a workflow package with all the expired items
NodeRef workflowPackage = setupWorkflowPackage(workflowStoreName, expiredContent);
// create the workflow parameters map
Map<QName, Serializable> params = new HashMap<QName, Serializable>(5);
params.put(WorkflowModel.ASSOC_PACKAGE, workflowPackage);
params.put(WorkflowModel.ASSOC_ASSIGNEE, assignee);
params.put(WorkflowModel.PROP_WORKFLOW_DESCRIPTION, workflowTitle);
// transition the workflow to send it to the users inbox
this.workflowService.updateTask(startTask.id, params, null, null);
this.workflowService.endTask(startTask.id, null);
// remember the root path of the workflow sandbox so we can inform
// the virtualisation server later
this.workflowStores.add(workflowStoreName + ":/" +
JNDIConstants.DIR_DEFAULT_WWW + "/" +
JNDIConstants.DIR_DEFAULT_APPBASE + "/ROOT");
if (logger.isDebugEnabled())
logger.debug("Started '" + this.workflowName + "' workflow for user '" +
userName + "' in store '" + storeName + "'");
}
}
}
}
/**
* Sets up a workflow package from the given main workflow store and applies
* the list of paths as modified items within the main workflow store.
*
* @param workflowStoreName The main workflow store to setup
* @param expiredContent The expired content
* @return The NodeRef representing the workflow package
*/
private NodeRef setupWorkflowPackage(String workflowStoreName, List<String> expiredContent)
{
// create package paths (layered to user sandbox area as target)
String packagesPath = workflowStoreName + ":/" + JNDIConstants.DIR_DEFAULT_WWW;
for (final String srcPath : expiredContent)
{
final Matcher m = STORE_RELATIVE_PATH_PATTERN.matcher(srcPath);
String relPath = m.matches() && m.group(1).length() != 0 ? m.group(1) : null;
String pathInWorkflowStore = workflowStoreName + ":" + relPath;
// call forceCopy to make sure the path appears modified in the workflow
// sandbox, if the item is already modified or deleted this call has no effect.
this.avmLockingAwareService.forceCopy(pathInWorkflowStore);
}
// convert package to workflow package
AVMNodeDescriptor packageDesc = avmService.lookup(-1, packagesPath);
NodeRef packageNodeRef = workflowService.createPackage(
AVMNodeConverter.ToNodeRef(-1, packageDesc.getPath()));
this.nodeService.setProperty(packageNodeRef, WorkflowModel.PROP_IS_SYSTEM_PACKAGE, true);
return packageNodeRef;
}
}

View File

@@ -1,970 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.avm;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import org.alfresco.repo.avm.util.BulkLoader;
import org.alfresco.repo.domain.PropertyValue;
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.VersionDescriptor;
import org.alfresco.service.cmr.avm.locking.AVMLockingService;
import org.alfresco.service.cmr.avmsync.AVMDifference;
import org.alfresco.service.cmr.avmsync.AVMSyncService;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.QName;
import org.alfresco.wcm.util.WCMUtil;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.extensions.surf.util.ISO8601DateFormat;
/**
* An interactive console for the AVM repository.
*
* @author britt
* @author Gavin Cornwell
* @author janv
*/
public class AVMInterpreter
{
private static final Pattern collectionPattern = Pattern.compile("^\\[(.*)\\]$");
private static final Pattern nodeRefPattern = Pattern.compile("^\\w+://\\w+\\w+$");
private static final Pattern integerPattern = Pattern.compile("^\\d+$");
private static final Pattern dateTimePattern = Pattern.compile("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$");
/**
* The service interface.
*/
private AVMService fService;
/**
* The sync service.
*/
private AVMSyncService fSyncService;
/**
* The locking service.
*/
private AVMLockingService fLockingService;
/**
* The permission service.
*/
private PermissionService fPermissionService;
/**
* The reader for interaction.
*/
private BufferedReader fIn;
/**
* The Bulk Loader.
*/
private BulkLoader fLoader;
/**
* Main entry point.
* Syntax: AVMInteractiveConsole storage (new|old).
*/
public static void main(String[] args)
{
FileSystemXmlApplicationContext context =
new FileSystemXmlApplicationContext("config/alfresco/application-context.xml");
AVMInterpreter console = new AVMInterpreter();
console.setAvmService((AVMService)context.getBean("AVMService"));
console.setAvmSyncService((AVMSyncService)context.getBean("AVMSyncService"));
console.setAvmLockingService((AVMLockingService)context.getBean("AVMLockingService"));
console.setPermissionService((PermissionService)context.getBean("PermissionService"));
BulkLoader loader = new BulkLoader();
loader.setAvmService((AVMService)context.getBean("AVMService"));
console.setBulkLoader(loader);
console.rep();
context.close();
}
/**
* Make up a new console.
*/
public AVMInterpreter()
{
fIn = new BufferedReader(new InputStreamReader(System.in));
}
/**
* Set the AVMService.
* @param service The AVMService instance.
*/
public void setAvmService(AVMService service)
{
fService = service;
}
/**
* Set the AVM sync service.
* @param syncService
*/
public void setAvmSyncService(AVMSyncService syncService)
{
fSyncService = syncService;
}
/**
* Set the AVM locking service.
* @param lockService
*/
public void setAvmLockingService(AVMLockingService lockService)
{
fLockingService = lockService;
}
/**
* Set the PermissionService.
* @param service The PermissionService instance.
*/
public void setPermissionService(PermissionService service)
{
fPermissionService = service;
}
/**
* Set the bulk loader.
* @param loader
*/
public void setBulkLoader(BulkLoader loader)
{
fLoader = loader;
}
/**
* A Read-Eval-Print loop.
*/
public void rep()
{
while (true)
{
System.out.print("> ");
try
{
String line = fIn.readLine();
if (line.equals("exit"))
{
return;
}
System.out.println(interpretCommand(line, fIn));
}
catch (IOException ie)
{
ie.printStackTrace(System.err);
System.exit(2);
}
}
}
/**
* Interpret a single command using the BufferedReader passed in for any data needed.
* @param line The unparsed command
* @param in A Reader to be used for commands that need input data.
* @return The textual output of the command.
*/
public String interpretCommand(String line, BufferedReader in)
{
String[] command = line.split(",\\s+");
if (command.length == 0)
{
command = new String[1];
command[0] = line;
}
try
{
ByteArrayOutputStream bout = new ByteArrayOutputStream();
PrintStream out = new PrintStream(bout);
if (command[0].equals("ls"))
{
if (command.length < 2)
{
return "Syntax Error.";
}
int version = (command.length == 2) ? -1 : Integer.parseInt(command[2]);
AVMNodeDescriptor desc = fService.lookup(version, command[1]);
if (desc == null)
{
return "Not Found.";
}
Map<String, AVMNodeDescriptor> listing =
fService.getDirectoryListing(desc, true);
for (String name : listing.keySet())
{
out.println(name + " " + listing.get(name));
}
}
else if (command[0].equals("lsr"))
{
if (command.length < 2)
{
return "Syntax Error.";
}
int version = (command.length == 2) ? -1 : Integer.parseInt(command[2]);
AVMNodeDescriptor desc = fService.lookup(version, command[1]);
recursiveList(out, desc, 0);
}
else if (command[0].equals("lsrep"))
{
List<AVMStoreDescriptor> repos = fService.getStores();
for (AVMStoreDescriptor repo : repos)
{
out.println(repo);
}
}
else if (command[0].equals("lsver"))
{
if ((command.length < 2) || (command.length > 4))
{
return "Syntax Error.";
}
List<VersionDescriptor> listing = null;
String storeName = command[1];
if (command.length == 2)
{
listing = fService.getStoreVersions(storeName);
}
else
{
Date fromDate = ISO8601DateFormat.parse(command[2]);
Date toDate = new Date();
if (command.length == 4)
{
toDate = ISO8601DateFormat.parse(command[3]);
}
listing = fService.getStoreVersions(storeName, fromDate, toDate);
}
for (VersionDescriptor desc : listing)
{
out.println(desc);
}
}
else if (command[0].equals("mkrep"))
{
if (command.length != 2)
{
return "Syntax Error.";
}
fService.createStore(command[1]);
}
else if (command[0].equals("load"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
fLoader.recursiveLoad(command[1], command[2]);
}
else if (command[0].equals("mkdir"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
fService.createDirectory(command[1], command[2]);
}
else if (command[0].equals("mkbr"))
{
if (command.length != 5)
{
return "Syntax Error.";
}
fService.createBranch(Integer.parseInt(command[4]), command[1], command[2], command[3]);
}
else if (command[0].equals("mkldir"))
{
if (command.length != 4)
{
return "Syntax Error.";
}
fService.createLayeredDirectory(command[1], command[2], command[3]);
}
else if (command[0].equals("setopacity"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
boolean isOpaque = new Boolean(command[2]);
fService.setOpacity(command[1], isOpaque);
}
else if (command[0].equals("rename"))
{
if (command.length != 5)
{
return "Syntax Error.";
}
fService.rename(command[1], command[2], command[3], command[4]);
}
else if (command[0].equals("cp"))
{
if (command.length != 5)
{
return "Syntax Error.";
}
InputStream fin = fService.getFileInputStream(Integer.parseInt(command[2]), command[1]);
OutputStream fout = fService.createFile(command[3], command[4]);
byte [] buff = new byte[8192];
int read;
while ((read = fin.read(buff)) != -1)
{
fout.write(buff, 0, read);
}
fin.close();
fout.close();
}
else if (command[0].equals("retarget"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
fService.retargetLayeredDirectory(command[1], command[2]);
}
else if (command[0].equals("mkprimary"))
{
if (command.length != 2)
{
return "Syntax Error.";
}
fService.makePrimary(command[1]);
}
else if (command[0].equals("mklfile"))
{
if (command.length != 4)
{
return "Syntax Error.";
}
fService.createLayeredFile(command[1], command[2], command[3]);
}
else if (command[0].equals("snap"))
{
if ((command.length < 2) || (command.length > 4))
{
return "Syntax Error.";
}
String tag = (command.length > 2) ? command[2] : null;
String description = (command.length > 3) ? command[3] : null;
fService.createSnapshot(command[1], tag, description);
}
else if (command[0].equals("cat"))
{
if (command.length < 2)
{
return "Syntax Error.";
}
int version = (command.length == 2) ? -1 : Integer.parseInt(command[2]);
BufferedReader reader =
new BufferedReader(
new InputStreamReader(fService.getFileInputStream(version, command[1])));
String l;
while ((l = reader.readLine()) != null)
{
out.println(l);
}
reader.close();
}
else if (command[0].equals("rm"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
fService.removeNode(command[1], command[2]);
}
else if (command[0].equals("rmrep"))
{
if (command.length != 2)
{
return "Syntax Error.";
}
fService.purgeStore(command[1]);
}
else if (command[0].equals("rmver"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
String storeName = command[1];
int ver =Integer.parseInt(command[2]);
String wpStoreId = WCMUtil.getWebProject(fService, storeName);
if ((wpStoreId != null) && (ver <= 2))
{
return "WCM store - cannot delete versions 0-2";
}
fService.purgeVersion(ver, storeName);
}
else if (command[0].equals("rmvers"))
{
if (command.length != 4)
{
return "Syntax Error.";
}
String storeName = command[1];
String wpStoreId = WCMUtil.getWebProject(fService, storeName);
Date fromDate = ISO8601DateFormat.parse(command[2]);
Date toDate = ISO8601DateFormat.parse(command[3]);
List<VersionDescriptor> listing = fService.getStoreVersions(storeName, fromDate, toDate);
for (VersionDescriptor desc : listing)
{
int ver = desc.getVersionID();
if ((wpStoreId != null) && (ver <= 2))
{
return "WCM store - cannot delete versions 0-2";
}
fService.purgeVersion(ver, storeName);
}
}
else if (command[0].equals("write"))
{
if (command.length != 2)
{
return "Syntax Error.";
}
PrintStream ps =
new PrintStream(fService.getFileOutputStream(command[1]));
String l;
while (!(l = in.readLine()).equals(""))
{
ps.println(l);
}
ps.close();
}
else if (command[0].equals("create"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
PrintStream ps =
new PrintStream(fService.createFile(command[1], command[2]));
String l;
while (!(l = in.readLine()).equals(""))
{
ps.println(l);
}
ps.close();
}
else if (command[0].equals("stat"))
{
if (command.length < 2)
{
return "Syntax Error.";
}
int version = (command.length == 2) ? -1 : Integer.parseInt(command[2]);
AVMNodeDescriptor desc = fService.lookup(version, command[1]);
out.println(desc);
out.println("Version: " + desc.getVersionID());
out.println("Owner: " + desc.getOwner());
out.println("Mod Time: " + new Date(desc.getModDate()));
}
else if (command[0].equals("getnodeproperties"))
{
if (command.length < 2)
{
return "Syntax Error.";
}
int version = (command.length == 2) ? -1 : Integer.parseInt(command[2]);
final Map<QName, PropertyValue> properties = fService.getNodeProperties(version, command[1]);
for (final Map.Entry<QName, PropertyValue> p : properties.entrySet())
{
out.println(p.getKey() + ": " + p.getValue());
}
}
else if (command[0].equals("setnodepermission"))
{
if (command.length != 4)
{
return "Syntax Error.";
}
fPermissionService.setPermission(
AVMNodeConverter.ToNodeRef(-1, command[1]), command[2], command[3], true);
}
else if (command[0].equals("clearnodepermission"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
fPermissionService.clearPermission(
AVMNodeConverter.ToNodeRef(-1, command[1]), command[2]);
}
else if (command[0].equals("descnode"))
{
if (command.length < 2)
{
return "Syntax Error.";
}
String path = command[1];
int version = (command.length == 2) ? -1 : Integer.parseInt(command[2]);
AVMNodeDescriptor nodeDesc = fService.lookup(version, path);
if (nodeDesc == null)
{
return "Path Not Found.";
}
out.println(nodeDesc.toString());
out.println("isDirectory: " + nodeDesc.isDirectory());
out.println("isFile: " + nodeDesc.isFile());
out.println("isPrimary: " + nodeDesc.isPrimary());
out.println("isOpaque: " + nodeDesc.getOpacity());
out.println("creator: " + nodeDesc.getCreator());
out.println("owner: " + nodeDesc.getOwner());
out.println("lastModifier: " + nodeDesc.getLastModifier());
out.println("created: " + new Date(nodeDesc.getCreateDate()));
out.println("modified: " + new Date(nodeDesc.getModDate()));
out.println("lastAccess: " + new Date(nodeDesc.getAccessDate()));
// get lock information
String lockPath = path.substring(path.indexOf("/"));
String store = path.substring(0, path.indexOf(":"));
String mainStore = store;
if (store.indexOf("--") != -1)
{
mainStore = store.substring(0, store.indexOf("--"));
}
try
{
String lockOwner = fLockingService.getLockOwner(mainStore, lockPath);
if (lockOwner != null)
{
out.println("lock: " + lockOwner);
}
else
{
out.println("No locks found");
}
}
catch (AVMNotFoundException avmerr)
{
out.println("No locks found");
}
}
else if (command[0].equals("deletenodeproperty"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
fService.deleteNodeProperty(command[1], QName.createQName(command[2]));
out.println("deleted property " + command[2] + " of " + command[1]);
}
else if (command[0].equals("history"))
{
if (command.length != 4)
{
return "Syntax Error.";
}
AVMNodeDescriptor desc = fService.lookup(Integer.parseInt(command[2]), command[1]);
List<AVMNodeDescriptor> history = fService.getHistory(desc, Integer.parseInt(command[3]));
for (AVMNodeDescriptor node : history)
{
out.println(node);
out.println("Version: " + node.getVersionID());
out.println("Owner: " + node.getOwner());
out.println("Mod Time: " + new Date(node.getModDate()));
}
}
/*
else if (command[0].equals("catver"))
{
if (command.length != 4)
{
return "Syntax Error.";
}
AVMNodeDescriptor desc = fService.lookup(Integer.parseInt(command[2]), command[1]);
List<AVMNodeDescriptor> history = fService.getHistory(desc, Integer.parseInt(command[3]));
if (history.size() == 0)
{
return "No History.";
}
BufferedReader reader =
new BufferedReader(
new InputStreamReader(
fService.getFileInputStream(history.get(history.size() - 1))));
String l;
while ((l = reader.readLine()) != null)
{
out.println(l);
}
reader.close();
}
*/
else if (command[0].equals("ca"))
{
if (command.length != 5)
{
return "Syntax Error.";
}
AVMNodeDescriptor left = fService.lookup(Integer.parseInt(command[2]), command[1]);
AVMNodeDescriptor right = fService.lookup(Integer.parseInt(command[4]), command[3]);
AVMNodeDescriptor ca = fService.getCommonAncestor(left, right);
out.println(ca);
}
else if (command[0].equals("statstore"))
{
if (command.length != 2)
{
return "Syntax Error.";
}
AVMStoreDescriptor desc = fService.getStore(command[1]);
if (desc == null)
{
return "Not Found.";
}
out.println(desc);
Map<QName, PropertyValue> props =
fService.getStoreProperties(command[1]);
for (QName name : props.keySet())
{
out.println(name + ": " + props.get(name));
}
}
else if (command[0].equals("compare"))
{
if (command.length != 5)
{
return "Syntax Error.";
}
List<AVMDifference> diffs = fSyncService.compare(Integer.parseInt(command[2]),
command[1],
Integer.parseInt(command[4]),
command[3],
null);
for (AVMDifference diff : diffs)
{
out.println(diff);
}
}
else if (command[0].equals("update"))
{
if (command.length != 4)
{
return "Syntax Error.";
}
AVMDifference diff = new AVMDifference(Integer.parseInt(command[2]), command[1],
-1, command[3], AVMDifference.NEWER);
List<AVMDifference> diffs = new ArrayList<AVMDifference>();
diffs.add(diff);
fSyncService.update(diffs, null, false, false, false, false, null, null);
}
else if (command[0].equals("resetLayer"))
{
if (command.length != 2)
{
return "Syntax Error.";
}
fSyncService.resetLayer(command[1]);
}
else if (command[0].equals("flatten"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
fSyncService.flatten(command[1], command[2]);
}
else if (command[0].equals("getnodeaspects"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
final Set<QName> aspects = fService.getAspects(Integer.parseInt(command[2]), command[1]);
for (final QName qn : aspects)
{
out.println(qn.toString());
}
}
else if (command[0].equals("addnodeaspect"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
fService.addAspect(command[1], QName.createQName(command[2]));
}
else if (command[0].equals("deletenodeaspect"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
fService.removeAspect(command[1], QName.createQName(command[2]));
}
else if (command[0].equals("setnodeproperty"))
{
if (command.length < 4)
{
return "Syntax Error.";
}
QName valueQName = QName.createQName(command[2]);
String propertyValue = "";
// If multiple values are specified then concatenate the values
if (command.length > 4)
{
StringBuffer sb = new StringBuffer();
for (int i=3; i<command.length; i++)
{
sb.append(command[i]);
}
propertyValue = sb.toString();
}
else
{
propertyValue = command[3];
}
// Pass setNodeProperty() the serializable value
Serializable serializableValue = convertValueFromSring(propertyValue);
QName valueTypeQName = getValueTypeQName(propertyValue);
fService.setNodeProperty(command[1], valueQName, new PropertyValue(valueTypeQName, serializableValue));
out.println("set property " + command[2] + " of " + command[1]);
}
else if (command[0].equals("setstoreproperty"))
{
if (command.length < 4)
{
return "Syntax Error.";
}
QName valueQName = QName.createQName(command[2]);
String propertyValue = "";
// If multiple values are specified then concatenate the values
if (command.length > 4)
{
StringBuffer sb = new StringBuffer();
for (int i=3; i<command.length; i++)
{
sb.append(command[i]);
}
propertyValue = sb.toString();
}
else
{
propertyValue = command[3];
}
Serializable serializableValue = convertValueFromSring(propertyValue);
QName valueTypeQName = getValueTypeQName(propertyValue);
fService.setStoreProperty(command[1], valueQName, new PropertyValue(valueTypeQName, serializableValue));
out.println("set property " + command[2] + " of " + command[1]);
}
else if (command[0].equals("setstorepermission"))
{
if (command.length != 4)
{
return "Syntax Error.";
}
fPermissionService.setPermission(
new StoreRef(StoreRef.PROTOCOL_AVM, command[1]), command[2], command[3], true);
}
else if (command[0].equals("clearstorepermission"))
{
if (command.length != 3)
{
return "Syntax Error.";
}
fPermissionService.clearPermission(
new StoreRef(StoreRef.PROTOCOL_AVM, command[1]), command[2]);
}
// unknown or invalid command specified
else
{
return "Syntax Error.";
}
out.flush();
String retVal = new String(bout.toByteArray());
out.close();
return retVal;
}
catch (Exception e)
{
e.printStackTrace(System.err);
return e.toString();
}
}
private void recursiveList(PrintStream out, AVMNodeDescriptor dir, int indent)
{
Map<String, AVMNodeDescriptor> listing = fService.getDirectoryListing(dir, true);
for (String name : listing.keySet())
{
AVMNodeDescriptor child = listing.get(name);
for (int i = 0; i < indent; i++)
{
out.print(' ');
}
out.println(name + " " + child);
if (child.isDirectory())
{
recursiveList(out, child, indent + 2);
}
}
}
private static Serializable convertValueFromSring(String sValue)
{
Serializable retValue = "";
CharSequence seq = sValue.subSequence(0, sValue.length());
if (collectionPattern.matcher(seq).matches())
{
String[] elements = getCSVArray(sValue.substring(1, sValue.length()-1));
// Should this be an ArrayList or a HashSet?
Collection<Serializable> propValues = new HashSet<Serializable>(elements.length);
for (int i=0; i<elements.length; i++)
{
// Add each value in turn unless it is empty
if (!"".equals(elements[i]))
{
propValues.add(convertValueFromSring(elements[i]));
}
}
retValue = (Serializable)propValues;
}
else if (nodeRefPattern.matcher(seq).matches())
{
retValue = new NodeRef(sValue);
}
else if (integerPattern.matcher(seq).matches())
{
retValue = new Integer(sValue);
}
else if (dateTimePattern.matcher(seq).matches())
{
// TODO: Support timestamps
/*
DateFormat df = DateFormat.getDateTimeInstance(dateStyle, timeStyle)df.pa
Calendar cal = Calendar.getInstance();
retValue = new NodeRef(dateTimePattern.matcher(seq).group(1));
*/
} else
{
retValue = sValue;
}
return retValue;
}
private static QName getValueTypeQName(String sValue)
{
QName typeQName = null;
CharSequence seq = sValue.subSequence(0, sValue.length());
if (collectionPattern.matcher(seq).matches())
{
String[] elements = getCSVArray(sValue.substring(1, sValue.length()-1));
if (elements[0] != "")
{
typeQName = getValueTypeQName(elements[0]);
}
}
else if (nodeRefPattern.matcher(seq).matches())
{
typeQName = DataTypeDefinition.NODE_REF;
}
else if (integerPattern.matcher(seq).matches())
{
typeQName = DataTypeDefinition.INT;
}
else if (dateTimePattern.matcher(seq).matches())
{
// TODO: Support timestamps
/*
DateFormat df = DateFormat.getDateTimeInstance(dateStyle, timeStyle)df.pa
Calendar cal = Calendar.getInstance();
retValue = new NodeRef(dateTimePattern.matcher(seq).group(1));
*/
typeQName = DataTypeDefinition.DATETIME;
} else
{
typeQName = DataTypeDefinition.TEXT;
}
return typeQName;
}
private static String[] getCSVArray(String valueString)
{
String[] elements = valueString.split(",");
if (elements.length == 0)
{
elements = new String[1];
elements[0] = valueString;
}
return elements;
}
}

View File

@@ -1,722 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.avm;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import org.alfresco.repo.avm.util.AVMUtil;
import org.alfresco.repo.domain.PropertyValue;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.permissions.AccessDeniedException;
import org.alfresco.service.cmr.avm.AVMExistsException;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
import org.alfresco.service.cmr.avm.LayeringDescriptor;
import org.alfresco.service.cmr.avm.VersionDescriptor;
import org.alfresco.service.cmr.avm.locking.AVMLockingException;
import org.alfresco.service.cmr.avm.locking.AVMLockingService;
import org.alfresco.service.cmr.avm.locking.AVMLockingService.LockState;
import org.alfresco.service.cmr.repository.ContentData;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.AccessStatus;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair;
import org.alfresco.wcm.util.WCMUtil;
import org.alfresco.wcm.webproject.WebProjectService;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.extensions.surf.util.I18NUtil;
/**
* An AVMLockingService aware implementation of AVMService.
* @author britt
*/
public class AVMLockingAwareService implements AVMService, ApplicationContextAware
{
public static final String STORE_SEPARATOR = "--";
public static final String STORE_WORKFLOW = "workflow";
public static final String STORE_PREVIEW = "preview";
private AVMService fService;
private AVMLockingService fLockingService;
private PermissionService permissionService;
private ApplicationContext fContext;
private WebProjectService wpService;
public AVMLockingAwareService()
{
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
fContext = applicationContext;
}
public void init()
{
fService = (AVMService)fContext.getBean("avmService");
fLockingService = (AVMLockingService)fContext.getBean("avmLockingService");
permissionService = (PermissionService) fContext.getBean("PermissionService");
wpService = (WebProjectService) fContext.getBean("WebProjectService");
}
public void addAspect(String path, QName aspectName)
{
grabLock(path);
fService.addAspect(path, aspectName);
}
public void copy(int srcVersion, String srcPath, String dstPath, String name)
{
fService.copy(srcVersion, srcPath, dstPath, name);
}
public void createBranch(int version, String srcPath, String dstPath,
String name)
{
fService.createBranch(version, srcPath, dstPath, name);
}
public void createDirectory(String path, String name)
{
fService.createDirectory(path, name);
}
public OutputStream createFile(String path, String name)
{
grabLock(AVMUtil.extendAVMPath(path, name));
return fService.createFile(path, name);
}
public void createFile(String path, String name, InputStream in)
{
grabLock(AVMUtil.extendAVMPath(path, name));
fService.createFile(path, name, in);
}
public void createLayeredDirectory(String targetPath, String parent,
String name)
{
fService.createLayeredDirectory(targetPath, parent, name);
}
public void createLayeredFile(String targetPath, String parent, String name)
{
grabLock(AVMUtil.extendAVMPath(parent, name));
fService.createLayeredFile(targetPath, parent, name);
}
public Map<String, Integer> createSnapshot(String store, String tag, String description)
{
return fService.createSnapshot(store, tag, description);
}
public void createStore(String name)
{
fService.createStore(name);
}
public void createStore(String name, Map<QName, PropertyValue> props)
{
fService.createStore(name, props);
}
public void deleteNodeProperties(String path)
{
grabLock(path);
fService.deleteNodeProperties(path);
}
public void deleteNodeProperty(String path, QName name)
{
grabLock(path);
fService.deleteNodeProperty(path, name);
}
public void deleteStoreProperty(String store, QName name)
{
fService.deleteStoreProperty(store, name);
}
public AVMNodeDescriptor forceCopy(String path)
{
grabLock(path);
return fService.forceCopy(path);
}
public Pair<Integer, String> getAPath(AVMNodeDescriptor desc)
{
return fService.getAPath(desc);
}
public List<String> getPathsInStoreVersion(AVMNodeDescriptor desc, String store, int version)
{
return fService.getPathsInStoreVersion(desc, store, version);
}
public Set<QName> getAspects(int version, String path)
{
return fService.getAspects(version, path);
}
public Set<QName> getAspects(AVMNodeDescriptor desc)
{
return fService.getAspects(desc);
}
public AVMNodeDescriptor getCommonAncestor(AVMNodeDescriptor left,
AVMNodeDescriptor right)
{
return fService.getCommonAncestor(left, right);
}
public ContentData getContentDataForRead(int version, String path)
{
return fService.getContentDataForRead(version, path);
}
public ContentData getContentDataForRead(AVMNodeDescriptor desc)
{
return fService.getContentDataForRead(desc);
}
public ContentData getContentDataForWrite(String path)
{
grabLock(path);
return fService.getContentDataForWrite(path);
}
public ContentReader getContentReader(int version, String path)
{
return fService.getContentReader(version, path);
}
public ContentWriter getContentWriter(String path, boolean update)
{
grabLock(path);
return fService.getContentWriter(path, update);
}
public List<String> getDeleted(int version, String path)
{
return fService.getDeleted(version, path);
}
public SortedMap<String, AVMNodeDescriptor> getDirectoryListing(int version, String path)
{
return fService.getDirectoryListing(version, path);
}
public SortedMap<String, AVMNodeDescriptor> getDirectoryListing(int version, String path, boolean includeDeleted)
{
return fService.getDirectoryListing(version, path, includeDeleted);
}
public SortedMap<String, AVMNodeDescriptor> getDirectoryListing(AVMNodeDescriptor dir)
{
return fService.getDirectoryListing(dir);
}
public SortedMap<String, AVMNodeDescriptor> getDirectoryListing(AVMNodeDescriptor dir, String childNamePattern)
{
return fService.getDirectoryListing(dir, childNamePattern);
}
public SortedMap<String, AVMNodeDescriptor> getDirectoryListing(AVMNodeDescriptor dir, boolean includeDeleted)
{
return fService.getDirectoryListing(dir, includeDeleted);
}
public AVMNodeDescriptor[] getDirectoryListingArray(int version, String path, boolean includeDeleted)
{
return fService.getDirectoryListingArray(version, path, includeDeleted);
}
public AVMNodeDescriptor[] getDirectoryListingArray(AVMNodeDescriptor dir, boolean includeDeleted)
{
return fService.getDirectoryListingArray(dir, includeDeleted);
}
public SortedMap<String, AVMNodeDescriptor> getDirectoryListingDirect(int version, String path)
{
return fService.getDirectoryListingDirect(version, path);
}
public SortedMap<String, AVMNodeDescriptor> getDirectoryListingDirect(int version, String path, boolean includeDeleted)
{
return fService.getDirectoryListingDirect(version, path, includeDeleted);
}
public SortedMap<String, AVMNodeDescriptor> getDirectoryListingDirect(
AVMNodeDescriptor dir, boolean includeDeleted)
{
return fService.getDirectoryListingDirect(dir, includeDeleted);
}
public InputStream getFileInputStream(int version, String path)
{
return fService.getFileInputStream(version, path);
}
public InputStream getFileInputStream(AVMNodeDescriptor desc)
{
return fService.getFileInputStream(desc);
}
public OutputStream getFileOutputStream(String path)
{
grabLock(path);
return fService.getFileOutputStream(path);
}
public List<Pair<Integer, String>> getHeadPaths(AVMNodeDescriptor desc)
{
return fService.getHeadPaths(desc);
}
public List<AVMNodeDescriptor> getHistory(AVMNodeDescriptor desc, int count)
{
return fService.getHistory(desc, count);
}
public String getIndirectionPath(int version, String path)
{
return fService.getIndirectionPath(version, path);
}
public int getLatestSnapshotID(String storeName)
{
return fService.getLatestSnapshotID(storeName);
}
public LayeringDescriptor getLayeringInfo(int version, String path)
{
return fService.getLayeringInfo(version, path);
}
public int getNextVersionID(String storeName)
{
return fService.getNextVersionID(storeName);
}
public Map<QName, PropertyValue> getNodeProperties(int version, String path)
{
return fService.getNodeProperties(version, path);
}
public Map<QName, PropertyValue> getNodeProperties(AVMNodeDescriptor desc)
{
return fService.getNodeProperties(desc);
}
public PropertyValue getNodeProperty(int version, String path, QName name)
{
return fService.getNodeProperty(version, path, name);
}
public List<Pair<Integer, String>> getPaths(AVMNodeDescriptor desc)
{
return fService.getPaths(desc);
}
public List<Pair<Integer, String>> getPathsInStoreHead(
AVMNodeDescriptor desc, String store)
{
return fService.getPathsInStoreHead(desc, store);
}
public AVMStoreDescriptor getStore(String name)
{
return fService.getStore(name);
}
public Map<QName, PropertyValue> getStoreProperties(String store)
{
return fService.getStoreProperties(store);
}
public PropertyValue getStoreProperty(String store, QName name)
{
return fService.getStoreProperty(store, name);
}
public AVMNodeDescriptor getStoreRoot(int version, String name)
{
return fService.getStoreRoot(version, name);
}
public List<VersionDescriptor> getStoreVersions(String name)
{
return fService.getStoreVersions(name);
}
public List<VersionDescriptor> getStoreVersions(String name, Date from, Date to)
{
return fService.getStoreVersions(name, from, to);
}
public List<AVMStoreDescriptor> getStores()
{
return fService.getStores();
}
public AVMStoreDescriptor getSystemStore()
{
return fService.getSystemStore();
}
public boolean hasAspect(int version, String path, QName aspectName)
{
return fService.hasAspect(version, path, aspectName);
}
public void link(String parentPath, String name, AVMNodeDescriptor toLink)
{
// TODO Does this need a lock? I don't think so, but revisit.
fService.link(parentPath, name, toLink);
}
public void updateLink(String parentPath, String name, AVMNodeDescriptor toLink)
{
// TODO Does this need a lock? I don't think so, but revisit.
fService.updateLink(parentPath, name, toLink);
}
public AVMNodeDescriptor lookup(int version, String path)
{
return fService.lookup(version, path);
}
public AVMNodeDescriptor lookup(int version, String path,
boolean includeDeleted)
{
return fService.lookup(version, path, includeDeleted);
}
public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name)
{
return fService.lookup(dir, name);
}
public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name,
boolean includeDeleted)
{
return fService.lookup(dir, name, includeDeleted);
}
public void makePrimary(String path)
{
fService.makePrimary(path);
}
public void makeTransparent(String dirPath, String name)
{
fService.makeTransparent(dirPath, name);
}
public void purgeStore(String name)
{
fService.purgeStore(name);
String webProject = WCMUtil.getWebProject(fService, name);
if (webProject != null)
{
fLockingService.removeLocks(name);
}
}
public void purgeVersion(int version, String name)
{
fService.purgeVersion(version, name);
}
public Map<QName, PropertyValue> queryStorePropertyKey(String store, QName keyPattern)
{
return fService.queryStorePropertyKey(store, keyPattern);
}
public Map<String, Map<QName, PropertyValue>> queryStoresPropertyKeys(QName keyPattern)
{
return fService.queryStoresPropertyKeys(keyPattern);
}
public void removeAspect(String path, QName aspectName)
{
grabLock(path);
fService.removeAspect(path, aspectName);
}
public void removeNode(String parent, String name)
{
String path = AVMUtil.extendAVMPath(parent, name);
grabLock(path);
fService.removeNode(parent, name);
String[] storePath = AVMUtil.splitPath(parent);
String avmStore = storePath[0];
fService.createSnapshot(avmStore, null, "Removed "+path);
String webProject = WCMUtil.getWebProject(fService, avmStore);
if (webProject != null)
{
Map<String, String> lockDataToMatch = Collections.singletonMap(WCMUtil.LOCK_KEY_STORE_NAME, avmStore);
String relPath = AVMUtil.extendAVMPath(storePath[1], name); // store-relative path, eg. /www/avm_webapps/ROOT/my.txt
fLockingService.removeLocks(webProject, relPath, lockDataToMatch);
}
}
public void removeNode(String path)
{
grabLock(path);
fService.removeNode(path);
String[] storePath = AVMUtil.splitPath(path);
String avmStore = storePath[0];
String relPath = storePath[1]; // store-relative path, eg. /www/avm_webapps/ROOT/my.txt
fService.createSnapshot(avmStore, null, "Removed "+path);
String webProject = WCMUtil.getWebProject(fService, avmStore);
if (webProject != null)
{
Map<String, String> lockDataToMatch = Collections.singletonMap(WCMUtil.LOCK_KEY_STORE_NAME, avmStore);
fLockingService.removeLocks(webProject, relPath, lockDataToMatch);
}
}
public void rename(String srcParent, String srcName, String dstParent, String dstName)
{
String srcPath = AVMUtil.extendAVMPath(srcParent, srcName);
String dstPath = AVMUtil.extendAVMPath(dstParent, dstName);
AVMNodeDescriptor desc = fService.lookup(-1, srcPath, false);
if (! (desc != null && desc.isDirectory()))
{
grabLock(srcPath);
}
fService.rename(srcParent, srcName, dstParent, dstName);
if (! (desc != null && desc.isDirectory()))
{
String[] srcStorePath = AVMUtil.splitPath(srcPath);
String[] dstStorePath = AVMUtil.splitPath(dstPath);
String srcWebProject = WCMUtil.getWebProject(fService, srcStorePath[0]);
String dstWebProject = WCMUtil.getWebProject(fService, dstStorePath[0]);
if ((dstWebProject != null) && (dstWebProject.equals(srcWebProject)))
{
// Make sure we hold the lock already
grabLock(dstPath);
}
else
{
// Remove the old lock and take the new
fLockingService.removeLock(srcWebProject, srcStorePath[1]);
grabLock(dstPath);
}
}
}
public void renameStore(String sourceName, String destName)
{
fService.renameStore(sourceName, destName);
}
public void retargetLayeredDirectory(String path, String target)
{
// TODO This assumes that directories are not locked.
fService.retargetLayeredDirectory(path, target);
}
public void revert(String path, AVMNodeDescriptor toRevertTo)
{
grabLock(path);
fService.revert(path, toRevertTo);
}
public void setContentData(String path, ContentData data)
{
grabLock(path);
fService.setContentData(path, data);
}
public void setEncoding(String path, String encoding)
{
grabLock(path);
fService.setEncoding(path, encoding);
}
public void setGuid(String path, String guid)
{
grabLock(path);
fService.setGuid(path, guid);
}
public void setMetaDataFrom(String path, AVMNodeDescriptor from)
{
grabLock(path);
fService.setMetaDataFrom(path, from);
}
public void setMimeType(String path, String mimeType)
{
grabLock(path);
fService.setMimeType(path, mimeType);
}
public void setNodeProperties(String path,
Map<QName, PropertyValue> properties)
{
grabLock(path);
fService.setNodeProperties(path, properties);
}
public void setNodeProperty(String path, QName name, PropertyValue value)
{
grabLock(path);
fService.setNodeProperty(path, name, value);
}
public void setOpacity(String path, boolean opacity)
{
// TODO Assumes no directory locking.
fService.setOpacity(path, opacity);
}
public void setStoreProperties(String store, Map<QName, PropertyValue> props)
{
fService.setStoreProperties(store, props);
}
public void setStoreProperty(String store, QName name, PropertyValue value)
{
fService.setStoreProperty(store, name, value);
}
public void uncover(String dirPath, String name)
{
// TODO What about when this is a directory?
grabLock(AVMUtil.extendAVMPath(dirPath, name));
fService.uncover(dirPath, name);
}
public void createDirectory(String path, String name, List<QName> aspects, Map<QName, PropertyValue> properties)
{
fService.createDirectory(path, name, aspects, properties);
}
public void createFile(String path, String name, InputStream in, List<QName> aspects, Map<QName, PropertyValue> properties)
{
grabLock(AVMUtil.extendAVMPath(path, name));
fService.createFile(path, name, in, aspects, properties);
}
private void grabLock(String path)
{
AVMNodeDescriptor desc = fService.lookup(-1, path, false);
if (desc != null && desc.isDirectory())
{
return;
}
String[] storePath = AVMUtil.splitPath(path);
String avmStore = storePath[0];
String webProject = WCMUtil.getWebProject(fService, storePath[0]);
if (webProject != null && webProject.equals(avmStore))
{
// Don't do locking in staging.
return;
}
if (avmStore.indexOf(STORE_SEPARATOR + STORE_WORKFLOW) != -1)
{
//Allow lock in workflow store if user has "Write" permission
NodeRef nodeRef = AVMNodeConverter.ToNodeRef(-1, path);
if (permissionService.hasPermission(nodeRef, PermissionService.WRITE) == AccessStatus.DENIED)
{
String errorMessage = I18NUtil.getMessage("avmlockservice.accessdenied", AuthenticationUtil.getFullyAuthenticatedUser());
throw new AccessDeniedException(errorMessage);
}
}
else if (webProject != null)
{
String userName = AuthenticationUtil.getFullyAuthenticatedUser();
LockState lockState = fLockingService.getLockState(webProject, storePath[1], userName);
String wpStoreId = WCMUtil.getWebProjectStoreId(webProject);
// ALF-11440 PM 18-Dec-2011:
// 1. Managers may edit any unlocked file - it becomes locked.
// 2. Managers may edit any locked file in any sandbox in which it is locked
// but not in sandboxes where it is unlocked.
// ALF-8787 and ALF-12766 are consistent with 2.
// A Manager should only be able to create a file in a sandbox
// if it is NOT locked somewhere else.
switch (lockState)
{
case LOCK_NOT_OWNER:
String lockOwner = fLockingService.getLockOwner(webProject, storePath[1]);
if ((wpService.isContentManager(wpStoreId, userName)) &&
(avmStore.equals(wpStoreId + STORE_SEPARATOR + lockOwner) ||
avmStore.equals(wpStoreId + STORE_SEPARATOR + lockOwner
+ STORE_SEPARATOR + STORE_PREVIEW)))
{
// Handle as if LOCK_OWNER
break;
}
throw new AVMLockingException("avmlockservice.locked", path, lockOwner);
case NO_LOCK:
Map<String, String> lockAttributes = Collections.singletonMap(WCMUtil.LOCK_KEY_STORE_NAME, avmStore);
fLockingService.lock(webProject, storePath[1], userName, lockAttributes);
break;
case LOCK_OWNER:
// Nothing to do
break;
}
}
}
public List<VersionDescriptor> getStoreVersionsTo(String name, int version)
{
return fService.getStoreVersionsTo(name, version);
}
public List<VersionDescriptor> getStoreVersionsFrom(String name, int version)
{
return fService.getStoreVersionsFrom(name, version);
}
public List<VersionDescriptor> getStoreVersionsBetween(String name, int from, int to)
{
return fService.getStoreVersionsBetween(name, from, to);
}
}

View File

@@ -1,131 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.repo.avm;
import org.alfresco.repo.avm.util.AVMUtil;
import org.alfresco.service.cmr.avm.AVMException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.util.Pair;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Utility for going back and forth between the AVM world and
* the <code>StoreRef</code>, <code>NodeRef</code> world.
* @author britt
*/
public class AVMNodeConverter
{
private static Log fgLogger = LogFactory.getLog(AVMNodeConverter.class);
/**
* Get a NodeRef corresponding to the given path and version.
* @param version The version id.
* @param avmPath The AVM path.
* @return A NodeRef with AVM info stuffed inside.
*/
public static NodeRef ToNodeRef(int version, String avmPath)
{
String [] pathParts = AVMUtil.splitPath(avmPath);
while (pathParts[1].endsWith(AVMUtil.AVM_PATH_SEPARATOR) && pathParts[1].length() > 1)
{
pathParts[1] = pathParts[1].substring(0, pathParts[1].length() - 1);
}
StoreRef storeRef = ToStoreRef(pathParts[0]);
String translated = version + pathParts[1];
translated = translated.replaceAll("/+", "|");
return new NodeRef(storeRef, translated);
}
/**
* Get a StoreRef that corresponds to a given AVMStore name.
* @param avmStore The name of the AVMStore.
* @return A working StoreRef.
*/
public static StoreRef ToStoreRef(String avmStore)
{
return new StoreRef(StoreRef.PROTOCOL_AVM, avmStore);
}
/**
* Convert a NodeRef into a version, AVMPath pair.
* @param nodeRef The NodeRef to convert.
* @return An Integer, String array.
*/
public static Pair<Integer, String> ToAVMVersionPath(NodeRef nodeRef)
{
StoreRef store = nodeRef.getStoreRef();
String translated = nodeRef.getId();
if (translated.indexOf('|') != -1)
{
// we assume that this is the new style avm path
translated = translated.replace('|', AVMUtil.AVM_PATH_SEPARATOR_CHAR);
}
else
{
// this is the old style avm path
translated = translated.replace(';', AVMUtil.AVM_PATH_SEPARATOR_CHAR);
}
int off = translated.indexOf(AVMUtil.AVM_PATH_SEPARATOR_CHAR);
if (off == -1)
{
fgLogger.error(translated);
throw new AVMException("Bad Node Reference: " + nodeRef.getId());
}
int version = Integer.parseInt(translated.substring(0, off));
String path = translated.substring(off);
return new Pair<Integer, String>(version, AVMUtil.buildAVMPath(store.getIdentifier(), path));
}
/**
* Extend an already valid AVM path by one more component.
* @param path The starting AVM path.
* @param name The name to add to it.
* @return The extended path.
*/
public static String ExtendAVMPath(String path, String name)
{
return AVMUtil.extendAVMPath(path, name);
}
/**
* Split a path into its parent path and its base name.
* @param path The initial AVM path.
* @return An array of 2 Strings containing the parent path and the base
* name.
*/
public static String[] SplitBase(String path)
{
return AVMUtil.splitBase(path);
}
/**
* Normalize an AVM path.
* @param path The incoming path.
* @return The normalized path.
*
* @deprecated see org.alfresco.repo.avm.util.AVMUtil.normalizePath
*/
public static String NormalizePath(String path)
{
return AVMUtil.normalizePath(path);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,32 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.repo.avm;
/**
* This defines the different types of FolderEntrys.
* @author britt
*/
public interface AVMNodeType
{
public static final int PLAIN_FILE = 0;
public static final int LAYERED_FILE = 1;
public static final int PLAIN_DIRECTORY = 2;
public static final int LAYERED_DIRECTORY = 3;
public static final int DELETED_NODE = 4;
}

View File

@@ -1,555 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.avm;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import org.alfresco.repo.domain.PropertyValue;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
import org.alfresco.service.cmr.avm.LayeringDescriptor;
import org.alfresco.service.cmr.avm.VersionDescriptor;
import org.alfresco.service.cmr.remote.AVMRemote;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair;
/**
* A loopback implementation of the AVMRemote interface?
* @author britt
*/
public class AVMRemoteLocal implements AVMRemote
{
/**
* The AVMService instance.
*/
private AVMService fService;
/**
* Default constructor.
*/
public AVMRemoteLocal()
{
}
/**
* Setter for the AVMService instance.
*/
public void setAvmService(AVMService service)
{
fService = service;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#createAVMStore(java.lang.String)
*/
public void createStore(String name)
{
fService.createStore(name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#createBranch(int, java.lang.String, java.lang.String, java.lang.String)
*/
public void createBranch(int version, String srcPath, String dstPath,
String name)
{
fService.createBranch(version, srcPath, dstPath, name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#createDirectory(java.lang.String, java.lang.String)
*/
public void createDirectory(String path, String name)
{
fService.createDirectory(path, name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#createFile(java.lang.String, java.lang.String)
*/
public OutputStream createFile(String path, String name)
{
return fService.createFile(path, name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#createLayeredDirectory(java.lang.String, java.lang.String, java.lang.String)
*/
public void createLayeredDirectory(String targetPath, String parent,
String name)
{
fService.createLayeredDirectory(targetPath, parent, name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#createLayeredFile(java.lang.String, java.lang.String, java.lang.String)
*/
public void createLayeredFile(String targetPath, String parent, String name)
{
fService.createLayeredFile(targetPath, parent, name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#createSnapshot(java.lang.String)
*/
public Map<String, Integer> createSnapshot(String store, String label, String comment)
{
return fService.createSnapshot(store, label, comment);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#deleteNodeProperties(java.lang.String)
*/
public void deleteNodeProperties(String path)
{
fService.deleteNodeProperties(path);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#deleteNodeProperty(java.lang.String, org.alfresco.service.namespace.QName)
*/
public void deleteNodeProperty(String path, QName name)
{
fService.deleteNodeProperty(path, name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#deleteStoreProperty(java.lang.String, org.alfresco.service.namespace.QName)
*/
public void deleteStoreProperty(String store, QName name)
{
fService.deleteStoreProperty(store, name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getAVMStore(java.lang.String)
*/
public AVMStoreDescriptor getStore(String name)
{
return fService.getStore(name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getAVMStoreRoot(int, java.lang.String)
*/
public AVMNodeDescriptor getStoreRoot(int version, String name)
{
return fService.getStoreRoot(version, name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getAVMStoreVersions(java.lang.String)
*/
public List<VersionDescriptor> getStoreVersions(String name)
{
return fService.getStoreVersions(name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getAVMStoreVersions(java.lang.String, java.util.Date, java.util.Date)
*/
public List<VersionDescriptor> getStoreVersions(String name, Date from,
Date to)
{
return fService.getStoreVersions(name, from, to);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getAVMStores()
*/
public List<AVMStoreDescriptor> getStores()
{
return fService.getStores();
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getCommonAncestor(org.alfresco.service.cmr.avm.AVMNodeDescriptor, org.alfresco.service.cmr.avm.AVMNodeDescriptor)
*/
public AVMNodeDescriptor getCommonAncestor(AVMNodeDescriptor left,
AVMNodeDescriptor right)
{
return fService.getCommonAncestor(left, right);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getDeleted(int, java.lang.String)
*/
public List<String> getDeleted(int version, String path)
{
return fService.getDeleted(version, path);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getDirectoryListing(int, java.lang.String)
*/
public SortedMap<String, AVMNodeDescriptor> getDirectoryListing(
int version, String path)
{
return fService.getDirectoryListing(version, path);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getDirectoryListing(org.alfresco.service.cmr.avm.AVMNodeDescriptor)
*/
public SortedMap<String, AVMNodeDescriptor> getDirectoryListing(
AVMNodeDescriptor dir)
{
return fService.getDirectoryListing(dir);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getDirectoryListingDirect(int, java.lang.String)
*/
public SortedMap<String, AVMNodeDescriptor> getDirectoryListingDirect(
int version, String path)
{
return fService.getDirectoryListingDirect(version, path);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getFileInputStream(int, java.lang.String)
*/
public InputStream getFileInputStream(int version, String path)
{
return fService.getFileInputStream(version, path);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getFileInputStream(org.alfresco.service.cmr.avm.AVMNodeDescriptor)
*/
public InputStream getFileInputStream(AVMNodeDescriptor desc)
{
return fService.getFileInputStream(desc);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getFileOutputStream(java.lang.String)
*/
public OutputStream getFileOutputStream(String path)
{
return fService.getFileOutputStream(path);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getHistory(org.alfresco.service.cmr.avm.AVMNodeDescriptor, int)
*/
public List<AVMNodeDescriptor> getHistory(AVMNodeDescriptor desc, int count)
{
return fService.getHistory(desc, count);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getIndirectionPath(int, java.lang.String)
*/
public String getIndirectionPath(int version, String path)
{
return fService.getIndirectionPath(version, path);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getLatestSnapshotID(java.lang.String)
*/
public int getLatestSnapshotID(String storeName)
{
return fService.getLatestSnapshotID(storeName);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getLatestVersionID(java.lang.String)
*/
public int getNextVersionID(String storeName)
{
return fService.getNextVersionID(storeName);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getLayeringInfo(int, java.lang.String)
*/
public LayeringDescriptor getLayeringInfo(int version, String path)
{
return fService.getLayeringInfo(version, path);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getNodeProperties(int, java.lang.String)
*/
public Map<QName, PropertyValue> getNodeProperties(int version, String path)
{
return fService.getNodeProperties(version, path);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getNodeProperty(int, java.lang.String, org.alfresco.service.namespace.QName)
*/
public PropertyValue getNodeProperty(int version, String path, QName name)
{
return fService.getNodeProperty(version, path, name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getStoreProperties(java.lang.String)
*/
public Map<QName, PropertyValue> getStoreProperties(String store)
{
return fService.getStoreProperties(store);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#getStoreProperty(java.lang.String, org.alfresco.service.namespace.QName)
*/
public PropertyValue getStoreProperty(String store, QName name)
{
return fService.getStoreProperty(store, name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#lookup(int, java.lang.String)
*/
public AVMNodeDescriptor lookup(int version, String path)
{
return fService.lookup(version, path);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#lookup(int, java.lang.String, boolean)
*/
public AVMNodeDescriptor lookup(int version, String path, boolean includeDeleted)
{
return fService.lookup(version, path, includeDeleted);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#lookup(org.alfresco.service.cmr.avm.AVMNodeDescriptor, java.lang.String)
*/
public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name)
{
return fService.lookup(dir, name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#lookup(org.alfresco.service.cmr.avm.AVMNodeDescriptor, java.lang.String, boolean includeDeleted)
*/
public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name, boolean includeDeleted)
{
return fService.lookup(dir, name, includeDeleted);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#makePrimary(java.lang.String)
*/
public void makePrimary(String path)
{
fService.makePrimary(path);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#purgeAVMStore(java.lang.String)
*/
public void purgeStore(String name)
{
fService.purgeStore(name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#purgeVersion(int, java.lang.String)
*/
public void purgeVersion(int version, String name)
{
fService.purgeVersion(version, name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#queryStorePropertyKey(java.lang.String, org.alfresco.service.namespace.QName)
*/
public Map<QName, PropertyValue> queryStorePropertyKey(String store,
QName keyPattern)
{
return fService.queryStorePropertyKey(store, keyPattern);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#queryStoresPropertyKey(org.alfresco.service.namespace.QName)
*/
public Map<String, Map<QName, PropertyValue>> queryStoresPropertyKey(
QName keyPattern)
{
return fService.queryStoresPropertyKeys(keyPattern);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#removeNode(java.lang.String, java.lang.String)
*/
public void removeNode(String parent, String name)
{
fService.removeNode(parent, name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#rename(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
*/
public void rename(String srcParent, String srcName, String dstParent,
String dstName)
{
fService.rename(srcParent, srcName, dstParent, dstName);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#retargetLayeredDirectory(java.lang.String, java.lang.String)
*/
public void retargetLayeredDirectory(String path, String target)
{
fService.retargetLayeredDirectory(path, target);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#setNodeProperties(java.lang.String, java.util.Map)
*/
public void setNodeProperties(String path,
Map<QName, PropertyValue> properties)
{
fService.setNodeProperties(path, properties);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#setNodeProperty(java.lang.String, org.alfresco.service.namespace.QName, org.alfresco.repo.domain.PropertyValue)
*/
public void setNodeProperty(String path, QName name, PropertyValue value)
{
fService.setNodeProperty(path, name, value);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#setOpacity(java.lang.String, boolean)
*/
public void setOpacity(String path, boolean opacity)
{
fService.setOpacity(path, opacity);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#setStoreProperties(java.lang.String, java.util.Map)
*/
public void setStoreProperties(String store, Map<QName, PropertyValue> props)
{
fService.setStoreProperties(store, props);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#setStoreProperty(java.lang.String, org.alfresco.service.namespace.QName, org.alfresco.repo.domain.PropertyValue)
*/
public void setStoreProperty(String store, QName name, PropertyValue value)
{
fService.setStoreProperty(store, name, value);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#uncover(java.lang.String, java.lang.String)
*/
public void uncover(String dirPath, String name)
{
fService.uncover(dirPath, name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.AVMRemote#renameStore(java.lang.String, java.lang.String)
*/
public void renameStore(String sourceName, String destName)
{
fService.renameStore(sourceName, destName);
}
/* (non-Javadoc)
* @see org.alfresco.service.cmr.remote.AVMRemote#addAspect(java.lang.String, org.alfresco.service.namespace.QName)
*/
public void addAspect(String path, QName aspectName)
{
fService.addAspect(path, aspectName);
}
/* (non-Javadoc)
* @see org.alfresco.service.cmr.remote.AVMRemote#getAspects(int, java.lang.String)
*/
public Set<QName> getAspects(int version, String path)
{
return fService.getAspects(version, path);
}
/* (non-Javadoc)
* @see org.alfresco.service.cmr.remote.AVMRemote#hasAspect(int, java.lang.String, org.alfresco.service.namespace.QName)
*/
public boolean hasAspect(int version, String path, QName aspectName)
{
return fService.hasAspect(version, path, aspectName);
}
/* (non-Javadoc)
* @see org.alfresco.service.cmr.remote.AVMRemote#removeAspect(java.lang.String, org.alfresco.service.namespace.QName)
*/
public void removeAspect(String path, QName aspectName)
{
fService.removeAspect(path, aspectName);
}
/* (non-Javadoc)
* @see org.alfresco.service.cmr.remote.AVMRemote#revert(java.lang.String, org.alfresco.service.cmr.avm.AVMNodeDescriptor)
*/
public void revert(String path, AVMNodeDescriptor toRevertTo)
{
fService.revert(path, toRevertTo);
}
/* (non-Javadoc)
* @see org.alfresco.service.cmr.remote.AVMRemote#getAPath(org.alfresco.service.cmr.avm.AVMNodeDescriptor)
*/
public Pair<Integer, String> getAPath(AVMNodeDescriptor 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);
}
/* (non-Javadoc)
* @see org.alfresco.service.cmr.remote.AVMRemote#setEncoding(java.lang.String, java.lang.String)
*/
public void setEncoding(String path, String encoding)
{
fService.setEncoding(path, encoding);
}
/* (non-Javadoc)
* @see org.alfresco.service.cmr.remote.AVMRemote#setMimeType(java.lang.String, java.lang.String)
*/
public void setMimeType(String path, String mimeType)
{
fService.setMimeType(path, mimeType);
}
}

View File

@@ -1,735 +0,0 @@
/*
* Copyright (C) 2005-2013 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.repo.avm;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import org.alfresco.repo.domain.PropertyValue;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
import org.alfresco.service.cmr.avm.LayeringDescriptor;
import org.alfresco.service.cmr.avm.VersionDescriptor;
import org.alfresco.service.cmr.repository.ContentData;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair;
// Sparta: disable WCM/AVM - temporary (until WCM/AVM has been fully removed)
public class AVMServiceNOOPImpl implements AVMService
{
/**
* Basic constructor for the service.
*/
public AVMServiceNOOPImpl()
{
}
@Override
public InputStream getFileInputStream(int version, String path)
{
// TODO Auto-generated method stub
return null;
}
@Override
public InputStream getFileInputStream(AVMNodeDescriptor desc)
{
// TODO Auto-generated method stub
return null;
}
@Override
public OutputStream getFileOutputStream(String path)
{
// TODO Auto-generated method stub
return null;
}
@Override
public SortedMap<String, AVMNodeDescriptor> getDirectoryListing(
int version, String path)
{
// TODO Auto-generated method stub
return null;
}
@Override
public SortedMap<String, AVMNodeDescriptor> getDirectoryListingDirect(
int version, String path)
{
// TODO Auto-generated method stub
return null;
}
@Override
public SortedMap<String, AVMNodeDescriptor> getDirectoryListing(
AVMNodeDescriptor dir)
{
// TODO Auto-generated method stub
return null;
}
@Override
public SortedMap<String, AVMNodeDescriptor> getDirectoryListing(
AVMNodeDescriptor dir, String childNamePattern)
{
// TODO Auto-generated method stub
return null;
}
@Override
public List<String> getDeleted(int version, String path)
{
// TODO Auto-generated method stub
return null;
}
@Override
public OutputStream createFile(String path, String name)
{
// TODO Auto-generated method stub
return null;
}
@Override
public void createDirectory(String path, String name)
{
// TODO Auto-generated method stub
}
@Override
public void createLayeredFile(String targetPath, String parent, String name)
{
// TODO Auto-generated method stub
}
@Override
public void createLayeredDirectory(String targetPath, String parent,
String name)
{
// TODO Auto-generated method stub
}
@Override
public void retargetLayeredDirectory(String path, String target)
{
// TODO Auto-generated method stub
}
@Override
public void createStore(String name)
{
// TODO Auto-generated method stub
}
@Override
public void createStore(String name, Map<QName, PropertyValue> props)
{
// TODO Auto-generated method stub
}
@Override
public void createBranch(int version, String srcPath, String dstPath,
String name)
{
// TODO Auto-generated method stub
}
@Override
public void removeNode(String parent, String name)
{
// TODO Auto-generated method stub
}
@Override
public void rename(String srcParent, String srcName, String dstParent,
String dstName)
{
// TODO Auto-generated method stub
}
@Override
public void uncover(String dirPath, String name)
{
// TODO Auto-generated method stub
}
@Override
public int getNextVersionID(String storeName)
{
// TODO Auto-generated method stub
return 0;
}
@Override
public int getLatestSnapshotID(String storeName)
{
// TODO Auto-generated method stub
return 0;
}
@Override
public Map<String, Integer> createSnapshot(String store, String tag,
String description)
{
// TODO Auto-generated method stub
return null;
}
@Override
public List<VersionDescriptor> getStoreVersions(String name)
{
// TODO Auto-generated method stub
return null;
}
@Override
public List<VersionDescriptor> getStoreVersions(String name, Date from,
Date to)
{
// TODO Auto-generated method stub
return null;
}
@Override
public List<AVMStoreDescriptor> getStores()
{
return Collections.emptyList();
}
@Override
public AVMStoreDescriptor getStore(String name)
{
// TODO Auto-generated method stub
return null;
}
@Override
public AVMNodeDescriptor getStoreRoot(int version, String name)
{
// TODO Auto-generated method stub
return null;
}
@Override
public AVMNodeDescriptor lookup(int version, String path)
{
// TODO Auto-generated method stub
return null;
}
@Override
public AVMNodeDescriptor lookup(int version, String path,
boolean includeDeleted)
{
// TODO Auto-generated method stub
return null;
}
@Override
public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name)
{
// TODO Auto-generated method stub
return null;
}
@Override
public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name,
boolean includeDeleted)
{
// TODO Auto-generated method stub
return null;
}
@Override
public Pair<Integer, String> getAPath(AVMNodeDescriptor desc)
{
// TODO Auto-generated method stub
return null;
}
@Override
public String getIndirectionPath(int version, String path)
{
// TODO Auto-generated method stub
return null;
}
@Override
public void purgeStore(String name)
{
// TODO Auto-generated method stub
}
@Override
public void purgeVersion(int version, String name)
{
// TODO Auto-generated method stub
}
@Override
public void makePrimary(String path)
{
// TODO Auto-generated method stub
}
@Override
public List<AVMNodeDescriptor> getHistory(AVMNodeDescriptor desc, int count)
{
// TODO Auto-generated method stub
return null;
}
@Override
public void setOpacity(String path, boolean opacity)
{
// TODO Auto-generated method stub
}
@Override
public AVMNodeDescriptor getCommonAncestor(AVMNodeDescriptor left,
AVMNodeDescriptor right)
{
// TODO Auto-generated method stub
return null;
}
@Override
public LayeringDescriptor getLayeringInfo(int version, String path)
{
// TODO Auto-generated method stub
return null;
}
@Override
public void setNodeProperty(String path, QName name, PropertyValue value)
{
// TODO Auto-generated method stub
}
@Override
public void setNodeProperties(String path,
Map<QName, PropertyValue> properties)
{
// TODO Auto-generated method stub
}
@Override
public PropertyValue getNodeProperty(int version, String path, QName name)
{
// TODO Auto-generated method stub
return null;
}
@Override
public Map<QName, PropertyValue> getNodeProperties(int version, String path)
{
// TODO Auto-generated method stub
return null;
}
@Override
public void deleteNodeProperty(String path, QName name)
{
// TODO Auto-generated method stub
}
@Override
public void deleteNodeProperties(String path)
{
// TODO Auto-generated method stub
}
@Override
public void setStoreProperty(String store, QName name, PropertyValue value)
{
// TODO Auto-generated method stub
}
@Override
public void setStoreProperties(String store, Map<QName, PropertyValue> props)
{
// TODO Auto-generated method stub
}
@Override
public PropertyValue getStoreProperty(String store, QName name)
{
// TODO Auto-generated method stub
return null;
}
@Override
public Map<QName, PropertyValue> getStoreProperties(String store)
{
// TODO Auto-generated method stub
return null;
}
@Override
public Map<QName, PropertyValue> queryStorePropertyKey(String store,
QName keyPattern)
{
// TODO Auto-generated method stub
return null;
}
@Override
public void deleteStoreProperty(String store, QName name)
{
// TODO Auto-generated method stub
}
@Override
public void addAspect(String path, QName aspectName)
{
// TODO Auto-generated method stub
}
@Override
public Set<QName> getAspects(int version, String path)
{
// TODO Auto-generated method stub
return null;
}
@Override
public void removeAspect(String path, QName aspectName)
{
// TODO Auto-generated method stub
}
@Override
public boolean hasAspect(int version, String path, QName aspectName)
{
// TODO Auto-generated method stub
return false;
}
@Override
public void renameStore(String sourceName, String destName)
{
// TODO Auto-generated method stub
}
@Override
public void revert(String path, AVMNodeDescriptor toRevertTo)
{
// TODO Auto-generated method stub
}
@Override
public void setGuid(String path, String guid)
{
// TODO Auto-generated method stub
}
@Override
public void setMimeType(String path, String mimeType)
{
// TODO Auto-generated method stub
}
@Override
public void setEncoding(String path, String encoding)
{
// TODO Auto-generated method stub
}
@Override
public Map<String, Map<QName, PropertyValue>> queryStoresPropertyKeys(
QName keyPattern)
{
// TODO Auto-generated method stub
return null;
}
@Override
public void createDirectory(String path, String name, List<QName> aspects,
Map<QName, PropertyValue> properties)
{
// TODO Auto-generated method stub
}
@Override
public void createFile(String path, String name, InputStream in)
{
// TODO Auto-generated method stub
}
@Override
public void createFile(String path, String name, InputStream in,
List<QName> aspects, Map<QName, PropertyValue> properties)
{
// TODO Auto-generated method stub
}
@Override
public SortedMap<String, AVMNodeDescriptor> getDirectoryListing(
AVMNodeDescriptor dir, boolean includeDeleted)
{
// TODO Auto-generated method stub
return null;
}
@Override
public AVMNodeDescriptor[] getDirectoryListingArray(AVMNodeDescriptor dir,
boolean includeDeleted)
{
// TODO Auto-generated method stub
return null;
}
@Override
public SortedMap<String, AVMNodeDescriptor> getDirectoryListingDirect(
int version, String path, boolean includeDeleted)
{
// TODO Auto-generated method stub
return null;
}
@Override
public AVMNodeDescriptor[] getDirectoryListingArray(int version,
String path, boolean includeDeleted)
{
// TODO Auto-generated method stub
return null;
}
@Override
public SortedMap<String, AVMNodeDescriptor> getDirectoryListingDirect(
AVMNodeDescriptor dir, boolean includeDeleted)
{
// TODO Auto-generated method stub
return null;
}
@Override
public SortedMap<String, AVMNodeDescriptor> getDirectoryListing(
int version, String path, boolean includeDeleted)
{
// TODO Auto-generated method stub
return null;
}
@Override
public void removeNode(String path)
{
// TODO Auto-generated method stub
}
@Override
public void makeTransparent(String dirPath, String name)
{
// TODO Auto-generated method stub
}
@Override
public AVMStoreDescriptor getSystemStore()
{
// TODO Auto-generated method stub
return null;
}
@Override
public void setMetaDataFrom(String path, AVMNodeDescriptor from)
{
// TODO Auto-generated method stub
}
@Override
public void link(String parentPath, String name, AVMNodeDescriptor toLink)
{
// TODO Auto-generated method stub
}
@Override
public void updateLink(String parentPath, String name,
AVMNodeDescriptor toLink)
{
// TODO Auto-generated method stub
}
@Override
public AVMNodeDescriptor forceCopy(String path)
{
// TODO Auto-generated method stub
return null;
}
@Override
public void copy(int srcVersion, String srcPath, String dstPath, String name)
{
// TODO Auto-generated method stub
}
@Override
public List<Pair<Integer, String>> getPaths(AVMNodeDescriptor desc)
{
// TODO Auto-generated method stub
return null;
}
@Override
public List<Pair<Integer, String>> getHeadPaths(AVMNodeDescriptor desc)
{
// TODO Auto-generated method stub
return null;
}
@Override
public List<Pair<Integer, String>> getPathsInStoreHead(
AVMNodeDescriptor desc, String store)
{
// TODO Auto-generated method stub
return null;
}
@Override
public List<String> getPathsInStoreVersion(AVMNodeDescriptor desc,
String store, int version)
{
// TODO Auto-generated method stub
return null;
}
@Override
public Map<QName, PropertyValue> getNodeProperties(AVMNodeDescriptor desc)
{
// TODO Auto-generated method stub
return null;
}
@Override
public Set<QName> getAspects(AVMNodeDescriptor desc)
{
// TODO Auto-generated method stub
return null;
}
@Override
public ContentReader getContentReader(int version, String path)
{
// TODO Auto-generated method stub
return null;
}
@Override
public ContentWriter getContentWriter(String path, boolean update)
{
// TODO Auto-generated method stub
return null;
}
@Override
public ContentData getContentDataForRead(int version, String path)
{
// TODO Auto-generated method stub
return null;
}
@Override
public ContentData getContentDataForRead(AVMNodeDescriptor desc)
{
// TODO Auto-generated method stub
return null;
}
@Override
public ContentData getContentDataForWrite(String path)
{
// TODO Auto-generated method stub
return null;
}
@Override
public void setContentData(String path, ContentData data)
{
// TODO Auto-generated method stub
}
@Override
public List<VersionDescriptor> getStoreVersionsFrom(String name, int version)
{
// TODO Auto-generated method stub
return null;
}
@Override
public List<VersionDescriptor> getStoreVersionsTo(String name, int version)
{
// TODO Auto-generated method stub
return null;
}
@Override
public List<VersionDescriptor> getStoreVersionsBetween(String name,
int startVersion, int endVersion)
{
// TODO Auto-generated method stub
return null;
}
}

View File

@@ -1,77 +0,0 @@
/*
* Copyright (C) 2005-2013 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.repo.avm;
import java.util.List;
import org.alfresco.service.cmr.avmsync.AVMDifference;
import org.alfresco.service.cmr.avmsync.AVMSyncService;
import org.alfresco.util.NameMatcher;
//Sparta: disable WCM/AVM - temporary (until WCM/AVM has been fully removed)
public class AVMSyncServiceNOOPImpl implements AVMSyncService
{
/**
* Basic constructor for the service.
*/
public AVMSyncServiceNOOPImpl()
{
}
@Override
public List<AVMDifference> compare(int srcVersion, String srcPath,
int dstVersion, String dstPath, NameMatcher excluder)
{
// TODO Auto-generated method stub
return null;
}
@Override
public List<AVMDifference> compare(int srcVersion, String srcPath,
int dstVersion, String dstPath, NameMatcher excluder,
boolean expandDirs)
{
// TODO Auto-generated method stub
return null;
}
@Override
public void update(List<AVMDifference> diffList, NameMatcher excluder,
boolean ignoreConflicts, boolean ignoreOlder,
boolean overrideConflicts, boolean overrideOlder, String tag,
String description)
{
// TODO Auto-generated method stub
}
@Override
public void flatten(String layerPath, String underlyingPath)
{
// TODO Auto-generated method stub
}
@Override
public void resetLayer(String layerPath)
{
// TODO Auto-generated method stub
}
}

View File

@@ -1,108 +0,0 @@
/*
* Copyright (C) 2005-2012 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.avm;
import java.util.List;
import org.alfresco.service.cmr.avmsync.AVMDifference;
import org.alfresco.service.cmr.avmsync.AVMSyncService;
import org.alfresco.service.cmr.remote.AVMSyncServiceTransport;
import org.alfresco.service.cmr.security.AuthenticationService;
import org.alfresco.util.NameMatcher;
/**
* Server side implementation of the remote wrapper of AVMSyncService.
* @author britt
*/
public class AVMSyncServiceTransportImpl implements AVMSyncServiceTransport
{
/**
* Reference to the AVMSyncService instance.
*/
private AVMSyncService fSyncService;
/**
* Reference to the AuthenticationService instance.
*/
private AuthenticationService fAuthenticationService;
/**
* Default constructor.
*/
public AVMSyncServiceTransportImpl()
{
}
public void setAvmSyncService(AVMSyncService service)
{
fSyncService = service;
}
public void setAuthenticationService(AuthenticationService service)
{
fAuthenticationService = service;
}
/* (non-Javadoc)
* @see org.alfresco.service.cmr.avmsync.AVMSyncServiceTransport#compare(java.lang.String, int, java.lang.String, int, java.lang.String)
*/
public List<AVMDifference> compare(String ticket, int srcVersion,
String srcPath, int dstVersion, String dstPath, NameMatcher excluder)
{
fAuthenticationService.validate(ticket);
return fSyncService.compare(srcVersion, srcPath, dstVersion, dstPath, excluder);
}
@Override
public List<AVMDifference> compare(String ticket, int srcVersion, String srcPath, int dstVersion, String dstPath, NameMatcher excluder, boolean expandDirs)
{
fAuthenticationService.validate(ticket);
return fSyncService.compare(srcVersion, srcPath, dstVersion, dstPath, excluder, expandDirs);
}
/* (non-Javadoc)
* @see org.alfresco.service.cmr.avmsync.AVMSyncServiceTransport#flatten(java.lang.String, java.lang.String, java.lang.String)
*/
public void flatten(String ticket, String layerPath, String underlyingPath)
{
fAuthenticationService.validate(ticket);
fSyncService.flatten(layerPath, underlyingPath);
}
/* (non-Javadoc)
* @see org.alfresco.service.cmr.avmsync.AVMSyncServiceTransport#resetLayer(java.lang.String, java.lang.String)
*/
public void resetLayer(String ticket, String layerPath)
{
fAuthenticationService.validate(ticket);
fSyncService.resetLayer(layerPath);
}
/* (non-Javadoc)
* @see org.alfresco.service.cmr.avmsync.AVMSyncServiceTransport#update(java.lang.String, java.util.List, boolean, boolean, boolean, boolean, java.lang.String, java.lang.String)
*/
public void update(String ticket, List<AVMDifference> diffList, NameMatcher excluder,
boolean ignoreConflicts, boolean ignoreOlder,
boolean overrideConflicts, boolean overrideOlder, String tag,
String description)
{
fAuthenticationService.validate(ticket);
fSyncService.update(diffList, excluder, ignoreConflicts, ignoreOlder, overrideConflicts, overrideOlder, tag, description);
}
}

View File

@@ -1,92 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.avm;
import org.alfresco.repo.action.executer.ContentMetadataExtracter;
import org.alfresco.repo.content.ContentServicePolicies;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
/**
* A component that listens for changes to the content
*
* @since 2.1
* @author Derek Hulley
*/
public class AvmMetadataExtracter
implements ContentServicePolicies.OnContentUpdatePolicy
{
/** the component to register the behaviour with */
private PolicyComponent policyComponent;
/** the action that will do the work */
private ContentMetadataExtracter extracterAction;
/**
* @param policyComponent used for registrations
*/
public void setPolicyComponent(PolicyComponent policyComponent)
{
this.policyComponent = policyComponent;
}
/**
* @param extracterAction the action that will perform the actual extraction
*/
public void setExtracterAction(ContentMetadataExtracter extracterAction)
{
this.extracterAction = extracterAction;
}
/**
* Registers the policy behaviour methods
*/
public void init()
{
policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onContentUpdate"),
this,
new JavaBehaviour(this, "onContentUpdate"));
}
/**
* When the content changes, the metadata is extracted.
*/
public void onContentUpdate(NodeRef nodeRef, boolean newContent)
{
/*
* The use of the action here is a supreme hack. The code within the action is
* what we are after and it would be a shame to duplicate it. Also, it is the
* intention that rules will eventually work against AVM, making this class
* obsolete.
*/
// Ignore everything non-AVM
if (!nodeRef.getStoreRef().getProtocol().equals(StoreRef.PROTOCOL_AVM))
{
return;
}
// We extract the content whether it is new or not
extracterAction.executeImpl(null, nodeRef);
}
}

View File

@@ -1,98 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.avm;
/**
* Ownership, timestamps, later perhaps ACLs
* @author britt
*/
public interface BasicAttributes
{
/**
* Set the creator of the node.
* @param creator The creator to set.
*/
public void setCreator(String creator);
/**
* Get the creator of the node.
* @return The creator.
*/
public String getCreator();
/**
* Set the owner of the node.
* @param owner The owner to set.
*/
public void setOwner(String owner);
/**
* Get the owner of the node.
* @return The owner.
*/
public String getOwner();
/**
* Set the last modifier of the node.
* @param lastModifier
*/
public void setLastModifier(String lastModifier);
/**
* Get the last modifier of the node.
* @return The last modifier.
*/
public String getLastModifier();
/**
* Set the create date.
* @param createDate The date to set.
*/
public void setCreateDate(long createDate);
/**
* Get the create date.
* @return The create date.
*/
public long getCreateDate();
/**
* Set the modification date.
* @param modDate The date to set.
*/
public void setModDate(long modDate);
/**
* Get the modification date.
* @return The modification date.
*/
public long getModDate();
/**
* Set the access date of the node.
* @param accessDate The access date.
*/
public void setAccessDate(long accessDate);
/**
* Get the access date of the node.
* @return The access date.
*/
public long getAccessDate();
}

View File

@@ -1,214 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.repo.avm;
import java.io.Serializable;
/**
* Implementation of the BasicAttributesBean.
* @author britt
*/
public class BasicAttributesImpl implements BasicAttributes, Serializable
{
private static final long serialVersionUID = -3796354564923670005L;
/**
* The creator.
*/
private String fCreator;
/**
* The owner.
*/
private String fOwner;
/**
* The last modifier.
*/
private String fLastModifier;
/**
* The creation date.
*/
private long fCreateDate;
/**
* The modification date.
*/
private long fModDate;
/**
* The access date.
*/
private long fAccessDate;
/**
* Default constructor.
*/
public BasicAttributesImpl()
{
}
/**
* A Copy constructor.
* @param other
*/
public BasicAttributesImpl(BasicAttributes other)
{
fCreator = other.getCreator();
fOwner = other.getOwner();
fLastModifier = other.getLastModifier();
fCreateDate = other.getCreateDate();
fModDate = other.getModDate();
fAccessDate = other.getAccessDate();
}
/**
* Fill in the blanks constructor.
* @param creator
* @param owner
* @param modifier
* @param createDate
* @param modDate
* @param accessDate
*/
public BasicAttributesImpl(String creator,
String owner,
String modifier,
long createDate,
long modDate,
long accessDate)
{
fCreator = creator;
fOwner = owner;
fLastModifier = modifier;
fCreateDate = createDate;
fModDate = modDate;
fAccessDate = accessDate;
}
/**
* Set the creator.
* @param creator
*/
public void setCreator(String creator)
{
fCreator = creator;
}
/**
* Get the creator.
* @return The creator.
*/
public String getCreator()
{
return fCreator;
}
/**
* Set the owner.
* @param owner
*/
public void setOwner(String owner)
{
fOwner = owner;
}
/**
* Get the owner.
* @return The owner.
*/
public String getOwner()
{
return fOwner;
}
/**
* Set the last modifier.
* @param lastModifier
*/
public void setLastModifier(String lastModifier)
{
fLastModifier = lastModifier;
}
/**
* Get the last modifier.
* @return The last modifier.
*/
public String getLastModifier()
{
return fLastModifier;
}
/**
* Set the create date.
* @param createDate
*/
public void setCreateDate(long createDate)
{
fCreateDate = createDate;
}
/**
* Get the create date.
* @return The create date.
*/
public long getCreateDate()
{
return fCreateDate;
}
/**
* Set the modification date.
* @param modDate
*/
public void setModDate(long modDate)
{
fModDate = modDate;
}
/**
* Get the modification date.
* @return modDate
*/
public long getModDate()
{
return fModDate;
}
// TODO Do we want this?
/**
* Set the access date.
* @param accessDate
*/
public void setAccessDate(long accessDate)
{
fAccessDate = accessDate;
}
/**
* Get the access date.
* @return The access date.
*/
public long getAccessDate()
{
return fAccessDate;
}
}

View File

@@ -1,33 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.avm;
/**
* Interface for listeners to new store events.
* @author britt
*/
public interface CreateStoreCallback
{
/**
* A new store has been created.
* @param storeName The name of the new store.
*/
public void storeCreated(String storeName);
}

View File

@@ -1,107 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.avm;
import java.util.ArrayList;
import java.util.List;
import org.alfresco.repo.transaction.TransactionListenerAdapter;
/**
* Transaction listener for firing create store events.
* @author britt
*/
public class CreateStoreTxnListener extends TransactionListenerAdapter
{
/**
* Storage for stores created in a transaction.
*/
private ThreadLocal<List<String>> fCreatedStores;
/**
* Callbacks to invoke on commit.
*/
private List<CreateStoreCallback> fCallbacks;
/**
* Default constructor.
*/
public CreateStoreTxnListener()
{
fCreatedStores = new ThreadLocal<List<String>>();
fCallbacks = new ArrayList<CreateStoreCallback>();
}
/* (non-Javadoc)
* @see org.alfresco.repo.transaction.TransactionListenerAdapter#afterCommit()
*/
@Override
public void afterCommit()
{
List<String> created = fCreatedStores.get();
if (created != null)
{
for (String name : created)
{
synchronized (this)
{
for (CreateStoreCallback cb : fCallbacks)
{
cb.storeCreated(name);
}
}
}
fCreatedStores.set(null);
}
}
/* (non-Javadoc)
* @see org.alfresco.repo.transaction.TransactionListenerAdapter#afterRollback()
*/
@Override
public void afterRollback()
{
fCreatedStores.set(null);
}
/**
* During the transaction somebody is responsible for
* calling this.
* @param storeName The name of the store that has been created.
*/
public void storeCreated(String storeName)
{
List<String> created = fCreatedStores.get();
if (created == null)
{
created = new ArrayList<String>();
fCreatedStores.set(created);
}
created.add(storeName);
}
/**
* Register a callback.
* @param cb The callback.
*/
public synchronized void addCallback(CreateStoreCallback cb)
{
fCallbacks.add(cb);
}
}

View File

@@ -1,33 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.avm;
/**
* Callback interface for those interested in new version creation.
* @author britt
*/
public interface CreateVersionCallback
{
/**
* A version of a store has been created.
* @param storeName The name of the store in which a new version has been created.
* @param versionID The version id of the new version.
*/
public void versionCreated(String storeName, int versionID);
}

View File

@@ -1,109 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.avm;
import java.util.ArrayList;
import java.util.List;
import org.alfresco.repo.transaction.TransactionListenerAdapter;
import org.alfresco.util.Pair;
/**
* Transaction listener that fires create version events.
* @author britt
*/
public class CreateVersionTxnListener extends TransactionListenerAdapter
{
/**
* Storage for versions created in a transaction.
*/
private ThreadLocal<List<Pair<String, Integer>>> fCreatedVersions;
/**
* Callbacks to invoke on commit.
*/
private List<CreateVersionCallback> fCallbacks;
/**
* Default constructor.
*/
public CreateVersionTxnListener()
{
fCreatedVersions = new ThreadLocal<List<Pair<String, Integer>>>();
fCallbacks = new ArrayList<CreateVersionCallback>();
}
/* (non-Javadoc)
* @see org.alfresco.repo.transaction.TransactionListenerAdapter#afterCommit()
*/
@Override
public void afterCommit()
{
List<Pair<String, Integer>> created = fCreatedVersions.get();
if (created != null)
{
for (Pair<String, Integer> version : created)
{
synchronized (this)
{
for (CreateVersionCallback cb : fCallbacks)
{
cb.versionCreated(version.getFirst(), version.getSecond());
}
}
}
fCreatedVersions.set(null);
}
}
/* (non-Javadoc)
* @see org.alfresco.repo.transaction.TransactionListenerAdapter#afterRollback()
*/
@Override
public void afterRollback()
{
fCreatedVersions.set(null);
}
/**
* During the transaction somebody is responsible for
* calling this.
* @param storeName The name of the store that just created a new version
* @param versionID The id of the new version.
*/
public void versionCreated(String storeName, int versionID)
{
List<Pair<String, Integer>> created = fCreatedVersions.get();
if (created == null)
{
created = new ArrayList<Pair<String, Integer>>();
fCreatedVersions.set(created);
}
created.add(new Pair<String, Integer>(storeName, versionID));
}
/**
* Register a callback.
* @param cb The callback.
*/
public synchronized void addCallback(CreateVersionCallback cb)
{
fCallbacks.add(cb);
}
}

View File

@@ -1,332 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. */
package org.alfresco.repo.avm;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.WCMAppModel;
import org.alfresco.model.WCMModel;
import org.alfresco.repo.avm.util.AVMUtil;
import org.alfresco.repo.domain.PropertyValue;
import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.Behaviour;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.util.PropertyCheck;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Class defines policy behaviour for avmlayeredfolder type
*
* @author Ivan Rybnikov
* @since 4.0.2
*/
public class LayeredFolderType implements NodeServicePolicies.OnMoveNodePolicy
{
private static Log logger = LogFactory.getLog(LayeredFolderType.class);
/** The policy component */
private PolicyComponent policyComponent;
private FileFolderService fileFolderService;
transient private AVMService avmService;
/** Used to determine was the policy executed by Web-Client operation */
private static ThreadLocal<Boolean> issuedByWebClient = new ThreadLocal<Boolean>();
/** Default max time allowed for the external issuers (CIFS, FTP) */
private static long EXTERNAL_MAX_TIME = 2000;
/** Max time allowed for the external issuers (CIFS, FTP).
* can be overridden by bean definition */
private long maxTime = EXTERNAL_MAX_TIME;
/**
* Initialize the avmlayeredfolder type policies
*/
public void init()
{
if (maxTime < 0)
{
logger.warn(
"Unable to set 'wcm.rename.max.time.milliseconds' property value: '" + maxTime + " ms', " +
"set default value: '" + EXTERNAL_MAX_TIME + " ms'");
setMaxTime(EXTERNAL_MAX_TIME);
}
PropertyCheck.mandatory(this, "policyComponent", policyComponent);
PropertyCheck.mandatory(this, "fileFolderService", fileFolderService);
PropertyCheck.mandatory(this, "avmService", avmService);
this.policyComponent.bindClassBehaviour(
NodeServicePolicies.OnMoveNodePolicy.QNAME,
WCMModel.TYPE_AVM_LAYERED_FOLDER,
new JavaBehaviour(this, "onMoveNode", Behaviour.NotificationFrequency.EVERY_EVENT));
}
@Override
public synchronized void onMoveNode(ChildAssociationRef oldChildAssocRef, ChildAssociationRef newChildAssocRef)
{
// Storing start time
long startTime = System.currentTimeMillis();
NodeRef oldNodeRef = oldChildAssocRef.getChildRef();
NodeRef newNodeRef = newChildAssocRef.getChildRef();
String name = newChildAssocRef.getQName().getLocalName();
String[] splittedPath = AVMUtil.splitPath(AVMNodeConverter.ToAVMVersionPath(oldNodeRef).getSecond());
// Get AVM store name
String avmStore = splittedPath[0];
// Get stale path
String oldPathToReplace = splittedPath[1];
// Create new path
String newPathToInsert = oldPathToReplace.substring(0, oldPathToReplace.lastIndexOf(AVMUtil.AVM_PATH_SEPARATOR_CHAR) + 1) + name;
AVMNodeDescriptor desc = avmService.lookup(-1, AVMNodeConverter.ToAVMVersionPath(newNodeRef).getSecond());
if (desc.isDirectory())
{
// Create the initial list of descriptors
List<AVMNodeDescriptor> descriptors = new ArrayList<AVMNodeDescriptor>(10);
descriptors.add(desc);
// List of next level of descriptors
List<AVMNodeDescriptor> nextDescriptors = new ArrayList<AVMNodeDescriptor>(10);
while (descriptors.size() != 0)
{
if (nextDescriptors != null)
{
nextDescriptors.clear();
}
for (AVMNodeDescriptor curDescriptor : descriptors)
{
Map<String, AVMNodeDescriptor> listing = avmService.getDirectoryListing(curDescriptor);
if (listing.size() == 0)
{
continue;
}
for (AVMNodeDescriptor descriptor : listing.values())
{
if (descriptor.isDirectory())
{
nextDescriptors.add(descriptor);
}
else if (descriptor.isFile())
{
refreshPath(descriptor, avmStore, oldPathToReplace, newPathToInsert, startTime);
}
}
}
descriptors.clear();
if(nextDescriptors != null)
{
descriptors.addAll(nextDescriptors);
}
}
}
}
private void refreshPath(AVMNodeDescriptor descriptor, String avmStore, String oldPathToReplace, String newPathToInsert, long startTime)
{
checkDuration(startTime);
String path = descriptor.getPath();
// If file is a form instance data refresh its paths to renditions
if (avmService.hasAspect(-1, path, WCMAppModel.ASPECT_FORM_INSTANCE_DATA))
{
refreshFormInstanceData(avmStore, oldPathToReplace, newPathToInsert, -1, path);
}
// If file is a rendition find its form instance data and refresh its paths to renditions
else if (avmService.hasAspect(-1, path, WCMAppModel.ASPECT_RENDITION))
{
refreshRendition(avmStore, oldPathToReplace, newPathToInsert, -1, path);
}
}
private void refreshFormInstanceData(String avmStore, String pathToReplace, String pathToInsert, int nodeVersion, String nodePath)
{
// Get all renditions
final PropertyValue pv = avmService.getNodeProperty(nodeVersion, nodePath, WCMAppModel.PROP_RENDITIONS);
// Skip if there is no renditions.
if (pv == null)
return;
final Collection<Serializable> renditionPaths = pv.getCollection(DataTypeDefinition.TEXT);
final List<String> newRenditionPaths = new ArrayList<String>(renditionPaths.size());
// Refresh all renditions paths
for (Serializable renditionPath : renditionPaths)
{
// Get old path which become stale
String oldPath = (String) renditionPath;
// Refresh path to make it actual
String newPath = oldPath.replaceFirst(pathToReplace, pathToInsert);
newRenditionPaths.add(newPath);
// Refresh property WCMAppModel.PROP_PRIMARY_FORM_INSTANCE_DATA of the rendition
// which is the path from rendition to the form instance data
String fullRenditionPath = avmStore + ":" + newPath;
String primaryFormInstanceData = avmService.getNodeProperty(-1, fullRenditionPath, WCMAppModel.PROP_PRIMARY_FORM_INSTANCE_DATA).getStringValue();
primaryFormInstanceData = primaryFormInstanceData.replaceFirst(pathToReplace, pathToInsert);
avmService.setNodeProperty(fullRenditionPath, WCMAppModel.PROP_PRIMARY_FORM_INSTANCE_DATA, new PropertyValue(DataTypeDefinition.TEXT,
primaryFormInstanceData));
}
avmService.setNodeProperty(nodePath, WCMAppModel.PROP_RENDITIONS, new PropertyValue(DataTypeDefinition.TEXT, (Serializable) newRenditionPaths));
}
private void refreshRendition(String avmStore, String pathToReplace, String pathToInsert, int nodeVersion, String nodePath)
{
// Get form instance data
String primaryFormInstanceData = avmService.getNodeProperty(nodeVersion, nodePath, WCMAppModel.PROP_PRIMARY_FORM_INSTANCE_DATA).getStringValue();
// If form instance data is under the same folder skip it because it will be processed by refreshFormInstanceData() method
if (primaryFormInstanceData.startsWith(pathToReplace + AVMUtil.AVM_PATH_SEPARATOR_CHAR))
return;
// If form instance data contains new path skip it because it have already been processed
if (primaryFormInstanceData.startsWith(pathToInsert + AVMUtil.AVM_PATH_SEPARATOR_CHAR))
return;
// Get paths to renditions
final PropertyValue pv = avmService.getNodeProperty(-1, avmStore + ":" + primaryFormInstanceData, WCMAppModel.PROP_RENDITIONS);
// Return if renditions list is empty
if (pv == null)
return;
final Collection<Serializable> renditionPaths = pv.getCollection(DataTypeDefinition.TEXT);
final List<String> newRenditionPaths = new ArrayList<String>(renditionPaths.size());
// Refresh all paths
for (Serializable renditionPath : renditionPaths)
{
// Form instance data have already been refreshed
if (((String) renditionPath).startsWith(pathToInsert))
return;
String newPath = ((String) renditionPath).replaceFirst(pathToReplace, pathToInsert);
newRenditionPaths.add(newPath);
}
avmService.setNodeProperty(
avmStore + ":" + primaryFormInstanceData,
WCMAppModel.PROP_RENDITIONS,
new PropertyValue(DataTypeDefinition.TEXT, (Serializable) newRenditionPaths));
}
/**
* Set the policy component
*
* @param policyComponent the policy component
*/
public void setPolicyComponent(PolicyComponent policyComponent)
{
this.policyComponent = policyComponent;
}
/**
* Set the fileFolderService
*
* @param fileFolderService
*/
public void setFileFolderService(FileFolderService fileFolderService)
{
this.fileFolderService = fileFolderService;
}
/**
* Set the avmService
*
* @param avmService
*/
public void setAvmService(AVMService avmService)
{
this.avmService = avmService;
}
/**
* Checks policy duration.
* If policy was fired by the external calls (FTP, CIFS)
* and exceeds value set in wcm.rename.max.time.milliseconds exception is thrown.
* Default time is set to 2 seconds.
*
* @throws AlfrescoRuntimeException if operation exceeds max time duration
*/
private void checkDuration(long startTime)
{
if (!isIssuedByWebClient() && ((System.currentTimeMillis() - startTime) > maxTime))
{
logger.warn("Operation exceeds max time duration and was aborted");
throw new AlfrescoRuntimeException("Operation exceeds max time duration and was aborted");
}
}
/**
* Thread variable used to determine whether policy
* fired by Web-Client or by external issuers (FTP, CIFS)
*
* @param isWebClient
*/
public static void setIssuedByWebClient(Boolean isWebClient)
{
issuedByWebClient.set(isWebClient);
}
/**
* Get the issuedByWebClient
*
* @return issuedByWebClient
*/
public static Boolean isIssuedByWebClient()
{
Boolean result = issuedByWebClient.get();
return result == null ? Boolean.FALSE : result;
}
/**
* Set the max time
*
* @param maxTime
*/
public void setMaxTime(long maxTime)
{
this.maxTime = maxTime;
}
}

View File

@@ -1,158 +0,0 @@
/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.avm;
import java.io.Serializable;
import org.alfresco.repo.avm.util.SimplePath;
/**
* This is the key by which Lookup's are retrieved from the cache.
* @author britt
*/
public class LookupKey implements Serializable
{
private static final long serialVersionUID = 8471482833953423406L;
/**
* The name of the store.
*/
private String fStoreName;
/**
* The path being looked up.
*/
private SimplePath fPath;
/**
* The version being looked up.
*/
private int fVersion;
/**
* Whether the lookup is a write lookup.
*/
private boolean fWrite;
/**
* Whether the lookup includes deleted nodes.
*/
private boolean fIncludeDeleted;
/**
* Create one from whole cloth.
* @param version The version we're looking under.
* @param path The path.
* @param storeName The name of the store.
* @param write Whether this is a write lookup.
* @param includeDeleted Whether this lookup should include deleted items.
*/
public LookupKey(int version,
SimplePath path,
String storeName,
boolean write,
boolean includeDeleted)
{
fVersion = version;
fPath = path;
fStoreName = storeName;
fWrite = write;
fIncludeDeleted = includeDeleted;
}
public LookupKey(LookupKey other)
{
fVersion = other.fVersion;
fPath = other.fPath;
fStoreName = other.fStoreName;
fWrite = other.fWrite;
fIncludeDeleted = other.fIncludeDeleted;
}
/**
* Set the writeness of this key.
*/
public void setWrite(boolean write)
{
fWrite = write;
}
/**
* Get the store name for this key.
* @return The store name.
*/
public String getStoreName()
{
return fStoreName;
}
/**
* Is this a write lookup.
* @return Whether this is a write lookup.
*/
public boolean isWrite()
{
return fWrite;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (!(obj instanceof LookupKey))
{
return false;
}
LookupKey o = (LookupKey)obj;
return fStoreName.equalsIgnoreCase(o.fStoreName) &&
fVersion == o.fVersion &&
fPath.equals(o.fPath) &&
fWrite == o.fWrite &&
fIncludeDeleted == o.fIncludeDeleted;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode()
{
int hash = fStoreName.toLowerCase().hashCode();
hash += fPath.hashCode();
hash += fVersion;
hash += fWrite ? 1 : 0;
hash += fIncludeDeleted ? 1 : 0;
return hash;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
return fStoreName + ":" + fPath + "-" + fVersion + "-" + fWrite + "-" + fIncludeDeleted;
}
}

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More