/*
* DrakkarKeel - An Enterprise Collaborative Search Platform
*
* The contents of this file are subject under the terms described in the
* DRAKKARKEEL_LICENSE file included in this distribution; you may not use this
* file except in compliance with the License.
*
* 2013-2014 DrakkarKeel Platform.
*/
package drakkar.prow.controller;
import Ice.Communicator;
import drakkar.oar.Request;
import drakkar.oar.Response;
import drakkar.oar.callback.GetAMIDCallback;
import drakkar.oar.callback.GetSAMICallback;
import drakkar.oar.callback.SendAMIDCallback;
import drakkar.oar.callback.SendSAMICallback;
import drakkar.oar.exception.InvocationException;
import drakkar.oar.slice.error.RequestException;
import drakkar.oar.slice.server.ServerSidePrxHolder;
import drakkar.oar.util.Invocation;
import drakkar.oar.util.OutputMonitor;
import java.io.IOException;
import java.io.Serializable;
/**
* Esta clase tiene el objetivo de despachar las diferentes de operaciones invocadas
* por el cliente hacia la aplicación servidora.
*
* @deprecated As of DrakkarKeel version 1.1,
* replaced by <code>RequestDispatcher</code>.
*
* @see drakkar.prow.communication.RequestDispatcher
*
*/
public class DispatchController implements Serializable{
private static final long serialVersionUID = 80000000000023L;
private ServerSidePrxHolder serverPrxHolder;
private Communicator comunicator;
/**
* Costructor por defecto de la clase.
*
* @param comunicator objeto Communicator, este es utilizado para efectuar
* la deserialización de los objetos Response retornados
* or el método get(...)
*/
public DispatchController(Communicator comunicator) {
this.serverPrxHolder = new ServerSidePrxHolder();
this.comunicator = comunicator;
}
/**
* Este método ejcuta una operación determinada en el servidor, apartir del
* objeto Request pasado por parámetros
*
* @param request operación a realizar, con sus parámetros de entrada
* @param invocation especifica el modo de invocación de la operación:
* <br>
* <tt>- SYNCHRONOUS_METHOD_INVOCATION: Synchronous Method Invocation</tt><br>
* <tt>- ASYNCHRONOUS_METHOD_INVOCATION: Asynchronous Method Invocation</tt><br>
* <tt>- ASYNCHRONOUS_METHOD_DISPATCH: Asynchronous Method Dispatch</tt><br>
* <tt>- ASYNCHRONOUS_METHOD_INVOCATION_DISPATCH: Asynchronous Method Invocation and Dispatch</tt><br>
* <br>
*/
public void send(Request request, byte invocation) {
if (serverPrxHolder != null) {
try {
switch (invocation) {
case Invocation.SYNCHRONOUS_METHOD_INVOCATION: // case: 0
////////////////////////////////////////////////////////////
this.serverPrxHolder.value.sendSAMI(request.toArray());
break;
////////////////////////////////////////////////////////////
case Invocation.ASYNCHRONOUS_METHOD_INVOCATION: // case: 1
////////////////////////////////////////////////////////////
SendSAMICallback callbackSAMI = new SendSAMICallback();
this.serverPrxHolder.value.sendSAMI_async(callbackSAMI, request.toArray());
break;
////////////////////////////////////////////////////////////
case Invocation.ASYNCHRONOUS_METHOD_DISPATCH: // case: 2
this.serverPrxHolder.value.sendAMID(request.toArray());
break;
////////////////////////////////////////////////////////////
case Invocation.ASYNCHRONOUS_METHOD_INVOCATION_DISPATCH: // case: 3
////////////////////////////////////////////////////////////
SendAMIDCallback callbackAMID = new SendAMIDCallback();
this.serverPrxHolder.value.sendAMID_async(callbackAMID, request.toArray());
break;
////////////////////////////////////////////////////////////
default:
throw new InvocationException("Invalid invocation");
}
} catch (InvocationException ex) {
OutputMonitor.printStream("Invocation not supported ", ex);
} catch (RequestException ex) {
OutputMonitor.printStream("To request ", ex);
} catch (IOException ex) {
OutputMonitor.printStream("Failed or interrupted I/O operations.", ex);
}
}
}
/**
* Este método ejcuta una operación determinada en el servidor, apartir del
* objeto Request pasado por parámetros y devuelve un correspondiente objeto
* Response
*
* @param request operación a realizar, con sus parámetros de entrada
* @param invocation Especifica el modo de invocación de la operación:
* <br>
* <tt>- SYNCHRONOUS_METHOD_INVOCATION: Synchronous Method Invocation</tt><br>
* <tt>- ASYNCHRONOUS_METHOD_INVOCATION: Asynchronous Method Invocation</tt><br>
* <tt>- ASYNCHRONOUS_METHOD_DISPATCH: Asynchronous Method Dispatch</tt><br>
* <tt>- ASYNCHRONOUS_METHOD_INVOCATION_DISPATCH: Asynchronous Method Invocation and Dispatch</tt><br>
* <br>
*
* @return un objeto Response con resultados de la operación ejecutada
*/
public Response get(Request request, byte invocation) {
byte[] array = null;
boolean flag = false;
if (serverPrxHolder != null) {
try {
switch (invocation) {
case (Invocation.SYNCHRONOUS_METHOD_INVOCATION): // case: 0
////////////////////////////////////////////////////////////
array = this.serverPrxHolder.value.getSAMI(request.toArray());
return Response.arrayToResponse(array, comunicator);
////////////////////////////////////////////////////////////
case (Invocation.ASYNCHRONOUS_METHOD_INVOCATION): // case: 1
////////////////////////////////////////////////////////////
GetSAMICallback callbackSAMI = new GetSAMICallback(this.comunicator);
flag = this.serverPrxHolder.value.getSAMI_async(callbackSAMI, request.toArray());
return callbackSAMI.getResponse();
////////////////////////////////////////////////////////////
case (Invocation.ASYNCHRONOUS_METHOD_DISPATCH): // case: 2
////////////////////////////////////////////////////////////
array = this.serverPrxHolder.value.getAMID(request.toArray());
return Response.arrayToResponse(array, comunicator);
////////////////////////////////////////////////////////////
case (Invocation.ASYNCHRONOUS_METHOD_INVOCATION_DISPATCH): // case: 3
////////////////////////////////////////////////////////////
GetAMIDCallback callbackAMID = new GetAMIDCallback(comunicator);
flag = this.serverPrxHolder.value.getAMID_async(callbackAMID, request.toArray());
return callbackAMID.getResponse();
////////////////////////////////////////////////////////////
default:
throw new InvocationException("Invalid invocation");
}
} catch (ClassNotFoundException ex) {
OutputMonitor.printStream("To load in a class", ex);
} catch (InvocationException ex) {
OutputMonitor.printStream("Invocation not supported ", ex);
} catch (RequestException ex) {
OutputMonitor.printStream("Request exception", ex);
} catch (IOException ex) {
OutputMonitor.printStream("Failed or interrupted I/O operations.", ex);
}
}
return null;
}
/**
* Devuelve la instancia de la clase ServerPrxHolder
*
* @return serverPrxHolder
*/
public ServerSidePrxHolder getServerSidePrxHolder() {
return this.serverPrxHolder;
}
/**
* Modifica el objeto ServerSidePrxHolder de la clase
*
* @param serverPrxHolder nuevo ServerSidePrxHolder
*/
public void setServerSidePrxHolder(ServerSidePrxHolder serverPrxHolder) {
this.serverPrxHolder = serverPrxHolder;
}
/**
* Cierra la comuniciación con el servidor
*/
public void disconnect() {
if (this.serverPrxHolder.value != null) {
this.serverPrxHolder.value.disconnect();
this.serverPrxHolder = null;
}
}
}