Example #1
0
 @SuppressWarnings("unchecked")
 public static synchronized List<Key<Line>> getTrainKeys() {
   String functionName = "getTrainKeys()";
   if (trainKeys == null || trainKeys.size() == 0) {
     Objectify ofy = ObjectifyService.begin();
     Query<Line> q = ofy.query(Line.class).filter("type", 21);
     List<Key<Line>> keys;
     try {
       Cache cache =
           CacheManager.getInstance().getCacheFactory().createCache(Collections.emptyMap());
       keys = (List<Key<Line>>) cache.get(q.toString());
       if (keys == null) {
         keys = q.listKeys();
         cache.put(q.toString(), keys);
       }
     } catch (CacheException e) {
       keys = q.listKeys();
       Logger.getLogger(location).log(Level.SEVERE, functionName + ": Cache error: " + e);
       e.printStackTrace();
     }
     trainKeys = keys;
     Logger.getLogger(location)
         .log(Level.INFO, functionName + ": served new trainKeys. #" + trainKeys.size());
   }
   return trainKeys;
 }
Example #2
0
 public void deleteUserFavouritePosition(
     Key<UserFavouritePosition> fav, User currentUser, Objectify ofy) {
   String functionName = "deleteUserFavouritePosition()";
   UserFavouritePosition toDelete = ofy.find(fav);
   if (toDelete != null && toDelete.getUser().equals(currentUser)) {
     Query<UserFavouritePosition> q =
         ofy.query(UserFavouritePosition.class).filter("user", toDelete.getUser());
     removeFromCache(q.toString());
     ofy.delete(fav);
   } else if (toDelete == null) {
     Logger.getLogger(location)
         .log(
             Level.SEVERE,
             functionName
                 + ": got a request to delete a userfavouriteposition but none were found with that key: "
                 + fav);
   } else {
     Logger.getLogger(location)
         .log(
             Level.SEVERE,
             functionName
                 + ": got a request to delete a userfavouriteposition but it did not match the current user: "
                 + currentUser);
   }
 }
Example #3
0
 @SuppressWarnings("unchecked")
 public Collection<Point> getSearchPointsForLine(
     Key<Line> l, int middleIndex, int plusMinusIndex, Objectify ofy) {
   String functionName = "getSearchPointsForLine(int plusMinusIndex)";
   List<Key<Point>> keys;
   plusMinusIndex++; // query is exclusive, therefore we expand by one to return the expected
                     // number of results
   Query<Point> q =
       ofy.query(Point.class)
           .ancestor(l)
           .filter("ignore", false)
           .filter("index <", middleIndex + plusMinusIndex)
           .filter("index >", middleIndex - plusMinusIndex);
   try {
     Cache cache =
         CacheManager.getInstance().getCacheFactory().createCache(Collections.emptyMap());
     keys = (List<Key<Point>>) cache.get(q.toString());
     if (keys == null) {
       keys = q.listKeys();
       cache.put(q.toString(), keys);
     }
   } catch (CacheException e) {
     keys = q.listKeys();
     Logger.getLogger(location).log(Level.SEVERE, functionName + ": Cache error: " + e);
     e.printStackTrace();
   }
   Map<Key<Point>, Point> points = ofy.get(keys);
   return points.values();
 }
 public static Vector<Long> ReadFeedList(String email) {
   Vector<Long> outputList = new Vector<Long>();
   Query<FeedParameters> query =
       objectify.query(FeedParameters.class).filter("emailAddress", email);
   for (Key<FeedParameters> feedKey : query.fetchKeys()) {
     outputList.add(feedKey.getId());
   }
   return outputList;
 }
