private void createItem(Instruction instr, DatabaseCore databaseCore) {
    Map<String, Object> data = instr.getData();
    ModifiableItem item =
        databaseCore
            .getDataFactory()
            .createItem(
                instr.getTarget(),
                data.getOrDefault("date", "").toString(),
                data.getOrDefault("name", "").toString(),
                data.getOrDefault("data", "").toString());

    if (data.containsKey("tags")) item.addTags(parseTags(data.get("tags"), databaseCore));

    databaseCore.addItem(item);
  }
 private void processTag(Instruction instr, DatabaseCore databaseCore) {
   switch (instr.getOperationType()) {
     case CREATE:
       createTag(instr, databaseCore);
       return;
     case EDIT:
       editTag(instr, databaseCore);
       return;
     case DELETE:
       databaseCore.removeTag(instr.getTarget());
   }
 }
  private void editItem(Instruction instr, DatabaseCore databaseCore) {
    Map<String, Object> data = instr.getData();
    ModifiableItem item = databaseCore.getItemChecked(instr.getTarget());

    if (data.containsKey("name")) item.setName(data.get("name").toString());
    if (data.containsKey("date")) item.setDate(data.get("date").toString());
    if (data.containsKey("data")) item.setData(data.get("data").toString());
    if (data.containsKey("tags")) {
      item.removeAllTags();
      item.addTags(parseTags(data.get("tags"), databaseCore));
    }
  }
  private void editTag(Instruction instr, DatabaseCore core) {
    Map<String, Object> data = instr.getData();
    ModifiableTag tag = core.getTagChecked(instr.getTarget());

    if (data.containsKey("name")) tag.setName(data.get("name").toString());
    if (data.containsKey("parent")) {
      int newParentID = (int) data.get("parent");

      ModifiableTag oldParent = ((ModifiableTag) tag.getParent());
      ModifiableTag newParent = core.getTagChecked(newParentID);

      if (newParentID == oldParent.getID()) return; // beze změny - stejný nadřazený štítek

      if (Tags.sameBranch(tag, newParent)) throw new RuntimeException("same branch!");

      // odstranění odkazu z předchozího nadřazeného štítku
      oldParent.removeChild(tag);

      tag.setParent(newParent);
      newParent.addChild(tag);
    }
  }
  private void createTag(Instruction instr, DatabaseCore databaseCore) {
    Map<String, Object> data = instr.getData();
    ModifiableTag tag =
        databaseCore
            .getDataFactory()
            .createTag(instr.getTarget(), data.getOrDefault("name", "").toString());

    ModifiableTag parent;

    if (data.containsKey("parent")) { // explicitně uvedeno
      int parentID = (int) data.get("parent");
      parent = databaseCore.getTagChecked(parentID);

    } else { // výchozí - ROOT
      parent = databaseCore.getRootTag();
    }

    tag.setParent(parent);
    parent.addChild(tag);

    databaseCore.addTag(tag);
  }