Mercurial > hg > Members > tatsuki > JungleXMLReader
view src/main/java/jp/ac/u_ryukyu/cr/ie/tatsuki/bbs/JuGrix.java @ 41:037731e99d6e
fit JungleCore 144
author | one |
---|---|
date | Mon, 17 Nov 2014 18:47:10 +0900 |
parents | 22edfb7f47ad |
children | 1bdd50e26fac |
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 javax.lang.model.element.Element; 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 personTraverser = personTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> personIdpairIterator = personTraverser.find((TreeNode node) -> { Iterator<String> personIdIterator = node.getAttributes().getString("Person-id"); if (personIdIterator.hasNext()) { if (personIdIterator.next().equals(id)) return true; } return false; }, "Person-id", id); if (personIdpairIterator.hasNext()) return true; return false; } public Iterator<String> personIds(String orgId, LinkedList<String> roleIds) { Iterator<String> parentOrgIdIterator = parentOrganizationIds(orgId, roleIds); TreeMap<String, String> personIdsTreeMap = TreeMap.empty(Ord.stringOrd); if (filter(orgId, roleIds)) personIdsTreeMap = personIdsSearch(orgId, personIdsTreeMap); for (; parentOrgIdIterator.hasNext();) { personIdsTreeMap = personIdsSearch(parentOrgIdIterator.next(), personIdsTreeMap); } 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, personIds); } if (personIds.isEmpty()) return new NullIterator(); Iterator<P2<String, String>> personIdsIterator = personIds.iterator(); return new Iterator<String>() { String personId; @Override public boolean hasNext() { for (; personIdsIterator.hasNext();) { personId = personIdsIterator.next()._1(); if (filter(personId, roleIds)) return true; } return false; } @Override public String next() { return personId; } }; } private TreeMap<String, String> personIdsSearch(String orgId, TreeMap<String, String> orgIdsTreeMap) { InterfaceTraverser personTraverser = personTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> personIdPairIterator = personTraverser.findAll((TreeNode node) -> { Iterator<String> personIdIterator = node.getAttributes().getString("element"); for (; personIdIterator.hasNext();) { if (personIdIterator.next().equals("Person")) return true; } return false; }, "Person-id"); for (; personIdPairIterator.hasNext();) { Pair<TreeNode, NodePath> personIdPair = personIdPairIterator.next(); Iterator<Pair<TreeNode, NodePath>> orgIdPairIterator = personTraverser.findInSubTree((TreeNode node) -> { Iterator<String> personIdIterator = node.getAttributes().getString("text-organizationRefId"); for (; personIdIterator.hasNext();) { if (personIdIterator.next().equals(orgId)) return true; } return false; }, personIdPair, "text-organizationRefId", orgId); if (orgIdPairIterator.hasNext()) { Iterator<String> personIdIterator = personIdPair.left().getAttributes().getString("Person-id"); if (personIdIterator.hasNext()) { String personId = personIdIterator.next(); orgIdsTreeMap = orgIdsTreeMap.set(personId, personId); } } } return orgIdsTreeMap; } 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>> orgIdPairIterator = orgTraverser.find((TreeNode node) -> { Iterator<String> personIdIterator = node.getAttributes().getString("element"); for (; personIdIterator.hasNext();) { if (!personIdIterator.next().equals("Organization")) continue; Iterator<String> compareOrgIdIterator = node.getAttributes().getString("Organization-id"); for (; compareOrgIdIterator.hasNext();) { if (compareOrgIdIterator.next().equals(orgId)) return true; } } return false; }, "Organization-id", orgId); if (!orgIdPairIterator.hasNext()) return false; Pair<TreeNode, NodePath> orgIdPair = orgIdPairIterator.next(); for (String id : roleIds) { Pattern personPattern = Pattern.compile("r:"); Matcher personMacher = personPattern.matcher(id); if (personMacher.find()) { if (roleFilter(id, orgIdPair)) return false; } Pattern organizationPattern = Pattern.compile("rde:"); Matcher organizationMacher = organizationPattern.matcher(id); if (organizationMacher.find()) { if (!rdeFilter(id, orgIdPair)) return false; } } return true; } private boolean rdeFilter(String filterRdeId, Pair<TreeNode, NodePath> searchNodePair) { InterfaceTraverser orgTraverser = organizationTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> orgRoleIdPairIterator = orgTraverser.findInSubTreeAllValue((TreeNode node) -> { Iterator<String> element = node.getAttributes().getString("element"); if (!element.hasNext()) return false; if (!element.next().equals("roleRefId")) return false; Iterator<String> roleId = node.getAttributes().getString("text-roleRefId"); if (roleId.hasNext()) return true; return false; }, searchNodePair, "text-roleRefId"); TreeMap<String, String> orgRoleIdMap = TreeMap.empty(Ord.stringOrd); for (; orgRoleIdPairIterator.hasNext();) { Iterator<String> roleIdIterator = orgRoleIdPairIterator.next().left().getAttributes().getString("text-roleRefId"); for (; roleIdIterator.hasNext();) { String roleId = roleIdIterator.next(); orgRoleIdMap = orgRoleIdMap.set(roleId, roleId); } } Iterator<P2<String, String>> orgRoleIdP2Iterator = orgRoleIdMap.iterator(); InterfaceTraverser roleTraverser = roleTree.getTraverser(); for (; orgRoleIdP2Iterator.hasNext();) { String orgRoleId = orgRoleIdP2Iterator.next()._1(); Iterator<Pair<TreeNode, NodePath>> roleIdPairIterator = roleTraverser.find((TreeNode node) -> { Iterator<String> element = node.getAttributes().getString("element"); if (!element.hasNext()) return false; if (!element.next().equals("Role")) return false; Iterator<String> compareRoleIdIterator = node.getAttributes().getString("Role-id"); for (; compareRoleIdIterator.hasNext();) { if (compareRoleIdIterator.next().equals(orgRoleId)) return true; } return false; }, "Role-id", orgRoleId); for (; roleIdPairIterator.hasNext();) { Pair<TreeNode, NodePath> rolePair = roleIdPairIterator.next(); Iterator<Pair<TreeNode, NodePath>> rdeIdPairIterator = roleTraverser.findInSubTree((TreeNode node) -> { Iterator<String> element = node.getAttributes().getString("element"); if (!element.hasNext()) return false; if (!element.next().equals("roleDescriptionElementRefIds")) return false; Iterator<String> rdeIdIterator = node.getAttributes().getString("text-roleDescriptionElementRefIds"); for (; rdeIdIterator.hasNext();) { if (rdeIdIterator.next().equals(filterRdeId)) return true; } return false; }, rolePair, "text-roleDescriptionElementRefIds", filterRdeId); if (!rdeIdPairIterator.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>> roleIdPairIterator = orgTraverser.findInSubTree((TreeNode node) -> { Iterator<String> elementName = node.getAttributes().getString("element"); if (!elementName.hasNext()) return false; if (!elementName.next().equals("roleRefIds")) return false; Iterator<String> roleId = node.getAttributes().getString("text-roleRefIds"); for (; roleId.hasNext();) { if (roleId.next().equals(id)) return true; } return false; }, searchNodePair, "text-roleRefIds", id); if (roleIdPairIterator.hasNext()) { 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 new NullIterator(); } public Iterator<String> searchRoleIds(JungleTree tree, String id, String element) { InterfaceTraverser traverser = tree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> idPairIterator = traverser.find((TreeNode node) -> { Iterator<String> nodeElement = node.getAttributes().getString("element"); if (!nodeElement.hasNext()) return false; if (!nodeElement.next().equals(element)) return false; Iterator<String> nodeIdIterator = node.getAttributes().getString(element + "-id"); for (; nodeIdIterator.hasNext();) { if (nodeIdIterator.next().equals(id)) return true; } return false; }, element + "-id", id); TreeMap<String, String> idsTreeMap = TreeMap.empty(Ord.stringOrd); for (; idPairIterator.hasNext();) { Pair<TreeNode, NodePath> targetPair = idPairIterator.next(); Iterator<Pair<TreeNode, NodePath>> roleIdPairIterator = traverser.findInSubTreeAllValue((TreeNode node) -> { Iterator<String> nodeElement = node.getAttributes().getString("element"); if (!nodeElement.hasNext()) return false; if (!nodeElement.next().equals("roleRefId")) return false; Iterator<String> nodeIdIterator = node.getAttributes().getString("text-roleRefId"); if (nodeIdIterator.hasNext()) return true; return false; }, targetPair, "text-roleRefId"); for (; roleIdPairIterator.hasNext();) { Pair<TreeNode, NodePath> roleIdPair = roleIdPairIterator.next(); Iterator<String> roleIdIterator = roleIdPair.left().getAttributes().getString("text-roleRefId"); for (; roleIdIterator.hasNext();) { String roleId = roleIdIterator.next(); idsTreeMap = idsTreeMap.set(roleId, roleId); } } } 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 personTraverser = personTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> personIdPairIterator = personTraverser.find((TreeNode node) -> { Iterator<String> nodeElement = node.getAttributes().getString("element"); if (!nodeElement.hasNext()) return false; if (!nodeElement.next().equals("Person")) return false; Iterator<String> nodeIdIterator = node.getAttributes().getString("Person-id"); if (!nodeIdIterator.hasNext()) return false; if (nodeIdIterator.next().equals(personId)) return true; return false; }, "Person-id", personId); if (!personIdPairIterator.hasNext()) return new NullIterator(); Pair<TreeNode, NodePath> personIdPair = personIdPairIterator.next(); Iterator<Pair<TreeNode, NodePath>> priorityPairIterator = personTraverser.findInSubTree((TreeNode node) -> { Iterator<String> nodeElement = node.getAttributes().getString("element"); if (!nodeElement.hasNext()) return false; if (!nodeElement.next().equals("priority")) return false; Iterator<String> priorityIterator = node.getAttributes().getString("text-priority"); for (; priorityIterator.hasNext();) { if (priorityIterator.next().equals("0")) return true; } return false; }, personIdPair, "text-priority", "0"); TreeMap<String, String> roleIdTreeMap = TreeMap.empty(Ord.stringOrd); for (; priorityPairIterator.hasNext();) { Pair<TreeNode, NodePath> priorityPair = priorityPairIterator.next(); NodePath priorityPath = priorityPair.right(); Pair<Integer, NodePath> removeLastPair = priorityPath.last(); NodePath roleIdNodePath = removeLastPair.right().add(removeLastPair.left() + 1); TreeNode roleIdNode = getTarget(personTree.getRootNode(), roleIdNodePath); Iterator<String> roleIdIterator = roleIdNode.getAttributes().getString("text-roleRefId"); for (; roleIdIterator.hasNext();) { String roleId = roleIdIterator.next(); roleIdTreeMap = roleIdTreeMap.set(roleId, roleId); } } Iterator<P2<String, String>> roleIdP2Iterator = roleIdTreeMap.iterator(); return new Iterator<String>() { @Override public boolean hasNext() { if (roleIdP2Iterator.hasNext()) return true; return false; } @Override public String next() { return roleIdP2Iterator.next()._1(); } }; } public Iterator<String> concurrentRoleIds(String personId) { InterfaceTraverser personTraverser = personTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> personIdPairIterator = personTraverser.find((TreeNode node) -> { Iterator<String> nodeElement = node.getAttributes().getString("element"); if (!nodeElement.hasNext()) return false; if (!nodeElement.next().equals("Person")) return false; Iterator<String> nodeId = node.getAttributes().getString("Person-id"); for (; nodeId.hasNext();) { if (nodeId.next().equals(personId)) return true; } return false; }, "Person-id", personId); if (!personIdPairIterator.hasNext()) return new NullIterator(); Pair<TreeNode, NodePath> personidPair = personIdPairIterator.next(); Iterator<Pair<TreeNode, NodePath>> priorityPairIterator = personTraverser.findInSubTreeAllValue( (TreeNode node) -> { Iterator<String> nodeElement = node.getAttributes().getString("element"); if (!nodeElement.hasNext()) return false; if (!nodeElement.next().equals("priority")) return false; Iterator<String> priorityIterator = node.getAttributes().getString("text-priority"); if (priorityIterator.hasNext()) return true; return false; }, personidPair, "text-priority"); TreeMap<String, String> roleIdTreeMap = TreeMap.empty(Ord.stringOrd); for (; priorityPairIterator.hasNext();) { Pair<TreeNode, NodePath> priorityPair = priorityPairIterator.next(); TreeNode priorityNode = priorityPair.left(); Iterator<String> priorityIterator = priorityNode.getAttributes().getString("text-priority"); for (; priorityIterator.hasNext();) { int priority = Integer.parseInt(priorityIterator.next()); if (priority > 0) { NodePath priorityPath = priorityPair.right(); Pair<Integer, NodePath> removeLastPair = priorityPath.last(); NodePath roleIdNodePath = removeLastPair.right().add(removeLastPair.left() + 1); TreeNode roleIdNode = getTarget(personTree.getRootNode(), roleIdNodePath); Iterator<String> roleIdIterator = roleIdNode.getAttributes().getString("text-roleRefId"); for (; roleIdIterator.hasNext();) { String roleId = roleIdIterator.next(); roleIdTreeMap = roleIdTreeMap.set(roleId, roleId); } } } } Iterator<P2<String, String>> roleIdP2Iterator = roleIdTreeMap.iterator(); return new Iterator<String>() { @Override public boolean hasNext() { if (roleIdP2Iterator.hasNext()) return true; return false; } @Override public String next() { return roleIdP2Iterator.next()._1(); } }; } public Iterator<String> deepPersonIds(String orgId, LinkedList<String> filterIds) { TreeMap<String, String> personIdsTreeMap = TreeMap.empty(Ord.stringOrd); Iterator<String> childrensIterator = deepChildOrganizationIdsPlus(orgId, filterIds); if (!childrensIterator.hasNext()) return new NullIterator(); for (; childrensIterator.hasNext();) { String id = childrensIterator.next(); personIdsTreeMap = personIdsSearch(id, 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); orgIdsTreeMap = orgIdsTreeMap.set(orgId, orgId); orgIdsTreeMap = _deepChildOrganizationIds(orgId, orgIdsTreeMap); if (orgIdsTreeMap.isEmpty()) return new NullIterator(); Iterator<P2<String, String>> orgIdsP2Iterator = orgIdsTreeMap.iterator(); return new Iterator<String>() { String childOrgId; @Override public boolean hasNext() { for (; orgIdsP2Iterator.hasNext();) { childOrgId = orgIdsP2Iterator.next()._1(); if (filter(childOrgId, filterIds)) return true; } return false; } @Override public String next() { return childOrgId; } }; } public Iterator<String> deepChildOrganizationIds(String orgId, LinkedList<String> filterIds) { TreeMap<String, String> orgIdsTreeMap = TreeMap.empty(Ord.stringOrd); TreeMap<String, String> newOrgIdsTreeMap = _deepChildOrganizationIds(orgId, orgIdsTreeMap); if (newOrgIdsTreeMap.isEmpty()) return new NullIterator(); Iterator<P2<String, String>> orgIdP2Iterator = newOrgIdsTreeMap.iterator(); return new Iterator<String>() { String childOrgId; @Override public String next() { return childOrgId; } @Override public boolean hasNext() { for (; orgIdP2Iterator.hasNext();) { childOrgId = orgIdP2Iterator.next()._1(); if (filter(childOrgId, filterIds)) return true; } return false; } }; } public TreeMap<String, String> _deepChildOrganizationIds(String orgId, TreeMap<String, String> orgIdsTreeMap) { TreeMap<String, String> childrenIdTreeMap = _childOrganizationIds(orgId, TreeMap.empty(Ord.stringOrd)); if (childrenIdTreeMap.isEmpty()) return orgIdsTreeMap; Iterator<P2<String, String>> childrenIdIterator = childrenIdTreeMap.iterator(); for (; childrenIdIterator.hasNext();) { String childrenId = childrenIdIterator.next()._1(); orgIdsTreeMap = orgIdsTreeMap.set(childrenId, childrenId); orgIdsTreeMap = _deepChildOrganizationIds(childrenId, 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, childrenOrgIdTreeMap); if (newChildrenOrgIdTreeMap.isEmpty()) return new NullIterator(); Iterator<P2<String, String>> childrenOrgIdIterator = newChildrenOrgIdTreeMap.iterator(); return new Iterator<String>() { String childOrgId; @Override public boolean hasNext() { if (childrenOrgIdIterator.hasNext()) { childOrgId = childrenOrgIdIterator.next()._1(); if (filter(childOrgId, filterIds)) return true; } return false; } @Override public String next() { return childOrgId; } }; } public TreeMap<String, String> _childOrganizationIds(String orgId, TreeMap<String, String> childOrgIdsTreeMap) { InterfaceTraverser orgTraverser = organizationTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> orgIdPairIterator = orgTraverser.find((TreeNode node) -> { Iterator<String> nodeElement = node.getAttributes().getString("element"); if (!nodeElement.hasNext()) return false; if (!nodeElement.next().equals("Organization")) return false; Iterator<String> nodeIdIterator = node.getAttributes().getString("Organization-id"); for (; nodeIdIterator.hasNext();) { if (nodeIdIterator.next().equals(orgId)) return true; } return false; }, "Organization-id", orgId); if (!orgIdPairIterator.hasNext()) return childOrgIdsTreeMap; Pair<TreeNode, NodePath> orgIdPair = orgIdPairIterator.next(); Iterator<Pair<TreeNode, NodePath>> chilrenOrgPairIterator = orgTraverser.findInSubTree((TreeNode node) -> { Iterator<String> nodeElement = node.getAttributes().getString("element"); if (!nodeElement.hasNext()) return false; if (nodeElement.next().equals("childOrganizations")) return true; return false; }, orgIdPair, "element", "childOrganizations"); if (!chilrenOrgPairIterator.hasNext()) return childOrgIdsTreeMap; Pair<TreeNode, NodePath> chilerenOrg = chilrenOrgPairIterator.next(); Iterator<Pair<TreeNode, NodePath>> chilrenOrgIdPairIterator = orgTraverser.findInSubTreeAllValue( (TreeNode node) -> { Iterator<String> nodeElement = node.getAttributes().getString("element"); if (!nodeElement.hasNext()) return false; if (!nodeElement.next().equals("organizationRefIds")) return false; Iterator<String> nodeText = node.getAttributes().getString("text-organizationRefIds"); if (nodeText.hasNext()) return true; return false; }, chilerenOrg, "text-organizationRefIds"); for (; chilrenOrgIdPairIterator.hasNext();) { Iterator<String> childrenOrgIdIterator = chilrenOrgIdPairIterator.next().left().getAttributes() .getString("text-organizationRefIds"); for (; childrenOrgIdIterator.hasNext();) { String childrenOrgId = childrenOrgIdIterator.next(); childOrgIdsTreeMap = childOrgIdsTreeMap.set(childrenOrgId, childrenOrgId); } } return childOrgIdsTreeMap; } 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>> personIdPairIterator = personTraverser.find((TreeNode node) -> { Iterator<String> element = node.getAttributes().getString("element"); if (!element.hasNext()) return false; if (!element.next().equals("Person")) return false; Iterator<String> nodePersonId = node.getAttributes().getString("Person-id"); for (; nodePersonId.hasNext();) { if (nodePersonId.next().equals(personId)) return true; } return false; }, "Person-id", personId); if (!personIdPairIterator.hasNext()) return ""; Pair<TreeNode, NodePath> targetPersonIdPair = personIdPairIterator.next(); Iterator<Pair<TreeNode, NodePath>> roleIdPairIterator = personTraverser.findInSubTree((TreeNode node) -> { Iterator<String> element = node.getAttributes().getString("element"); if (!element.hasNext()) return false; if (!element.next().equals("roleRefId")) return false; Iterator<String> compareRoleId = node.getAttributes().getString("text-roleRefId"); for (; compareRoleId.hasNext();) { if (compareRoleId.next().equals(roleId)) return true; } return false; }, targetPersonIdPair, "text-roleRefId", roleId); for (; roleIdPairIterator.hasNext();) { Pair<TreeNode, NodePath> roleIdPair = roleIdPairIterator.next(); NodePath roleIdNodePath = roleIdPair.right(); Pair<Integer, NodePath> removeLastPath = roleIdNodePath.last(); NodePath priorityNodePath = removeLastPath.right().add(removeLastPath.left() - 1); TreeNode priorityNode = getTarget(personTree.getRootNode(), priorityNodePath); Iterator<String> element = priorityNode.getAttributes().getString("element"); if (element.hasNext()) { if (element.next().equals("priority")) { Iterator<String> priority = priorityNode.getAttributes().getString("text-priority"); if (priority.hasNext()) return priority.next(); } } } return ""; } public Iterator<String> parentOrganizationIds(String orgId, LinkedList<String> filterIds) { TreeMap<String, String> parentIdsTreeMap = _parentOrganizationIds(orgId); if (parentIdsTreeMap.isEmpty()) return new NullIterator(); Iterator<P2<String, String>> parentIdP2Iterator = parentIdsTreeMap.iterator(); return new Iterator<String>() { String parentId; @Override public boolean hasNext() { for (; parentIdP2Iterator.hasNext();) { parentId = parentIdP2Iterator.next()._1(); if (filter(parentId, filterIds)) return true; } return false; } @Override public String next() { return parentId; } }; } public TreeMap<String, String> _parentOrganizationIds(String orgId) { InterfaceTraverser orgTraverser = organizationTree.getTraverser(); Iterator<Pair<TreeNode, NodePath>> orgIdPairIterator = orgTraverser.find((TreeNode node) -> { Iterator<String> element = node.getAttributes().getString("element"); if (!element.hasNext()) return false; if (!element.next().equals("Organization")) return false; Iterator<String> nodeIdIterator = node.getAttributes().getString("Organization-id"); for (; nodeIdIterator.hasNext();) { if (nodeIdIterator.next().equals(orgId)) return true; } return false; }, "Organization-id", orgId); if (!orgIdPairIterator.hasNext()) return TreeMap.empty(Ord.stringOrd); Pair<TreeNode, NodePath> orgNode = orgIdPairIterator.next(); Iterator<Pair<TreeNode, NodePath>> parentOrgPairIterator = orgTraverser.findInSubTree((TreeNode node) -> { Iterator<String> element = node.getAttributes().getString("element"); if (!element.hasNext()) return false; if (element.next().equals("parentOrganizations")) return true; return false; }, orgNode, "element", "parentOrganizations"); TreeMap<String, String> parentIdsTreeMap = TreeMap.empty(Ord.stringOrd); for (; parentOrgPairIterator.hasNext();) { Pair<TreeNode, NodePath> parentOrgNode = parentOrgPairIterator.next(); Iterator<Pair<TreeNode, NodePath>> parentOrgIdPairIterator = orgTraverser.findInSubTreeAllValue( (TreeNode node) -> { Iterator<String> element = node.getAttributes().getString("element"); if (!element.hasNext()) return false; if (!element.next().equals("organizationRefId")) return false; Iterator<String> parentIdIterator = node.getAttributes().getString("text-organizationRefId"); if (parentIdIterator.hasNext()) return true; return false; }, parentOrgNode, "text-organizationRefId"); for (; parentOrgIdPairIterator.hasNext();) { Iterator<String> parentIdIterator = parentOrgIdPairIterator.next().left().getAttributes() .getString("text-organizationRefId"); for (; parentIdIterator.hasNext();) { String parentId = parentIdIterator.next(); parentIdsTreeMap = parentIdsTreeMap.set(parentId, parentId); } } } return parentIdsTreeMap; } public Iterator<String> deepParentOrganizationIds(String orgId, LinkedList<String> filterIds) { TreeMap<String, String> parentIdsTreeMap = TreeMap.empty(Ord.stringOrd); TreeMap<String, String> newParentIdsTreeMap = _deepParentOrganizationIds(orgId, parentIdsTreeMap); if (newParentIdsTreeMap.isEmpty()) return new NullIterator(); Iterator<P2<String, String>> parentIds = newParentIdsTreeMap.iterator(); return new Iterator<String>() { String parentOrgId; @Override public boolean hasNext() { for (; parentIds.hasNext();) { parentOrgId = parentIds.next()._1(); if (filter(parentOrgId, filterIds)) return true; } return false; } @Override public String next() { return parentOrgId; } }; } public TreeMap<String, String> _deepParentOrganizationIds(String orgId, TreeMap<String, String> orgIds) { TreeMap<String, String> parentIdsTreeMap = _parentOrganizationIds(orgId); if (parentIdsTreeMap.isEmpty()) return orgIds; Iterator<P2<String, String>> parentIdsIterator = parentIdsTreeMap.iterator(); for (; parentIdsIterator.hasNext();) { String parentId = parentIdsIterator.next()._1(); orgIds = orgIds.set(parentId, parentId); orgIds = _deepParentOrganizationIds(parentId, orgIds); } return orgIds; } public Iterator<String> deepParentOrganizationIdsPlus(String id, LinkedList<String> filterIds) { TreeMap<String, String> parentIdsTreeMap = TreeMap.empty(Ord.stringOrd); parentIdsTreeMap = parentIdsTreeMap.set(id, id); parentIdsTreeMap = _deepParentOrganizationIds(id, parentIdsTreeMap); if (parentIdsTreeMap.isEmpty()) return new NullIterator(); Iterator<P2<String, String>> personIds = parentIdsTreeMap.iterator(); return new Iterator<String>() { String parentOrgId; @Override public boolean hasNext() { for (; personIds.hasNext();) { parentOrgId = personIds.next()._1(); if (filter(parentOrgId, filterIds)) return true; } return false; } @Override public String next() { return parentOrgId; } }; } 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>> PathNameIterator = traverser.find((TreeNode node) -> { Iterator<String> element = node.getAttributes().getString("element"); if (!element.hasNext()) return false; if (!element.next().equals("path")) return false; Iterator<String> pathStringIterator = node.getAttributes().getString("text-path"); for (; pathStringIterator.hasNext();) { if (pathStringIterator.next().equals(StrPath)) return true; } return false; }, "text-path", StrPath); if (!PathNameIterator.hasNext()) return ""; Pair<TreeNode, NodePath> pathNamePair = PathNameIterator.next(); NodePath pathNamePath = pathNamePair.right(); NodePath pathNameIdPath = pathNamePath.last().right(); TreeNode pathNameIdNode = getTarget(root, pathNameIdPath); Iterator<String> pathNameIdIterator = pathNameIdNode.getAttributes().getString(elementName + "-id"); if (pathNameIdIterator.hasNext()) return pathNameIdIterator.next(); return ""; } public Iterator<String> roleDescriptionElementIds(String id, LinkedList<String> filterIds) { Iterator<String> orgIdsIterator = deepParentOrganizationIdsPlus(id, filterIds); TreeMap<String, String> rdeIdsTreeMap = TreeMap.empty(Ord.stringOrd); for (; orgIdsIterator.hasNext();) { String orgId = orgIdsIterator.next(); Iterator<String> roleIdIteraotr = roleIds(orgId); for (; roleIdIteraotr.hasNext();) { String roleId = roleIdIteraotr.next(); Iterator<String> rdeIdIterator = getRde(roleId); for (; rdeIdIterator.hasNext();) { String rdeId = rdeIdIterator.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>> roleIdPairIterator = traverser.find((TreeNode node) -> { Iterator<String> element = node.getAttributes().getString("element"); if (!element.hasNext()) return false; if (!element.next().equals("Role")) return false; Iterator<String> idIterator = node.getAttributes().getString("Role-id"); for (; idIterator.hasNext();) { if (idIterator.next().equals(roleId)) return true; } return false; }, "Role-id", roleId); if (!roleIdPairIterator.hasNext()) return new NullIterator(); Pair<TreeNode, NodePath> roleIdPair = roleIdPairIterator.next(); Iterator<Pair<TreeNode, NodePath>> rdeIdPairIterator = traverser.findInSubTreeAllValue((TreeNode node) -> { Iterator<String> element = node.getAttributes().getString("element"); if (!element.hasNext()) return false; if (!element.next().equals("roleDescriptionElementRefIds")) return false; Iterator<String> rdeIterator = node.getAttributes().getString("text-roleDescriptionElementRefIds"); if (rdeIterator.hasNext()) return true; return false; }, roleIdPair, "text-roleDescriptionElementRefIds"); if (!rdeIdPairIterator.hasNext()) return new NullIterator(); Iterator<String> rdeIdIterator = rdeIdPairIterator.next().left().getAttributes().getString("text-roleDescriptionElementRefIds"); return new Iterator<String>() { String rdeId = ""; @Override public boolean hasNext() { if (rdeIdIterator.hasNext()) { rdeId = rdeIdIterator.next(); return true; } return false; } @Override public String next() { return rdeId; } }; } public TreeNode getTarget(TreeNode node, NodePath path) { TreeNode target; Pair<Integer, NodePath> popPath = path.pop(); int num = popPath.left(); NodePath newPath = popPath.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 (popPath.right().size() == 0) return child; target = getTarget(child, popPath.right()); return target; } }