List of usage examples for java.util LinkedHashSet add
boolean add(E e);
From source file:de._13ducks.cor.game.server.movement.SectorPathfinder.java
public static synchronized List<Node> findPath(SimplePosition start, SimplePosition target, FreePolygon startSector, MovementMap moveMap) { if (start == null || target == null) { System.out.println("FixMe: SPathfinder, irregular call: " + start + "-->" + target); return null; }//from www . j a va2 s .c o m FreePolygon targetSector = moveMap.containingPoly(target.x(), target.y()); if (targetSector == null) { // Ziel ungltig abbrechen System.out.println("Irregular target. Aborting"); return null; } FakeNode startNode = new FakeNode(start.x(), start.y(), startSector); Node targetNode = new FakeNode(target.x(), target.y(), targetSector); targetNode.addPolygon(targetSector); // Der Startknoten muss die Member seines Polys kennen startNode.setReachableNodes(computeDirectReachable(startNode, startSector)); // Der Zielknoten muss den Membern seines Polys bekannt sein // Die Movement-Map darf aber nicht verndert werden. Des halb mssen einige Aufrufe intern abgefangen werden und das reingedoktert werden. List<Node> preTargetNodes = Arrays.asList(computeDirectReachable(targetNode, targetSector)); PriorityBuffer open = new PriorityBuffer(); // Liste fr entdeckte Knoten LinkedHashSet<Node> containopen = new LinkedHashSet<Node>(); // Auch fr entdeckte Knoten, hiermit kann viel schneller festgestellt werden, ob ein bestimmter Knoten schon enthalten ist. LinkedHashSet<Node> closed = new LinkedHashSet<Node>(); // Liste fr fertig bearbeitete Knoten double cost_t = 0; //Movement Kosten (gerade 5, diagonal 7, wird spter festgelegt) startNode.setCost(0); //Kosten fr das Startfeld (von dem aus berechnet wird) sind natrlich 0 open.add(startNode); //Startfeld in die openlist containopen.add(startNode); targetNode.setParent(null); //"Vorgngerfeld" vom Zielfeld noch nicht bekannt for (int j = 0; j < 40000; j++) { //Anzahl der maximalen Durchlufe, bis Wegfindung aufgibt if (open.isEmpty()) { //Abbruch, wenn openlist leer ist => es gibt keinen Weg return null; } // Sortieren nicht mehr ntig, PriorityBuffer bewahrt die Felder in der Reihenfolge ihrer Priority - also dem F-Wert auf Node current = (Node) open.remove(); //der Eintrag aus der openlist mit dem niedrigesten F-Wert rausholen und gleich lschen containopen.remove(current); if (current.equals(targetNode)) { //Abbruch, weil Weg von Start nach Ziel gefunden wurde targetNode.setParent(current.getParent()); //"Vorgngerfeld" von Ziel bekannt break; } // Aus der open wurde current bereits gelscht, jetzt in die closed verschieben closed.add(current); List<Node> neighbors = computeNeighbors(current, targetNode, preTargetNodes); for (Node node : neighbors) { if (closed.contains(node)) { continue; } // Kosten dort hin berechnen cost_t = current.movementCostTo(node); if (containopen.contains(node)) { //Wenn sich der Knoten in der openlist befindet, muss berechnet werden, ob es einen krzeren Weg gibt if (current.getCost() + cost_t < node.getCost()) { //krzerer Weg gefunden? node.setCost(current.getCost() + cost_t); //-> Wegkosten neu berechnen node.setValF(node.getCost() + node.getHeuristic()); //F-Wert, besteht aus Wegkosten vom Start + Luftlinie zum Ziel node.setParent(current); //aktuelles Feld wird zum Vorgngerfeld } } else { node.setCost(current.getCost() + cost_t); node.setHeuristic(Math.sqrt(Math.pow(Math.abs((targetNode.getX() - node.getX())), 2) + Math.pow(Math.abs((targetNode.getY() - node.getY())), 2))); // geschtzte Distanz zum Ziel //Die Zahl am Ende der Berechnung ist der Aufwand der Wegsuche //5 ist schnell, 4 normal, 3 dauert lange node.setParent(current); // Parent ist die RogPosition, von dem der aktuelle entdeckt wurde node.setValF(node.getCost() + node.getHeuristic()); //F-Wert, besteht aus Wegkosten vom Start aus + Luftlinie zum Ziel open.add(node); // in openlist hinzufgen containopen.add(node); } } } if (targetNode.getParent() == null) { //kein Weg gefunden return null; } ArrayList<Node> pathrev = new ArrayList<Node>(); //Pfad aus parents erstellen, von Ziel nach Start while (!targetNode.equals(startNode)) { pathrev.add(targetNode); targetNode = targetNode.getParent(); } pathrev.add(startNode); ArrayList<Node> path = new ArrayList<Node>(); //Pfad umkehren, sodass er von Start nach Ziel ist for (int k = pathrev.size() - 1; k >= 0; k--) { path.add(pathrev.get(k)); } // Der folgende Algorithmus braucht Polygon-Infos, diese also hier einfgen startNode.addPolygon(startSector); targetNode.addPolygon(targetSector); /** * An dieser Stelle muss der Weg nocheinmal berarbeitet werden. * Es kann nmlich durch neue Tweaks sein, dass dies die Knoten nicht direkt * verbunden sind (also keinen gemeinsamen Polygon haben) * Das tritt z.B. bei der Start- und Zieleinsprungpunkt-Variierung auf. */ for (int i = 0; i < path.size() - 1; i++) { Node n1 = path.get(i); Node n2 = path.get(i + 1); FreePolygon commonSector = commonSector(n1, n2); if (commonSector == null) { // Das hier ist der interessante Fall, die beiden Knoten sind nicht direkt verbunden, es muss ein Zwischenknoten eingefgt werden: // Dessen Punkt suchen Edge direct = new Edge(n1, n2); Node newNode = null; // Die Polygone von n1 durchprobieren for (FreePolygon currentPoly : n1.getPolygons()) { List<Edge> edges = currentPoly.calcEdges(); for (Edge testedge : edges) { // Gibts da einen Schnitt? SimplePosition intersection = direct.intersectionWithEndsNotAllowed(testedge); if (intersection != null) { // Kandidat fr den nchsten Polygon FreePolygon nextPoly = null; // Kante gefunden // Von dieser Kante die Enden suchen nextPoly = getOtherPoly(testedge.getStart(), testedge.getEnd(), currentPoly); newNode = intersection.toNode(); newNode.addPolygon(currentPoly); newNode.addPolygon(nextPoly); break; } } if (newNode != null) { break; } } if (newNode == null) { // Das drfte nicht passieren, der Weg ist legal gefunden worden, muss also eigentlich existieren System.out.println("[Pathfinder][ERROR]: Cannot insert Nodes into route, aborting!"); return null; } else { path.add(i + 1, newNode); } } } return path; //Pfad zurckgeben }
From source file:org.apache.ambari.server.checks.InstallPackagesCheck.java
@Override public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException { final String clusterName = request.getClusterName(); final Cluster cluster = clustersProvider.get().getCluster(clusterName); final StackId targetStackId = request.getTargetStackId(); final String stackName = targetStackId.getStackName(); final String repoVersion = request.getRepositoryVersion(); final RepositoryVersionEntity rve = repositoryVersionDaoProvider.get().findByStackNameAndVersion(stackName, request.getRepositoryVersion()); if (StringUtils.isBlank(rve.getVersion()) || !rve.getVersion().matches("^\\d+(\\.\\d+)*\\-\\d+$")) { String message = MessageFormat.format( "The Repository Version {0} for Stack {1} must contain a \"-\" followed by a build number. " + "Make sure that another registered repository does not have the same repo URL or " + "shares the same build number. Next, try reinstalling the Repository Version.", rve.getVersion(), rve.getStackVersion()); prerequisiteCheck.getFailedOn().add("Repository Version " + rve.getVersion()); prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL); prerequisiteCheck.setFailReason(message); return;/* w ww . j ava 2s .c om*/ } final ClusterVersionEntity clusterVersion = clusterVersionDAOProvider.get() .findByClusterAndStackAndVersion(clusterName, targetStackId, repoVersion); final Set<String> failedHosts = new HashSet<String>(); for (Host host : cluster.getHosts()) { if (host.getMaintenanceState(cluster.getClusterId()) != MaintenanceState.ON) { for (HostVersionEntity hve : hostVersionDaoProvider.get().findByHost(host.getHostName())) { if (hve.getRepositoryVersion().getVersion().equals(request.getRepositoryVersion()) && hve.getState() == RepositoryVersionState.INSTALL_FAILED) { failedHosts.add(host.getHostName()); } } } } if (!failedHosts.isEmpty()) { String message = MessageFormat.format( "Hosts in cluster [{0},{1},{2},{3}] are in INSTALL_FAILED state because " + "Install Packages had failed. Please re-run Install Packages, if necessary place following hosts " + "in Maintenance mode: {4}", cluster.getClusterName(), targetStackId.getStackName(), targetStackId.getStackVersion(), repoVersion, StringUtils.join(failedHosts, ", ")); prerequisiteCheck.setFailedOn(new LinkedHashSet<String>(failedHosts)); prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL); prerequisiteCheck.setFailReason(message); } else if (clusterVersion.getState() == RepositoryVersionState.INSTALL_FAILED) { String message = MessageFormat.format("Cluster [{0},{1},{2},{3}] is in INSTALL_FAILED state because " + "Install Packages failed. Please re-run Install Packages even if you placed the failed hosts " + "in Maintenance mode.", cluster.getClusterName(), targetStackId.getStackName(), targetStackId.getStackVersion(), repoVersion); LinkedHashSet<String> failedOn = new LinkedHashSet<String>(); failedOn.add(cluster.getClusterName()); prerequisiteCheck.setFailedOn(failedOn); prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL); prerequisiteCheck.setFailReason(message); } }
From source file:com.offbynull.coroutines.instrumenter.asm.SimpleClassWriter.java
private LinkedHashSet<String> flattenHierarchy(String type) { Validate.notNull(type);/*from w ww . ja v a 2s . co m*/ LinkedHashSet<String> ret = new LinkedHashSet<>(); String currentType = type; while (true) { ret.add(currentType); ClassInformation classHierarchy = infoRepo.getInformation(currentType); // must return a result Validate.isTrue(classHierarchy != null, "No parent found for %s", currentType); if (classHierarchy.getSuperClassName() == null) { break; } currentType = classHierarchy.getSuperClassName(); } return ret; }
From source file:pl.psnc.ep.rt.web.servlets.CollXMLServlet.java
private static void addAuthors(Element metadata, Element content, MetadataServer ms) throws RemoteException, DLibraException { AttributeId authorAttrId = Util.getAttributeId("Autor", ms); AttributeValueSet avs = (AttributeValueSet) metadata.getUserData(KEY_AVS); List<AbstractAttributeValue> authorValues = getValues(avs, authorAttrId); if (authorValues != null && !authorValues.isEmpty()) { String authorsValue = authorValues.get(0).getValue(); NodeList authorsNodes = manualAuthorsHelper.parseAuthorsValue(authorsValue); if (authorsNodes != null) { for (int i = 0; i < authorsNodes.getLength(); i++) { Node imported = metadata.getOwnerDocument().importNode(authorsNodes.item(i), true); metadata.appendChild(imported); }/*w w w. j av a2 s . com*/ return; } } LinkedHashSet<String> authors = new LinkedHashSet<String>(); NodeList modules = content.getElementsByTagNameNS(Namespace.COL.URI, "module"); for (int i = 0; i < modules.getLength(); i++) { avs = (AttributeValueSet) modules.item(i).getUserData(KEY_AVS); List<AbstractAttributeValue> values = getValues(avs, authorAttrId); for (AbstractAttributeValue av : values) authors.add(av.getValue()); } Document doc = metadata.getOwnerDocument(); Element actors = element(doc, Namespace.MD, "actors", null); metadata.appendChild(actors); Element roles = element(doc, Namespace.MD, "roles", null); metadata.appendChild(roles); Pattern authorPattern = Pattern.compile("^([^<]+)<([^>]*)>$"); int id = 1; for (String author : authors) { String fullName = author; String email = ""; Matcher matcher = authorPattern.matcher(author); if (matcher.matches()) { fullName = matcher.group(1).trim(); email = matcher.group(2).trim(); } Element person = element(doc, Namespace.MD, "person", null); person.setAttribute("userid", "" + id); person.appendChild(element(doc, Namespace.MD, "fullname", fullName)); person.appendChild(element(doc, Namespace.MD, "firstname", fullName.lastIndexOf(' ') > -1 ? fullName.substring(0, fullName.lastIndexOf(' ')) : fullName)); person.appendChild(element(doc, Namespace.MD, "surname", fullName.lastIndexOf(' ') > -1 ? fullName.substring(fullName.lastIndexOf(' ') + 1, fullName.length()) : "")); person.appendChild(element(doc, Namespace.MD, "email", email)); actors.appendChild(person); Element role = element(doc, Namespace.MD, "role", "" + id); role.setAttribute("type", "author"); roles.appendChild(role); id++; } }
From source file:org.tdar.core.service.BulkUploadTemplateService.java
/** * For the set of @link ResourceType entries, get all of the valid @link * BulkImportField fields that should be used. * /* www.j a va 2 s. co m*/ * @param resourceTypes * @return */ public LinkedHashSet<CellMetadata> getAllValidFieldNames(ResourceType... resourceTypes) { List<ResourceType> resourceClasses = new ArrayList<ResourceType>(Arrays.asList(resourceTypes)); if (ArrayUtils.isEmpty(resourceTypes)) { resourceClasses = Arrays.asList(getResourceTypesSupportingBulkUpload()); } CellMetadata filename = CellMetadata.FILENAME; LinkedHashSet<CellMetadata> nameSet = new LinkedHashSet<CellMetadata>(); nameSet.add(filename); for (ResourceType clas : resourceClasses) { nameSet.addAll(reflectionService.findBulkAnnotationsOnClass(clas.getResourceClass())); } Iterator<CellMetadata> fields = nameSet.iterator(); while (fields.hasNext()) { CellMetadata field = fields.next(); String displayName = field.getDisplayName(); String key = field.getKey(); logger.trace(field.getKey() + "-" + field.getName() + " " + displayName); if (!TdarConfiguration.getInstance().getLicenseEnabled()) { if ((key.equals(InformationResource.LICENSE_TEXT) || key.equals(InformationResource.LICENSE_TYPE))) { fields.remove(); } } if (!TdarConfiguration.getInstance().getCopyrightMandatory()) { if ((key.equals(InformationResource.COPYRIGHT_HOLDER)) || displayName.contains(CellMetadata .getDisplayLabel(MessageHelper.getInstance(), InformationResource.COPYRIGHT_HOLDER))) { fields.remove(); } } } return nameSet; }
From source file:com.shazam.dataengineering.pipelinebuilder.PipelineObject.java
private HashSet<Field> parseFields(LinkedHashSet<Field> accumulator, Object json, String key) { if (json instanceof String) { accumulator.add(new Field().withKey(key).withStringValue((String) json)); } else if (json instanceof JSONArray) { JSONArray fieldArray = (JSONArray) json; for (Object field : fieldArray) { parseFields(accumulator, field, key); }/*from www .j a v a 2s.c om*/ } else if (json instanceof JSONObject) { String refValue = (String) ((JSONObject) json).get("ref"); accumulator.add(new Field().withKey(key).withRefValue(refValue)); } return accumulator; }
From source file:cz.cas.lib.proarc.authentication.Authenticators.java
public List<Authenticator> getAuthenticators() { List<Object> authenticatorIds = conf.getList(PROPERTY_AUTHENTICATORS); LinkedHashSet<Object> ids = new LinkedHashSet<Object>(authenticatorIds); // ensure the ProArc authenticator used as a last resort ids.remove(TYPE_PROARC);// w ww .j av a 2 s . co m ids.add(TYPE_PROARC); ArrayList<Authenticator> authenticators = new ArrayList<Authenticator>(ids.size()); for (Object id : ids) { if (TYPE_PROARC.equals(id)) { authenticators.add(new ProArcAuthenticator()); } else if (TYPE_DESA.equals(id)) { authenticators.add(new DESAAuthenticator()); } else { LOG.warning("Unknown authenticator: " + id); } } return authenticators; }
From source file:org.opencb.opencga.storage.core.variant.VariantStoragePipeline.java
public static void checkAndUpdateStudyConfiguration(StudyConfiguration studyConfiguration, int fileId, VariantSource source, ObjectMap options) throws StorageEngineException { if (options.containsKey(Options.SAMPLE_IDS.key()) && !options.getAsStringList(Options.SAMPLE_IDS.key()).isEmpty()) { for (String sampleEntry : options.getAsStringList(Options.SAMPLE_IDS.key())) { String[] split = sampleEntry.split(":"); if (split.length != 2) { throw new StorageEngineException("Param " + sampleEntry + " is malformed"); }//from www . ja v a2 s . c o m String sampleName = split[0]; int sampleId; try { sampleId = Integer.parseInt(split[1]); } catch (NumberFormatException e) { throw new StorageEngineException("SampleId " + split[1] + " is not an integer", e); } if (!source.getSamplesPosition().containsKey(sampleName)) { //ERROR throw new StorageEngineException( "Given sampleName '" + sampleName + "' is not in the input file"); } else { if (!studyConfiguration.getSampleIds().containsKey(sampleName)) { //Add sample to StudyConfiguration studyConfiguration.getSampleIds().put(sampleName, sampleId); } else { if (studyConfiguration.getSampleIds().get(sampleName) != sampleId) { throw new StorageEngineException("Sample " + sampleName + ":" + sampleId + " was already present. It was in the StudyConfiguration with a different sampleId: " + studyConfiguration.getSampleIds().get(sampleName)); } } } } //Check that all samples has a sampleId List<String> missingSamples = new LinkedList<>(); for (String sampleName : source.getSamples()) { if (!studyConfiguration.getSampleIds().containsKey(sampleName)) { missingSamples.add(sampleName); } /*else { Integer sampleId = studyConfiguration.getSampleIds().get(sampleName); if (studyConfiguration.getIndexedSamples().contains(sampleId)) { logger.warn("Sample " + sampleName + ":" + sampleId + " was already loaded. It was in the StudyConfiguration.indexedSamples"); } }*/ } if (!missingSamples.isEmpty()) { throw new StorageEngineException( "Samples " + missingSamples.toString() + " has not assigned sampleId"); } } else { //Find the grader sample Id in the studyConfiguration, in order to add more sampleIds if necessary. int maxId = 0; for (Integer i : studyConfiguration.getSampleIds().values()) { if (i > maxId) { maxId = i; } } //Assign new sampleIds for (String sample : source.getSamples()) { if (!studyConfiguration.getSampleIds().containsKey(sample)) { //If the sample was not in the original studyId, a new SampleId is assigned. int sampleId; int samplesSize = studyConfiguration.getSampleIds().size(); Integer samplePosition = source.getSamplesPosition().get(sample); if (!studyConfiguration.getSampleIds().containsValue(samplePosition)) { //1- Use with the SamplePosition sampleId = samplePosition; } else if (!studyConfiguration.getSampleIds().containsValue(samplesSize)) { //2- Use the number of samples in the StudyConfiguration. sampleId = samplesSize; } else { //3- Use the maxId sampleId = maxId + 1; } studyConfiguration.getSampleIds().put(sample, sampleId); if (sampleId > maxId) { maxId = sampleId; } } } } if (studyConfiguration.getSamplesInFiles().containsKey(fileId)) { LinkedHashSet<Integer> sampleIds = studyConfiguration.getSamplesInFiles().get(fileId); List<String> missingSamples = new LinkedList<>(); for (String sampleName : source.getSamples()) { if (!sampleIds.contains(studyConfiguration.getSampleIds().get(sampleName))) { missingSamples.add(sampleName); } } if (!missingSamples.isEmpty()) { throw new StorageEngineException( "Samples " + missingSamples.toString() + " were not in file " + fileId); } if (sampleIds.size() != source.getSamples().size()) { throw new StorageEngineException("Incorrect number of samples in file " + fileId); } } else { LinkedHashSet<Integer> sampleIdsInFile = new LinkedHashSet<>(source.getSamples().size()); for (String sample : source.getSamples()) { sampleIdsInFile.add(studyConfiguration.getSampleIds().get(sample)); } studyConfiguration.getSamplesInFiles().put(fileId, sampleIdsInFile); } }
From source file:de._13ducks.cor.game.server.movement.SubSectorPathfinder.java
/** * Sucht einen Weg auf Freiflchen (FreePolygon) um ein Hindernis herum. * Beachtet weitere Hindernisse auf der "Umleitung". * Sucht die Route nur bis zum nchsten Ziel. * Der Mover darf sich nicht bereits auf einer Umleitung befinden, * diese muss ggf vorher gelscht worden sein. * @param mover// w w w . j av a 2s . c o m * @param obstacle * @return */ static List<SubSectorEdge> searchDiversion(Moveable mover, Moveable obstacle, SimplePosition target) { // Vorberprfung: Ist das Ziel berhaupt noch frei? List<Moveable> moversAroundTarget = Server.getInnerServer().moveMan.moveMap .moversAroundPoint(target.toFPP(), mover.getRadius() + 5); moversAroundTarget.remove(mover); // Falls drin for (Moveable m : moversAroundTarget) { if (m.getPrecisePosition().getDistance(target.toFPP()) < m.getRadius() + mover.getRadius() + ServerBehaviourMove.MIN_DISTANCE) { System.out.println("No div, target blocked!"); return null; } } /** * Wegsuche in 2 Schritten: * 1. Aufbauen eines geeigneten Graphen, der das gesamte Problem enthlt. * 2. Suchen einer Route in diesem Graphen mittels A* (A-Star). */ // Aufbauen des Graphen: ArrayList<SubSectorObstacle> graph = new ArrayList<SubSectorObstacle>(); // Der Graph selber LinkedList<Moveable> openObstacles = new LinkedList<Moveable>(); // Die Liste mit noch zu untersuchenden Knoten ArrayList<Moveable> closedObstacles = new ArrayList<Moveable>(); // Bearbeitete Knoten openObstacles.add(obstacle); // Startpunkt des Graphen. closedObstacles.add(mover); // Wird im Graphen nicht mitbercksichtigt. double radius = mover.getRadius() + ServerBehaviourMove.MIN_DISTANCE; while (!openObstacles.isEmpty()) { // Neues Element aus der Liste holen und als bearbeitet markieren. Moveable work = openObstacles.poll(); closedObstacles.add(work); SubSectorObstacle next = new SubSectorObstacle(work.getPrecisePosition().x(), work.getPrecisePosition().y(), work.getRadius()); // Zuerst alle Punkte des Graphen lschen, die jetzt nichtmehr erreichbar sind: for (SubSectorObstacle obst : graph) { obst.removeNearNodes(next, radius); } // Mit Graph vernetzen for (SubSectorObstacle node : graph) { if (node.inColRange(next, radius)) { // Schnittpunkte suchen SubSectorNode[] intersections = node.calcIntersections(next, radius); for (SubSectorNode n2 : intersections) { boolean reachable = true; for (SubSectorObstacle o : graph) { if (o.equals(node)) { continue; // Um den gehts jetzt ja gerade, natrlich liegen wir auf diesem Kreis } if (o.moveCircleContains(n2, radius)) { reachable = false; break; } } if (reachable) { // Schnittpunkt einbauen next.addNode(n2); node.addNode(n2); } } } } // Bearbeitetes selbst in Graph einfgen graph.add(next); // Weitere Hindernisse suchen, die jetzt relevant sind. List<Moveable> moversAround = Server.getInnerServer().moveMan.moveMap.moversAround(work, (work.getRadius() + radius) * 2); for (Moveable pmove : moversAround) { if (!closedObstacles.contains(pmove) && !openObstacles.contains(pmove)) { openObstacles.add(pmove); } } } // Jetzt drber laufen und Graph aufbauen: for (SubSectorObstacle obst : graph) { // Vorgensweise: // In jedem Hinderniss die Linie entlanglaufen und Knoten mit Kanten verbinden. // Ein Knoten darf auf einem Kreis immer nur in eine Richtung gehen. // (das sollte mithilfe seiner beiden, bekannten hindernisse recht einfach sein) // Die Lnge des Kreissegments lsst sich einfach mithilfe des winkels ausrechnen (Math.atan2(y,x) // Dann darf der A*. Bzw. Dijkstra, A* ist hier schon fast Overkill. // Alle Knoten ihrem Bogenma nach sortieren. obst.sortNodes(); obst.interConnectNodes(radius); } // Start- und Zielknoten einbauen und mit dem Graph vernetzten. SubSectorNode startNode = new SubSectorNode(mover.getPrecisePosition().x(), mover.getPrecisePosition().y()); SubSectorNode targetNode = new SubSectorNode(target.x(), target.y()); double min = Double.POSITIVE_INFINITY; SubSectorObstacle minObstacle = null; for (SubSectorObstacle obst : graph) { double newdist = Math.sqrt((obst.getX() - startNode.getX()) * (obst.getX() - startNode.getX()) + (obst.getY() - startNode.getY()) * (obst.getY() - startNode.getY())); newdist -= obst.getRadius() + radius; // Es interessiert uns der nchstmgliche Kreis, nicht das nchste Hinderniss if (newdist < min) { min = newdist; minObstacle = obst; } } // Punkt auf Laufkreis finden Vector direct = new Vector(startNode.getX() - minObstacle.getX(), startNode.getY() - minObstacle.getY()); direct = direct.normalize().multiply(minObstacle.getRadius() + radius); SubSectorNode minNode = new SubSectorNode(minObstacle.getX() + direct.getX(), minObstacle.getY() + direct.getY(), minObstacle); // In das Hinderniss integrieren: minObstacle.lateIntegrateNode(minNode); SubSectorEdge startEdge = new SubSectorEdge(startNode, minNode, min); if (!startNode.equals(minNode)) { startNode.addEdge(startEdge); minNode.addEdge(startEdge); } else { // Wir stehen schon auf dem minNode. // Die Einsprungkante ist nicht notwendig. startNode = minNode; } double min2 = Double.POSITIVE_INFINITY; SubSectorObstacle minObstacle2 = null; for (SubSectorObstacle obst : graph) { double newdist = Math.sqrt((obst.getX() - targetNode.getX()) * (obst.getX() - targetNode.getX()) + (obst.getY() - targetNode.getY()) * (obst.getY() - targetNode.getY())); newdist -= obst.getRadius() + radius; // Es interessiert uns der nchstmgliche Kreis, nicht das nchste Hinderniss if (newdist < min2) { min2 = newdist; minObstacle2 = obst; } } // Punkt auf Laufkreis finden Vector direct2 = new Vector(targetNode.getX() - minObstacle2.getX(), targetNode.getY() - minObstacle2.getY()); direct2 = direct2.normalize().multiply(minObstacle2.getRadius() + radius); SubSectorNode minNode2 = new SubSectorNode(minObstacle2.getX() + direct2.getX(), minObstacle2.getY() + direct2.getY(), minObstacle2); // In das Hinderniss integrieren: minObstacle2.lateIntegrateNode(minNode2); SubSectorEdge targetEdge = new SubSectorEdge(minNode2, targetNode, min2); if (!targetNode.equals(minNode2)) { targetNode.addEdge(targetEdge); minNode2.addEdge(targetEdge); } else { // Das Ziel ist schon auf dem Laufkreis. // Die Aussprungkante ist nicht ntig. targetNode = minNode2; } /** * Hier jetzt einen Weg suchen von startNode nach targetNode. * Die Kanten sind in node.myEdges * Die Ziele bekommt man mit edge.getOther(startNode) * Die Lnge (Wegkosten) stehen in edge.length (vorsicht: double-Wert!) */ PriorityBuffer open = new PriorityBuffer(); // Liste fr entdeckte Knoten LinkedHashSet<SubSectorNode> containopen = new LinkedHashSet<SubSectorNode>(); // Auch fr entdeckte Knoten, hiermit kann viel schneller festgestellt werden, ob ein bestimmter Knoten schon enthalten ist. LinkedHashSet<SubSectorNode> closed = new LinkedHashSet<SubSectorNode>(); // Liste fr fertig bearbeitete Knoten double cost_t = 0; //Movement Kosten (gerade 5, diagonal 7, wird spter festgelegt) open.add(startNode); while (open.size() > 0) { SubSectorNode current = (SubSectorNode) open.remove(); containopen.remove(current); if (current.equals(targetNode)) { //Abbruch, weil Weg von Start nach Ziel gefunden wurde //targetNode.setParent(current.getParent()); //"Vorgngerfeld" von Ziel bekannt break; } // Aus der open wurde current bereits gelscht, jetzt in die closed verschieben closed.add(current); ArrayList<SubSectorEdge> neighbors = current.getMyEdges(); for (SubSectorEdge edge : neighbors) { SubSectorNode node = edge.getOther(current); if (closed.contains(node)) { continue; } // Kosten dort hin berechnen cost_t = edge.getLength(); if (containopen.contains(node)) { //Wenn sich der Knoten in der openlist befindet, muss berechnet werden, ob es einen krzeren Weg gibt if (current.getCost() + cost_t < node.getCost()) { //krzerer Weg gefunden? node.setCost(current.getCost() + cost_t); //-> Wegkosten neu berechnen //node.setValF(node.cost + node.getHeuristic()); //F-Wert, besteht aus Wegkosten vom Start + Luftlinie zum Ziel node.setParent(current); //aktuelles Feld wird zum Vorgngerfeld } } else { node.setCost(current.getCost() + cost_t); //node.setHeuristic(Math.sqrt(Math.pow(Math.abs((targetNode.getX() - node.getX())), 2) + Math.pow(Math.abs((targetNode.getY() - node.getY())), 2))); // geschtzte Distanz zum Ziel //Die Zahl am Ende der Berechnung ist der Aufwand der Wegsuche //5 ist schnell, 4 normal, 3 dauert lange node.setParent(current); // Parent ist die RogPosition, von dem der aktuelle entdeckt wurde //node.setValF(node.cost + node.getHeuristic()); //F-Wert, besteht aus Wegkosten vom Start aus + Luftlinie zum Ziel open.add(node); // in openlist hinzufgen containopen.add(node); } } } if (targetNode.getParent() == null) { //kein Weg gefunden return null; } ArrayList<SubSectorNode> pathrev = new ArrayList<SubSectorNode>(); //Pfad aus parents erstellen, von Ziel nach Start while (!targetNode.equals(startNode)) { pathrev.add(targetNode); targetNode = targetNode.getParent(); } pathrev.add(startNode); ArrayList<SubSectorNode> path = new ArrayList<SubSectorNode>(); //Pfad umkehren, sodass er von Start nach Ziel ist for (int k = pathrev.size() - 1; k >= 0; k--) { path.add(pathrev.get(k)); } // Nachbearbeitung: // Wir brauchen eine Kanten-Liste mit arc/direct Informationen ArrayList<SubSectorEdge> finalPath = new ArrayList<SubSectorEdge>(); for (int i = 0; i < path.size() - 1; i++) { SubSectorNode from = path.get(i); SubSectorNode to = path.get(i + 1); SubSectorEdge edge = shortestCommonEdge(from, to); if (edge != null) { finalPath.add(edge); } else { throw new RuntimeException("ERROR Cannot find edge from " + from + " to " + to + " but it is part of the calculated path!!!"); } } return finalPath; //Pfad zurckgeben }
From source file:org.apache.ambari.server.checks.PreviousUpgradeCompleted.java
@Override public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException { final String clusterName = request.getClusterName(); final Cluster cluster = clustersProvider.get().getCluster(clusterName); String errorMessage = null;//from w ww . j a va 2s. c om List<UpgradeEntity> upgrades = upgradeDaoProvider.get().findAll(); if (upgrades != null) { Long lastStartTime = 0L; UpgradeEntity mostRecentUpgrade = null; UpgradeEntity correspondingDowngrade = null; for (UpgradeEntity upgrade : upgrades) { // Find the most recent upgrade for this cluster if (upgrade.getClusterId() == cluster.getClusterId() && upgrade.getDirection() == Direction.UPGRADE) { Long requestId = upgrade.getRequestId(); RequestEntity upgradeRequest = requestDaoProvider.get().findByPK(requestId); if (upgradeRequest != null && upgradeRequest.getStartTime() > lastStartTime) { mostRecentUpgrade = upgrade; lastStartTime = upgradeRequest.getStartTime(); } } } // Check for the corresponding downgrade. if (mostRecentUpgrade != null) { for (UpgradeEntity downgrade : upgrades) { // Surprisingly, a Downgrade's from and to version are identical. if (downgrade.getClusterId() == cluster.getClusterId() && downgrade.getDirection() == Direction.DOWNGRADE && downgrade.getFromVersion().equals(mostRecentUpgrade.getFromVersion())) { correspondingDowngrade = downgrade; break; } } // If it has no downgrade, then the "Save Cluster State" step should have COMPLETED. if (correspondingDowngrade == null) { // Should have only 1 element. List<HostRoleCommandEntity> finalizeCommandList = hostRoleCommandDaoProvider.get() .findSortedCommandsByRequestIdAndCustomCommandName(mostRecentUpgrade.getRequestId(), FINALIZE_ACTION_CLASS_NAME); // If the action is not COMPLETED, then something went wrong. if (finalizeCommandList != null) { for (HostRoleCommandEntity command : finalizeCommandList) { if (command.getStatus() != HostRoleStatus.COMPLETED) { errorMessage = MessageFormat.format( "Upgrade attempt (id: {0}, request id: {1}, from version: {2}, " + "to version: {3}) did not complete task with id {4} since its state is {5} instead of COMPLETED.", mostRecentUpgrade.getId(), mostRecentUpgrade.getRequestId(), mostRecentUpgrade.getFromVersion(), mostRecentUpgrade.getToVersion(), command.getTaskId(), command.getStatus()); errorMessage += " Please ensure that you called:\n" + SET_CURRENT_COMMAND; errorMessage += MessageFormat .format("\nFurther, change the status of host_role_command with " + "id {0} to COMPLETED", mostRecentUpgrade.getId()); break; } } } } } } if (null != errorMessage) { LinkedHashSet<String> failedOn = new LinkedHashSet<String>(); failedOn.add(cluster.getClusterName()); prerequisiteCheck.setFailedOn(failedOn); prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL); prerequisiteCheck.setFailReason(errorMessage); } }