public static void main(String[] args) {
   WebResource wr =
       new WebResource(
           "https://path.com/p/MmptI",
           new Place(42, "Place", 0, 0),
           new Message("42", "horst", Calendar.getInstance().getTime(), "this sucks"));
   wr.resolve();
   log.info(wr);
 }
  public static Collection<WebResource> resolveLinks(List<Message> messages, final Place p) {

    List<Future<WebResource>> futures = new ArrayList<Future<WebResource>>();

    for (final Message m : messages) {
      for (final String url : m.findLinks()) {
        futures.add(
            resolverThreadPool.submit(
                new Callable<WebResource>() {
                  @Override
                  public WebResource call() throws Exception {
                    return new WebResource(url, p, m).resolve();
                  }
                }));
      }
    }
    Map<String, WebResource> resources = new HashMap<String, WebResource>();
    do {
      Iterator<Future<WebResource>> futureIterator = futures.iterator();
      while (futureIterator.hasNext()) {
        Future<WebResource> wrf = futureIterator.next();
        if (wrf.isDone()) {
          futureIterator.remove();
          try {
            WebResource wr = wrf.get();
            if (wr == null || wr.hadErrors()) {
              continue;
            }
            URL u = wr.getUrlObj();
            if (u == null) {
              continue;
            }
            if (!resources.containsKey(wr.getUrl())) {
              resources.put(wr.getUrl(), wr);
            }

          } catch (Exception e) {
            // should not happen, we have already checked if
            // the
            // result is ready.
            e.printStackTrace();
          }
        }
      }
      try {
        Thread.sleep(100);
      } catch (InterruptedException e) {
        log.warn("Unable to sleep");
      }

    } while (futures.size() > 0);
    return resources.values();
  }