@Override
    public void run() {
      // log.info("START");
      try {
        while (execute) {
          int next = random.nextInt(nodesMaxIndex);
          NodeData rndNode = parentNodes[next];
          if (random.nextBoolean()) {
            // put single item
            if (random.nextBoolean()) {
              // node
              cache.put(
                  new TransientNodeData(
                      QPath.makeChildPath(
                          rndNode.getQPath(), InternalQName.parse("[]childNode-" + next)),
                      IdGenerator.generate(),
                      1,
                      Constants.NT_UNSTRUCTURED,
                      new InternalQName[0],
                      1,
                      IdGenerator.generate(),
                      rndNode.getACL()));
            } else {
              TransientPropertyData pd =
                  new TransientPropertyData(
                      QPath.makeChildPath(
                          rndNode.getQPath(), InternalQName.parse("[]property-" + next)),
                      IdGenerator.generate(),
                      1,
                      PropertyType.STRING,
                      rndNode.getIdentifier(),
                      false,
                      new TransientValueData("prop data"));
              cache.put(pd);
            }
            itemsProcessed++;
          } else {
            // put list of childs
            if (random.nextBoolean()) {
              // nodes
              List<NodeData> cn = createNodesData(rndNode, 100);
              cache.addChildNodes(rndNode, cn);
              itemsProcessed += cn.size();
            } else {
              // properties w/o value
              List<PropertyData> cp = createPropertiesData(rndNode, 100);
              cache.addChildProperties(rndNode, cp);
              itemsProcessed += cp.size();
            }
          }

          Thread.sleep(putTimeout);
        }
      } catch (Exception e) {
        log.error(getName() + " " + e, e);
      }
      // log.info("FINISH");
    }
  /**
   * properties w/o value.
   *
   * @param parent
   * @param count
   * @return
   * @throws Exception
   */
  private List<PropertyData> createPropertiesData(NodeData parent, int count) throws Exception {

    List<PropertyData> props = new ArrayList<PropertyData>();

    for (int i = 1; i <= count; i++) {
      TransientPropertyData pd =
          new TransientPropertyData(
              QPath.makeChildPath(parent.getQPath(), InternalQName.parse("[]property-" + i)),
              IdGenerator.generate(),
              1,
              PropertyType.STRING,
              parent.getIdentifier(),
              false,
              new TransientValueData("prop data"));
      props.add(pd);
    }

    return props;
  }
  private List<NodeData> createNodesData(NodeData parent, int count) throws Exception {

    List<NodeData> nodes = new ArrayList<NodeData>();

    for (int i = 1; i <= count; i++) {
      nodes.add(
          new TransientNodeData(
              QPath.makeChildPath(parent.getQPath(), InternalQName.parse("[]node" + i)),
              IdGenerator.generate(),
              1,
              Constants.NT_UNSTRUCTURED,
              new InternalQName[0],
              1,
              IdGenerator.generate(),
              parent.getACL()));
    }

    return nodes;
  }
 @Override
 public void run() {
   // log.info("START");
   try {
     while (execute) {
       NodeData rndNode = nodes[random.nextInt(nodesMaxIndex)];
       if (random.nextBoolean()) {
         // by id
         NodeData n = (NodeData) cache.get(rndNode.getIdentifier());
         if (n != null) assertEquals(rndNode.getIdentifier(), n.getIdentifier());
       } else {
         // by parent + name
         NodeData n =
             (NodeData)
                 cache.get(
                     rndNode.getParentIdentifier(),
                     rndNode.getQPath().getEntries()[rndNode.getQPath().getEntries().length - 1],
                     ItemType.NODE);
         if (n != null) assertEquals(rndNode.getIdentifier(), n.getIdentifier());
       }
       itemsProcessed++;
     }
   } catch (Exception e) {
     log.error(getName() + " " + e, e);
   }
   // log.info("FINISH");
 }