public void init() throws ServletException {
    super.init();
    try {
      if (getServletContext().getAttribute("SessionData") == null) {
        getServletContext().setAttribute("SessionData", new SessionData());
      }

      if (getServletContext().getAttribute("PeerIpMap") == null) {
        getServletContext().setAttribute("PeerIpMap", new HashMap<String, String>());
      }

      if (getServletContext().getAttribute("ProtocolContainer") == null) {
        PropertyMap thePropertyMap = new PropertyMap();
        thePropertyMap.setProperty("routingprotocol.exchangedelay", "60");
        thePropertyMap.setProperty(
            "routingprotocol.persist", "true".equalsIgnoreCase(getInitParameter("persist")));

        Set<String> theSupportedProtocols = new HashSet<String>();
        theSupportedProtocols.add(RoutingProtocol.ID);
        theSupportedProtocols.add(EchoProtocol.ID);
        theSupportedProtocols.add(MessageProtocol.ID);
        theSupportedProtocols.add(AsyncMessageProcotol.ID);

        ProtocolContainer theProtocolContainer =
            new ProtocolContainer(new ProtocolFactory(thePropertyMap), theSupportedProtocols);

        getServletContext().setAttribute("ProtocolContainer", theProtocolContainer);
      }

      ServerInfo theServerInfo = new ServerInfo(Type.WEB);
      theServerInfo.setServerURL(getServletConfig().getInitParameter("serverurl"));

      getProtocolContainer().setServerInfo(theServerInfo);

      WebPeer theWebPeer =
          (WebPeer)
              ((RoutingProtocol) getProtocolContainer().getProtocol(RoutingProtocol.ID))
                  .getRoutingTable()
                  .getEntryForLocalPeer()
                  .getPeer();
      theWebPeer.setEndPointContainer(
          (EndPointContainer2) getServletContext().getAttribute("EndPoints"));

      try {
        RoutingProtocol theRoutingProtocol =
            (RoutingProtocol) getProtocolContainer().getProtocol(RoutingProtocol.ID);
        WebRoutingTableInspecter theInspector =
            new WebRoutingTableInspecter(getSessionData(), getPeerIpMap());
        theRoutingProtocol.setRoutingTableInspector(theInspector);
      } catch (Exception e) {
        LOGGER.error("Unable to get routingprotocol", e);
      }

    } catch (Exception e) {
      throw new ServletException("Could not init p2p servlet", e);
    }
  }
  public PeerSenderReply sendMessageTo(
      AbstractPeer aSendingPeer, WebPeer aWebPeer, String aMessage, int aTimeoutInSeconds)
      throws IOException {
    //    synchronized (aWebPeer.getPeerId()) {

    //      long t1 = System.currentTimeMillis();
    //      LOGGER.debug("Entering peer to web sender for message '" + aMessage + "' logcounter: " +
    // LOGCOUNTER++);
    //    AbstractURLConnectionHelper theConnectionHelper = new ApacheURLConnectionHelper( new
    // URL(aWebPeer.getURL(), ProtocolWebServer.CONTEXT_PROTOCOL), true );
    AbstractURLConnectionHelper theConnectionHelper =
        new URLConnectionHelper(
            new URL(aWebPeer.getURL(), ProtocolWebServer.CONTEXT_PROTOCOL), true);
    theConnectionHelper.scheduleClose(30, TimeUnit.SECONDS);
    try {
      theConnectionHelper.connectInputOutput();
      //        long t2 = System.currentTimeMillis();
      //        LOGGER.debug("Connecting to '" + aWebPeer.getURL()  + "' took " + (t2 - t1) + "
      // ms");
      theConnectionHelper.write("session", UUID.randomUUID().toString());
      theConnectionHelper.write("peerid", aSendingPeer.getPeerId());
      //      theConnectionHelper.write( "input", aMessage );
      theConnectionHelper.write("input", URLEncoder.encode(aMessage, "UTF-8"));
      //        long t3 = System.currentTimeMillis();
      //        LOGGER.debug("Writing to outputstream of '" + aWebPeer.getURL() + "' took " +
      // (t3-t2) +  " ms");
      //      theConnectionHelper.endLine();
      //      theConnectionHelper.flush();
      theConnectionHelper.endInput();
      String theLine = theConnectionHelper.readLine();
      //        long t4 = System.currentTimeMillis();
      //        LOGGER.debug("Reading from '" + aWebPeer.getURL()  + "' took " + (t4-t3) +  " ms");

      return new PeerSenderReply(theLine, HttpCommunicationInterface.getInstance());
    } catch (IOException e) {
      LOGGER.error(
          "Could not send message to web peer at endpoint: '"
              + aWebPeer.getEndPointRepresentation()
              + "'",
          e);
      // LOGGER.error("Could not send message to web peer at endpoint: '" +
      // aWebPeer.getEndPointRepresentation() + "'");
      throw e;
    } finally {
      theConnectionHelper.close();
    }
  }