boolean (Statement head, List<? super Statement> lst) { Statement post = null; Set<Statement> setDest = head.getNeighboursSet(EdgeType.REGULAR, EdgeDirection.FORWARD); if (setDest.contains(head)) { return false; } while (true) { lst.clear(); boolean repeat = false; setDest.remove(post); for (Statement stat : setDest) { if (stat.getLastBasicType() != StatementType.GENERAL) { if (post == null) { post = stat; repeat = true; break; } else { return false; } } // preds Set<Statement> setPred = stat.getNeighboursSet(EdgeType.REGULAR, EdgeDirection.BACKWARD); setPred.remove(head); if (setPred.contains(stat)) { return false; } if (!setDest.containsAll(setPred) || setPred.size() > 1) { if (post == null) { post = stat; repeat = true; break; } else { return false; } } else if (setPred.size() == 1) { Statement pred = setPred.iterator().next(); while (lst.contains(pred)) { Set<Statement> setPredTemp = pred.getNeighboursSet(EdgeType.REGULAR, EdgeDirection.BACKWARD); setPredTemp.remove(head); if (!setPredTemp.isEmpty()) { // at most 1 predecessor pred = setPredTemp.iterator().next(); if (pred == stat) { return false; // loop found } } else { break; } } } // succs List<StatEdge> lstEdges = stat.getSuccessorEdges(EdgeType.DIRECT_ALL); if (lstEdges.size() > 1) { Set<Statement> setSucc = stat.getNeighboursSet(EdgeType.DIRECT_ALL, EdgeDirection.FORWARD); setSucc.retainAll(setDest); if (setSucc.size() > 0) { return false; } else { if (post == null) { post = stat; repeat = true; break; } else { return false; } } } else if (lstEdges.size() == 1) { StatEdge edge = lstEdges.get(0); if (edge.getType() == EdgeType.REGULAR) { Statement statd = edge.getDestination(); if (head == statd) { return false; } if (post != statd && !setDest.contains(statd)) { if (post != null) { return false; } else { Set<Statement> set = statd.getNeighboursSet(EdgeType.REGULAR, EdgeDirection.BACKWARD); if (set.size() > 1) { post = statd; repeat = true; break; } else { return false; } } } } } lst.add(stat); } if (!repeat) { break; } } lst.add(head); lst.remove(post); lst.add(0, post); return true; }