@Override
  public Node getProductCategory(Long shopId) {
    Node root = new Node();
    ProductWriter writer = productDaoManager.getWriter();
    List<ProductCategory> productCategoryList = writer.getProductCategoryByShopId(shopId);
    if (CollectionUtils.isEmpty(productCategoryList)) {
      return root;
    }
    List<Node> nodeList = null;

    Map<Long, List<Node>> secondTypeMap = new HashMap<Long, List<Node>>();
    for (ProductCategory productCategory : productCategoryList) {
      if (productCategory.getParentId() == null
          && productCategory.getCategoryType() == ProductCategoryType.TOP_CATEGORY) {
        root = productCategory.toNode();
      }
      if (productCategory.getCategoryType() == ProductCategoryType.SECOND_CATEGORY) {
        if (secondTypeMap.get(productCategory.getParentId()) == null) {
          nodeList = new ArrayList<Node>();
          secondTypeMap.put(productCategory.getParentId(), nodeList);
        }
        Node node = productCategory.toNode();
        secondTypeMap.get(productCategory.getParentId()).add(node);
      }
    }
    List<Node> nodes = new ArrayList<Node>();
    for (ProductCategory productCategory : productCategoryList) {
      if (productCategory.getCategoryType() == ProductCategoryType.FIRST_CATEGORY) {
        nodeList = secondTypeMap.get(productCategory.getId());
        Node node = productCategory.toNode();
        if (CollectionUtils.isNotEmpty(nodeList)) {
          node.setChildren(nodeList);
        }
        nodes.add(node);
      }
    }

    root.mergeAndBuildTree(root, nodes);
    return root;
  }