From aeafa9fbbd2b194490762f4287ec1c630a66c24f Mon Sep 17 00:00:00 2001 From: Neil McErlean Date: Wed, 9 Sep 2015 10:42:29 +0000 Subject: [PATCH] Addressing review comment - don't have assoc types in the service API - have aspect names instead. I agree with this comment. I think assoc types are an implementation detail of this service. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/classified_renditions@111779 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../metadata-referral-context.xml | 3 +- .../model/clf/ClassifiedRenditions.java | 2 +- .../model/clf/aspect/ClassifiedAspect.java | 4 +- .../ReferralAdminService.java | 34 ++++++--------- .../ReferralAdminServiceImpl.java | 41 +++++++------------ .../ReferredMetadataService.java | 4 +- .../clf/aspect/ClassifiedAspectUnitTest.java | 2 +- .../ReferralAdminServiceImplUnitTest.java | 25 +++++------ 8 files changed, 46 insertions(+), 69 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/metadata-referral-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/metadata-referral-context.xml index c9f97fdfe8..02c35da73a 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/metadata-referral-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/metadata-referral-context.xml @@ -50,9 +50,8 @@ org.alfresco.module.org_alfresco_module_rm.referredmetadata.ReferralAdminService.attachReferrer=ACL_ALLOW org.alfresco.module.org_alfresco_module_rm.referredmetadata.ReferralAdminService.detachReferrer=ACL_ALLOW - org.alfresco.module.org_alfresco_module_rm.referredmetadata.ReferralAdminService.getDefinedReferrals=ACL_ALLOW - org.alfresco.module.org_alfresco_module_rm.referredmetadata.ReferralAdminService.getReferralFor=ACL_ALLOW org.alfresco.module.org_alfresco_module_rm.referredmetadata.ReferralAdminService.getAttachedReferralsFrom=ACL_ALLOW + org.alfresco.module.org_alfresco_module_rm.referredmetadata.ReferralAdminService.getAttachedReferralFrom=ACL_ALLOW org.alfresco.module.org_alfresco_module_rm.referredmetadata.ReferralAdminService.*=ACL_DENY diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/clf/ClassifiedRenditions.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/clf/ClassifiedRenditions.java index 1f92b82cb0..aec6c61e4b 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/clf/ClassifiedRenditions.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/clf/ClassifiedRenditions.java @@ -85,7 +85,7 @@ public class ClassifiedRenditions extends BaseBehaviourBean if (contentClassificationService.isClassified(sourceNode) && referralAdminService.getAttachedReferralFrom(renditionNodeRef, ASPECT_CLASSIFIED) != null) { - referralAdminService.attachReferrer(renditionNodeRef, sourceNode, ASSOC_CLASSIFIED_RENDITION); + referralAdminService.attachReferrer(renditionNodeRef, sourceNode, ASPECT_CLASSIFIED); } return null; diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/clf/aspect/ClassifiedAspect.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/clf/aspect/ClassifiedAspect.java index 7730f82875..622e345eb3 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/clf/aspect/ClassifiedAspect.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/clf/aspect/ClassifiedAspect.java @@ -148,9 +148,9 @@ public class ClassifiedAspect extends BaseBehaviourBean implements NodeServicePo for (ChildAssociationRef chAssRef : renditions) { final NodeRef renditionNode = chAssRef.getChildRef(); - if (referralAdminService.getAttachedReferralFrom(renditionNode, ASPECT_CLASSIFIED_RENDITION) == null) + if (referralAdminService.getAttachedReferralFrom(renditionNode, ASPECT_CLASSIFIED) == null) { - referralAdminService.attachReferrer(renditionNode, classifiedNode, ASSOC_CLASSIFIED_RENDITION); + referralAdminService.attachReferrer(renditionNode, classifiedNode, ASPECT_CLASSIFIED); } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/referredmetadata/ReferralAdminService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/referredmetadata/ReferralAdminService.java index cafad45b0e..52a94d7a09 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/referredmetadata/ReferralAdminService.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/referredmetadata/ReferralAdminService.java @@ -32,7 +32,8 @@ import java.util.Set; * Then any read request for relevant metadata such as hasAspect or getProperties can be delegated to the * linked node. *