Example #5
0
  private void listMessages(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    resp.setCharacterEncoding("UTF-8");
    if (!IrssiNotifier.versionCheck(req.getParameter("version"))) {
      IrssiNotifier.printError(resp.getWriter(), new OldVersionException());
      return;
    }
    String id = req.getParameter("apiToken");
    String guid = req.getParameter("guid");

    if (id == null || guid == null || id.equals("") || guid.equals("")) {
      IrssiNotifier.printError(resp.getWriter(), "Virheellinen pyyntö");
      return;
    }

    ObjectifyDAO dao = new ObjectifyDAO();
    try {
      IrssiNotifierUser user = IrssiNotifier.getUser(dao, id);
      Query<Message> messages =
          dao.ofy().query(Message.class).order("-timestamp").ancestor(user).limit(LIMIT + 1);
      String starting = req.getParameter("starting");
      if (starting != null) {
        try {
          long startingTimestamp = Long.parseLong(starting);
          messages = messages.filter("timestamp <=", startingTimestamp);
        } catch (NumberFormatException e) {
        }
      }

      Message next = null;
      if (messages.count() == LIMIT + 1) {
        IrssiNotifier.log.info("Lisää viestejä on saatavilla");
        next = messages.list().get(LIMIT);
      } else {
        IrssiNotifier.log.info("Sisältää viestihistorian viimeiset viestit");
      }

      MessageListResponse response = new MessageListResponse(messages.limit(LIMIT));
      response.nextMessage = next;
      response.isNextFetch = starting != null;

      JSONSerializer serializer = new JSONSerializer();
      String jsonObject =
          serializer
              .include("messages")
              .transform(new CustomTimeTransformer(), "messages.timestamp")
              .transform(new CustomTimeTransformer(), "nextMessage.timestamp")
              .exclude("*.class")
              .serialize(response);
      resp.setHeader("Content-Type", "application/json");
      resp.getWriter().println(jsonObject);
      resp.getWriter().close();
    } catch (UserNotFoundException e) {
      IrssiNotifier.printError(resp.getWriter(), e);
    }
  }
  public Business findByBarcode(String code) {
    Query<Spot> query = ofy().query(Spot.class).filter("barcode", code);
    Spot bc = query.get();
    Business business = null;
    if (bc != null) {
      business = ofy().find(bc.getBusiness());
    }

    return business;
  }
Example #7
0
 /**
  * Méthode permettant l'effacement de tout les messages postés pour un device donné
  *
  * @param device contient l'identifiant pour lequel les messages doivent être supprimé, si null
  *     tous les messages de la base sont supprimés
  * @return le nombre de message effectivement supprimés
  */
 public Integer raz(String device) {
   Query<Message> im = null;
   if (device == null) {
     im = ofy().query(Message.class);
   } else {
     im = ofy().query(Message.class).filter("device", device);
   }
   int rc = im.count();
   ofy().delete(im);
   return (rc);
 }
Example #8
0
 public ApplicationUser getByEMail(String email) {
   try {
     Query<ApplicationUser> query = ofy().query(ApplicationUser.class);
     // query.ancestor(companyKey);
     ApplicationUser user = query.filter("email", email).get();
     return user;
   } catch (Exception e) {
     LOG.error("Cannot get ApplicationUser by email(" + email + ")", e);
     return null;
   }
 }
Example #9
0
 public static synchronized void resetTrainNodes() {
   Objectify ofy = ObjectifyService.begin();
   Query<TrainNode> q = ofy.query(TrainNode.class);
   Dao.getInstance().removeFromCache(q.toString());
   trainNodes = null;
   mapTrainNodeKeyToNode = null;
   trainKeys = null;
   subteKeys = null;
   mapBusCache = Collections.synchronizedMap(new MapBusCached<String, HashMap<String, PQA>>(500));
   System.err.println("resetTrainNodes was executed");
 }
