@Override
  public <T> void setProperty(final PropertyKey<T> key, final T value) throws FrameworkException {

    // check for read-only properties
    // if (StructrApp.getConfiguration().isReadOnlyProperty(type, key) ||
    // (StructrApp.getConfiguration().isWriteOnceProperty(type, key) && (dbRelationship != null) &&
    // dbRelationship.hasProperty(key.name()))) {
    if (key.isReadOnly()
        || (key.isWriteOnce()
            && (dbRelationship != null)
            && dbRelationship.hasProperty(key.dbName()))) {

      if (readOnlyPropertiesUnlocked || securityContext.isSuperUser()) {

        // permit write operation once and
        // lock read-only properties again
        readOnlyPropertiesUnlocked = false;

      } else {

        throw new FrameworkException(getClass().getSimpleName(), new ReadOnlyPropertyToken(key));
      }
    }

    key.setProperty(securityContext, this, value);
  }
  @Test
  public void testAddProperty() {
    String key3 = "key3";

    Node node1 = getGraphDb().getNodeById(node1Id);
    Node node2 = getGraphDb().getNodeById(node2Id);
    Relationship rel = node1.getSingleRelationship(MyRelTypes.TEST, Direction.BOTH);
    // add new property
    node2.setProperty(key3, int1);
    rel.setProperty(key3, int2);
    assertTrue(node1.hasProperty(key1));
    assertTrue(node2.hasProperty(key1));
    assertTrue(node1.hasProperty(key2));
    assertTrue(node2.hasProperty(key2));
    assertTrue(node1.hasProperty(arrayKey));
    assertTrue(node2.hasProperty(arrayKey));
    assertTrue(rel.hasProperty(arrayKey));
    assertTrue(!node1.hasProperty(key3));
    assertTrue(node2.hasProperty(key3));
    assertEquals(int1, node1.getProperty(key1));
    assertEquals(int2, node2.getProperty(key1));
    assertEquals(string1, node1.getProperty(key2));
    assertEquals(string2, node2.getProperty(key2));
    assertEquals(int1, rel.getProperty(key1));
    assertEquals(string1, rel.getProperty(key2));
    assertEquals(int2, rel.getProperty(key3));
  }
 @Test
 public void testRelMultiRemoveProperty() {
   Node node1 = getGraphDb().createNode();
   Node node2 = getGraphDb().createNode();
   Relationship rel = node1.createRelationshipTo(node2, MyRelTypes.TEST);
   rel.setProperty("key0", "0");
   rel.setProperty("key1", "1");
   rel.setProperty("key2", "2");
   rel.setProperty("key3", "3");
   rel.setProperty("key4", "4");
   newTransaction();
   rel.removeProperty("key3");
   rel.removeProperty("key2");
   rel.removeProperty("key3");
   newTransaction();
   getNodeManager().clearCache();
   assertEquals("0", rel.getProperty("key0"));
   assertEquals("1", rel.getProperty("key1"));
   assertEquals("4", rel.getProperty("key4"));
   assertTrue(!rel.hasProperty("key2"));
   assertTrue(!rel.hasProperty("key3"));
   rel.delete();
   node1.delete();
   node2.delete();
 }
  // ----- protected methods -----
  protected boolean hasPropertyValue(
      Relationship rel, PropertyKey propertyKey, Object propertyValue) {

    if (rel != null && rel.hasProperty(propertyKey.dbName())) {

      Object value = rel.getProperty(propertyKey.dbName());
      return value.equals(propertyValue);
    }

    return false;
  }
Example #5
0
  @Test
  public void testRelationshipAddProperty() {
    Node node1 = getGraphDb().createNode();
    Node node2 = getGraphDb().createNode();
    Relationship rel1 = node1.createRelationshipTo(node2, MyRelTypes.TEST);
    Relationship rel2 = node2.createRelationshipTo(node1, MyRelTypes.TEST);
    try {
      rel1.setProperty(null, null);
      fail("Null argument should result in exception.");
    } catch (IllegalArgumentException e) {
    }
    Integer int1 = new Integer(1);
    Integer int2 = new Integer(2);
    String string1 = new String("1");
    String string2 = new String("2");

    // add property
    rel1.setProperty(key1, int1);
    rel2.setProperty(key1, string1);
    rel1.setProperty(key2, string2);
    rel2.setProperty(key2, int2);
    assertTrue(rel1.hasProperty(key1));
    assertTrue(rel2.hasProperty(key1));
    assertTrue(rel1.hasProperty(key2));
    assertTrue(rel2.hasProperty(key2));
    assertTrue(!rel1.hasProperty(key3));
    assertTrue(!rel2.hasProperty(key3));
    assertEquals(int1, rel1.getProperty(key1));
    assertEquals(string1, rel2.getProperty(key1));
    assertEquals(string2, rel1.getProperty(key2));
    assertEquals(int2, rel2.getProperty(key2));

    getTransaction().failure();
  }
