Mercurial > hg > Members > tatsuki > JungleXMLReader
view src/main/java/jp/ac/u_ryukyu/cr/ie/tatsuki/bbs/JuGrix.java @ 32:b8d86bc46b51
remove warning and rename src file
author | one |
---|---|
date | Sun, 09 Nov 2014 17:56:49 +0900 |
parents | 7f70341a78bc |
children | af6d03ba6ee5 96dcbd8e2fcb |
line wrap: on
line source
package jp.ac.u_ryukyu.cr.ie.tatsuki.bbs; import java.util.Iterator; import java.util.LinkedList; import java.util.regex.Matcher; import java.util.regex.Pattern; import ac.jp.u_ryukyu.cr.ie.tatsuki.xmlReader.LoadXml; import fj.Ord; import fj.P2; import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; public class JuGrix { JungleTree personTree; JungleTree organizationTree; JungleTree roleTree; JungleTree rdeTree; public JuGrix(boolean index) { try { LoadXml reader = new LoadXml(); if (index == true) { personTree = reader.loadTestDataCreateIndex("Person.xml"); organizationTree = reader.loadTestDataCreateIndex("Organization.xml"); roleTree = reader.loadTestDataCreateIndex("Role.xml"); rdeTree = reader.loadTestDataCreateIndex("RoleDescriptionElement.xml"); } else { personTree = reader.loadTestData("Person.xml"); organizationTree = reader.loadTestData("Organization.xml"); roleTree = reader.loadTestData("Role.xml"); rdeTree = reader.loadTestData("RoleDescriptionElement.xml"); } } catch (Exception e) { e.printStackTrace(); } } public boolean isActive(String id) { InterfaceTraverser ifTraverser = personTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> pairIterator = ifTraverser.find((TreeNode node) -> { String personId = node.getAttributes().getString("Person-id"); if (personId == null) return false; if (personId.equals(id)) return true; return false; }, "Person-id", id); if (pairIterator.hasNext()) return true; return false; } public Iterator<String> personIds(String orgId, LinkedList<String> roleIds) { TreeMap<String, String> personIds = TreeMap.empty(Ord.stringOrd); TreeMap<String, String> personIdsTreeMap = personIdsSearch(orgId, roleIds, personIds); if (personIdsTreeMap.isEmpty()) return new NullIterator(); Iterator<P2<String, String>> personIdsIterator = personIdsTreeMap.iterator(); return new Iterator<String>() { @Override public boolean hasNext() { if (personIdsIterator.hasNext()) return true; return false; } @Override public String next() { return personIdsIterator.next()._1(); } }; } public Iterator<String> personIds(LinkedList<String> orgIds, LinkedList<String> roleIds) { TreeMap<String, String> personIds = TreeMap.empty(Ord.stringOrd); for (String orgId : orgIds) { personIds = personIdsSearch(orgId, roleIds, personIds); } if (personIds.isEmpty()) return new NullIterator(); Iterator<P2<String, String>> personIdsIterator = personIds.iterator(); return new Iterator<String>() { @Override public boolean hasNext() { if (personIdsIterator.hasNext()) return true; return false; } @Override public String next() { return personIdsIterator.next()._1(); } }; } private TreeMap<String, String> personIdsSearch(String id, LinkedList<String> roleIds, TreeMap<String, String> orgIds) { if (!filter(id, roleIds)) return orgIds; InterfaceTraverser personTraverser = personTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> pairPersonIterator = personTraverser.findAll((TreeNode node) -> { String personId = node.getAttributes().getString("element"); if (personId == null) return false; if (personId.equals("Person")) return true; return false; }, "Person-id"); for (; pairPersonIterator.hasNext();) { Pair<TreeNode, NodePath> pairPerson = pairPersonIterator.next(); Iterator<Pair<TreeNode, NodePath>> pairIdIterator = personTraverser.findInSubTree((TreeNode node) -> { String personId = node.getAttributes().getString("text-organizationRefId"); if (personId == null) return false; if (personId.equals(id)) return true; return false; }, pairPerson, "text-organizationRefId", id); if (pairIdIterator.hasNext()) { String name = pairPerson.left().getAttributes().getString("Person-id"); if (name != null) orgIds = orgIds.set(name, name); } } return orgIds; } public boolean filter(String orgId, LinkedList<String> roleIds) { if (roleIds == null) return true; if (roleIds.isEmpty()) return true; InterfaceTraverser orgTraverser = organizationTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> orgNodeIterator = orgTraverser.find((TreeNode node) -> { String personId = node.getAttributes().getString("element"); if (personId == null) return false; if (!personId.equals("Organization")) return false; String compareOrgId = node.getAttributes().getString("Organization-id"); if (compareOrgId == null) return false; if (compareOrgId.equals(orgId)) return true; return false; }, "Organization-id", orgId); if (!orgNodeIterator.hasNext()) return false; Pair<TreeNode, NodePath> searchNodePair = orgNodeIterator.next(); for (String id : roleIds) { Pattern personPattern = Pattern.compile("r:"); Matcher personMacher = personPattern.matcher(id); if (personMacher.find()) { if (roleFilter(id, searchNodePair)) return false; } Pattern organizationPattern = Pattern.compile("rde:"); Matcher organizationMacher = organizationPattern.matcher(id); if (organizationMacher.find()) { if (!rdeFilter(id, searchNodePair)) return false; } } return true; } private boolean rdeFilter(String id, Pair<TreeNode, NodePath> searchNodePair) { InterfaceTraverser orgTraverser = organizationTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> pairIdIterator = orgTraverser.findInSubTreeAllValue((TreeNode node) -> { String element = node.getAttributes().getString("element"); if (element == null) return false; if (!element.equals("roleRefId")) return false; String roleId = node.getAttributes().getString("text-roleRefId"); if (roleId != null) return true; return false; }, searchNodePair, "text-roleRefId"); TreeMap<String, String> idMap = TreeMap.empty(Ord.stringOrd); for (; pairIdIterator.hasNext();) { String roleId = pairIdIterator.next().left().getAttributes().getString("text-roleRefId"); idMap = idMap.set(roleId, roleId); } Iterator<P2<String, String>> ids = idMap.iterator(); InterfaceTraverser roleTraverser = roleTree.getTraverser(); for (; ids.hasNext();) { String roleId = ids.next()._1(); Iterator<Pair<TreeNode, NodePath>> roleNodeIterator = roleTraverser.find((TreeNode node) -> { String element = node.getAttributes().getString("element"); if (element == null) return false; if (!element.equals("Role")) return false; String compareRoleId = node.getAttributes().getString("Role-id"); if (compareRoleId == null) return false; if (compareRoleId.equals(roleId)) return true; return false; }, "Role-id", roleId); for (; roleNodeIterator.hasNext();) { Pair<TreeNode, NodePath> rolePair = roleNodeIterator.next(); Iterator<Pair<TreeNode, NodePath>> rdeNodeIterator = roleTraverser.findInSubTree((TreeNode node) -> { String elementName = node.getAttributes().getString("element"); if (elementName == null) return false; if (!elementName.equals("roleDescriptionElementRefIds")) return false; String rdeId = node.getAttributes().getString("text-roleDescriptionElementRefIds"); if (rdeId == null) return false; Pattern personPattern = Pattern.compile(id); Matcher personMacher = personPattern.matcher(rdeId); if (personMacher.find()) return true; return false; }, rolePair, "text-roleDescriptionElementRefIds", id); if (!rdeNodeIterator.hasNext()) return false; } } return true; } public boolean roleFilter(String id, Pair<TreeNode, NodePath> searchNodePair) { // System.out.println(searchNodePair.getAttributes().getString("id")); InterfaceTraverser orgTraverser = organizationTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> pairIdIterator = orgTraverser.findInSubTree((TreeNode node) -> { String elementName = node.getAttributes().getString("element"); if (elementName == null) return false; if (!elementName.equals("roleRefIds")) return false; String roleId = node.getAttributes().getString("text-roleRefIds"); if (roleId == null) return false; if (roleId.equals(id)) return true; return false; }, searchNodePair, "text-roleRefIds", id); if (pairIdIterator.hasNext()) { System.out.println(pairIdIterator.next().left().getAttributes().getString("text-roleRefIds")); return false; } return true; } public Iterator<String> roleIds(String id) { Pattern personPattern = Pattern.compile("p:"); Matcher personMacher = personPattern.matcher(id); if (personMacher.find()) { return searchRoleIds(personTree, id, "Person"); } Pattern organizationPattern = Pattern.compile("o:"); Matcher organizationMacher = organizationPattern.matcher(id); if (organizationMacher.find()) { return searchRoleIds(organizationTree, id, "Organization"); } return null; } public Iterator<String> searchRoleIds(JungleTree tree, String id, String element) { InterfaceTraverser ifTraverser = tree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> searchTargetIterator = ifTraverser.find((TreeNode node) -> { String nodeElement = node.getAttributes().getString("element"); if (nodeElement == null) return false; if (!nodeElement.equals(element)) return false; String nodeId = node.getAttributes().getString(element + "-id"); if (nodeId == null) return false; if (nodeId.equals(id)) return true; return false; }, element + "-id", id); TreeMap<String, String> idsTreeMap = TreeMap.empty(Ord.stringOrd); ; for (; searchTargetIterator.hasNext();) { Pair<TreeNode, NodePath> searchTargetPair = searchTargetIterator.next(); Iterator<Pair<TreeNode, NodePath>> pairIdIterator = ifTraverser.findInSubTreeAllValue((TreeNode node) -> { String nodeElement = node.getAttributes().getString("element"); if (nodeElement == null) return false; if (!nodeElement.equals("roleRefId")) return false; String nodeId = node.getAttributes().getString("text-roleRefId"); if (nodeId != null) return true; return false; }, searchTargetPair, "text-roleRefId"); for (; pairIdIterator.hasNext();) { Pair<TreeNode, NodePath> idNodePath = pairIdIterator.next(); String attribute = idNodePath.left().getAttributes().getString("text-roleRefId"); idsTreeMap = idsTreeMap.set(attribute, attribute); } } if (idsTreeMap.isEmpty()) return new NullIterator(); Iterator<P2<String, String>> ids = idsTreeMap.iterator(); return new Iterator<String>() { @Override public boolean hasNext() { if (ids.hasNext()) return true; return false; } @Override public String next() { return ids.next()._1(); } }; } public Iterator<String> competentRoleId(String personId) { InterfaceTraverser ifTraverser = personTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> pairPersonIterator = ifTraverser.find((TreeNode node) -> { String nodeElement = node.getAttributes().getString("element"); if (nodeElement == null) return false; if (!nodeElement.equals("Person")) return false; String nodeId = node.getAttributes().getString("Person-id"); if (nodeId == null) return false; if (nodeId.equals(personId)) return true; return false; }, "Person-id", personId); if (!pairPersonIterator.hasNext()) return new NullIterator(); Pair<TreeNode, NodePath> person = pairPersonIterator.next(); Iterator<Pair<TreeNode, NodePath>> targetPairIterator = ifTraverser.findInSubTree((TreeNode node) -> { String nodeElement = node.getAttributes().getString("element"); if (nodeElement == null) return false; if (!nodeElement.equals("priority")) return false; String priority = node.getAttributes().getString("text-priority"); if (priority == null) return false; if (priority.equals("0")) return true; return false; }, person, "text-priority", "0"); LinkedList<String> idList = new LinkedList<String>(); for (; targetPairIterator.hasNext();) { NodePath searchPath = targetPairIterator.next().right(); Pair<Integer, NodePath> searchPair = searchPath.last(); NodePath targetPath = searchPair.right().add(searchPair.left() + 1); TreeNode targetNode = getTarget(personTree.getRootNode(), targetPath); // TreeNode targetNode = getTarget(person.left(), targetPath); String id = targetNode.getAttributes().getString("text-roleRefId"); idList.add(id); } return idList.iterator(); } public Iterator<String> concurrentRoleIds(String personId) { InterfaceTraverser ifTraverser = personTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> pairPersonIterator = ifTraverser.find((TreeNode node) -> { String nodeElement = node.getAttributes().getString("element"); if (nodeElement == null) return false; if (!nodeElement.equals("Person")) return false; String nodeId = node.getAttributes().getString("Person-id"); if (nodeId == null) return false; if (nodeId.equals(personId)) return true; return false; }, "Person-id", personId); if (!pairPersonIterator.hasNext()) return new NullIterator(); Pair<TreeNode, NodePath> person = pairPersonIterator.next(); Iterator<Pair<TreeNode, NodePath>> targetPairIterator = ifTraverser.findInSubTreeAllValue((TreeNode node) -> { String nodeElement = node.getAttributes().getString("element"); if (nodeElement == null) return false; if (!nodeElement.equals("priority")) return false; String priority = node.getAttributes().getString("text-priority"); if (priority != null) return true; return false; }, person, "text-priority"); LinkedList<String> idList = new LinkedList<String>(); for (; targetPairIterator.hasNext();) { Pair<TreeNode, NodePath> targetPair = targetPairIterator.next(); TreeNode targetNode = targetPair.left(); int priority = Integer.parseInt(targetNode.getAttributes().getString("text-priority")); if (priority > 0) { NodePath targetPath = targetPair.right(); Pair<Integer, NodePath> searchPair = targetPath.last(); NodePath roleIdNodePath = searchPair.right().add(searchPair.left() + 1); TreeNode roleIdNode = getTarget(personTree.getRootNode(), roleIdNodePath); String id = roleIdNode.getAttributes().getString("text-roleRefId"); idList.add(id); } } return idList.iterator(); } public Iterator<String> deepPersonIds(String orgId, LinkedList<String> filterIds) { TreeMap<String, String> personIdsTreeMap = TreeMap.empty(Ord.stringOrd); Iterator<String> childrensIterator = deepParentOrganizationIdsPlus(orgId, filterIds); if (!childrensIterator.hasNext()) return new NullIterator(); for (; childrensIterator.hasNext();) { String id = childrensIterator.next(); personIdsTreeMap = personIdsSearch(id, filterIds,personIdsTreeMap); } if (personIdsTreeMap.isEmpty()) return new NullIterator(); Iterator<P2<String, String>> personIds = personIdsTreeMap.iterator(); return new Iterator<String>() { @Override public boolean hasNext() { if (personIds.hasNext()) return true; return false; } @Override public String next() { return personIds.next()._1(); } }; } public Iterator<String> deepChildOrganizationIdsPlus(String orgId, LinkedList<String> filterIds) { TreeMap<String, String> orgIdsTreeMap = TreeMap.empty(Ord.stringOrd); if (filter(orgId, filterIds)) orgIdsTreeMap = orgIdsTreeMap.set(orgId, orgId); orgIdsTreeMap = _deepChildOrganizationIds(orgId, filterIds, orgIdsTreeMap); if (orgIdsTreeMap.isEmpty()) return new NullIterator(); Iterator<P2<String, String>> orgIds = orgIdsTreeMap.iterator(); return new Iterator<String>() { @Override public boolean hasNext() { if (orgIds.hasNext()) return true; return false; } @Override public String next() { return orgIds.next()._1(); } }; } public Iterator<String> deepChildOrganizationIds(String orgId, LinkedList<String> filterIds) { TreeMap<String, String> orgIdsTreeMap = TreeMap.empty(Ord.stringOrd); TreeMap<String, String> newOrgIdsTreeMap = _deepChildOrganizationIds(orgId, filterIds, orgIdsTreeMap); if (newOrgIdsTreeMap.isEmpty()) return new NullIterator(); Iterator<P2<String, String>> orgIds = newOrgIdsTreeMap.iterator(); return new Iterator<String>() { @Override public String next() { return orgIds.next()._1(); } @Override public boolean hasNext() { if (orgIds.hasNext()) return true; return false; } }; } public TreeMap<String, String> _deepChildOrganizationIds(String orgId, LinkedList<String> filterIds, TreeMap<String, String> orgIdsTreeMap) { Iterator<String> childrensIterator = childOrganizationIds(orgId, new LinkedList<String>()); if (!childrensIterator.hasNext()) return orgIdsTreeMap; for (; childrensIterator.hasNext();) { String childrenId = childrensIterator.next(); if (filter(childrenId, filterIds)) orgIdsTreeMap = orgIdsTreeMap.set(childrenId, childrenId); orgIdsTreeMap = _deepChildOrganizationIds(childrenId, filterIds, orgIdsTreeMap); } return orgIdsTreeMap; } public Iterator<String> childOrganizationIds(String orgId, LinkedList<String> filterIds) { TreeMap<String, String> childrenOrgIdTreeMap = TreeMap.empty(Ord.stringOrd); TreeMap<String, String> newChildrenOrgIdTreeMap = _childOrganizationIds(orgId, filterIds, childrenOrgIdTreeMap); if (newChildrenOrgIdTreeMap.isEmpty()) return new NullIterator(); Iterator<P2<String, String>> childrenOrgIdIterator = newChildrenOrgIdTreeMap.iterator(); return new Iterator<String>() { @Override public boolean hasNext() { if (childrenOrgIdIterator.hasNext()) return true; return false; } @Override public String next() { return childrenOrgIdIterator.next()._1(); } }; } public TreeMap<String, String> _childOrganizationIds(String orgId, LinkedList<String> filterIds, TreeMap<String, String> childOrgIdsTreeMap) { InterfaceTraverser orgTraverser = organizationTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> pairPersonIterator = orgTraverser.find((TreeNode node) -> { String nodeElement = node.getAttributes().getString("element"); if (nodeElement == null) return false; if (!nodeElement.equals("Organization")) return false; String nodeId = node.getAttributes().getString("Organization-id"); if (nodeId == null) return false; if (nodeId.equals(orgId)) return true; return false; }, "Organization-id", orgId); if (!pairPersonIterator.hasNext()) return childOrgIdsTreeMap; Pair<TreeNode, NodePath> person = pairPersonIterator.next(); Iterator<Pair<TreeNode, NodePath>> chilrenOrgIdsIterator = orgTraverser.findInSubTree((TreeNode node) -> { String nodeElement = node.getAttributes().getString("element"); if (nodeElement == null) return false; if (nodeElement.equals("childOrganizations")) return true; return false; }, person, "element", "childOrganizations"); if (!chilrenOrgIdsIterator.hasNext()) return childOrgIdsTreeMap; Pair<TreeNode, NodePath> chilerenOrgIds = chilrenOrgIdsIterator.next(); Iterator<Pair<TreeNode, NodePath>> chilrenOrgIdIterator = orgTraverser.findInSubTreeAllValue((TreeNode node) -> { String nodeElement = node.getAttributes().getString("element"); if (nodeElement == null) return false; if (!nodeElement.equals("organizationRefIds")) return false; nodeElement = node.getAttributes().getString("text-organizationRefIds"); if (nodeElement != null) return true; return false; }, chilerenOrgIds, "text-organizationRefIds"); for (; chilrenOrgIdIterator.hasNext();) { String childrenOrgId = chilrenOrgIdIterator.next().left().getAttributes().getString("text-organizationRefIds"); if (filter(childrenOrgId, filterIds)) childOrgIdsTreeMap = childOrgIdsTreeMap.set(childrenOrgId, childrenOrgId); } return childOrgIdsTreeMap; } public TreeNode getTarget(TreeNode node, NodePath path) { TreeNode target; Pair<Integer, NodePath> pathNode = path.pop(); int num = pathNode.left(); NodePath newPath = pathNode.right(); if (num == -1 && newPath.size() != 0) return getTarget(node, newPath); Either<Error, TreeNode> either = node.getChildren().at(num); if (either.isA()) return node; TreeNode child = either.b(); if (pathNode.right().size() == 0) return child; target = getTarget(child, pathNode.right()); return target; } class NullIterator implements Iterator<String> { @Override public boolean hasNext() { return false; } @Override public String next() { return null; } } public String rolePriority(String personId, String roleId) { InterfaceTraverser personTraverser = personTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> personIterator = personTraverser.find((TreeNode node) -> { String element = node.getAttributes().getString("element"); if (element == null) return false; if (!element.equals("Person")) return false; String nodeId = node.getAttributes().getString("Person-id"); if (nodeId == null) return false; if (nodeId.equals(personId)) return true; return false; }, "Person-id", personId); if (!personIterator.hasNext()) return ""; Pair<TreeNode, NodePath> targetNode = personIterator.next(); Iterator<Pair<TreeNode, NodePath>> priorityIterator = personTraverser.findInSubTree((TreeNode node) -> { String element = node.getAttributes().getString("element"); if (element == null) return false; if (!element.equals("roleRefId")) return false; String compareRoleId = node.getAttributes().getString("text-roleRefId"); if (compareRoleId == null) return false; if (compareRoleId.equals(roleId)) return true; return false; }, targetNode, "text-roleRefId",roleId); for (; priorityIterator.hasNext();) { Pair<TreeNode, NodePath> priorityPair = priorityIterator.next(); NodePath roleNodePath = priorityPair.right(); Pair<Integer, NodePath> last = roleNodePath.last(); NodePath priorityNodePath = last.right().add(last.left() - 1); TreeNode priorityNode = getTarget(personTree.getRootNode(), priorityNodePath); if (priorityNode.getAttributes().getString("element").equals("priority")) return priorityNode.getAttributes().getString("text-priority"); } return ""; } public Iterator<String> parentOrganizationIds(String orgId, LinkedList<String> filterIds) { return _parentOrganizationIds(orgId, filterIds); } public Iterator<String> _parentOrganizationIds(String orgId, LinkedList<String> filterIds) { InterfaceTraverser orgTraverser = organizationTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> orgIterator = orgTraverser.find((TreeNode node) -> { String element = node.getAttributes().getString("element"); if (element == null) return false; if (!element.equals("Organization")) return false; String nodeId = node.getAttributes().getString("Organization-id"); if (nodeId == null) return false; if (nodeId.equals(orgId)) return true; return false; }, "Organization-id", orgId); if (!orgIterator.hasNext()) return new NullIterator(); Pair<TreeNode, NodePath> orgNode = orgIterator.next(); Iterator<Pair<TreeNode, NodePath>> parentOrgIterator = orgTraverser.findInSubTree((TreeNode node) -> { String element = node.getAttributes().getString("element"); if (element == null) return false; if (element.equals("parentOrganizations")) return true; return false; }, orgNode, "element", "parentOrganizations"); TreeMap<String, String> parentIdsTreeMap = TreeMap.empty(Ord.stringOrd); for (; parentOrgIterator.hasNext();) { Pair<TreeNode, NodePath> parentOrgNode = parentOrgIterator.next(); Iterator<Pair<TreeNode, NodePath>> parentNodeIterator = orgTraverser.findInSubTreeAllValue((TreeNode node) -> { String element = node.getAttributes().getString("element"); if (element == null) return false; if (!element.equals("organizationRefId")) return false; String parentId = node.getAttributes().getString("text-organizationRefId"); if (parentId != null) return true; return false; }, parentOrgNode, "text-organizationRefId"); for (; parentNodeIterator.hasNext();) { String parentId = parentNodeIterator.next().left().getAttributes().getString("text-organizationRefId"); if (filter(parentId, filterIds)) parentIdsTreeMap = parentIdsTreeMap.set(parentId, parentId); } } Iterator<P2<String, String>> parentIds = parentIdsTreeMap.iterator(); if (parentIdsTreeMap.isEmpty()) return new NullIterator(); else return new Iterator<String>() { @Override public boolean hasNext() { if (parentIds.hasNext()) return true; return false; } @Override public String next() { return parentIds.next()._1(); } }; } public Iterator<String> deepParentOrganizationIds(String orgId, LinkedList<String> filterIds) { TreeMap<String, String> parentIdsTreeMap = TreeMap.empty(Ord.stringOrd); Iterator<P2<String, String>> parentIds = _deepParentOrganizationIds(orgId, filterIds, parentIdsTreeMap).iterator(); return new Iterator<String>() { @Override public boolean hasNext() { if (parentIds.hasNext()) return true; return false; } @Override public String next() { return parentIds.next()._1(); } }; } public TreeMap<String, String> _deepParentOrganizationIds(String orgId, LinkedList<String> filterIds, TreeMap<String, String> orgIds) { Iterator<String> parentIds = parentOrganizationIds(orgId, filterIds); if (!parentIds.hasNext()) return orgIds; for (; parentIds.hasNext();) { String parentId = parentIds.next(); if (filter(parentId, filterIds)) orgIds = orgIds.set(parentId, parentId); orgIds = _deepParentOrganizationIds(parentId, filterIds, orgIds); } return orgIds; } public Iterator<String> deepParentOrganizationIdsPlus(String id, LinkedList<String> filterIds) { TreeMap<String, String> parentIdsTreeMap = TreeMap.empty(Ord.stringOrd); if (filter(id, filterIds)) parentIdsTreeMap = parentIdsTreeMap.set(id, id); parentIdsTreeMap = _deepParentOrganizationIds(id, filterIds, parentIdsTreeMap); if (parentIdsTreeMap.isEmpty()) return new NullIterator(); Iterator<P2<String, String>> personIds = parentIdsTreeMap.iterator(); return new Iterator<String>() { @Override public boolean hasNext() { if (personIds.hasNext()) return true; return false; } @Override public String next() { return personIds.next()._1(); } }; } public String stringPathToId(String args) { String[] splitPath = args.split(":"); String str = splitPath[2]; for (int count = 3; count < splitPath.length; count++) { str = str + ":" + splitPath[count]; } final String StrPath = str; InterfaceTraverser traverser = null; TreeNode root = null; String elementName = null; if (splitPath[0].equals("r")) { traverser = roleTree.getTraverser(); root = roleTree.getRootNode(); elementName = "Role"; } if (splitPath[0].equals("rde")) { traverser = rdeTree.getTraverser(); root = rdeTree.getRootNode(); elementName = "RoleDescriptionElement"; } Iterator<Pair<TreeNode, NodePath>> idIterator = traverser.find((TreeNode node) -> { String element = node.getAttributes().getString("element"); if (element == null) return false; if (!element.equals("path")) return false; String pathString = node.getAttributes().getString("text-path"); if (pathString == null) return false; if (pathString.equals(StrPath)) return true; return false; }, "text-path", StrPath); if (!idIterator.hasNext()) return ""; Pair<TreeNode, NodePath> nodePair = idIterator.next(); NodePath path = nodePair.right(); NodePath targetPath = path.last().right(); TreeNode targetNode = getTarget(root, targetPath); String targetId = targetNode.getAttributes().getString(elementName + "-id"); return targetId; } public Iterator<String> roleDescriptionElementIds(String id, LinkedList<String> filterIds) { Iterator<String> orgIds = deepParentOrganizationIdsPlus(id, filterIds); TreeMap<String,String> rdeIdsTreeMap = TreeMap.empty(Ord.stringOrd); for (; orgIds.hasNext();) { String orgId = orgIds.next(); Iterator<String> roleIds = roleIds(orgId); for (; roleIds.hasNext();) { String roleId = roleIds.next(); Iterator<String> rdeIds = getRde(roleId); for (;rdeIds.hasNext();) { String rdeId = rdeIds.next(); rdeIdsTreeMap = rdeIdsTreeMap.set(rdeId,rdeId); } } } if (rdeIdsTreeMap.isEmpty()) return new NullIterator(); Iterator<P2<String, String>> rdeIds = rdeIdsTreeMap.iterator(); return new Iterator<String>() { @Override public boolean hasNext() { if (rdeIds.hasNext()) return true; return false; } @Override public String next() { return rdeIds.next()._1(); } }; } private Iterator<String> getRde(String roleId) { InterfaceTraverser traverser = roleTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> roleIterator = traverser.find((TreeNode node) -> { String element = node.getAttributes().getString("element"); if (element == null) return false; if (!element.equals("Role")) return false; String id = node.getAttributes().getString("Role-id"); if (id == null) return false; if (id.equals(roleId)) return true; return false; }, "Role-id", roleId); if (!roleIterator.hasNext()) return new NullIterator(); Pair<TreeNode, NodePath> roleNode = roleIterator.next(); Iterator<Pair<TreeNode, NodePath>> rdeIterator = traverser.findInSubTreeAllValue((TreeNode node) -> { String element = node.getAttributes().getString("element"); if (element == null) return false; if (!element.equals("roleDescriptionElementRefIds")) return false; String rde = node.getAttributes().getString("text-roleDescriptionElementRefIds"); if (rde != null) return true; return false; }, roleNode, "text-roleDescriptionElementRefIds"); if (!rdeIterator.hasNext()) return new NullIterator(); return new Iterator<String>() { @Override public boolean hasNext() { if (rdeIterator.hasNext()) return true; return false; } @Override public String next() { return rdeIterator.next().left().getAttributes().getString("text-roleDescriptionElementRefIds"); } }; } }