mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-06-16 17:55:15 +00:00
Merged V2.1 to HEAD
6535: adding in handlers for renames and deletes of webforms to update web project configurations. 6536: fix to monthpicker. 6537: Cluster sample config for ticketsCache defaults to replicating puts 6538: Invite web users wizard was not correctly initialising 6539: AWC-1474 - Email Space Users dialog - if no email recipients then show message 6540: Fixed remote classpath check for SDK projects 6541: AR-1544: Inbound Rules Being Fired on Name Property Update 6542: Fix for AWC-1216 - changed NavigationBean to spot when CIFS server is disabled (as the method has changed in repo) 6543: AR-1623: WebServices authentication errors during concurrent load test 6544: AWC-1253: AddContent action should be externally configurable/overridable 6545: Fixed AR-1586: Nicer message when installing older module or duplicate module 6546: AWC-1301: Access Denied viewing details of content with association 6547: AWC-1499: It is impossible to remove 'Complianceable' aspect with the help of Run action 6548: Missing file ... should fix build issues 6549: Missed file .. fixed build issue 6550: AWC-1092: sorting by version number in version history is alpha, not numeric 6551: AWC-1217: Cannot differentiate between two users with same name in user picker search results 6552: Fixed AR-1572: Export of ML-enabled documents can now be imported 6553: Removed tabs 6554: Fixed handling of SC_NOT_FOUND message 6555: Fixed AR-1627: Removed ability to flush transaction resources on demand git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6744 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
parent
ab0e9db542
commit
652b9406db
@ -488,10 +488,10 @@
|
|||||||
|
|
||||||
<cacheEventListenerFactory
|
<cacheEventListenerFactory
|
||||||
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
|
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
|
||||||
properties="replicatePuts = false,
|
properties="replicatePuts = true,
|
||||||
replicateUpdates = true,
|
replicateUpdates = true,
|
||||||
replicateRemovals = true,
|
replicateRemovals = true,
|
||||||
replicateUpdatesViaCopy = false,
|
replicateUpdatesViaCopy = true,
|
||||||
replicateAsynchronously = false"/>
|
replicateAsynchronously = false"/>
|
||||||
</cache>
|
</cache>
|
||||||
|
|
||||||
|
@ -364,18 +364,15 @@
|
|||||||
|
|
||||||
<aspect name="cm:complianceable">
|
<aspect name="cm:complianceable">
|
||||||
<title>Complianceable</title>
|
<title>Complianceable</title>
|
||||||
<parent>cm:auditable</parent>
|
|
||||||
<!-- TODO: Support mandatory-aspects on an aspect in the meta-model
|
|
||||||
<mandatory-aspects>
|
|
||||||
<aspect>cm:auditable</aspect>
|
|
||||||
</mandatory-aspects>
|
|
||||||
-->
|
|
||||||
<properties>
|
<properties>
|
||||||
<property name="cm:removeAfter">
|
<property name="cm:removeAfter">
|
||||||
<title>Remove After</title>
|
<title>Remove After</title>
|
||||||
<type>d:datetime</type>
|
<type>d:datetime</type>
|
||||||
</property>
|
</property>
|
||||||
</properties>
|
</properties>
|
||||||
|
<mandatory-aspects>
|
||||||
|
<aspect>cm:auditable</aspect>
|
||||||
|
</mandatory-aspects>
|
||||||
</aspect>
|
</aspect>
|
||||||
|
|
||||||
<aspect name="cm:ownable">
|
<aspect name="cm:ownable">
|
||||||
|
@ -116,9 +116,6 @@
|
|||||||
<property name="dictionaryService">
|
<property name="dictionaryService">
|
||||||
<ref bean="dictionaryService"/>
|
<ref bean="dictionaryService"/>
|
||||||
</property>
|
</property>
|
||||||
<property name="policyName">
|
|
||||||
<value>onCreateNode</value>
|
|
||||||
</property>
|
|
||||||
<property name="isClassBehaviour">
|
<property name="isClassBehaviour">
|
||||||
<value>true</value>
|
<value>true</value>
|
||||||
</property>
|
</property>
|
||||||
@ -133,16 +130,10 @@
|
|||||||
<bean id="on-property-update-trigger" class="org.alfresco.repo.rule.ruletrigger.OnPropertyUpdateRuleTrigger" parent="rule-trigger-base">
|
<bean id="on-property-update-trigger" class="org.alfresco.repo.rule.ruletrigger.OnPropertyUpdateRuleTrigger" parent="rule-trigger-base">
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="on-create-child-association-trigger" class="org.alfresco.repo.rule.ruletrigger.SingleChildAssocRefPolicyRuleTrigger" parent="rule-trigger-base">
|
<bean id="on-create-child-association-trigger" class="org.alfresco.repo.rule.ruletrigger.OnCreateChildAssociationRuleTrigger" parent="rule-trigger-base">
|
||||||
<property name="policyName">
|
|
||||||
<value>onCreateChildAssociation</value>
|
|
||||||
</property>
|
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="on-delete-child-association-trigger" class="org.alfresco.repo.rule.ruletrigger.SingleChildAssocRefPolicyRuleTrigger" parent="rule-trigger-base">
|
<bean id="on-delete-child-association-trigger" class="org.alfresco.repo.rule.ruletrigger.BeforeDeleteChildAssociationRuleTrigger" parent="rule-trigger-base">
|
||||||
<property name="policyName">
|
|
||||||
<value>beforeDeleteChildAssociation</value>
|
|
||||||
</property>
|
|
||||||
<property name="executeRuleImmediately">
|
<property name="executeRuleImmediately">
|
||||||
<value>true</value>
|
<value>true</value>
|
||||||
</property>
|
</property>
|
||||||
|
@ -173,7 +173,7 @@ public class HttpAlfrescoContentReader extends AbstractContentReader
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Check the return codes
|
// Check the return codes
|
||||||
if (statusCode == HttpServletResponse.SC_NOT_FOUND)
|
if (statusCode == HttpServletResponse.SC_NO_CONTENT)
|
||||||
{
|
{
|
||||||
// It doesn't exist, which is not an error. The defaults are fine.
|
// It doesn't exist, which is not an error. The defaults are fine.
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.alfresco.model.ContentModel;
|
||||||
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
||||||
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
||||||
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
|
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
|
||||||
@ -375,7 +376,15 @@ public class ExporterComponent
|
|||||||
Set<QName> aspects = nodeService.getAspects(nodeRef);
|
Set<QName> aspects = nodeService.getAspects(nodeRef);
|
||||||
for (QName aspect : aspects)
|
for (QName aspect : aspects)
|
||||||
{
|
{
|
||||||
if (!isExcludedURI(parameters.getExcludeNamespaceURIs(), aspect.getNamespaceURI()))
|
if (isExcludedURI(parameters.getExcludeNamespaceURIs(), aspect.getNamespaceURI()))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (isExcludeAspect(aspect))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
exporter.startAspect(nodeRef, aspect);
|
exporter.startAspect(nodeRef, aspect);
|
||||||
exporter.endAspect(nodeRef, aspect);
|
exporter.endAspect(nodeRef, aspect);
|
||||||
@ -686,6 +695,25 @@ public class ExporterComponent
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is the aspect unexportable?
|
||||||
|
*
|
||||||
|
* @param aspectQName the aspect name
|
||||||
|
* @return <tt>true</tt> if the aspect can't be exported
|
||||||
|
*/
|
||||||
|
private boolean isExcludeAspect(QName aspectQName)
|
||||||
|
{
|
||||||
|
if (aspectQName.equals(ContentModel.ASPECT_MULTILINGUAL_DOCUMENT) ||
|
||||||
|
aspectQName.equals(ContentModel.ASPECT_MULTILINGUAL_EMPTY_TRANSLATION))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine if specified Node Reference is within the set of nodes to be exported
|
* Determine if specified Node Reference is within the set of nodes to be exported
|
||||||
*
|
*
|
||||||
|
@ -36,6 +36,7 @@ import org.alfresco.error.AlfrescoRuntimeException;
|
|||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
import org.alfresco.repo.search.QueryParameterDefImpl;
|
import org.alfresco.repo.search.QueryParameterDefImpl;
|
||||||
import org.alfresco.repo.tenant.TenantService;
|
import org.alfresco.repo.tenant.TenantService;
|
||||||
|
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
|
||||||
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
||||||
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
||||||
import org.alfresco.service.cmr.model.FileExistsException;
|
import org.alfresco.service.cmr.model.FileExistsException;
|
||||||
@ -521,12 +522,20 @@ public class FileFolderServiceImpl implements FileFolderService
|
|||||||
// done
|
// done
|
||||||
return nodeRefs;
|
return nodeRefs;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see #move(NodeRef, NodeRef, String)
|
* @see #move(NodeRef, NodeRef, String)
|
||||||
*/
|
*/
|
||||||
public FileInfo rename(NodeRef sourceNodeRef, String newName) throws FileExistsException, FileNotFoundException
|
public FileInfo rename(NodeRef sourceNodeRef, String newName) throws FileExistsException, FileNotFoundException
|
||||||
{
|
{
|
||||||
|
// NOTE:
|
||||||
|
//
|
||||||
|
// This information is placed in the transaction to indicate that a rename has taken place. This information is
|
||||||
|
// used by the rule trigger to ensure inbound rule is not triggered by a file rename
|
||||||
|
//
|
||||||
|
// See http://issues.alfresco.com/browse/AR-1544
|
||||||
|
AlfrescoTransactionSupport.bindResource(sourceNodeRef.toString()+"rename", sourceNodeRef);
|
||||||
|
|
||||||
return moveOrCopy(sourceNodeRef, null, newName, true);
|
return moveOrCopy(sourceNodeRef, null, newName, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -643,12 +652,12 @@ public class FileFolderServiceImpl implements FileFolderService
|
|||||||
ContentData contentData = (ContentData)nodeService.getProperty(targetNodeRef, ContentModel.PROP_CONTENT);
|
ContentData contentData = (ContentData)nodeService.getProperty(targetNodeRef, ContentModel.PROP_CONTENT);
|
||||||
if (contentData != null)
|
if (contentData != null)
|
||||||
{
|
{
|
||||||
String targetMimetype = contentData.getMimetype();
|
String targetMimetype = contentData.getMimetype();
|
||||||
String newMimetype = mimetypeService.guessMimetype(newName);
|
String newMimetype = mimetypeService.guessMimetype(newName);
|
||||||
if (!targetMimetype.equalsIgnoreCase(newMimetype))
|
if (!targetMimetype.equalsIgnoreCase(newMimetype))
|
||||||
{
|
{
|
||||||
contentData = ContentData.setMimetype(contentData, newMimetype);
|
contentData = ContentData.setMimetype(contentData, newMimetype);
|
||||||
nodeService.setProperty(targetNodeRef, ContentModel.PROP_CONTENT, contentData);
|
nodeService.setProperty(targetNodeRef, ContentModel.PROP_CONTENT, contentData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -768,16 +768,25 @@ public class ModuleManagementTool
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (directory == false)
|
try
|
||||||
{
|
{
|
||||||
// Install the module
|
if (directory == false)
|
||||||
manager.installModule(aepFileLocation, warFileLocation, previewInstall, forceInstall, backup);
|
{
|
||||||
|
// Install the module
|
||||||
|
manager.installModule(aepFileLocation, warFileLocation, previewInstall, forceInstall, backup);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Install the modules from the directory
|
||||||
|
manager.installModules(aepFileLocation, warFileLocation, previewInstall, forceInstall, backup);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
catch (ModuleManagementToolException e)
|
||||||
{
|
{
|
||||||
// Install the modules from the directory
|
// These are user-friendly
|
||||||
manager.installModules(aepFileLocation, warFileLocation, previewInstall, forceInstall, backup);
|
manager.outputMessage(e.getMessage());
|
||||||
|
outputUsage();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (OP_LIST.equals(operation) == true && args.length == 2)
|
else if (OP_LIST.equals(operation) == true && args.length == 2)
|
||||||
|
@ -1013,9 +1013,6 @@ public abstract class BaseNodeServiceTest extends BaseSpringTest
|
|||||||
getSession().flush();
|
getSession().flush();
|
||||||
getSession().clear();
|
getSession().clear();
|
||||||
|
|
||||||
// make sure that our integrity allows this
|
|
||||||
AlfrescoTransactionSupport.flush();
|
|
||||||
|
|
||||||
// now get them back
|
// now get them back
|
||||||
Map<QName, Serializable> checkMap = nodeService.getProperties(nodeRef);
|
Map<QName, Serializable> checkMap = nodeService.getProperties(nodeRef);
|
||||||
assertNotNull("Properties were not set/retrieved", checkMap);
|
assertNotNull("Properties were not set/retrieved", checkMap);
|
||||||
@ -1717,14 +1714,12 @@ public abstract class BaseNodeServiceTest extends BaseSpringTest
|
|||||||
ASSOC_TYPE_QNAME_TEST_CONTAINS,
|
ASSOC_TYPE_QNAME_TEST_CONTAINS,
|
||||||
QName.createQName("pathB"),
|
QName.createQName("pathB"),
|
||||||
ContentModel.TYPE_CONTENT);
|
ContentModel.TYPE_CONTENT);
|
||||||
AlfrescoTransactionSupport.flush();
|
|
||||||
// there should be no issue with a duplicate association names any more
|
// there should be no issue with a duplicate association names any more
|
||||||
ChildAssociationRef pathBDuplicateRef = nodeService.createNode(
|
ChildAssociationRef pathBDuplicateRef = nodeService.createNode(
|
||||||
parentRef,
|
parentRef,
|
||||||
ASSOC_TYPE_QNAME_TEST_CONTAINS,
|
ASSOC_TYPE_QNAME_TEST_CONTAINS,
|
||||||
QName.createQName("pathB"),
|
QName.createQName("pathB"),
|
||||||
ContentModel.TYPE_CONTENT);
|
ContentModel.TYPE_CONTENT);
|
||||||
AlfrescoTransactionSupport.flush();
|
|
||||||
// Now create nodes with duplicate cm:name properties
|
// Now create nodes with duplicate cm:name properties
|
||||||
Map<QName, Serializable> props = new HashMap<QName, Serializable>(5);
|
Map<QName, Serializable> props = new HashMap<QName, Serializable>(5);
|
||||||
props.put(ContentModel.PROP_NAME, "ABC");
|
props.put(ContentModel.PROP_NAME, "ABC");
|
||||||
@ -1734,7 +1729,6 @@ public abstract class BaseNodeServiceTest extends BaseSpringTest
|
|||||||
QName.createQName("ABC"),
|
QName.createQName("ABC"),
|
||||||
ContentModel.TYPE_CONTENT,
|
ContentModel.TYPE_CONTENT,
|
||||||
props);
|
props);
|
||||||
AlfrescoTransactionSupport.flush();
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// now check that the duplicate is detected with attention to being case-insensitive
|
// now check that the duplicate is detected with attention to being case-insensitive
|
||||||
@ -1774,7 +1768,6 @@ public abstract class BaseNodeServiceTest extends BaseSpringTest
|
|||||||
ContentModel.TYPE_CONTENT,
|
ContentModel.TYPE_CONTENT,
|
||||||
props);
|
props);
|
||||||
NodeRef abcRef = pathAbcRef.getChildRef();
|
NodeRef abcRef = pathAbcRef.getChildRef();
|
||||||
AlfrescoTransactionSupport.flush();
|
|
||||||
// delete ABC
|
// delete ABC
|
||||||
nodeService.deleteNode(abcRef);
|
nodeService.deleteNode(abcRef);
|
||||||
// create it again
|
// create it again
|
||||||
|
@ -70,6 +70,7 @@ import org.alfresco.service.cmr.coci.CheckOutCheckInService;
|
|||||||
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
||||||
import org.alfresco.service.cmr.lock.LockService;
|
import org.alfresco.service.cmr.lock.LockService;
|
||||||
import org.alfresco.service.cmr.lock.LockStatus;
|
import org.alfresco.service.cmr.lock.LockStatus;
|
||||||
|
import org.alfresco.service.cmr.model.FileFolderService;
|
||||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||||
import org.alfresco.service.cmr.repository.ContentData;
|
import org.alfresco.service.cmr.repository.ContentData;
|
||||||
import org.alfresco.service.cmr.repository.ContentService;
|
import org.alfresco.service.cmr.repository.ContentService;
|
||||||
@ -118,6 +119,7 @@ public class RuleServiceCoverageTest extends TestCase
|
|||||||
private ContentTransformerRegistry transformerRegistry;
|
private ContentTransformerRegistry transformerRegistry;
|
||||||
private CopyService copyService;
|
private CopyService copyService;
|
||||||
private AuthenticationComponent authenticationComponent;
|
private AuthenticationComponent authenticationComponent;
|
||||||
|
private FileFolderService fileFolderService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Category related values
|
* Category related values
|
||||||
@ -157,6 +159,7 @@ public class RuleServiceCoverageTest extends TestCase
|
|||||||
this.transactionService = serviceRegistry.getTransactionService();
|
this.transactionService = serviceRegistry.getTransactionService();
|
||||||
this.transformerRegistry = (ContentTransformerRegistry)applicationContext.getBean("contentTransformerRegistry");
|
this.transformerRegistry = (ContentTransformerRegistry)applicationContext.getBean("contentTransformerRegistry");
|
||||||
this.authenticationComponent = (AuthenticationComponent)applicationContext.getBean("authenticationComponent");
|
this.authenticationComponent = (AuthenticationComponent)applicationContext.getBean("authenticationComponent");
|
||||||
|
this.fileFolderService = serviceRegistry.getFileFolderService();
|
||||||
|
|
||||||
//authenticationComponent.setCurrentUser(authenticationComponent.getSystemUserName());
|
//authenticationComponent.setCurrentUser(authenticationComponent.getSystemUserName());
|
||||||
//authenticationComponent.setSystemUserAsCurrentUser();
|
//authenticationComponent.setSystemUserAsCurrentUser();
|
||||||
@ -359,6 +362,48 @@ public class RuleServiceCoverageTest extends TestCase
|
|||||||
// System.out.println(NodeStoreInspector.dumpNodeStore(this.nodeService, this.testStoreRef));
|
// System.out.println(NodeStoreInspector.dumpNodeStore(this.nodeService, this.testStoreRef));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testModifyNameTriggersInboundRule()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
//this.nodeService.addAspect(this.nodeRef, ContentModel.ASPECT_LOCKABLE, null);
|
||||||
|
Map<QName, Serializable> folderProps = new HashMap<QName, Serializable>(1);
|
||||||
|
folderProps.put(ContentModel.PROP_NAME, "myTestFolder");
|
||||||
|
NodeRef folder = this.nodeService.createNode(
|
||||||
|
this.rootNodeRef,
|
||||||
|
ContentModel.ASSOC_CHILDREN,
|
||||||
|
ContentModel.ASSOC_CHILDREN,
|
||||||
|
ContentModel.TYPE_FOLDER,
|
||||||
|
folderProps).getChildRef();
|
||||||
|
|
||||||
|
Map<String, Serializable> params = new HashMap<String, Serializable>(1);
|
||||||
|
params.put("aspect-name", ContentModel.ASPECT_VERSIONABLE);
|
||||||
|
|
||||||
|
Rule rule = createRule(
|
||||||
|
RuleType.INBOUND,
|
||||||
|
AddFeaturesActionExecuter.NAME,
|
||||||
|
params,
|
||||||
|
NoConditionEvaluator.NAME,
|
||||||
|
null);
|
||||||
|
|
||||||
|
this.ruleService.saveRule(folder, rule);
|
||||||
|
|
||||||
|
Map<QName, Serializable> contentProps = new HashMap<QName, Serializable>(1);
|
||||||
|
contentProps.put(ContentModel.PROP_NAME, "myTestDocument.txt");
|
||||||
|
NodeRef newNodeRef = this.nodeService.createNode(
|
||||||
|
folder,
|
||||||
|
ContentModel.ASSOC_CONTAINS,
|
||||||
|
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "myTestDocument.txt"),
|
||||||
|
ContentModel.TYPE_CONTENT,
|
||||||
|
contentProps).getChildRef();
|
||||||
|
//addContentToNode(newNodeRef);
|
||||||
|
assertFalse(this.nodeService.hasAspect(newNodeRef, ContentModel.ASPECT_VERSIONABLE));
|
||||||
|
|
||||||
|
// Use the file folder to change the name of the node
|
||||||
|
this.fileFolderService.rename(newNodeRef, "myNewName.txt");
|
||||||
|
assertFalse(this.nodeService.hasAspect(newNodeRef, ContentModel.ASPECT_VERSIONABLE));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public void testDisableIndividualRules()
|
public void testDisableIndividualRules()
|
||||||
{
|
{
|
||||||
Map<String, Serializable> params = new HashMap<String, Serializable>(1);
|
Map<String, Serializable> params = new HashMap<String, Serializable>(1);
|
||||||
|
@ -35,8 +35,6 @@ import org.alfresco.repo.action.evaluator.ComparePropertyValueEvaluator;
|
|||||||
import org.alfresco.repo.action.executer.ImageTransformActionExecuter;
|
import org.alfresco.repo.action.executer.ImageTransformActionExecuter;
|
||||||
import org.alfresco.repo.content.MimetypeMap;
|
import org.alfresco.repo.content.MimetypeMap;
|
||||||
import org.alfresco.repo.content.transform.AbstractContentTransformerTest;
|
import org.alfresco.repo.content.transform.AbstractContentTransformerTest;
|
||||||
import org.alfresco.repo.transaction.TransactionUtil;
|
|
||||||
import org.alfresco.repo.transaction.TransactionUtil.TransactionWork;
|
|
||||||
import org.alfresco.service.cmr.action.Action;
|
import org.alfresco.service.cmr.action.Action;
|
||||||
import org.alfresco.service.cmr.action.ActionCondition;
|
import org.alfresco.service.cmr.action.ActionCondition;
|
||||||
import org.alfresco.service.cmr.repository.ContentWriter;
|
import org.alfresco.service.cmr.repository.ContentWriter;
|
||||||
@ -47,7 +45,6 @@ import org.alfresco.service.cmr.rule.RuleType;
|
|||||||
import org.alfresco.service.cmr.security.AuthenticationService;
|
import org.alfresco.service.cmr.security.AuthenticationService;
|
||||||
import org.alfresco.service.cmr.security.PermissionService;
|
import org.alfresco.service.cmr.security.PermissionService;
|
||||||
import org.alfresco.service.namespace.QName;
|
import org.alfresco.service.namespace.QName;
|
||||||
import org.apache.commons.digester.SetRootRule;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
|
* As a special exception to the terms and conditions of version 2.0 of
|
||||||
|
* the GPL, you may redistribute this Program in connection with Free/Libre
|
||||||
|
* and Open Source Software ("FLOSS") applications as described in Alfresco's
|
||||||
|
* FLOSS exception. You should have recieved a copy of the text describing
|
||||||
|
* the FLOSS exception, and it is also available here:
|
||||||
|
* http://www.alfresco.com/legal/licensing"
|
||||||
|
*/
|
||||||
|
package org.alfresco.repo.rule.ruletrigger;
|
||||||
|
|
||||||
|
import org.alfresco.repo.node.NodeServicePolicies;
|
||||||
|
import org.alfresco.repo.policy.JavaBehaviour;
|
||||||
|
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||||
|
import org.alfresco.service.namespace.NamespaceService;
|
||||||
|
import org.alfresco.service.namespace.QName;
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A rule trigger for the creation of <b>secondary child associations</b>.
|
||||||
|
* <p>
|
||||||
|
* Policy names supported are:
|
||||||
|
* <ul>
|
||||||
|
* <li>{@linkplain NodeServicePolicies.BeforeDeleteChildAssociationPolicy}</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* @author Roy Wetherall
|
||||||
|
*/
|
||||||
|
public class BeforeDeleteChildAssociationRuleTrigger
|
||||||
|
extends RuleTriggerAbstractBase
|
||||||
|
implements NodeServicePolicies.BeforeDeleteChildAssociationPolicy
|
||||||
|
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The logger
|
||||||
|
*/
|
||||||
|
private static Log logger = LogFactory.getLog(BeforeDeleteChildAssociationRuleTrigger.class);
|
||||||
|
|
||||||
|
private static final String POLICY = "beforeDeleteChildAssociation";
|
||||||
|
|
||||||
|
private boolean isClassBehaviour = false;
|
||||||
|
|
||||||
|
public void setIsClassBehaviour(boolean isClassBehaviour)
|
||||||
|
{
|
||||||
|
this.isClassBehaviour = isClassBehaviour;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.alfresco.repo.rule.ruletrigger.RuleTrigger#registerRuleTrigger()
|
||||||
|
*/
|
||||||
|
public void registerRuleTrigger()
|
||||||
|
{
|
||||||
|
if (isClassBehaviour == true)
|
||||||
|
{
|
||||||
|
this.policyComponent.bindClassBehaviour(
|
||||||
|
QName.createQName(NamespaceService.ALFRESCO_URI, POLICY),
|
||||||
|
this,
|
||||||
|
new JavaBehaviour(this, POLICY));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.policyComponent.bindAssociationBehaviour(
|
||||||
|
QName.createQName(NamespaceService.ALFRESCO_URI, POLICY),
|
||||||
|
this,
|
||||||
|
new JavaBehaviour(this, POLICY));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void beforeDeleteChildAssociation(ChildAssociationRef childAssocRef)
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled() == true)
|
||||||
|
{
|
||||||
|
logger.debug("Single child assoc trigger (policy = " + POLICY + ") fired for parent node " + childAssocRef.getParentRef() + " and child node " + childAssocRef.getChildRef());
|
||||||
|
}
|
||||||
|
|
||||||
|
triggerRules(childAssocRef.getParentRef(), childAssocRef.getChildRef());
|
||||||
|
}
|
||||||
|
}
|
@ -25,12 +25,14 @@
|
|||||||
package org.alfresco.repo.rule.ruletrigger;
|
package org.alfresco.repo.rule.ruletrigger;
|
||||||
|
|
||||||
import org.alfresco.repo.node.NodeServicePolicies;
|
import org.alfresco.repo.node.NodeServicePolicies;
|
||||||
|
import org.alfresco.repo.policy.JavaBehaviour;
|
||||||
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
|
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
|
||||||
import org.alfresco.service.cmr.dictionary.ClassDefinition;
|
import org.alfresco.service.cmr.dictionary.ClassDefinition;
|
||||||
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
||||||
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
||||||
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
|
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
|
||||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||||
|
import org.alfresco.service.namespace.NamespaceService;
|
||||||
import org.alfresco.service.namespace.QName;
|
import org.alfresco.service.namespace.QName;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
@ -49,7 +51,7 @@ import org.apache.commons.logging.LogFactory;
|
|||||||
*
|
*
|
||||||
* @author Roy Wetherall
|
* @author Roy Wetherall
|
||||||
*/
|
*/
|
||||||
public class CreateNodeRuleTrigger extends SingleChildAssocRefPolicyRuleTrigger
|
public class CreateNodeRuleTrigger extends RuleTriggerAbstractBase
|
||||||
implements NodeServicePolicies.OnCreateNodePolicy
|
implements NodeServicePolicies.OnCreateNodePolicy
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
@ -57,12 +59,42 @@ public class CreateNodeRuleTrigger extends SingleChildAssocRefPolicyRuleTrigger
|
|||||||
*/
|
*/
|
||||||
private static Log logger = LogFactory.getLog(CreateNodeRuleTrigger.class);
|
private static Log logger = LogFactory.getLog(CreateNodeRuleTrigger.class);
|
||||||
|
|
||||||
|
private static final String POLICY = "onCreateNode";
|
||||||
|
|
||||||
|
private boolean isClassBehaviour = false;
|
||||||
|
|
||||||
|
public void setIsClassBehaviour(boolean isClassBehaviour)
|
||||||
|
{
|
||||||
|
this.isClassBehaviour = isClassBehaviour;
|
||||||
|
}
|
||||||
|
|
||||||
DictionaryService dictionaryService;
|
DictionaryService dictionaryService;
|
||||||
|
|
||||||
public void setDictionaryService(DictionaryService dictionaryService)
|
public void setDictionaryService(DictionaryService dictionaryService)
|
||||||
{
|
{
|
||||||
this.dictionaryService = dictionaryService;
|
this.dictionaryService = dictionaryService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.alfresco.repo.rule.ruletrigger.RuleTrigger#registerRuleTrigger()
|
||||||
|
*/
|
||||||
|
public void registerRuleTrigger()
|
||||||
|
{
|
||||||
|
if (isClassBehaviour == true)
|
||||||
|
{
|
||||||
|
this.policyComponent.bindClassBehaviour(
|
||||||
|
QName.createQName(NamespaceService.ALFRESCO_URI, POLICY),
|
||||||
|
this,
|
||||||
|
new JavaBehaviour(this, POLICY));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.policyComponent.bindAssociationBehaviour(
|
||||||
|
QName.createQName(NamespaceService.ALFRESCO_URI, POLICY),
|
||||||
|
this,
|
||||||
|
new JavaBehaviour(this, POLICY));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
|
@ -26,8 +26,8 @@ package org.alfresco.repo.rule.ruletrigger;
|
|||||||
|
|
||||||
import org.alfresco.repo.node.NodeServicePolicies;
|
import org.alfresco.repo.node.NodeServicePolicies;
|
||||||
import org.alfresco.repo.policy.JavaBehaviour;
|
import org.alfresco.repo.policy.JavaBehaviour;
|
||||||
|
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
|
||||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||||
import org.alfresco.service.cmr.rule.RuleServiceException;
|
|
||||||
import org.alfresco.service.namespace.NamespaceService;
|
import org.alfresco.service.namespace.NamespaceService;
|
||||||
import org.alfresco.service.namespace.QName;
|
import org.alfresco.service.namespace.QName;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
@ -39,40 +39,23 @@ import org.apache.commons.logging.LogFactory;
|
|||||||
* Policy names supported are:
|
* Policy names supported are:
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>{@linkplain NodeServicePolicies.OnCreateChildAssociationPolicy}</li>
|
* <li>{@linkplain NodeServicePolicies.OnCreateChildAssociationPolicy}</li>
|
||||||
* <li>{@linkplain NodeServicePolicies.BeforeDeleteChildAssociationPolicy}</li>
|
|
||||||
* </ul>
|
* </ul>
|
||||||
*
|
*
|
||||||
* @author Roy Wetherall
|
* @author Roy Wetherall
|
||||||
*/
|
*/
|
||||||
public class SingleChildAssocRefPolicyRuleTrigger
|
public class OnCreateChildAssociationRuleTrigger
|
||||||
extends RuleTriggerAbstractBase
|
extends RuleTriggerAbstractBase
|
||||||
implements NodeServicePolicies.OnCreateChildAssociationPolicy,
|
implements NodeServicePolicies.OnCreateChildAssociationPolicy
|
||||||
NodeServicePolicies.BeforeDeleteChildAssociationPolicy
|
|
||||||
|
|
||||||
{
|
{
|
||||||
private static final String ERR_POLICY_NAME_NOT_SET = "Unable to register rule trigger since policy name has not been set.";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The logger
|
* The logger
|
||||||
*/
|
*/
|
||||||
private static Log logger = LogFactory.getLog(SingleChildAssocRefPolicyRuleTrigger.class);
|
private static Log logger = LogFactory.getLog(OnCreateChildAssociationRuleTrigger.class);
|
||||||
|
|
||||||
|
private static final String POLICY_NAME = "onCreateChildAssociation";
|
||||||
|
|
||||||
private String policyNamespace = NamespaceService.ALFRESCO_URI;
|
private boolean isClassBehaviour = false;
|
||||||
|
|
||||||
private String policyName;
|
|
||||||
|
|
||||||
private boolean isClassBehaviour = false;
|
|
||||||
|
|
||||||
public void setPolicyNamespace(String policyNamespace)
|
|
||||||
{
|
|
||||||
this.policyNamespace = policyNamespace;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPolicyName(String policyName)
|
|
||||||
{
|
|
||||||
this.policyName = policyName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setIsClassBehaviour(boolean isClassBehaviour)
|
public void setIsClassBehaviour(boolean isClassBehaviour)
|
||||||
{
|
{
|
||||||
this.isClassBehaviour = isClassBehaviour;
|
this.isClassBehaviour = isClassBehaviour;
|
||||||
@ -83,37 +66,22 @@ public class SingleChildAssocRefPolicyRuleTrigger
|
|||||||
*/
|
*/
|
||||||
public void registerRuleTrigger()
|
public void registerRuleTrigger()
|
||||||
{
|
{
|
||||||
if (policyName == null)
|
|
||||||
{
|
|
||||||
throw new RuleServiceException(ERR_POLICY_NAME_NOT_SET);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isClassBehaviour == true)
|
if (isClassBehaviour == true)
|
||||||
{
|
{
|
||||||
this.policyComponent.bindClassBehaviour(
|
this.policyComponent.bindClassBehaviour(
|
||||||
QName.createQName(this.policyNamespace, this.policyName),
|
QName.createQName(NamespaceService.ALFRESCO_URI, POLICY_NAME),
|
||||||
this,
|
this,
|
||||||
new JavaBehaviour(this, policyName));
|
new JavaBehaviour(this, POLICY_NAME));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.policyComponent.bindAssociationBehaviour(
|
this.policyComponent.bindAssociationBehaviour(
|
||||||
QName.createQName(this.policyNamespace, this.policyName),
|
QName.createQName(NamespaceService.ALFRESCO_URI, POLICY_NAME),
|
||||||
this,
|
this,
|
||||||
new JavaBehaviour(this, policyName));
|
new JavaBehaviour(this, POLICY_NAME));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void beforeDeleteChildAssociation(ChildAssociationRef childAssocRef)
|
|
||||||
{
|
|
||||||
if (logger.isDebugEnabled() == true)
|
|
||||||
{
|
|
||||||
logger.debug("Single child assoc trigger (policy = " + this.policyName + ") fired for parent node " + childAssocRef.getParentRef() + " and child node " + childAssocRef.getChildRef());
|
|
||||||
}
|
|
||||||
|
|
||||||
triggerRules(childAssocRef.getParentRef(), childAssocRef.getChildRef());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNewNode)
|
public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNewNode)
|
||||||
{
|
{
|
||||||
if (isNewNode)
|
if (isNewNode)
|
||||||
@ -122,9 +90,23 @@ public class SingleChildAssocRefPolicyRuleTrigger
|
|||||||
}
|
}
|
||||||
if (logger.isDebugEnabled() == true)
|
if (logger.isDebugEnabled() == true)
|
||||||
{
|
{
|
||||||
logger.debug("Single child assoc trigger (policy = " + this.policyName + ") fired for parent node " + childAssocRef.getParentRef() + " and child node " + childAssocRef.getChildRef());
|
logger.debug("Single child assoc trigger (policy = " + POLICY_NAME + ") fired for parent node " + childAssocRef.getParentRef() + " and child node " + childAssocRef.getChildRef());
|
||||||
}
|
}
|
||||||
|
|
||||||
triggerRules(childAssocRef.getParentRef(), childAssocRef.getChildRef());
|
// NOTE:
|
||||||
|
//
|
||||||
|
// We check for the presence of this resource in the transaction to determine whether a rename has been issued. If that is the case
|
||||||
|
// then we don't want to trigger any associated rules.
|
||||||
|
//
|
||||||
|
// See http://issues.alfresco.com/browse/AR-1544
|
||||||
|
if (AlfrescoTransactionSupport.getResource(childAssocRef.getChildRef().toString()+"rename") == null)
|
||||||
|
{
|
||||||
|
triggerRules(childAssocRef.getParentRef(), childAssocRef.getChildRef());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Remove the marker
|
||||||
|
AlfrescoTransactionSupport.unbindResource(childAssocRef.getChildRef().toString()+"rename");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -554,21 +554,7 @@ public abstract class AlfrescoTransactionSupport
|
|||||||
*/
|
*/
|
||||||
public void flush()
|
public void flush()
|
||||||
{
|
{
|
||||||
// check integrity
|
throw new UnsupportedOperationException("Manual flush no longer supported.");
|
||||||
for (IntegrityChecker integrityChecker : integrityCheckers)
|
|
||||||
{
|
|
||||||
integrityChecker.checkIntegrity();
|
|
||||||
}
|
|
||||||
// flush listeners
|
|
||||||
for (TransactionListener listener : getListenersIterable())
|
|
||||||
{
|
|
||||||
listener.flush();
|
|
||||||
}
|
|
||||||
// flush changes
|
|
||||||
for (TransactionalDao daoService : getDaoServices())
|
|
||||||
{
|
|
||||||
daoService.flush();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -627,8 +613,12 @@ public abstract class AlfrescoTransactionSupport
|
|||||||
listener.beforeCommit(readOnly);
|
listener.beforeCommit(readOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
// flush
|
// Check integrity
|
||||||
flush();
|
for (IntegrityChecker integrityChecker : integrityCheckers)
|
||||||
|
{
|
||||||
|
integrityChecker.checkIntegrity();
|
||||||
|
}
|
||||||
|
|
||||||
// prepare the indexes
|
// prepare the indexes
|
||||||
for (LuceneIndexerAndSearcher lucene : lucenes)
|
for (LuceneIndexerAndSearcher lucene : lucenes)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user