- * For a link to be made, there must be a {@link #getDefinedReferrals() defined MetadataReferral} already in the system. + * For a link to be made, there must be a {@link ReferralRegistry#getMetadataReferrals()} defined MetadataReferral} + * already in the system. * This means that a peer-association type will have to have been declared and that a spring bean will have to have * defined which aspects are to be handled by this {@link MetadataReferral}. * @@ -45,41 +46,30 @@ public interface ReferralAdminService * Creates a link between two nodes such that the first {@code referrer} can 'inherit' or reuse some aspect * metadata from another node - the {@code referrer}. *

+ * Note that attaching a referrer for the specified aspect will also link the two nodes for + * all aspects defined in the {@link MetadataReferral}. + *

* Note that links can currently only extend between two pairs of nodes and cannot be chained. * * @param referrer the node which is to inherit additional metadata. * @param referent the node which will provide the additional metadata. - * @param assocType the type of the peer association which will link the two nodes. + * @param aspectName the name of the aspect whose metadata is to be attached. * @return a {@link MetadataReferral} object which defines the link type. * @throws ChainedMetadataReferralUnsupported if an attempt is made to attach nodes such that a chain would be made. */ - // FIXME Remove assocType entirely from the API - MetadataReferral attachReferrer(NodeRef referrer, NodeRef referent, QName assocType); + MetadataReferral attachReferrer(NodeRef referrer, NodeRef referent, QName aspectName); /** * Removes an existing metadata link between two nodes. + *

+ * Note that detaching a referrer for the specified aspect will also unlink the two nodes for + * all aspects defined in the {@link MetadataReferral}. * * @param referrer the node which has been linked to a metadata source. - * @param assocType the type of the peer association forming the link. + * @param aspectName the name of the aspect whose metadata is to be detached. * @return the removed {@link MetadataReferral}. */ - MetadataReferral detachReferrer(NodeRef referrer, QName assocType); - - /** - * Gets the set of defined {@link MetadataReferral}s. - * - * @return the set of defined {@link MetadataReferral}. - */ - Set getDefinedReferrals(); - - /** - * Gets the {@link MetadataReferral} which contains the specified {@code aspectName} if there is one. - * Note that only one {@link MetadataReferral} may declare that it handles any particular aspect. - * - * @param aspectName the name of the aspect whose {@link MetadataReferral} is sought. - * @return the {@link MetadataReferral} which handles the specified aspect, if there is one. - */ - MetadataReferral getReferralFor(QName aspectName); + MetadataReferral detachReferrer(NodeRef referrer, QName aspectName); // FIXME Chase all references /** * Gets the set of {@link MetadataReferral}s which are currently applied from the specified {@code referrer}. diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/referredmetadata/ReferralAdminServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/referredmetadata/ReferralAdminServiceImpl.java index f2b43b1dc9..4aa8c4afbb 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/referredmetadata/ReferralAdminServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/referredmetadata/ReferralAdminServiceImpl.java @@ -79,9 +79,15 @@ public class ReferralAdminServiceImpl implements ReferralAdminService this.registry = registry; } - @Override public MetadataReferral attachReferrer(NodeRef referrer, NodeRef referent, QName assocType) + @Override public MetadataReferral attachReferrer(NodeRef referrer, NodeRef referent, QName aspectName) { - final MetadataReferral metadataReferral = getReferralForAssociation(assocType); + final MetadataReferral metadataReferral = registry.getReferralForAspect(aspectName); + if (metadataReferral == null) + { + throw new IllegalArgumentException("No defined " + MetadataReferral.class.getSimpleName() + + " for aspect " + aspectName); + } + final QName assocType = metadataReferral.getAssocType(); // Prevent the creation of chains of metadata linking from node A to B to C. @@ -135,8 +141,11 @@ public class ReferralAdminServiceImpl implements ReferralAdminService return metadataReferral; } - @Override public MetadataReferral detachReferrer(NodeRef referrer, QName assocType) + @Override public MetadataReferral detachReferrer(NodeRef referrer, QName aspectName) { + final MetadataReferral referral = registry.getReferralForAspect(aspectName); + final QName assocType = referral.getAssocType(); + // Is the association there? final List assocs = nodeService.getTargetAssocs(referrer, assocType); @@ -146,36 +155,19 @@ public class ReferralAdminServiceImpl implements ReferralAdminService } else { - MetadataReferral result = getReferralForAssociation(assocType); - // There should only be one such association... but we'll remove them all just in case for (AssociationRef assocRef : assocs) { nodeService.removeAssociation(referrer, assocRef.getTargetRef(), assocType); } - return result; + return referral; } } - @Override public MetadataReferral getReferralFor(QName aspectName) - { - MetadataReferral metadataReferral = null; - - for (MetadataReferral d : getDefinedReferrals()) - { - if (d.getAspects().contains(aspectName)) - { - metadataReferral = d; - break; - } - } - return metadataReferral; - } - @Override public Set getAttachedReferralsFrom(NodeRef referrer) { - final Set allMetadataReferrals = getDefinedReferrals(); + final Set allMetadataReferrals = registry.getMetadataReferrals(); final Set result = new HashSet<>(); for (MetadataReferral d : allMetadataReferrals) @@ -200,9 +192,4 @@ public class ReferralAdminServiceImpl implements ReferralAdminService } return null; } - - @Override public Set getDefinedReferrals() - { - return registry.getMetadataReferrals(); - } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/referredmetadata/ReferredMetadataService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/referredmetadata/ReferredMetadataService.java index 8e18c2bcf7..77d234dbfe 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/referredmetadata/ReferredMetadataService.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/referredmetadata/ReferredMetadataService.java @@ -29,8 +29,8 @@ import java.io.Serializable; import java.util.Map; /** - * This service provides read-only access to linked metadata. - * TODO complete! Include definition of referent etc or link to package.html + * This service provides read-only access to linked metadata. It is primarily concerned with data transfer. + * For an overview, see the package javadoc. * * @author Neil Mc Erlean * @since 2.4.a diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/clf/aspect/ClassifiedAspectUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/clf/aspect/ClassifiedAspectUnitTest.java index 30e89eff75..0d2729b503 100644 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/clf/aspect/ClassifiedAspectUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/clf/aspect/ClassifiedAspectUnitTest.java @@ -142,7 +142,7 @@ public class ClassifiedAspectUnitTest implements ClassifiedContentModel for (NodeRef rendition : asList(RENDITION_1, RENDITION_2)) { - verify(mockReferralAdminService).attachReferrer(rendition, NODE_REF, ASSOC_CLASSIFIED_RENDITION); + verify(mockReferralAdminService).attachReferrer(rendition, NODE_REF, ASPECT_CLASSIFIED); } } diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/referredmetadata/ReferralAdminServiceImplUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/referredmetadata/ReferralAdminServiceImplUnitTest.java index 6e31f011df..f5388c9f06 100644 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/referredmetadata/ReferralAdminServiceImplUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/referredmetadata/ReferralAdminServiceImplUnitTest.java @@ -84,17 +84,17 @@ public class ReferralAdminServiceImplUnitTest } @Test(expected=IllegalArgumentException.class) - public void attachingReferrerWithNoAssociationConfiguredShouldFail() + public void attachingReferrerWithNoAspectConfiguredShouldFail() { - referralAdminService.attachReferrer(node2, node1, assoc1); + referralAdminService.attachReferrer(node2, node1, aspect1); } @Test public void attachDetach() { - when(mockRegistry.getReferralForAssociation(assoc1)).thenReturn(referral1); + when(mockRegistry.getReferralForAspect(aspect1)).thenReturn(referral1); // attach - MetadataReferral d = attachReferrer(node1, node2, assoc1); + MetadataReferral d = attachReferrer(node1, node2, aspect1); // validate assertEquals(assoc1, d.getAssocType()); @@ -103,24 +103,25 @@ public class ReferralAdminServiceImplUnitTest assertFalse(mockReferredMetadataService.isReferringMetadata(node1, aspect3)); // detach - assertEquals(d, referralAdminService.detachReferrer(node1, assoc1)); + assertEquals(d, referralAdminService.detachReferrer(node1, aspect1)); } - private MetadataReferral attachReferrer(NodeRef referrer, NodeRef referent, QName assocType) + private MetadataReferral attachReferrer(NodeRef referrer, NodeRef referent, QName aspectName) { - MetadataReferral d = referralAdminService.attachReferrer(referrer, referent, assocType); + MetadataReferral mr = referralAdminService.attachReferrer(referrer, referent, aspectName); + final QName assocType = mr.getAssocType(); when(mockNodeService.getSourceAssocs(referent, assocType)).thenReturn(asList(new AssociationRef(referrer, assocType, referent))); when(mockNodeService.getTargetAssocs(referrer, assocType)).thenReturn(asList(new AssociationRef(referrer, assocType, referent))); - for (QName aspect : d.getAspects()) + for (QName aspect : mr.getAspects()) { when(mockReferredMetadataService.isReferringMetadata(referrer, aspect)).thenReturn(true); } - return d; + return mr; } @Test public void chainsOfDelegationShouldBePrevented() { - when(mockRegistry.getReferralForAssociation(assoc1)).thenReturn(referral1); + when(mockRegistry.getReferralForAspect(aspect1)).thenReturn(referral1); // The node already has a delegation in place: node1 -> node2. We're trying to add to the // end of the chain: node2 -> node3 @@ -128,13 +129,13 @@ public class ReferralAdminServiceImplUnitTest when(mockNodeService.getTargetAssocs(node1, assoc1)).thenReturn(asList(new AssociationRef(node1, assoc1, node2))); expectedException(ChainedMetadataReferralUnsupported.class, () -> { - referralAdminService.attachReferrer(node2, node3, assoc1); + referralAdminService.attachReferrer(node2, node3, aspect1); return null; }); // Now try to add to the start of the chain: node3 -> node1 expectedException(ChainedMetadataReferralUnsupported.class, () -> { - referralAdminService.attachReferrer(node3, node1, assoc1); + referralAdminService.attachReferrer(node3, node1, aspect1); return null; }); }