Example #10
0
 public void addUserFavouritePosition(UserFavouritePosition fav, Objectify ofy) {
   String functionName = "addUserFavouritePosition()";
   if (fav.getUser() == null) {
     Logger.getLogger(location).log(Level.SEVERE, functionName + ": got a fav without user");
   } else {
     Query<UserFavouritePosition> q =
         ofy.query(UserFavouritePosition.class).filter("user", fav.getUser());
     removeFromCache(q.toString());
     ofy.put(fav);
   }
 }
 // FIXME: not working
 int countUsersActiveInLastNDays(DatastoreService ds, int numDays) {
   com.googlecode.objectify.Query<User> q = ofy().query(User.class);
   if (numDays > 0) {
     // This is ridiculous, but 30 days in milliseconds is 2.5B, and if numDays is
     // in int, the expression below overflows and we look for
     // lastSeen > some-future-date. To fix, just cast it to a long.
     long numDays64Bit = numDays;
     q.filter(
         "lastSeen >", new Date(System.currentTimeMillis() - numDays64Bit * 24 * 60 * 60 * 1000));
   }
   return q.count();
 }
  public static List<Long> getFeedsForUpdate() {
    Vector<Long> outputList = new Vector<Long>();
    Query<FeedParameters> query =
        objectify
            .query(FeedParameters.class)
            .filter("inPostingQueue", true)
            .filter("postingTime <", new Date());

    for (Key<FeedParameters> feedKey : query.fetchKeys()) {
      outputList.add(feedKey.getId());
    }
    return outputList;
  }
Example #13
0
  public ArrayList<Model> Raffle(String accessToken, String eid) {

    Dao dao = new Dao();

    Random r = new Random();

    Query<VoteDetails> qRaffle = dao.ofy().query(VoteDetails.class);
    List<VoteDetails> droppers = qRaffle.filter("eid", eid).list();

    VoteDetails winner = droppers.get(r.nextInt(droppers.size() - 1));

    return Profile.GetFacebookProfileInfo(accessToken, winner.uid);
  }
Example #14
0
 @SuppressWarnings("unchecked")
 public Collection<Point> getSearchPointsForLine(
     Key<Line> l, String geoCell, int plusMinusIndex, Objectify ofy) {
   String functionName = "getSearchPointsForLine(String geoCell)";
   Query<Point> q =
       ofy.query(Point.class)
           .ancestor(l)
           .filter("ignore", false)
           .filter("defaultGeoCell", geoCell)
           .limit(1);
   Key<Point> kMiddle;
   try {
     Cache cache =
         CacheManager.getInstance().getCacheFactory().createCache(Collections.emptyMap());
     kMiddle = (Key<Point>) cache.get(q.toString());
     if (kMiddle == null) {
       kMiddle = q.getKey();
       cache.put(q.toString(), kMiddle);
     }
   } catch (CacheException e) {
     kMiddle = q.getKey();
     Logger.getLogger(location).log(Level.SEVERE, functionName + ": Cache error: " + e);
     e.printStackTrace();
   }
   if (kMiddle
       == null) { // dirty hack, but still better than failing in case that no point was found
     q = ofy.query(Point.class).ancestor(l).filter("defaultGeoCell", geoCell).limit(1);
     kMiddle = q.getKey();
     System.err.println(
         "had to resort to dirty hack and retrieve a point that is set to ignore for line "
             + l
             + " in cell "
             + geoCell
             + ". Result: "
             + kMiddle);
   }
   try {
     Point middle = ofy.get(kMiddle);
     Collection<Point> points;
     if (plusMinusIndex > 0) {
       points = getSearchPointsForLine(l, middle.getIndex(), plusMinusIndex, ofy);
     } else {
       points = new LinkedList<Point>();
       points.add(middle);
     }
     return points;
   } catch (NullPointerException e) {
     q = ofy.query(Point.class).ancestor(l).filter("ignore", false);
     System.err.println(
         "because of "
             + e
             + " had to resort to even dirtier hack and retrieve all potential points for line "
             + l
             + ", even those not in cell "
             + geoCell);
     return q.list();
   }
 }
