Package org.hpi.server

Source Code of org.hpi.server.HPIServerImplProtocol

/**
*
*/
package org.hpi.server;

import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

import org.hpi.data.factoy.HPIDataFactory;
import org.hpi.dialogue.protocol.entities.Invoker;
import org.hpi.dialogue.protocol.entities.User;
import org.hpi.dialogue.protocol.request.DescribeInvokerRequest;
import org.hpi.dialogue.protocol.request.ExecuteInvokerRequest;
import org.hpi.dialogue.protocol.request.ListInvokersRequest;
import org.hpi.dialogue.protocol.request.LoginRequest;
import org.hpi.dialogue.protocol.request.LogoffRequest;
import org.hpi.dialogue.protocol.request.Request;
import org.hpi.dialogue.protocol.request.ServerShutdownRequest;
import org.hpi.dialogue.protocol.response.DescribeInvokerResponse;
import org.hpi.dialogue.protocol.response.ExecuteInvokerResponse;
import org.hpi.dialogue.protocol.response.ListInvokersResponse;
import org.hpi.dialogue.protocol.response.LoginResponse;
import org.hpi.dialogue.protocol.response.LogoffResponse;
import org.hpi.dialogue.protocol.response.Response;
import org.hpi.dialogue.protocol.response.ServerShutdownResponse;
import org.hpi.dialogue.protocol.service.HPIServerProtocol;
import org.hpi.exception.HPIExecuteInvokerException;
import org.hpi.exception.HPISessionException;
import org.hpi.server.session.HPISession;
import org.hpi.server.session.HPISessionManager;
import org.hpi.service.ExecuteInvoker;

/**
* @author Jean Villete
*
*/
class HPIServerImplProtocol extends Thread {

  private Socket      socket = null;
 
  HPIServerImplProtocol(Socket socket) {
    super("HostingInvokerProtocol");
    this.socket = socket;
  }
 
  @Override
  public void run() {
    HPIServerProtocol serverProtocol = null;
    try {
      serverProtocol = new HPIServerProtocol(this.socket);
      Request clientRequest = serverProtocol.readRequest();
      Response response = null;

      // deciding the correct request
      if (clientRequest instanceof LoginRequest) { // login request
        response = this.doLogin((LoginRequest) clientRequest);
      } else if (clientRequest instanceof ListInvokersRequest) { // list invokers request
        response = this.retrieveListInvokers((ListInvokersRequest) clientRequest);
      } else if (clientRequest instanceof DescribeInvokerRequest) { // describe invoker request
        response = this.describeInvoker((DescribeInvokerRequest) clientRequest);
      } else if (clientRequest instanceof ExecuteInvokerRequest) { // execute invoker request
        response = this.executeInvoker((ExecuteInvokerRequest) clientRequest);
      } else if (clientRequest instanceof LogoffRequest) { // logoff request
        response = this.doLogoff((LogoffRequest) clientRequest);
      } else if (clientRequest instanceof ServerShutdownRequest) { // shutdown request
        new Thread() {
          @Override
          public void run() {
            try {
              Thread.sleep(ServerBridge.TIME_CHECK_SHUTDOWN);
              ServerBridge.SHUTDOWN = true;
            } catch (InterruptedException e) {
              throw new RuntimeException(e);
            }
          }
        }.start();
        response = new ServerShutdownResponse("Request to shutdown server received successfully and schedulled to execute in 5 seconds.", Response.Status.SUCCESS);
      } else throw new IllegalStateException("Request type unknown.");
     
      // writing the serialized response
      serverProtocol.writeResponse(response);
    } catch (Exception e) {
      throw new RuntimeException(e);
    } finally {
      if (serverProtocol != null) {
        serverProtocol.closeSocket();
      }
    }
  }
 
