By applying the cm:storeSelector aspect and setting its cm:storeName property to the name of a selectable store, the content will be automatically moved from its current location to the new store. The store does not, therefore, store content itself, it defines and manages those stores that are available for selection.
This allows storage polices to be implemented to control which underlying physical storage is used, based on your applications needs or business policies. For example, if you have a fast (and expensive) local disk, you can use this to store the files that you want to ensure are served for best performance; however, infrequently used files may be stored on lower cost, slower storage.
A summary of the procedure is as follows:
<bean id="firstSharedFileContentStore" class="org.alfresco.repo.content.filestore.FileContentStore"> <constructor-arg> <value>${dir.root}/storeA</value> </constructor-arg> </bean> <bean id="secondSharedFileContentStore" class="org.alfresco.repo.content.filestore.FileContentStore"> <constructor-arg> <value>${dir.root}/storeB</value> </constructor-arg> </bean>
This configuration snippet defines two new stores. The physical location is relative to the dir.root property defined in the alfresco-global.properties file.
<bean id="contentService" parent="baseContentService"> <property name="store"> <ref bean="storeSelectorContentStore" /> </property> </bean>
<bean id="storeSelectorContentStore" parent="storeSelectorContentStoreBase"> <property name="defaultStoreName"> <value>default</value> </property> <property name="storesByName"> <map> <entry key="default"> <ref bean="fileContentStore" /> </entry> <entry key="storeA"> <ref bean="firstSharedFileContentStore" /> </entry> <entry key="storeB"> <ref bean="secondSharedFileContentStore" /> </entry> </map> </property> </bean>
The list of stores is defined by the <property name="storesByName"> property. Any stores you want to be available to the storeSelectorContentStore should be listed under this property.
The cm:storeName property can be set in number of ways:
The expected behavior is as follows:
This configuration must be saved as an extension, for example, <extension>\sample-content-store-selector-context.xml.
<?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="firstSharedFileContentStore" class="org.alfresco.repo.content.filestore.FileContentStore"> <constructor-arg> <value>${dir.root}/storeA</value> </constructor-arg> </bean> <bean id="secondSharedFileContentStore" class="org.alfresco.repo.content.filestore.FileContentStore"> <constructor-arg> <value>${dir.root}/storeB</value> </constructor-arg> </bean> <bean id="storeSelectorContentStore" parent="storeSelectorContentStoreBase"> <property name="defaultStoreName"> <value>default</value> </property> <property name="storesByName"> <map> <entry key="default"> <ref bean="fileContentStore" /> </entry> <entry key="storeA"> <ref bean="firstSharedFileContentStore" /> </entry> <entry key="storeB"> <ref bean="secondSharedFileContentStore" /> </entry> </map> </property> </bean> <!-- Point the ContentService to the 'selector' store --> <bean id="contentService" parent="baseContentService"> <property name="store"> <ref bean="storeSelectorContentStore" /> </property> </bean> <!-- Add the other stores to the list of stores for cleaning --> <bean id="eagerContentStoreCleaner" class="org.alfresco.repo.content.cleanup.EagerContentStoreCleaner" init-method="init"> <property name="eagerOrphanCleanup" > <value>${system.content.eagerOrphanCleanup}</value> </property> <property name="stores" > <list> <ref bean="fileContentStore" /> <ref bean="firstSharedFileContentStore" /> <ref bean="secondSharedFileContentStore" /> </list> </property> <property name="listeners" > <ref bean="deletedContentBackupListeners" /> </property> </bean> </beans>
The following example shows the web-client-config-custom.xml file:
<!-- Configuring in the cm:storeSelector aspect --> <config evaluator="aspect-name" condition="cm:storeSelector"> <property-sheet> <show-property name="cm:storeName" /> </property-sheet> </config> <config evaluator="string-compare" condition="Action Wizards"> <aspects> <aspect name="cm:storeSelector"/> </aspects> </config> ...
Links:
[1] https://docs.alfresco.com/../tasks/store-filestore-define.html
[2] https://docs.alfresco.com/../concepts/store-using.html
[3] https://docs.alfresco.com/../concepts/store-config-fullexample.html
[4] https://docs.alfresco.com/../concepts/manage-cs-home.html
[5] https://docs.alfresco.com/../concepts/store-manage-content.html