Example usage for java.util LinkedHashSet add

List of usage examples for java.util LinkedHashSet add

Introduction

In this page you can find the example usage for java.util LinkedHashSet add.

Prototype

boolean add(E e);

Source Link

Document

Adds the specified element to this set if it is not already present (optional operation).

Usage

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);
    }
}