  /**
   * Method responsible to manage the execution of the referenced invoker
   * @param clientRequest
   * @return
   */
  private Response executeInvoker(ExecuteInvokerRequest clientRequest) {
    try {
      HPISessionManager sessionManager = HPISessionManager.getInstance();
      sessionManager.updateSession(clientRequest.getSessionId());
     
      HPIDataFactory dataFactory = HPIDataFactory.getInstance();
      Invoker invoker = dataFactory.getInvoker(clientRequest.getInvokeId());
     
      if (invoker != null) {
        ExecuteInvoker service = new ExecuteInvoker(invoker);
        String executionResult = service.runExecutables();
        return new ExecuteInvokerResponse(executionResult, Response.Status.SUCCESS);
      } else {
        return new ExecuteInvokerResponse("No invoker was found for the id: " + clientRequest.getInvokeId(), Response.Status.FAIL);
      }
    } catch (HPISessionException e) {
      return new ExecuteInvokerResponse("The session is not valid. " + e.getMessage(), Response.Status.FAIL);
    } catch (HPIExecuteInvokerException e) {
      return new ExecuteInvokerResponse("Error executing invoker. " + e.getMessage(), Response.Status.FAIL);
    }
  }

  /**
   *
   * @param clientRequest
   * @return
   */
  private Response describeInvoker(DescribeInvokerRequest clientRequest) {
    Invoker invoker = null;
    try {
      HPISessionManager sessionManager = HPISessionManager.getInstance();
      sessionManager.updateSession(clientRequest.getSessionId());
      HPIDataFactory dataFactory = HPIDataFactory.getInstance();
      invoker = dataFactory.getInvoker(clientRequest.getInvokeId());
      if (invoker != null) {
        return new DescribeInvokerResponse(invoker, "Describe/consult invoker command executed successfully.", Response.Status.SUCCESS);
      } else {
        return new DescribeInvokerResponse(invoker, "No invoker was found for the id: " + clientRequest.getInvokeId(), Response.Status.FAIL);
      }
    } catch (HPISessionException e) {
      return new DescribeInvokerResponse(invoker, "The session is not valid. " + e.getMessage(), Response.Status.FAIL);
    }
  }

  /**
   * Method to remove the session of the Session Manager explicitly
   * @param operation
   * @return
   */
  private LogoffResponse doLogoff(LogoffRequest operation) {
    HPISessionManager sessionManager = HPISessionManager.getInstance();
    if (sessionManager.deleteSession(operation.getSessionId())) {
      return new LogoffResponse("The session was removed successfully.", Response.Status.SUCCESS);
    } else {
      return new LogoffResponse("No session was found to remove.", Response.Status.FAIL);
    }
  }

  /**
   * Implementing the service do login and returning the result of it
   * @param request
   * @return
   */
  private LoginResponse doLogin(LoginRequest request) {
    User user = HPIDataFactory.getInstance().getUser(request.getUser().getNickname());
    if (user != null && user.getPassphrase().equals(request.getUser().getPassphrase())) {
      String remoteAddress = this.socket.getRemoteSocketAddress().toString();
      HPISession session = HPISessionManager.getInstance().newSession(user, remoteAddress);
     
      return new LoginResponse(session.getSession_id(), "User logged successfully.", Response.Status.SUCCESS);
    } else {
      return new LoginResponse("invalid session", "User not found or passphrase doesn't match.", Response.Status.FAIL);
    }
  }
 
  /**
   *
   * @param request
   * @return
   */
  private ListInvokersResponse retrieveListInvokers(ListInvokersRequest request) {
    List<Invoker> listInvokers = null;
    try {
      HPISessionManager sessionManager = HPISessionManager.getInstance();
      sessionManager.updateSession(request.getSessionId());
      HPIDataFactory dataFactory = HPIDataFactory.getInstance();
      listInvokers = new ArrayList<Invoker>(dataFactory.getInvokers());
      return new ListInvokersResponse(listInvokers, "List invokers executed successfully.", Response.Status.SUCCESS);
    } catch (HPISessionException e) {
      return new ListInvokersResponse(listInvokers, "The session is not valid. " + e.getMessage(), Response.Status.FAIL);
    }
  }
}
TOP

Related Classes of org.hpi.server.HPIServerImplProtocol

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.