Example #15
0
 @SuppressWarnings("unchecked")
 public Collection<UserFavouritePosition> getUserFavouritePositions(User user, Objectify ofy) {
   String functionName = "getUserFavouritePositions()";
   Query<UserFavouritePosition> q = ofy.query(UserFavouritePosition.class).filter("user", user);
   List<Key<UserFavouritePosition>> keys;
   try {
     Cache cache =
         CacheManager.getInstance().getCacheFactory().createCache(Collections.emptyMap());
     keys = (List<Key<UserFavouritePosition>>) cache.get(q.toString());
     if (keys == null) {
       keys = q.listKeys();
       cache.put(q.toString(), keys);
     }
   } catch (CacheException e) {
     Logger.getLogger(location).log(Level.SEVERE, functionName + ": caching error: " + e);
     keys = q.listKeys();
   }
   return ofy.get(keys).values();
 }
Example #16
0
 @SuppressWarnings("unchecked")
 public static synchronized HashMap<String, Set<TrainNode>> getTrainNodes() {
   String functionName = "getTrainNodes()";
   if (trainNodes == null || trainNodes.size() == 0) {
     trainNodes = new HashMap<String, Set<TrainNode>>();
     Objectify ofy = ObjectifyService.begin();
     Query<TrainNode> q = ofy.query(TrainNode.class);
     List<Key<TrainNode>> keys;
     try {
       Cache cache =
           CacheManager.getInstance().getCacheFactory().createCache(Collections.emptyMap());
       keys = (List<Key<TrainNode>>) cache.get(q.toString());
       if (keys == null) {
         keys = q.listKeys();
         cache.put(q.toString(), keys);
       }
     } catch (CacheException e) {
       keys = q.listKeys();
       Logger.getLogger(location).log(Level.SEVERE, functionName + ": Cache error: " + e);
       e.printStackTrace();
     }
     Map<Key<TrainNode>, TrainNode> res = ofy.get(keys);
     Collection<TrainNode> tns = res.values();
     Logger.getLogger(location)
         .log(
             Level.INFO,
             functionName + ": Got " + res.size() + " TrainNodes. keys.size(): " + keys.size());
     //			String m = "";
     for (TrainNode tn : tns) {
       if (!trainNodes.containsKey(tn.getGeoCell())) {
         trainNodes.put(tn.getGeoCell(), new HashSet<TrainNode>());
       }
       trainNodes.get(tn.getGeoCell()).add(tn);
       /*				if(tn.getLineKey().equals(new Key<Line>(Line.class, 155))) {
       //				if(tn.getLineType() == 11) {
       					System.err.print("\"" + tn.getGeoCell() + "\", ");
       				}*/
     }
     //			Utils.eMailGeneric(m, "DaoTemp");
   }
   return trainNodes;
 }
  public void putCathedra(final Cathedra cathedra) throws Exception {
    NamespaceController.getInstance().updateNamespace(NamespaceController.generalNamespace);
    Query<Cathedra> query = ofy().query(Cathedra.class).filter("name", cathedra.getName());
    if (query.count() != 0) {
      long oldCathedraId = query.getKey().getId();
      cathedra.setId(oldCathedraId);
    }
    DAOT.runInTransaction(
        logger,
        new DatastoreOperation<Void>() {
          @Override
          public Void run(DAOT daot) throws Exception {
            daot.getOfy().put(cathedra);
            return null;
          }

          @Override
          public String getOperationName() {
            return "Persisting of cathedra.";
          }
        });
  }
