@Test public void shouldRetrieveReferenceProperties() throws Exception { Node referenceableNode = session.getRootNode().addNode("referenceable"); referenceableNode.addMixin(JcrMixLexicon.REFERENCEABLE.toString()); Node node1 = session.getRootNode().addNode("node1"); Property prop1 = node1.setProperty("prop1", session.getValueFactory().createValue(referenceableNode, false)); Property prop2 = node1.setProperty("prop2", session.getValueFactory().createValue(referenceableNode, true)); Node node2 = session.getRootNode().addNode("node2"); Property prop3 = node2.setProperty("prop3", session.getValueFactory().createValue(referenceableNode, false)); Property prop4 = node2.setProperty("prop4", session.getValueFactory().createValue(referenceableNode, true)); session.save(); // check all strong references PropertyIterator propertyIterator = referenceableNode.getReferences(); assertEquals(2, propertyIterator.getSize()); Set<String> propertyNames = new HashSet<String>(2); while (propertyIterator.hasNext()) { propertyNames.add(propertyIterator.nextProperty().getName()); } assertTrue(propertyNames.contains(prop1.getName()) && propertyNames.contains(prop3.getName())); propertyIterator = referenceableNode.getReferences("prop1"); assertEquals(1, propertyIterator.getSize()); assertEquals(prop1.getName(), propertyIterator.nextProperty().getName()); propertyIterator = referenceableNode.getReferences("unknown"); assertEquals(0, propertyIterator.getSize()); // check all weak references propertyIterator = referenceableNode.getWeakReferences(); assertEquals(2, propertyIterator.getSize()); propertyNames = new HashSet<String>(2); while (propertyIterator.hasNext()) { propertyNames.add(propertyIterator.nextProperty().getName()); } assertTrue(propertyNames.contains(prop2.getName()) && propertyNames.contains(prop4.getName())); propertyIterator = referenceableNode.getWeakReferences("prop4"); assertEquals(1, propertyIterator.getSize()); assertEquals(prop4.getName(), propertyIterator.nextProperty().getName()); propertyIterator = referenceableNode.getWeakReferences("unknown"); assertEquals(0, propertyIterator.getSize()); }
@Override public void delete() { try { @SuppressWarnings("unchecked") final Iterator<Property> references = node.getReferences(); @SuppressWarnings("unchecked") final Iterator<Property> weakReferences = node.getWeakReferences(); final Iterator<Property> inboundProperties = Iterators.concat(references, weakReferences); while (inboundProperties.hasNext()) { final Property prop = inboundProperties.next(); final List<Value> newVals = new ArrayList<>(); final Iterator<Value> propIt = property2values.apply(prop); while (propIt.hasNext()) { final Value v = propIt.next(); if (!node.equals(getSession().getNodeByIdentifier(v.getString()))) { newVals.add(v); LOGGER.trace("Keeping multivalue reference property when deleting node"); } } if (newVals.size() == 0) { prop.remove(); } else { prop.setValue(newVals.toArray(new Value[newVals.size()])); } } final Node parent; if (getNode().getDepth() > 0) { parent = getNode().getParent(); } else { parent = null; } final String name = getNode().getName(); node.remove(); if (parent != null) { createTombstone(parent, name); } } catch (final RepositoryException e) { throw new RepositoryRuntimeException(e); } }