Example #1
0
  @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);
    }
  }