/* * Copyright (c) 2012, 2013, Credit Suisse (Anatole Tresch), Werner Keil. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.javamoney.regions.spi; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.javamoney.calc.function.MonetaryPredicate; import org.javamoney.regions.Region; import org.javamoney.regions.RegionTreeNode; /** * Abstract base class for a {@link RegionTreeNode}. * * @author Anatole Tresch */ public abstract class AbstractRegionNode implements RegionTreeNode, Comparable<RegionTreeNode> { /** Corresponding region instance. */ private Region region; /** THe node's parent node. */ private RegionTreeNode parent; /** The node's child nodes. */ private List<RegionTreeNode> childNodes = new ArrayList<RegionTreeNode>(); /* * (non-Javadoc) * * @see javax.money.ext.RegionTreeNode#getRegion() */ @Override public Region getRegion() { return region; } /* * (non-Javadoc) * * @see javax.money.ext.RegionTreeNode#getParent() */ @Override public RegionTreeNode getParent() { return parent; } /** * Set the node's region. * * @param region * The new region. */ protected void setRegion(Region region) { if (region == null) { throw new IllegalArgumentException("region is required."); } this.region = region; } /** * Access the child nodes instance (mutable). * * @return the child nodes list. */ protected List<RegionTreeNode> getChildNodes() { return childNodes; } /** * Set the node's parent. * * @param parent * The new parent. */ protected void setParent(RegionTreeNode parent) { this.parent = parent; } /* * (non-Javadoc) * * @see javax.money.ext.RegionTreeNode#getChildren() */ @Override public Collection<RegionTreeNode> getChildren() { return Collections.unmodifiableCollection(childNodes); } /* * (non-Javadoc) * * @see javax.money.ext.RegionTreeNode#contains(javax.money.ext.Region) */ @Override public boolean contains(Region region) { for (RegionTreeNode regionNode : childNodes) { if (regionNode.getRegion().equals(region)) { return true; } if (regionNode.contains(region)) { return true; } } return false; } /* * (non-Javadoc) * * @see * javax.money.ext.RegionTreeNode#selectParent(javax.money.ext.RegionFilter) */ @Override public RegionTreeNode selectParent(MonetaryPredicate<Region> filter) { RegionTreeNode regionNode = parent; while (regionNode != null) { if (filter.test(regionNode.getRegion())) { return regionNode; } regionNode = regionNode.getParent(); } return null; } /* * (non-Javadoc) * * @see javax.money.ext.RegionTreeNode#select(javax.money.ext.RegionFilter) */ @Override public Collection<RegionTreeNode> select(MonetaryPredicate<Region> filter) { List<RegionTreeNode> result = new ArrayList<RegionTreeNode>(); for (RegionTreeNode regionNode : childNodes) { if (filter.test(regionNode.getRegion())) { result.add(regionNode); } } return result; } @SuppressWarnings("unchecked") @Override public int compareTo(RegionTreeNode o) { return ((Comparable<Region>) this.region).compareTo(o.getRegion()); } @Override public RegionTreeNode getRegionTree(String path) { String[] paths = path.split("/"); RegionTreeNode current = this; for (String curPath : paths) { if (curPath.trim().isEmpty()) { continue; } current = getRegionNode(curPath); if (current == null) { throw new IllegalArgumentException("Invalid path: " + path); } } return current; } protected RegionTreeNode getRegionNode(String curPath) { for (RegionTreeNode node : this.childNodes) { if (node.getRegion().getRegionCode().equals(curPath)) { return node; } } return null; } public Region getRegionByCode(String code) { for (RegionTreeNode node : this.childNodes) { if (node.getRegion().getRegionCode().equals(code)) { return node.getRegion(); } } return null; } public Region getRegionByNumericCode(int code) { for (RegionTreeNode node : this.childNodes) { if (node.getRegion().getNumericRegionCode() == code) { return node.getRegion(); } } return null; } /* * (non-Javadoc) * * @see java.lang.Object#toString() */ @Override public String toString() { return getClass().getName() + " [region=" + region + ", parent=" + parent + "]"; } /* * (non-Javadoc) * * @see java.lang.Object#hashCode() */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((parent == null) ? 0 : parent.hashCode()); result = prime * result + ((region == null) ? 0 : region.hashCode()); return result; } /* * (non-Javadoc) * * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; AbstractRegionNode other = (AbstractRegionNode) obj; if (parent == null) { if (other.parent != null) return false; } else if (!parent.equals(other.parent)) return false; if (region == null) { if (other.region != null) return false; } else if (!region.equals(other.region)) return false; return true; } }