/** * Sets relationships. * * <p>Looks at merge actions and whether the relationship is empty when adding, so not all * relationships are added. * * @param relationships list of data object relationships or null */ public void setRelationships(List<DataObjectRelationship> relationships) { if (relationships == null) { this.relationships = null; relationshipMap = null; lastAttributeToRelationshipMap = null; attributeToRelationshipMap = null; return; } this.relationships = Collections.unmodifiableList(relationships); relationshipMap = new HashMap<String, DataObjectRelationship>(relationships.size()); attributeToRelationshipMap = new HashMap<String, List<DataObjectRelationship>>(); lastAttributeToRelationshipMap = new HashMap<String, DataObjectRelationship>(relationships.size()); removedRelationshipNames = new ArrayList<String>(); // Builds maps to link attribute names to their relationships for (DataObjectRelationship rel : relationships) { // This is not quite correct - we really only want to not add the NO_OVERRIDE items if they // are // overriding something. However, at the point this is running, we don't know whether we will // be embedding // anything... if (rel.getMergeAction() != MetadataMergeAction.REMOVE && rel.getMergeAction() != MetadataMergeAction.NO_OVERRIDE) { // related object attribute name relationshipMap.put(rel.getName(), rel); // last attribute in list linking the objects if (!rel.getAttributeRelationships().isEmpty()) { DataObjectAttributeRelationship relAttr = rel.getAttributeRelationships().get(rel.getAttributeRelationships().size() - 1); lastAttributeToRelationshipMap.put(relAttr.getParentAttributeName(), rel); } // all relationships relating to an attribute for (DataObjectAttributeRelationship relAttr : rel.getAttributeRelationships()) { List<DataObjectRelationship> rels = attributeToRelationshipMap.get(relAttr.getParentAttributeName()); if (rels == null) { rels = new ArrayList<DataObjectRelationship>(); attributeToRelationshipMap.put(relAttr.getParentAttributeName(), rels); } rels.add(rel); } } // since the attribute will still exist in the embedded metadata, we need to put a block in on // the standard // cascade if (rel.getMergeAction() == MetadataMergeAction.REMOVE) { removedRelationshipNames.add(rel.getName()); } } relationshipMap = Collections.unmodifiableMap(relationshipMap); lastAttributeToRelationshipMap = Collections.unmodifiableMap(lastAttributeToRelationshipMap); attributeToRelationshipMap = Collections.unmodifiableMap(attributeToRelationshipMap); }