Mercurial > hg > Members > tatsuki > JungleXMLReader
view src/main/java/jp/ac/u_ryukyu/cr/ie/tatsuki/bbs/JuGrix.java @ 45:8e531233d376 default tip
commit
author | one |
---|---|
date | Wed, 26 Nov 2014 06:23:40 +0900 |
parents | 5e8eac03fed3 |
children |
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.Stack; 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.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; public class JuGrix { JungleTree personTree; JungleTree organizationTree; JungleTree roleTree; JungleTree rdeTree; boolean useIndex; public JuGrix(boolean useIndex) { try { this.useIndex = useIndex; LoadXml reader = new LoadXml(); 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 JuGrix(boolean useIndex, JungleTree personTree, JungleTree organizationTree, JungleTree roleTree) { try { this.useIndex = useIndex; LoadXml reader = new LoadXml(); this.personTree = personTree; this.organizationTree = organizationTree; this.roleTree = roleTree; rdeTree = reader.loadTestData("RoleDescriptionElement.xml"); } catch (Exception e) { e.printStackTrace(); } } public boolean isActive(String id) { InterfaceTraverser personTraverser = personTree.getTraverser(useIndex); Iterator<TreeNode> personIdpairIterator = personTraverser.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 (personIdpairIterator.hasNext()) return true; return false; } public Iterator<String> personIds(String orgId, LinkedList<String> filterIds) { InterfaceTraverser orgTraverser = organizationTree.getTraverser(useIndex); Iterator<TreeNode> orgIdNodeIterator = orgTraverser.find((TreeNode node) -> { String nodeElement = node.getAttributes().getString("element"); if (nodeElement == null) return false; if (!nodeElement.equals("Organization")) return false; String targetOrgId = node.getAttributes().getString("Organization-id"); if (targetOrgId == null) return false; if (targetOrgId.equals(orgId)) return true; return false; }, "Organization-id", orgId); if (!orgIdNodeIterator.hasNext()) return new NullIterator<String>(); TreeNode orgIdNode = orgIdNodeIterator.next(); TreeNode orgRoleIdNodes = orgIdNode.getChildren().at(2).b(); TreeNode orgRoleIdNode = orgRoleIdNodes.getChildren().at(0).b(); String orgRoleId = orgRoleIdNode.getAttributes().getString("text-roleRefId"); if (!filter(filterIds, orgRoleId)) return new NullIterator<String>(); InterfaceTraverser traverser = personTree.getTraverser(useIndex); return new Iterator<String>() { Iterator<TreeNode> orgIdNodeIterator = traverser.find((TreeNode node) -> { String nodeElement = node.getAttributes().getString("element"); if (nodeElement == null) return false; if (!nodeElement.equals("organizationRefId")) return false; String targetOrgId = node.getAttributes().getString("text-organizationRefId"); if (targetOrgId == null) return false; if (targetOrgId.equals(orgId)) return true; return false; }, "text-organizationRefId", orgId); String targetPersonId; @Override public boolean hasNext() { for (; orgIdNodeIterator.hasNext();) { TreeNode orgIdNode = orgIdNodeIterator.next(); ParentIndex parentIndex = traverser.getParentIndex(); TreeNode OrganizationMappedByRoleNode = parentIndex.get(orgIdNode); TreeNode parentOrganizations = parentIndex.get(OrganizationMappedByRoleNode); TreeNode targetPersonIdNode = parentIndex.get(parentOrganizations); targetPersonId = targetPersonIdNode.getAttributes().getString("Person-id"); return true; } return false; } @Override public String next() { return targetPersonId; } }; } public Iterator<String> roleIds(String id, LinkedList<String> filterIds) { Pattern personPattern = Pattern.compile("p:"); Matcher personMacher = personPattern.matcher(id); if (personMacher.find()) { return searchPersonRoleIds(personTree, id, "Person", filterIds); } Pattern organizationPattern = Pattern.compile("o:"); Matcher organizationMacher = organizationPattern.matcher(id); if (organizationMacher.find()) { return searchOrgRoleIds(organizationTree, id, "Organization", filterIds); } return new NullIterator<String>(); } public Iterator<String> searchPersonRoleIds(JungleTree tree, String id, String element, LinkedList<String> filterIds) { InterfaceTraverser traverser = tree.getTraverser(useIndex); return new Iterator<String>() { String roleRefId = ""; Iterator<TreeNode> idNodeIterator = traverser.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); Iterator<TreeNode> OrganizationMappedByRoleIterator = getParentOrgs(); @Override public boolean hasNext() { if (OrganizationMappedByRoleIterator == null) return false; if (OrganizationMappedByRoleIterator.hasNext()) roleRefId = search(); else roleRefId = null; if (roleRefId != null) return true; OrganizationMappedByRoleIterator = getParentOrgs(); if (OrganizationMappedByRoleIterator != null) roleRefId = search(); if (roleRefId != null) return true; return this.hasNext(); } private String search() { for (; OrganizationMappedByRoleIterator.hasNext();) { TreeNode OrganizationMappedByRole = OrganizationMappedByRoleIterator.next(); TreeNode organizationRefIdNode = OrganizationMappedByRole.getChildren().at(0).b(); String organizationRefId = organizationRefIdNode.getAttributes().getString("text-organizationRefId"); if (!filterIds.contains(organizationRefId)) continue; TreeNode roleRefIdNode = OrganizationMappedByRole.getChildren().at(1).b(); return roleRefIdNode.getAttributes().getString("text-roleRefId"); } OrganizationMappedByRoleIterator = getParentOrgs(); return null; } private Iterator<TreeNode> getParentOrgs() { for (; idNodeIterator.hasNext();) { TreeNode targetPersonNode = idNodeIterator.next(); TreeNode parentOrganizations = targetPersonNode.getChildren().at(5).b(); return parentOrganizations.getChildren().iterator(); } return null; } @Override public String next() { return roleRefId; } }; } public Iterator<String> searchOrgRoleIds(JungleTree tree, String id, String element, LinkedList<String> filterIds) { InterfaceTraverser traverser = tree.getTraverser(useIndex); return new Iterator<String>() { String roleRefId = ""; Iterator<TreeNode> idNodeIterator = traverser.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); Iterator<TreeNode> OrganizationMappedByRoleIterator = getParentOrgs(); @Override public boolean hasNext() { if (OrganizationMappedByRoleIterator == null) return false; if (OrganizationMappedByRoleIterator.hasNext()) roleRefId = search(); else roleRefId = null; if (roleRefId != null) return true; OrganizationMappedByRoleIterator = getParentOrgs(); if (OrganizationMappedByRoleIterator != null) roleRefId = search(); if (roleRefId != null) return true; return false; } private String search() { for (; OrganizationMappedByRoleIterator.hasNext();) { TreeNode OrganizationMappedByRole = OrganizationMappedByRoleIterator.next(); TreeNode organizationRefIdNode = OrganizationMappedByRole.getChildren().at(0).b(); String organizationRefId = organizationRefIdNode.getAttributes().getString("text-organizationRefId"); if (!filterIds.contains(organizationRefId)) continue; TreeNode roleRefIdNode = OrganizationMappedByRole.getChildren().at(1).b(); return roleRefIdNode.getAttributes().getString("text-roleRefId"); } OrganizationMappedByRoleIterator = getParentOrgs(); return null; } private Iterator<TreeNode> getParentOrgs() { for (; idNodeIterator.hasNext();) { TreeNode targetPersonNode = idNodeIterator.next(); TreeNode parentOrganizations = targetPersonNode.getChildren().at(4).b(); return parentOrganizations.getChildren().iterator(); } return null; } @Override public String next() { return roleRefId; } }; } public Iterator<String> competentRoleId(String personId) { InterfaceTraverser personTraverser = personTree.getTraverser(useIndex); return new Iterator<String>() { String roleId = ""; Iterator<TreeNode> personNodeIterator = personTraverser.find((TreeNode node) -> { String nodeElement = node.getAttributes().getString("element"); if (nodeElement == null) return false; if (!nodeElement.equals("Person")) return false; String targetPersonId = node.getAttributes().getString("Person-id"); if (targetPersonId == null) return false; if (targetPersonId.equals(personId)) return true; return false; }, "PersonId", personId); Iterator<TreeNode> PriorityMappedByRoleIterator = new NullIterator<TreeNode>(); @Override public boolean hasNext() { for (; PriorityMappedByRoleIterator.hasNext();) { if (search()) return true; } for (; personNodeIterator.hasNext();) { TreeNode personNode = personNodeIterator.next(); TreeNode prioritiesNode = personNode.getChildren().at(6).b(); PriorityMappedByRoleIterator = prioritiesNode.getChildren().iterator(); for (; PriorityMappedByRoleIterator.hasNext();) { if (search()) return true; } } return false; } private boolean search() { TreeNode priorityMappedByRole = PriorityMappedByRoleIterator.next(); TreeNode priorityNode = priorityMappedByRole.getChildren().at(0).b(); String priority = priorityNode.getAttributes().getString("text-priority"); if (priority.equals("0")) { TreeNode roleIdNode = priorityMappedByRole.getChildren().at(1).b(); roleId = roleIdNode.getAttributes().getString("text-roleRefId"); return true; } return false; } @Override public String next() { return roleId; } }; } public Iterator<String> concurrentRoleIds(String personId) { InterfaceTraverser personTraverser = personTree.getTraverser(useIndex); return new Iterator<String>() { String roleId = ""; Iterator<TreeNode> personNodeIterator = personTraverser.find((TreeNode node) -> { String nodeElement = node.getAttributes().getString("element"); if (nodeElement == null) return false; if (!nodeElement.equals("Person")) return false; String targetPersonId = node.getAttributes().getString("Person-id"); if (targetPersonId == null) return false; if (targetPersonId.equals(personId)) return true; return false; }, "PersonId", personId); Iterator<TreeNode> PriorityMappedByRoleIterator = new NullIterator<TreeNode>(); @Override public boolean hasNext() { for (; PriorityMappedByRoleIterator.hasNext();) { if (search()) return true; } for (; personNodeIterator.hasNext();) { TreeNode personNode = personNodeIterator.next(); TreeNode prioritiesNode = personNode.getChildren().at(6).b(); PriorityMappedByRoleIterator = prioritiesNode.getChildren().iterator(); for (; PriorityMappedByRoleIterator.hasNext();) { if (search()) return true; } } return false; } private boolean search() { TreeNode priorityMappedByRole = PriorityMappedByRoleIterator.next(); TreeNode priorityNode = priorityMappedByRole.getChildren().at(0).b(); int priority = Integer.parseInt(priorityNode.getAttributes().getString("text-priority")); if (priority > 0) { TreeNode roleIdNode = priorityMappedByRole.getChildren().at(1).b(); roleId = roleIdNode.getAttributes().getString("text-roleRefId"); return true; } return false; } @Override public String next() { return roleId; } }; } public Iterator<String> deepPersonIds(String orgId, LinkedList<String> filterIds) { return new Iterator<String>() { Iterator<String> orgIdIterator = deepParentOrganizationIdsPlus(orgId, filterIds); private Iterator<String> personIterator = new NullIterator<String>(); String personId = ""; @Override public boolean hasNext() { for (; orgIdIterator.hasNext();) { if (personIterator.hasNext()) { personId = personIterator.next(); return true; } String targetOrgId = orgIdIterator.next(); personIterator = personIds(targetOrgId, new LinkedList<>()); if (personIterator.hasNext()) { personId = personIterator.next(); return true; } } return false; } @Override public String next() { // TODO Auto-generated method stub return personId; } }; } public Iterator<String> deepChildOrganizationIdsPlus(String orgId, LinkedList<String> filterIds) { return new Iterator<String>() { Iterator<String> childOrgIdIterator = deepChildOrganizationIds(orgId, filterIds); String childOrgId = initOrgId(); @Override public boolean hasNext() { return childOrgId != null; } private String initOrgId() { if (filter(filterIds, orgId)) return orgId; if (childOrgIdIterator.hasNext()) return childOrgIdIterator.next(); return null; } @Override public String next() { String str = childOrgId; if (childOrgIdIterator.hasNext()) childOrgId = childOrgIdIterator.next(); else childOrgId = null; return str; } }; } public Iterator<String> deepChildOrganizationIds(String orgId, LinkedList<String> filterIds) { return new Iterator<String>() { Iterator<TreeNode> childOrgnizationIdsIterator = childOrganizationIdsNode(orgId); Stack<String> orgIdStack = new Stack<String>(); String childOrgId; @Override public boolean hasNext() { for (; childOrgnizationIdsIterator.hasNext();) { TreeNode parentOrgIdNode = childOrgnizationIdsIterator.next(); childOrgId = parentOrgIdNode.getAttributes().getString("text-organizationRefId"); orgIdStack.push(childOrgId); if (orgNodefilter(filterIds, parentOrgIdNode)) return true; } if (orgIdStack.isEmpty()) return false; childOrgnizationIdsIterator = childOrganizationIdsNode(orgIdStack.pop()); return this.hasNext(); } @Override public String next() { return childOrgId; } }; } 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) { return new Iterator<String>() { Iterator<TreeNode> orgNodeIterator = childOrganizationIdsNode(orgId); String organizationRefId; @Override public boolean hasNext() { for (; orgNodeIterator.hasNext();) { TreeNode organizationRefIdNode = orgNodeIterator.next(); organizationRefId = organizationRefIdNode.getAttributes().getString("text-organizationRefId"); return true; } return false; } @Override public String next() { return organizationRefId; } }; } public Iterator<TreeNode> childOrganizationIdsNode(String orgId) { InterfaceTraverser orgTraverser = organizationTree.getTraverser(useIndex); return new Iterator<TreeNode>() { TreeNode childOrgNode; Iterator<TreeNode> orgIdNodeIterator = 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); Iterator<TreeNode> childOrganizations = getParentOrgs(); @Override public boolean hasNext() { if (childOrganizations == null) return false; if (childOrganizations.hasNext()) childOrgNode = search(); else childOrgNode = null; if (childOrgNode != null) return true; childOrganizations = getParentOrgs(); if (childOrganizations != null) childOrgNode = search(); if (childOrgNode != null) return true; return this.hasNext(); } @Override public TreeNode next() { return childOrgNode; } private TreeNode search() { for (; childOrganizations.hasNext();) { TreeNode OrganizationMappedByRole = childOrganizations.next(); TreeNode organizationRefIdsNode = OrganizationMappedByRole.getChildren().at(0).b(); TreeNode organizationRefIdNode = organizationRefIdsNode.getChildren().at(0).b(); return organizationRefIdNode; } childOrganizations = getParentOrgs(); return null; } private Iterator<TreeNode> getParentOrgs() { for (; orgIdNodeIterator.hasNext();) { TreeNode targetPersonNode = orgIdNodeIterator.next(); TreeNode parentOrganizations = targetPersonNode.getChildren().at(3).b(); return parentOrganizations.getChildren().iterator(); } return null; } }; } private boolean orgNodefilter(LinkedList<String> filterIds, TreeNode orgNode) { String orgId = orgNode.getAttributes().getString("text-organizationRefId"); return filter(filterIds, orgId); } private boolean filter(LinkedList<String> filterIds, String id) { Pattern orgPattern = Pattern.compile("o:"); Matcher orgMacher = orgPattern.matcher(id); if (orgMacher.find()) { id = getRole(id); } for (String filterId : filterIds) { Pattern rolePattern = Pattern.compile("r:"); Matcher roleMacher = rolePattern.matcher(filterId); if (roleMacher.find()) { if (!filterId.equals(id)) { return false; } } else { Pattern rdePattern = Pattern.compile("rde:"); Matcher rdeMacher = rdePattern.matcher(filterId); if (rdeMacher.find()) { if (!getRde(id, filterId)) return false; } } } return true; } private String getRole(String orgId) { InterfaceTraverser orgTraverser = organizationTree.getTraverser(useIndex); Iterator<TreeNode> orgNodeIterator = 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"); if (nodeId == null) return false; if (nodeId.equals(orgId)) return true; return false; }, "Organization-id", orgId); if (!orgNodeIterator.hasNext()) return ""; TreeNode orgNode = orgNodeIterator.next(); TreeNode roleRefIds = orgNode.getChildren().at(2).b(); TreeNode roleRefId = roleRefIds.getChildren().at(0).b(); String roleId = roleRefId.getAttributes().getString("text-roleRefId"); return roleId; } private boolean getRde(String roleId, String filterId) { InterfaceTraverser roleTraverser = roleTree.getTraverser(useIndex); Iterator<TreeNode> rdeIdNodeIterator = roleTraverser.find((TreeNode node) -> { String nodeElement = node.getAttributes().getString("element"); if (nodeElement == null) return false; if (!nodeElement.equals("Role")) return false; String nodeId = node.getAttributes().getString("Role-id"); if (nodeId == null) return false; if (nodeId.equals(roleId)) return true; return false; }, "Role-id", roleId); for (; rdeIdNodeIterator.hasNext();) { TreeNode rdeIdNode = rdeIdNodeIterator.next(); TreeNode roleDescriptionElementRefIds = rdeIdNode.getChildren().at(6).b(); Iterator<TreeNode> roleDescriptionElementRefIdIterator = roleDescriptionElementRefIds.getChildren().iterator(); for (; roleDescriptionElementRefIdIterator.hasNext();) { String roleDescriptionElementRefId = roleDescriptionElementRefIdIterator.next().getAttributes() .getString("text-roleDescriptionElementRefId"); if (roleDescriptionElementRefId.equals(filterId)) return true; } } return false; } public TreeMap<String, String> _childOrganizationIds(String orgId, TreeMap<String, String> childOrgIdsTreeMap) { InterfaceTraverser orgTraverser = organizationTree.getTraverser(useIndex); Iterator<TreeNode> orgIdNodeIterator = 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 (!orgIdNodeIterator.hasNext()) return childOrgIdsTreeMap; TreeNode orgIdNode = orgIdNodeIterator.next(); Iterator<TreeNode> chilrenOrgNodeIterator = orgTraverser.findInSubTree((TreeNode node) -> { String nodeElement = node.getAttributes().getString("element"); if (nodeElement == null) return false; if (nodeElement.equals("childOrganizations")) return true; return false; }, orgIdNode, "element", "childOrganizations"); if (!chilrenOrgNodeIterator.hasNext()) return childOrgIdsTreeMap; TreeNode chilerenOrg = chilrenOrgNodeIterator.next(); Iterator<TreeNode> chilrenOrgIdNodeIterator = 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; }, chilerenOrg, "text-organizationRefIds"); for (; chilrenOrgIdNodeIterator.hasNext();) { String childrenOrgId = chilrenOrgIdNodeIterator.next().getAttributes().getString("text-organizationRefIds"); childOrgIdsTreeMap = childOrgIdsTreeMap.set(childrenOrgId, childrenOrgId); } return childOrgIdsTreeMap; } class NullIterator<T> implements Iterator<T> { @Override public boolean hasNext() { return false; } @Override public T next() { return null; } } public String rolePriority(String personId, String roleId) { InterfaceTraverser personTraverser = personTree.getTraverser(useIndex); Iterator<TreeNode> roleIdNodeIterator = personTraverser.find((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; }, "text-roleRefId", roleId); for (; roleIdNodeIterator.hasNext();) { TreeNode roleIdNode = roleIdNodeIterator.next(); ParentIndex parentIndex = personTraverser.getParentIndex(); TreeNode roleIdParentNode = parentIndex.get(roleIdNode); TreeNode parent = parentIndex.get(roleIdParentNode); parent = parentIndex.get(parent); String nodePersonId = parent.getAttributes().getString("Person-Id"); if (nodePersonId != null && !nodePersonId.equals(personId)) continue; TreeNode priorityNode = roleIdParentNode.getChildren().at(0).b(); if (priorityNode.getAttributes().getString("element").equals("priority")) return priorityNode.getAttributes().getString("text-priority"); } return ""; } public Iterator<String> parentOrganizationIds(String id, LinkedList<String> filterIds) { return new Iterator<String>() { Iterator<TreeNode> orgNodeIterator = parentOrganizationIdsNode(id); String organizationRefId; @Override public boolean hasNext() { for (; orgNodeIterator.hasNext();) { TreeNode organizationRefIdNode = orgNodeIterator.next(); String orgId = organizationRefIdNode.getAttributes().getString("text-organizationRefId"); if (!filter(filterIds, orgId)) continue; organizationRefId = orgId; return true; } return false; } @Override public String next() { return organizationRefId; } }; } public Iterator<TreeNode> parentOrganizationIdsNode(String id) { return new Iterator<TreeNode>() { InterfaceTraverser traverser = getTraverser(id); String element; int pos; Iterator<TreeNode> idNodeIterator = traverser.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); TreeNode orgId; Iterator<TreeNode> parentOrganizationsIterator = getparentOrganizations(); private Iterator<TreeNode> getparentOrganizations() { for (; idNodeIterator.hasNext();) { TreeNode targetPersonNode = idNodeIterator.next(); TreeNode parentOrganizations = targetPersonNode.getChildren().at(pos).b(); return parentOrganizations.getChildren().iterator(); } return null; } @Override public boolean hasNext() { if (parentOrganizationsIterator == null) return false; if (parentOrganizationsIterator.hasNext()) orgId = search(); else orgId = null; if (orgId != null) return true; for (; parentOrganizationsIterator != null;) { parentOrganizationsIterator = getparentOrganizations(); if (parentOrganizationsIterator != null) orgId = search(); if (orgId != null) return true; } return false; } @Override public TreeNode next() { return orgId; } private TreeNode search() { for (; parentOrganizationsIterator.hasNext();) { TreeNode OrganizationMappedByRole = parentOrganizationsIterator.next(); TreeNode organizationRefIdNode = OrganizationMappedByRole.getChildren().at(0).b(); return organizationRefIdNode; } parentOrganizationsIterator = getparentOrganizations(); return null; } private InterfaceTraverser getTraverser(String id) { Pattern rolePattern = Pattern.compile("p:"); Matcher roleMacher = rolePattern.matcher(id); if (roleMacher.find()) { element = "Person"; pos = 5; return personTree.getTraverser(useIndex); } Pattern rdePattern = Pattern.compile("o:"); Matcher rdeMacher = rdePattern.matcher(id); if (rdeMacher.find()) { element = "Organization"; pos = 4; return organizationTree.getTraverser(useIndex); } return null; } }; } public Iterator<String> deepParentOrganizationIds(String orgId, LinkedList<String> filterIds) { return new Iterator<String>() { Iterator<TreeNode> parentOrgnizationIdsIterator = parentOrganizationIdsNode(orgId); Stack<String> orgIdStack = new Stack<String>(); String parentOrgId; @Override public boolean hasNext() { for (; parentOrgnizationIdsIterator.hasNext();) { TreeNode parentOrgIdNode = parentOrgnizationIdsIterator.next(); parentOrgId = parentOrgIdNode.getAttributes().getString("text-organizationRefId"); orgIdStack.push(parentOrgId); if (orgNodefilter(filterIds, parentOrgIdNode)) return true; } if (orgIdStack.isEmpty()) return false; parentOrgnizationIdsIterator = parentOrganizationIdsNode(orgIdStack.pop()); return this.hasNext(); } @Override public String next() { return parentOrgId; } }; } public Iterator<String> deepParentOrganizationIdsPlus(String id, LinkedList<String> filterIds) { return new Iterator<String>() { Iterator<String> parentOrgIdIterator = deepParentOrganizationIds(id, filterIds); String parentOrgId = initOrgId(); @Override public boolean hasNext() { return parentOrgId != null; } private String initOrgId() { if (filter(filterIds, id)) return id; if (parentOrgIdIterator.hasNext()) return parentOrgIdIterator.next(); return null; } @Override public String next() { String str = parentOrgId; parentOrgId = null; if (parentOrgIdIterator.hasNext()) parentOrgId = parentOrgIdIterator.next(); return str; } }; } 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; String elementName = null; if (splitPath[0].equals("r")) { traverser = roleTree.getTraverser(useIndex); elementName = "Role"; } if (splitPath[0].equals("rde")) { traverser = rdeTree.getTraverser(useIndex); elementName = "RoleDescriptionElement"; } Iterator<TreeNode> PathNameIterator = 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 (!PathNameIterator.hasNext()) return ""; TreeNode pathNameNode = PathNameIterator.next(); ParentIndex parentIndex = traverser.getParentIndex(); TreeNode pathNameIdNode = parentIndex.get(pathNameNode); String pathNameId = pathNameIdNode.getAttributes().getString(elementName + "-id"); return pathNameId; } public Iterator<String> roleDescriptionElementIds(String id, LinkedList<String> filterIds) { return new Iterator<String>() { Iterator<String> parentOrgIdIterator = deepParentOrganizationIdsPlus(id, filterIds); Iterator<String> rdeIdIterator = new NullIterator<String>(); @Override public boolean hasNext() { if (rdeIdIterator.hasNext()) return true; if (parentOrgIdIterator.hasNext()) { String orgId = parentOrgIdIterator.next(); String roleId = getRole(orgId); rdeIdIterator = getRde(roleId); } else { return false; } return this.hasNext(); } @Override public String next() { return rdeIdIterator.next(); } }; } private Iterator<String> getRde(String roleId) { InterfaceTraverser traverser = roleTree.getTraverser(useIndex); return new Iterator<String>() { Iterator<TreeNode> roleIdNodeIterator = 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); String rdeId; Iterator<TreeNode> roleDescriptionElementRefIdIterator = new NullIterator<TreeNode>(); @Override public boolean hasNext() { for (; roleIdNodeIterator.hasNext();) { if (roleDescriptionElementRefIdIterator.hasNext()) { rdeId = roleDescriptionElementRefIdIterator.next().getAttributes() .getString("text-roleDescriptionElementRefId"); return true; } TreeNode roleId = roleIdNodeIterator.next(); TreeNode roleDescriptionElementRefIds = roleId.getChildren().at(6).b(); roleDescriptionElementRefIdIterator = roleDescriptionElementRefIds.getChildren().iterator(); if (roleDescriptionElementRefIdIterator.hasNext()) { rdeId = roleDescriptionElementRefIdIterator.next().getAttributes() .getString("text-roleDescriptionElementRefId"); return true; } } return false; } @Override public String next() { return rdeId; } }; } }