Example #6
0
  @Test
  public void testRelGetProperties() {
    Integer int1 = new Integer(1);
    Integer int2 = new Integer(2);
    String string = new String("3");

    Node node1 = getGraphDb().createNode();
    Node node2 = getGraphDb().createNode();
    Relationship rel1 = node1.createRelationshipTo(node2, MyRelTypes.TEST);
    try {
      rel1.getProperty(key1);
      fail("get non existing property din't throw exception");
    } catch (NotFoundException e) {
    }
    try {
      rel1.getProperty(null);
      fail("get of null key din't throw exception");
    } catch (IllegalArgumentException e) {
    }
    assertTrue(!rel1.hasProperty(key1));
    assertTrue(!rel1.hasProperty(null));
    rel1.setProperty(key1, int1);
    rel1.setProperty(key2, int2);
    rel1.setProperty(key3, string);
    assertTrue(rel1.hasProperty(key1));
    assertTrue(rel1.hasProperty(key2));
    assertTrue(rel1.hasProperty(key3));
    try {
      rel1.removeProperty(key3);
    } catch (NotFoundException e) {
      fail("Remove of property failed.");
    }
    assertTrue(!rel1.hasProperty(key3));
    assertTrue(!rel1.hasProperty(null));
    rel1.delete();
    node2.delete();
    node1.delete();
  }
  /** Compare the specified source property of the two provided relationships. */
  @Override
  public int compare(Relationship rel1, Relationship rel2) {

    Object v1 = null;
    Object v2 = null;
    if (rel1.hasProperty("source") == false || rel2.hasProperty("source") == false) {

      if (VERBOSE) {
        System.out.println("Ack!!! A relationship has no source!");
        System.out.println(
            "rel1 source = "
                + rel1.getProperty("source")
                + "; rel2 source = "
                + rel2.getProperty("source"));
      }

      return 0;
    }

    IndexHits<Node> h1 = metadataNodeIndex.get("source", rel1.getProperty("source"));
    IndexHits<Node> h2 = metadataNodeIndex.get("source", rel2.getProperty("source"));
    if (h1.size() == 0 || h2.size() == 0) {

      if (VERBOSE) {
        System.out.println("Dorf!!! A relationship has no metaDataNode!");
        System.out.println(
            "rel1 MDN = "
                + metadataNodeIndex.get("source", rel1.getProperty("source"))
                + "; rel2 MDN = "
                + metadataNodeIndex.get("source", rel1.getProperty("source")));
      }

      return 0;
    }
    Node m1 = h1.next();
    Node m2 = h2.next();

    h1.close();
    h2.close();
    if (m1.hasProperty(property.propertyName)) {
      v1 = m1.getProperty(property.propertyName);
    }
    if (m2.hasProperty(property.propertyName)) {
      v2 = m2.getProperty(property.propertyName);
    }

    if (v1 == null && v2 == null) {
      return 0;
    } else if (v2 == NOTRANKED) {
      return -1;
    } else if (v1 == NOTRANKED) {
      return 1;
    }

    Integer rank1 = NOTRANKED;
    Integer rank2 = NOTRANKED;

    if (property.type == String.class) {
      if (priorityMapString.containsKey(v1)) {
        rank1 = priorityMapString.get(v1);
      }
      if (priorityMapString.containsKey(v2)) {
        rank2 = priorityMapString.get(v2);
      }
    } else if (property.type == Long.class || property.type == Integer.class) {
      if (priorityMapString.containsKey(v1)) {
        rank1 = priorityMapLong.get(v1);
      }
      if (priorityMapString.containsKey(v2)) {
        rank2 = priorityMapLong.get(v2);
      }
    } else if (property.type == Double.class) {
      if (priorityMapString.containsKey(v1)) {
        rank1 = priorityMapDouble.get(v1);
      }
      if (priorityMapString.containsKey(v2)) {
        rank2 = priorityMapDouble.get(v2);
      }
    } else {
      throw new java.lang.UnsupportedOperationException(
          "the source property datatype " + String.valueOf(property.type) + " is unrecognized");
    }

    Integer retval = null;
    if (rank1 == NOTRANKED && rank2 == NOTRANKED) {
      retval = 0;

      if (VERBOSE) {
        System.out.println("Glarg!!! Both relationships are unranked");
      }

    } else if (rank2 == NOTRANKED) {
      retval = -1;
      nRankableRelsCompared++;

      if (VERBOSE) {
        System.out.println(
            "rel 2 (relid "
                + rel2.getId()
                + "; source "
                + rel2.getProperty("source")
                + ") property "
                + v2
                + " is not in priority list; preferring rel 1 (relid "
                + rel1.getId()
                + "; source "
                + rel1.getProperty("source")
                + ") property "
                + v1
                + ")");
      }
    } else if (rank1 == NOTRANKED) {
      retval = 1;
      nRankableRelsCompared++;

      if (VERBOSE) {
        System.out.println(
            "rel 1 (relid "
                + rel1.getId()
                + "; name "
                + rel1.getProperty("source")
                + ") property "
                + v1
                + " is not in priority list; preferring rel 2 (relid "
                + rel2.getId()
                + "; source "
                + rel2.getProperty("source")
                + ") property "
                + v2
                + ")");
      }
    } else {
      retval = rank1.compareTo(rank2);
      nRankableRelsCompared += 2;

      if (VERBOSE) {
        System.out.println(
            "rel 1 (relid "
                + rel1.getId()
                + "; name "
                + rel1.getProperty("source")
                + ") property "
                + v1
                + " || rel 2 (relid "
                + rel2.getId()
                + "; source "
                + rel2.getProperty("source")
                + ") property "
                + v2
                + ")");
        System.out.println("\t" + retval);
      }
    }

    // priority is indicated by proximity to the beginning of the list, so we sort in REVERSE!
    // return retval * -1;
    return retval;
  }