Package vicazh.hyperpool.stream.net.http

Source Code of vicazh.hyperpool.stream.net.http.ReconnectConnection

package vicazh.hyperpool.stream.net.http;

import java.util.*;
import vicazh.hyperpool.Start;
import vicazh.hyperpool.stream.*;
import vicazh.hyperpool.stream.net.Stream;
import java.io.*;
import vicazh.hyperpool.stream.net.*;

class ReconnectConnection extends Connection implements Serializable {

  ReconnectConnection() {
  }

  ReconnectConnection(Service service) {
    super(service);
  }

  public boolean equals(Object obj) {
    return hashCode() == obj.hashCode();
  }

  protected Session getSession() {
    return new ReconnectSession(this);
  }

  synchronized boolean getAccept() {
    if (getSessions().size() == 0)
      return false;
    ReconnectServerStream rss = (ReconnectServerStream) getSessions()
        .get(0).getServer();
    if (rss == null)
      return false;
    if (!rss.accept)
      return false;
    if (getSessions().size() == 1)
      return true;
    ClientStream cs = getSessions().get(1).getClient();
    if (cs == null)
      return true;
    return cs.getMethod() == null;
  }

  int retryindex;

  long index;

  long length;

  transient OutputStream clientout;

  transient OutputStream serverout;

  public void setClient(OutputStream outputstream) throws IOException {
    super.setClient(outputstream);
    clientout = outputstream;
  }

  String client;

  public void setServer(OutputStream outputstream) throws IOException {
    super.setServer(outputstream);
    serverout = outputstream;
    client = getHostName();
  }

  boolean check(Session session) throws IOException {
    Socket socket = ((Stream) getServer()).getSocket();
    while (getAccept()
        && (socket == null ? getClient().outputstream != null
            : !socket.socket.isClosed())
        && retryindex++ < ((ReconnectService) element).getRetry()
        && index < length) {
      Start.logger.fine("file:" + session.getClient().getFile());
      try {
        clientout.close();
      } catch (Exception e) {
      }
      // new ServerStream for processing servers headers
      session.setServer(new NullStream(serverout));
      // new ClientStream, because after close() link to ServerStream will
      // lose
      setServer(new Stream(this, session.getServer()));
      clientout = ((Element) ((Service) element).getElement())
          .get(getServer());
      ((Stream) getClient().outputstream).outputstream = clientout;
      session.getClient().getFields()
          .put("range", "bytes=" + index + "-");
      // new Connection for creating new sessions
      Connection connection = new Connection(new Service());
      connection.setServer((OutputStream) getServer());
      connection.setClient(clientout);
      ClientStream dst = (ClientStream) connection.getClient().outputstream;
      try {
        dst.head(session.getClient().getMethod(), session.getClient()
            .getFile(), session.getClient().getVersion());
        for (Map.Entry<String, String> e : session.getClient()
            .getFields().entrySet())
          dst.field(e.getKey(), e.getValue());
        dst.header();
        clientout.flush();
        return false;
      } catch (Exception e) {
        try {
          Thread
              .sleep(((ReconnectService) element).getTimeout() * 1000);
        } catch (InterruptedException ex) {
        }
      }
    }
    return true;
  }

  synchronized public void remove(Session session) {
    retryindex = 0;
    index = 0;
    length = 0;
    super.remove(session);
  }

}
TOP

Related Classes of vicazh.hyperpool.stream.net.http.ReconnectConnection

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.