view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeAttribute.java @ 148:a2c374a2686b

Merge with 0854f9a9e81db5db639f02a126ebabf1d004b98e
author one
date Fri, 21 Nov 2014 12:49:28 +0900
parents 371b6ddb78f2 0854f9a9e81d
children 8a0aa8fc137c
line wrap: on
line source

package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction;

import java.nio.ByteBuffer;
import java.util.Iterator;

import fj.data.List;
import fj.data.Option;
import fj.data.TreeMap;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NulIterator;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeAttributes;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultOperationLog;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditorError;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;

public class DefaultTreeNodeAttribute implements TreeNodeAttributes {
  public List<TreeNode> children;
  public TreeMap<String, List<ByteBuffer>> attrs;
  OperationLog log;

  public DefaultTreeNodeAttribute(List<TreeNode> _children, TreeMap<String, List<ByteBuffer>> _attrs) {
    children = _children;
    attrs = _attrs;
    log = new DefaultOperationLog();
  }

  public DefaultTreeNodeAttribute(List<TreeNode> _children, TreeMap<String, List<ByteBuffer>> _attrs, OperationLog _log) {
    children = _children;
    attrs = _attrs;
    log = _log;
  }

  @Override
  public TreeMap<String, List<ByteBuffer>> getAttributesAsRawMap() {
    return attrs;
  }

  @Override
  public Either<Error, TreeNode> delete(String _key) {
    if (_key == null) {
      return DefaultEither.newA(NodeEditorError.NULL_VALUE_NOT_ALLOWED);
    }

    if (!attrs.contains(_key)) {
      return DefaultEither.newA(NodeEditorError.DELETE_KEY_NOT_FOUND);
    }

    TreeMap<String, List<ByteBuffer>> newMap = attrs.delete(_key);
    TreeNode newNode = new DefaultTreeNode(children, newMap);
    return DefaultEither.newB(newNode);
  }

  @Override
  public Either<Error, TreeNode> put(String _key, ByteBuffer _value) {
    if (_key == null || _value == null) {
      return DefaultEither.newA(NodeEditorError.NULL_VALUE_NOT_ALLOWED);
    }
    Option<List<ByteBuffer>> attrsListOp = attrs.get(_key);

    List<ByteBuffer> newAttrsList;
    if (attrsListOp.isNone()) {
      List<ByteBuffer> attrsList = List.nil();
      newAttrsList = attrsList.cons(_value);
    } else {
      List<ByteBuffer> attrsList = attrsListOp.some();
      newAttrsList = attrsList.cons(_value);
    }

    TreeMap<String, List<ByteBuffer>> newMap = attrs.set(_key, newAttrsList);
    TreeNode newNode = new DefaultTreeNode(children, newMap);
    return DefaultEither.newB(newNode);
  }

  @Override
  public List<ByteBuffer> get(String _key) {
    if (_key == null) {
      return List.nil();
    }

    Option<List<ByteBuffer>> result = attrs.get(_key);
    return result.isSome() ? result.some() : List.nil();
  }

  @Override
  public Iterator<String> getString(String key) {
    List<ByteBuffer> attributeList = get(key);
    if (attributeList == null)
      return new NulIterator<>();

    return new Iterator<String>() {

      List<ByteBuffer> iteratorAttributeList = attributeList;
      ByteBuffer attribute;

      @Override
      public boolean hasNext() {
        if (!iteratorAttributeList.isEmpty()) {
          attribute = iteratorAttributeList.head();
          iteratorAttributeList = iteratorAttributeList.tail();
          return true;
        }
        return false;
      }

      @Override
      public String next() {
        return new String(attribute.array());
      }

    };
  }

  @Override
  public List<String> getKeys() {
    return attrs.keys();
  }
}