Example #18
0
 /*
  * returns the Points of a line which are from the original import, without the intermediate points that are created for searches
  * caches the keys of the query result so that the entities can be read through a batch get (which checks memcache first). this caching should be evaluated and removed if it does not work out
  */
 @SuppressWarnings("unchecked")
 public Collection<Point> getPointsToDisplayForLine(Line l, Objectify ofy) {
   String functionName = "getPointsForLine()";
   List<Key<Point>> keys;
   Query<Point> q =
       ofy.query(Point.class).ancestor(l).filter("forSearchOnly", false).order("index");
   try {
     Cache cache =
         CacheManager.getInstance().getCacheFactory().createCache(Collections.emptyMap());
     keys = (List<Key<Point>>) cache.get(q.toString());
     if (keys == null) {
       keys = q.listKeys();
       cache.put(q.toString(), keys);
     }
   } catch (CacheException e) {
     keys = q.listKeys();
     Logger.getLogger(location).log(Level.SEVERE, functionName + ": Cache error: " + e);
     e.printStackTrace();
   }
   Map<Key<Point>, Point> points = ofy.get(keys);
   return points.values();
 }
Example #19
0
  public ConnectionProxy indirectSearch(
      GeoPt start, GeoPt dest, Set<Key<Line>> tabuTrainsSet, Set<Key<Line>> mlkSet, Objectify ofy) {
    final String functionName = "newIndirectSearch()";
    final int plusMinus = 8;
    final int maxAlternatives = 8;
    HashSet<Key<PQA>> PQsForAStar = new HashSet<Key<PQA>>();
    Logger.getLogger(location)
        .log(Level.INFO, functionName + ": " + "fetching PQAs for " + mlkSet.size() + " lines.");
    try {
      Cache cache =
          CacheManager.getInstance().getCacheFactory().createCache(Collections.emptyMap());
      for (Key<Line> k : mlkSet) {
        Query<PQA> q = ofy.query(PQA.class).filter("lineKeys", k);
        @SuppressWarnings("unchecked")
        List<Key<PQA>> rl = (List<Key<PQA>>) cache.get(q.toString());
        if (rl == null) {
          rl = q.listKeys();
          cache.put(q.toString(), rl);
        }
        PQsForAStar.addAll(rl);
      }
    } catch (CacheException e) {
      Logger.getLogger(location).log(Level.SEVERE, functionName + ": Cache error: " + e);
      e.printStackTrace();
    }
    Logger.getLogger(location)
        .log(Level.FINER, functionName + ": " + "Got " + PQsForAStar.size() + " PQs.");
    /*for(PlanQuadrat pq : PQsForAStar) {
    	System.err.print("\"" + pq.getGeoCell() + "\",");
    }
    System.err.println();*/
    HashSet<String> setBusKey = new HashSet<String>();
    for (Key<PQA> pq : PQsForAStar) {
      setBusKey.add(pq.getName());
    }
    //		HashMap<String, PlanQuadrat> mapBus = new HashMap<String, PlanQuadrat>();
    WayHolder wh =
        new AStarImpl()
            .aStarSearch(
                Utils.computeGeoCell(
                    new com.beoui.geocell.model.Point(start.getLatitude(), start.getLongitude())),
                Utils.computeGeoCell(
                    new com.beoui.geocell.model.Point(dest.getLatitude(), dest.getLongitude())),
                setBusKey,
                mlkSet,
                tabuTrainsSet,
                ofy); // erste Cell jeweils aus Liste Start und Liste Dest Cells. das gehört noch
                      // überarbeitet
    /*
    for(AStarNode asn : wh.getWay()) {
    	System.err.print("\"" + asn.getGeoCell() + "\", ");
    }
    System.err.println();
    for(AStarNode asn : wh.getWay()) {
    	System.err.print("\"" + asn.getOwningLine() + "\", ");
    }
    System.err.println();*/
    if (wh != null && wh.getWay().size() > 1) {
      List<AStarNode> way = wh.getWay();
      List<AStarNode> umsteigen = wh.getCombinationPoints();
      int index = 0;
      if (way.get(0).getOwningLine() == null) {
        index = 1;
      }
      Collection<Point> pointsStart;
      if (way.get(index).getClass() == AStarNodeImpl.class) {
        pointsStart =
            getSearchPointsForLine(
                way.get(index).getOwningLine(), way.get(index).getPointGeoCell(), plusMinus, ofy);
      } else {
        Line tempLine = getLineByKey(way.get(index).getOwningLine(), ofy);
        if (tempLine.getType() == 11 || tempLine.getType() == 13 || tempLine.getType() == 15) {
          pointsStart =
              getSearchPointsForLine(
                  way.get(index).getOwningLine(), way.get(index).getPointGeoCell(), 1, ofy);
        } else {
          pointsStart =
              getSearchPointsForLine(
                  way.get(index).getOwningLine(), way.get(index).getPointGeoCell(), 0, ofy);
        }
      }
      //			System.err.println("pointsStart.size: " + pointsStart.size());
      Point startPoint = Utils.closestPoint(start, pointsStart);
      List<LineProxy> lineProxies = new LinkedList<LineProxy>();
      LineProxy walk =
          Utils.walk(new Point(null, start.getLatitude(), start.getLongitude(), null), startPoint);
      lineProxies.add(walk);

      Point lastPoint = startPoint;
      AStarNode lastNode = way.get(index);
      for (int i = index; i < way.size(); i++) {
        AStarNode an = way.get(i);
        if (umsteigen.contains(an)) {
          Collection<Point> pointsLine1;
          if (an.getClass() == AStarNodeImpl.class) {
            pointsLine1 =
                getSearchPointsForLine(lastPoint.getOwner(), an.getPointGeoCell(), plusMinus, ofy);
          } else {
            Line tempLine = getLineByKey(an.getOwningLine(), ofy);
            if (tempLine.getType() == 11 || tempLine.getType() == 13 || tempLine.getType() == 15) {
              pointsLine1 =
                  getSearchPointsForLine(an.getOwningLine(), an.getPointGeoCell(), 1, ofy);
            } else {
              pointsLine1 =
                  getSearchPointsForLine(an.getOwningLine(), an.getPointGeoCell(), 0, ofy);
            }
          }
          AStarNode next = way.get(i + 1);
          Collection<Point> pointsLine2;
          if (next.getClass() == AStarNodeImpl.class) {
            //						System.err.println("Line: " + next.getOwningLine() + " / " +
            // Dao.getInstance().getLineByKey(next.getOwningLine(), ofy) + " / " +
            // next.getPointGeoCell());
            pointsLine2 =
                getSearchPointsForLine(
                    next.getOwningLine(), next.getPointGeoCell(), plusMinus, ofy);
          } else {
            Line tempLine = getLineByKey(next.getOwningLine(), ofy);
            if (tempLine.getType() == 11 || tempLine.getType() == 13 || tempLine.getType() == 15) {
              pointsLine2 =
                  getSearchPointsForLine(next.getOwningLine(), next.getPointGeoCell(), 1, ofy);
            } else {
              pointsLine2 =
                  getSearchPointsForLine(next.getOwningLine(), next.getPointGeoCell(), 0, ofy);
            }
          }
          Logger.getLogger(location)
              .log(
                  Level.FINE,
                  functionName
                      + ": Umsteigen von "
                      + an.getOwningLine()
                      + " zu "
                      + next.getOwningLine()
                      + " in "
                      + an.getPointGeoCell()
                      + " und "
                      + next.getPointGeoCell()
                      + ". Results: "
                      + pointsLine1.size()
                      + " und "
                      + pointsLine2.size());

          Iterator<Point> j1 = pointsLine1.iterator();
          double min_distance = 999999999.9;
          Tuple<Point, Point> tuple_min = null;
          while (j1.hasNext()) {
            Point outerPoint = j1.next();
            Iterator<Point> j2 = pointsLine2.iterator();
            while (j2
                .hasNext()) { // für jeden Punkt (innerhalb der errechneten cells) von Line inner
                              // distanz zu jedem Punkt von outer berechnen, das kürzeste Paar
                              // speichern
              Point innerPoint = j2.next();
              double distance = Utils.distanceApprox(innerPoint, outerPoint);
              if (innerPoint.isIgnore()
                  || outerPoint
                      .isIgnore()) { // absolutely avoid points that are set as ignore. Related to
                                     // the dirty hack that searches any point, if none were found
                                     // that are not "ignore"-flagged. Theoretically there shouldn't
                                     // be any case where this is necessary, but right now there is
                                     // (rarely).
                distance += 10000;
              }
              if (distance < min_distance) {
                min_distance = distance;
                tuple_min = new Tuple<Point, Point>(outerPoint, innerPoint);
              }
            }
          }
          LineProxy c = Utils.getConnection(lastPoint, tuple_min.getFirst(), ofy);
          lineProxies.add(c);
          Line lastPointOwner1 = ofy.get(lastPoint.getOwner());
          if (lastPointOwner1.getType() == 1) { // wenn bus, alternativen suchen
            List<Key<Line>> alternativesK = new LinkedList<Key<Line>>();
            PlanQuadrat pq1 = Dao.getInstance().getPlanQuadrat(lastPoint.getDefaultGeoCell(), ofy);
            PlanQuadrat pq2 =
                Dao.getInstance().getPlanQuadrat(tuple_min.getFirst().getDefaultGeoCell(), ofy);
            int counter = 0;
            for (Key<Line> k1 : pq1.getDirectLineKeys()) {
              if (k1.getId()
                      != lastPoint.getOwner().getId() // nicht der bus der eh schon genommen wird
                  && pq2.getDirectLineKeys()
                      .contains(k1) // in anfangs und end PQ gleichermaßen enthalten
                  && pq1.getIndices().get(pq1.getDirectLineKeys().indexOf(k1))
                      <= pq2.getIndices().get(pq2.getDirectLineKeys().indexOf(k1))
                  && counter < maxAlternatives) {
                alternativesK.add(k1);
                counter++;
                // Logger.getLogger("ListPointsServiceImpl").log(Level.INFO, functionName + ":
                // Matching line: " + KeyFactory.keyToString(k1));
              }
            }
            for (Key<Line> k : alternativesK) {
              Line l = getLineByKey(k, ofy);
              c.addAlternativeLine(l.getLinenum() + " " + l.getRamal());
            }
          } else if (lastPointOwner1.getType() == 21) { // auch für züge alternativen suchen
            List<Key<Line>> alternativesK = new LinkedList<Key<Line>>();
            Set<TrainNode> tns1 = Dao.getTrainNodes().get(lastNode.getGeoCell());
            Set<TrainNode> tns2 = Dao.getTrainNodes().get(an.getGeoCell());
            for (TrainNode tn1 : tns1) {
              if (!tn1.getLineKey()
                  .equals(lastPoint.getOwner())) { // nicht der Zug der eh schon genommen wird
                for (TrainNode tn2 : tns2) {
                  if (tn1.getLineKey().equals(tn2.getLineKey()) // gehören zum gleichen zug
                      && tn1.getIndex() < tn2.getIndex()) { // und der index steig
                    alternativesK.add(tn1.getLineKey());
                  }
                }
              }
            }
            for (Key<Line> k : alternativesK) {
              Line l = getLineByKey(k, ofy);
              if (!l.getRamal().equals(c.getRamal())) {
                c.addAlternativeLine("Ramal a " + l.getRamal());
              }
            }
          }
          walk = Utils.walk(tuple_min.getFirst(), tuple_min.getSecond());
          lineProxies.add(walk);
          lastPoint = tuple_min.getSecond();
          lastNode = next;
        }
      }
      index = way.size() - 1;
      if (way.get(index).getOwningLine() == null) {
        index = way.size() - 2;
      }
      Collection<Point> pointsDest;
      if (way.get(index).getClass() == AStarNodeImpl.class) {
        pointsDest =
            getSearchPointsForLine(
                way.get(index).getOwningLine(), way.get(index).getPointGeoCell(), plusMinus, ofy);
      } else {
        Line tempLine = getLineByKey(way.get(index).getOwningLine(), ofy);
        if (tempLine.getType() == 11 || tempLine.getType() == 13 || tempLine.getType() == 15) {
          pointsDest =
              getSearchPointsForLine(
                  way.get(index).getOwningLine(), way.get(index).getPointGeoCell(), 1, ofy);
        } else {
          pointsDest =
              getSearchPointsForLine(
                  way.get(index).getOwningLine(), way.get(index).getPointGeoCell(), 0, ofy);
        }
      }
      Point destPoint = Utils.closestPoint(dest, pointsDest);
      LineProxy c = Utils.getConnection(lastPoint, destPoint, ofy);
      lineProxies.add(c);
      Line lastPointOwner2 = ofy.get(lastPoint.getOwner());
      if (lastPointOwner2.getType() == 1) { // wenn bus, alternativen suchen
        List<Key<Line>> alternativesK = new LinkedList<Key<Line>>();
        PlanQuadrat pq1 = Dao.getInstance().getPlanQuadrat(lastPoint.getDefaultGeoCell(), ofy);
        PlanQuadrat pq2 = Dao.getInstance().getPlanQuadrat(destPoint.getDefaultGeoCell(), ofy);
        int counter = 0;
        for (Key<Line> k1 : pq1.getDirectLineKeys()) {
          if (k1.getId() != lastPoint.getOwner().getId() // nicht der bus der eh schon genommen wird
              && pq2.getDirectLineKeys()
                  .contains(k1) // in anfangs und end PQ gleichermaßen enthalten
              && pq1.getIndices().get(pq1.getDirectLineKeys().indexOf(k1))
                  <= pq2.getIndices().get(pq2.getDirectLineKeys().indexOf(k1))
              && counter < maxAlternatives) {
            alternativesK.add(k1);
            counter++;
            // Logger.getLogger("ListPointsServiceImpl").log(Level.INFO, functionName + ": Matching
            // line: " + KeyFactory.keyToString(k1));
          }
        }
        for (Key<Line> k : alternativesK) {
          Line l = getLineByKey(k, ofy);
          c.addAlternativeLine(l.getLinenum() + " " + l.getRamal());
        }
      } else if (lastPointOwner2.getType() == 21) { // auch für züge alternativen suchen
        //				System.err.println(lastPoint.getOwner() + " " + lastPointOwner2 + " " +
        // lastPoint.getDefaultGeoCell());
        List<Key<Line>> alternativesK = new LinkedList<Key<Line>>();
        Set<TrainNode> tns1 = Dao.getTrainNodes().get(lastNode.getGeoCell());
        Set<TrainNode> tns2 = Dao.getTrainNodes().get(way.get(index).getGeoCell());
        for (TrainNode tn1 : tns1) {
          if (!tn1.getLineKey()
              .equals(lastPoint.getOwner())) { // nicht der Zug der eh schon genommen wird
            for (TrainNode tn2 : tns2) {
              if (tn1.getLineKey().equals(tn2.getLineKey()) // gehören zum gleichen zug
                  && tn1.getIndex() < tn2.getIndex()) { // und der index steig
                alternativesK.add(tn1.getLineKey());
              }
            }
          }
        }
        for (Key<Line> k : alternativesK) {
          Line l = getLineByKey(k, ofy);
          if (!l.getRamal().equals(c.getRamal())) {
            c.addAlternativeLine("Ramal " + l.getRamal());
          }
        }
      }

      walk = Utils.walk(destPoint, new Point(null, dest.getLatitude(), dest.getLongitude(), null));
      lineProxies.add(walk);

      ConnectionProxy cp = new ConnectionProxy(lineProxies);
      return cp;
    } else {
      Logger.getLogger(location).log(Level.INFO, functionName + ": no indirect connection found.");
      return null;
    }
  }