Examples of IServiceCall


Examples of org.red5.server.api.service.IServiceCall

   * @param command Command event
   */
  protected void encodeCommand(IoBuffer out, ICommand command) {
    // TODO: tidy up here
    Output output = new org.red5.io.amf.Output(out);
    final IServiceCall call = command.getCall();
    final boolean isPending = (call.getStatus() == Call.STATUS_PENDING);
    log.debug("Call: {} pending: {}", call, isPending);
    if (!isPending) {
      log.debug("Call has been executed, send result");
      Serializer.serialize(output, call.isSuccess() ? "_result" : "_error");
    } else {
      log.debug("This is a pending call, send request");
      final String action = (call.getServiceName() == null) ? call.getServiceMethodName() : call.getServiceName() + '.' + call.getServiceMethodName();
      Serializer.serialize(output, action); // seems right
    }
    if (command instanceof Invoke) {
      Serializer.serialize(output, Integer.valueOf(command.getTransactionId()));
      Serializer.serialize(output, command.getConnectionParams());
    }
    if (call.getServiceName() == null && "connect".equals(call.getServiceMethodName())) {
      // response to initial connect, always use AMF0
      output = new org.red5.io.amf.Output(out);
    } else {
      if (Red5.getConnectionLocal().getEncoding() == Encoding.AMF3) {
        output = new org.red5.io.amf3.Output(out);
      } else {
        output = new org.red5.io.amf.Output(out);
      }
    }
    if (!isPending && (command instanceof Invoke)) {
      IPendingServiceCall pendingCall = (IPendingServiceCall) call;
      if (!call.isSuccess()) {
        log.debug("Call was not successful");
        StatusObject status = generateErrorResult(StatusCodes.NC_CALL_FAILED, call.getException());
        pendingCall.setResult(status);
      }
      Object res = pendingCall.getResult();
      log.debug("Writing result: {}", res);
      Serializer.serialize(output, res);
    } else {
      log.debug("Writing params");
      final Object[] args = call.getArguments();
      if (args != null) {
        for (Object element : args) {
          if (element instanceof ByteBuffer) {
            // a byte buffer indicates that serialization is already complete, send raw
            final ByteBuffer buf = (ByteBuffer) element;
View Full Code Here

Examples of org.red5.server.api.service.IServiceCall

   *            Connection
   * @param invoke
   *            Pending call result event context
   */
  protected void handlePendingCallResult(RTMPConnection conn, Invoke invoke) {
    final IServiceCall call = invoke.getCall();
    final IPendingServiceCall pendingCall = conn.retrievePendingCall(invoke.getTransactionId());
    if (pendingCall != null) {
      // The client sent a response to a previously made call.
      Object[] args = call.getArguments();
      if (args != null && args.length > 0) {
        // TODO: can a client return multiple results?
        pendingCall.setResult(args[0]);
      }
      Set<IPendingServiceCallback> callbacks = pendingCall.getCallbacks();
View Full Code Here

Examples of org.red5.server.api.service.IServiceCall

    notify(method, null);
  }

  /** {@inheritDoc} */
  public void notify(String method, Object[] params) {
    IServiceCall call = new Call(method, params);
    notify(call);
  }
View Full Code Here

Examples of org.red5.server.api.service.IServiceCall

public class RTMPTProtocolEncoder extends RTMPProtocolEncoder {

  @Override
  protected void encodeCommand(IoBuffer out, ICommand command) {
    // if we get an InsufficientBW message for the client, we'll reduce the base tolerance and set drop live to true
    final IServiceCall call = command.getCall();
    if ("onStatus".equals(call.getServiceMethodName()) && call.getArguments().length >= 1) {
      Object arg0 = call.getArguments()[0];
      if ("NetStream.Play.InsufficientBW".equals(((Status) arg0).getCode())) {
        long baseT = getBaseTolerance();
        try {
          // drop the tolerances by half but not less than 500
          setBaseTolerance(Math.max(baseT / 2, 500));
View Full Code Here

Examples of org.red5.server.api.service.IServiceCall

   * @param header      RTMP message header
   * @param message     RTMP message (event)
   * @return            Encoded message data
   */
  public IoBuffer encodeMessage(Header header, IRTMPEvent message) {
    IServiceCall call = null;
    switch (header.getDataType()) {
      case TYPE_CHUNK_SIZE:
        return encodeChunkSize((ChunkSize) message);
      case TYPE_INVOKE:
        log.trace("Invoke {}", message);
        call = ((Invoke) message).getCall();
        if (call != null) {
          log.debug("{}", call.toString());
          Object[] args = call.getArguments();
          if (args != null && args.length > 0) {
            Object a0 = args[0];
            if (a0 instanceof Status) {
              Status status = (Status) a0;
              //code: NetStream.Seek.Notify
View Full Code Here

Examples of org.red5.server.api.service.IServiceCall

  @SuppressWarnings({ "unchecked" })
  @Override
  protected void onCommand(RTMPConnection conn, Channel channel, Header source, ICommand command) {
    log.debug("onCommand {}", command);
    // get the call
    final IServiceCall call = command.getCall();
    log.trace("call: {}", call);
    // get the method name
    final String action = call.getServiceMethodName();
    // If it's a callback for server remote call then pass it over to callbacks handler and return
    if ("_result".equals(action) || "_error".equals(action)) {
      handlePendingCallResult(conn, (Invoke) command);
      return;
    }
    boolean disconnectOnReturn = false;
    // "connected" here means that there is a scope associated with the connection (post-"connect")
    boolean connected = conn.isConnected();
    if (connected) {
      // If this is not a service call then handle connection...
      if (call.getServiceName() == null) {
        StreamAction streamAction = StreamAction.getEnum(action);
        if (log.isDebugEnabled()) {
          log.debug("Stream action: {}", streamAction.toString());
        }
        // TODO change this to an application scope parameter and / or change to the listener pattern
        if (dispatchStreamActions) {
          // pass the stream action event to the handler
          try {
            conn.getScope().getHandler().handleEvent(new StreamActionEvent(streamAction));
          } catch (Exception ex) {
            log.warn("Exception passing stream action: {} to the scope handler", streamAction, ex);
          }
        }
        //if the "stream" action is not predefined a custom type will be returned
        switch (streamAction) {
          case DISCONNECT:
            conn.close();
            break;
          case CREATE_STREAM:
          case INIT_STREAM:
          case CLOSE_STREAM:
          case RELEASE_STREAM:
          case DELETE_STREAM:
          case PUBLISH:
          case PLAY:
          case PLAY2:
          case SEEK:
          case PAUSE:
          case PAUSE_RAW:
          case RECEIVE_VIDEO:
          case RECEIVE_AUDIO:
            IStreamService streamService = (IStreamService) ScopeUtils.getScopeService(conn.getScope(), IStreamService.class, StreamService.class);
            Status status = null;
            try {
              log.debug("Invoking {} from {} with service: {}", new Object[] { call, conn, streamService });
              if (invokeCall(conn, call, streamService)) {
                log.debug("Stream service invoke {} success", action);
              } else {
                status = getStatus(NS_INVALID_ARGUMENT).asStatus();
                status.setDescription(String.format("Failed to %s (stream id: %d)", action, source.getStreamId()));
              }
            } catch (Throwable err) {
              log.error("Error while invoking {} on stream service. {}", action, err);
              status = getStatus(NS_FAILED).asStatus();
              status.setDescription(String.format("Error while invoking %s (stream id: %d)", action, source.getStreamId()));
              status.setDetails(err.getMessage());
            }
            if (status != null) {
              channel.sendStatus(status);
            } else {
              log.debug("Status for {} was null", action);
            }
            break;
          default:
            log.debug("Defaulting to invoke for: {}", action);
            invokeCall(conn, call);
        }
      } else {
        // handle service calls
        invokeCall(conn, call);
      }
    } else {
      if (StreamAction.CONNECT.equals(action)) {
        // Handle connection
        log.debug("connect");
        // Get parameters passed from client to
        // NetConnection#connection
        final Map<String, Object> params = command.getConnectionParams();
        // Get hostname
        String host = getHostname((String) params.get("tcUrl"));
        // app name as path, but without query string if there is one
        String path = (String) params.get("app");
        if (path.indexOf("?") != -1) {
          int idx = path.indexOf("?");
          params.put("queryString", path.substring(idx));
          path = path.substring(0, idx);
        }
        params.put("path", path);
        // connection setup
        conn.setup(host, path, params);
        try {
          // Lookup server scope when connected using host and application name
          IGlobalScope global = server.lookupGlobal(host, path);
          log.trace("Global lookup result: {}", global);
          if (global != null) {
            final IContext context = global.getContext();
            IScope scope = null;
            try {
              // TODO optimize this to use Scope instead of Context
              scope = context.resolveScope(global, path);
              // if global scope connection is not allowed, reject
              if (scope.getDepth() < 1 && !globalScopeConnectionAllowed) {
                call.setStatus(Call.STATUS_ACCESS_DENIED);
                if (call instanceof IPendingServiceCall) {
                  IPendingServiceCall pc = (IPendingServiceCall) call;
                  StatusObject status = getStatus(NC_CONNECT_REJECTED);
                  status.setDescription("Global scope connection disallowed on this server.");
                  pc.setResult(status);
                }
                disconnectOnReturn = true;
              }
              if (scope != null) {
                if (log.isTraceEnabled()) {
                  log.trace("Connecting to: {}", scope);
                }
                if (log.isDebugEnabled()) {
                  log.debug("Connecting to: {}", scope.getName());
                  log.debug("Conn {}, scope {}, call {}", new Object[] { conn, scope, call });
                  log.debug("Call args {}", call.getArguments());
                }
                boolean okayToConnect;
                try {
                  if (call.getArguments() != null) {
                    okayToConnect = conn.connect(scope, call.getArguments());
                  } else {
                    okayToConnect = conn.connect(scope);
                  }
                  if (okayToConnect) {
                    log.debug("Connected - {}", conn.getClient());
                    call.setStatus(Call.STATUS_SUCCESS_RESULT);
                    if (call instanceof IPendingServiceCall) {
                      IPendingServiceCall pc = (IPendingServiceCall) call;
                      //send fmsver and capabilities
                      StatusObject result = getStatus(NC_CONNECT_SUCCESS);
                      result.setAdditional("fmsVer", Red5.getFMSVersion());
                      result.setAdditional("capabilities", Integer.valueOf(31));
                      result.setAdditional("mode", Integer.valueOf(1));
                      result.setAdditional("data", Red5.getDataVersion());
                      pc.setResult(result);
                    }
                    // Measure initial roundtrip time after connecting
                    conn.ping(new Ping(Ping.STREAM_BEGIN, 0, -1));
                    disconnectOnReturn = false;
                  } else {
                    log.debug("Connect failed");
                    call.setStatus(Call.STATUS_ACCESS_DENIED);
                    if (call instanceof IPendingServiceCall) {
                      IPendingServiceCall pc = (IPendingServiceCall) call;
                      pc.setResult(getStatus(NC_CONNECT_REJECTED));
                    }
                    disconnectOnReturn = true;
                  }
                } catch (ClientRejectedException rejected) {
                  log.debug("Connect rejected");
                  call.setStatus(Call.STATUS_ACCESS_DENIED);
                  if (call instanceof IPendingServiceCall) {
                    IPendingServiceCall pc = (IPendingServiceCall) call;
                    StatusObject status = getStatus(NC_CONNECT_REJECTED);
                    Object reason = rejected.getReason();
                    if (reason != null) {
                      status.setApplication(reason);
                      //should we set description?
                      status.setDescription(reason.toString());
                    }
                    pc.setResult(status);
                  }
                  disconnectOnReturn = true;
                }
              }
            } catch (ScopeNotFoundException err) {
              log.warn("Scope not found", err);
              call.setStatus(Call.STATUS_SERVICE_NOT_FOUND);
              if (call instanceof IPendingServiceCall) {
                StatusObject status = getStatus(NC_CONNECT_REJECTED);
                status.setDescription(String.format("No scope '%s' on this server.", path));
                ((IPendingServiceCall) call).setResult(status);
              }
              log.info("Scope {} not found on {}", path, host);
              disconnectOnReturn = true;
            } catch (ScopeShuttingDownException err) {
              log.warn("Scope shutting down", err);
              call.setStatus(Call.STATUS_APP_SHUTTING_DOWN);
              if (call instanceof IPendingServiceCall) {
                StatusObject status = getStatus(NC_CONNECT_APPSHUTDOWN);
                status.setDescription(String.format("Application at '%s' is currently shutting down.", path));
                ((IPendingServiceCall) call).setResult(status);
              }
              log.info("Application at {} currently shutting down on {}", path, host);
              disconnectOnReturn = true;
            }
          } else {
            log.warn("Scope {} not found", path);
            call.setStatus(Call.STATUS_SERVICE_NOT_FOUND);
            if (call instanceof IPendingServiceCall) {
              StatusObject status = getStatus(NC_CONNECT_INVALID_APPLICATION);
              status.setDescription(String.format("No scope '%s' on this server.", path));
              ((IPendingServiceCall) call).setResult(status);
            }
            log.info("No application scope found for {} on host {}", path, host);
            disconnectOnReturn = true;
          }
        } catch (RuntimeException e) {
          call.setStatus(Call.STATUS_GENERAL_EXCEPTION);
          if (call instanceof IPendingServiceCall) {
            IPendingServiceCall pc = (IPendingServiceCall) call;
            pc.setResult(getStatus(NC_CONNECT_FAILED));
          }
          log.error("Error connecting {}", e);
          disconnectOnReturn = true;
        }
        // Evaluate request for AMF3 encoding
        if (Integer.valueOf(3).equals(params.get("objectEncoding"))) {
          if (call instanceof IPendingServiceCall) {
            Object pcResult = ((IPendingServiceCall) call).getResult();
            Map<String, Object> result;
            if (pcResult instanceof Map) {
              result = (Map<String, Object>) pcResult;
              result.put("objectEncoding", 3);
            } else if (pcResult instanceof StatusObject) {
              result = new HashMap<String, Object>();
              StatusObject status = (StatusObject) pcResult;
              result.put("code", status.getCode());
              result.put("description", status.getDescription());
              result.put("application", status.getApplication());
              result.put("level", status.getLevel());
              result.put("objectEncoding", 3);
              ((IPendingServiceCall) call).setResult(result);
            }
          }
          conn.getState().setEncoding(Encoding.AMF3);
        }
      } else {
        // not connected and attempting to send an invoke
        log.warn("Not connected, closing connection");
        conn.close();
      }
    }
    if (command instanceof Invoke) {
      if ((source.getStreamId() != 0) && (call.getStatus() == Call.STATUS_SUCCESS_VOID || call.getStatus() == Call.STATUS_SUCCESS_NULL)) {
        // This fixes a bug in the FP on Intel Macs.
        log.debug("Method does not have return value, do not reply");
        return;
      }
      boolean sendResult = true;
View Full Code Here

Examples of org.red5.server.api.service.IServiceCall

   *
     * @param conn         Connection
     * @param invoke       Pending call result event context
     */
    protected void handlePendingCallResult(RTMPConnection conn, Notify invoke) {
    final IServiceCall call = invoke.getCall();
    final IPendingServiceCall pendingCall = conn.getPendingCall(invoke
        .getInvokeId());
    if (pendingCall != null) {
      // The client sent a response to a previously made call.
      Object[] args = call.getArguments();
      if ((args != null) && (args.length > 0)) {
        // TODO: can a client return multiple results?
        pendingCall.setResult(args[0]);
      }

View Full Code Here

Examples of org.red5.server.api.service.IServiceCall

    notify(method, null);
  }

  /** {@inheritDoc} */
  public void notify(String method, Object[] params) {
    IServiceCall call = new Call(method, params);
    notify(call);
  }
View Full Code Here

Examples of org.red5.server.api.service.IServiceCall

      Header source, Notify invoke, RTMP rtmp) {

    log.debug("Invoke: {}", invoke);

    // Get call
    final IServiceCall call = invoke.getCall();

    // If it's a callback for server remote call then pass it over to
    // callbacks handler and return
    if (call.getServiceMethodName().equals("_result")
        || call.getServiceMethodName().equals("_error")) {
      handlePendingCallResult(conn, invoke);
      return;
    }

    boolean disconnectOnReturn = false;

    // If this is not a service call then handle connection...
    if (call.getServiceName() == null) {
      log.debug("call: {}", call);
      final String action = call.getServiceMethodName();
      if (!conn.isConnected()) {
        // Handle connection
        if (action.equals(ACTION_CONNECT)) {
          log.debug("connect");

          // Get parameters passed from client to
          // NetConnection#connection
          final Map params = invoke.getConnectionParams();

          // Get hostname
          String host = getHostname((String) params.get("tcUrl"));

          // Check up port
          if (host.endsWith(":1935")) {
            // Remove default port from connection string
            host = host.substring(0, host.length() - 5);
          }

          // App name as path, but without query string if there is
          // one
          String path = (String) params.get("app");
          if (path.indexOf("?") != -1) {
            int idx = path.indexOf("?");
            params.put("queryString", path.substring(idx));
            path = path.substring(0, idx);
          }
          params.put("path", path);

          final String sessionId = null;
          conn.setup(host, path, sessionId, params);
          try {
            // Lookup server scope when connected
            // Use host and application name
            IGlobalScope global = server.lookupGlobal(host, path);
            if (global == null) {
              call.setStatus(Call.STATUS_SERVICE_NOT_FOUND);
              if (call instanceof IPendingServiceCall) {
                StatusObject status = getStatus(NC_CONNECT_INVALID_APPLICATION);
                status.setDescription("No scope \"" + path
                    + "\" on this server.");
                ((IPendingServiceCall) call).setResult(status);
              }
              log.info("No application scope found for {} on host {}. Misspelled or missing application folder?", path, host);
              disconnectOnReturn = true;
            } else {
              final IContext context = global.getContext();
              IScope scope = null;
              try {
                scope = context.resolveScope(global, path);
              } catch (ScopeNotFoundException err) {
                call.setStatus(Call.STATUS_SERVICE_NOT_FOUND);
                if (call instanceof IPendingServiceCall) {
                  StatusObject status = getStatus(NC_CONNECT_REJECTED);
                  status.setDescription("No scope \"" + path
                      + "\" on this server.");
                  ((IPendingServiceCall) call)
                      .setResult(status);
                }
                log.info("Scope {} not found on {}", path, host);
                disconnectOnReturn = true;
              } catch (ScopeShuttingDownException err) {
                call.setStatus(Call.STATUS_APP_SHUTTING_DOWN);
                if (call instanceof IPendingServiceCall) {
                  StatusObject status = getStatus(NC_CONNECT_APPSHUTDOWN);
                  status.setDescription("Application at \""
                      + path
                      + "\" is currently shutting down.");
                  ((IPendingServiceCall) call)
                      .setResult(status);
                }
                log.info("Application at {} currently shutting down on {}", path, host);
                disconnectOnReturn = true;
              }
              if (scope != null) {
                log.info("Connecting to: {}", scope);
                // Setup application's classloader to be used for deserializing
                ClassLoader loader = scope.getClassLoader();
                if (loader == null) {
                  // Fallback, should never happen
                  loader = getClass().getClassLoader();
                }
                Thread.currentThread().setContextClassLoader(loader);
               
                boolean okayToConnect;
                try {
                    log.info("DEBUG - conn {}, scope {}, call {}", new Object[]{conn, scope, call});
                    log.info("DEBUG - args {}", call.getArguments());
                  if (call.getArguments() != null) {
                    okayToConnect = conn.connect(scope, call.getArguments());
                  } else {
                    okayToConnect = conn.connect(scope);
                  }
                  if (okayToConnect) {
                    log.debug("Connected - Client: {}", conn.getClient());
                    call.setStatus(Call.STATUS_SUCCESS_RESULT);
                    if (call instanceof IPendingServiceCall) {
                      IPendingServiceCall pc = (IPendingServiceCall) call;
                      pc.setResult(getStatus(NC_CONNECT_SUCCESS));
                    }
                    // Measure initial roundtrip time after
                    // connecting
                    conn.getChannel(2).write(
                        new Ping(Ping.STREAM_CLEAR, 0,
                            -1));
                    conn.startRoundTripMeasurement();
                  } else {
                    log.debug("Connect failed");
                    call
                        .setStatus(Call.STATUS_ACCESS_DENIED);
                    if (call instanceof IPendingServiceCall) {
                      IPendingServiceCall pc = (IPendingServiceCall) call;
                      pc
                          .setResult(getStatus(NC_CONNECT_REJECTED));
                    }
                    disconnectOnReturn = true;
                  }
                } catch (ClientRejectedException rejected) {
                  log.debug("Connect rejected");
                  call.setStatus(Call.STATUS_ACCESS_DENIED);
                  if (call instanceof IPendingServiceCall) {
                    IPendingServiceCall pc = (IPendingServiceCall) call;
                    StatusObject status = getStatus(NC_CONNECT_REJECTED);
                    if (rejected.getReason() != null)
                      status.setApplication(rejected
                          .getReason());
                    pc.setResult(status);
                  }
                  disconnectOnReturn = true;
                }
              }
            }
          } catch (RuntimeException e) {
            call.setStatus(Call.STATUS_GENERAL_EXCEPTION);
            if (call instanceof IPendingServiceCall) {
              IPendingServiceCall pc = (IPendingServiceCall) call;
              pc.setResult(getStatus(NC_CONNECT_FAILED));
            }
            log.error("Error connecting {}", e);
            disconnectOnReturn = true;
          }

          // Evaluate request for AMF3 encoding
          if (Integer.valueOf(3).equals(params.get("objectEncoding"))
              && call instanceof IPendingServiceCall) {
            Object pcResult = ((IPendingServiceCall) call)
                .getResult();
            Map<String, Object> result;
            if (pcResult instanceof Map) {
              result = (Map) pcResult;
              result.put("objectEncoding", 3);
            } else if (pcResult instanceof StatusObject) {
              result = new HashMap<String, Object>();
              StatusObject status = (StatusObject) pcResult;
              result.put("code", status.getCode());
              result.put("description", status.getDescription());
              result.put("application", status.getApplication());
              result.put("level", status.getLevel());
              result.put("objectEncoding", 3);
              ((IPendingServiceCall) call).setResult(result);
            }

            rtmp.setEncoding(Encoding.AMF3);
          }
        }
      } else if (action.equals(ACTION_DISCONNECT)) {
        conn.close();
      } else if (action.equals(ACTION_CREATE_STREAM)
          || action.equals(ACTION_DELETE_STREAM)
          || action.equals(ACTION_RELEASE_STREAM)
          || action.equals(ACTION_PUBLISH)
          || action.equals(ACTION_PLAY) || action.equals(ACTION_SEEK)
          || action.equals(ACTION_PAUSE)
          || action.equals(ACTION_CLOSE_STREAM)
          || action.equals(ACTION_RECEIVE_VIDEO)
          || action.equals(ACTION_RECEIVE_AUDIO)) {
        IStreamService streamService = (IStreamService) getScopeService(
            conn.getScope(), IStreamService.class,
            StreamService.class);
        Status status = null;
        try {
          if (!invokeCall(conn, call, streamService)) {
            status = getStatus(NS_INVALID_ARGUMENT).asStatus();
            status.setDescription("Failed to " + action
                + " (stream ID: " + source.getStreamId() + ")");
          }
        } catch (Throwable err) {
          log.error("Error while invoking " + action
              + " on stream service.", err);
          status = getStatus(NS_FAILED).asStatus();
          status.setDescription("Error while invoking " + action
              + " (stream ID: " + source.getStreamId() + ")");
          status.setDetails(err.getMessage());
        }
        if (status != null) {
          channel.sendStatus(status);
        }
      } else {
        invokeCall(conn, call);
      }
    } else if (conn.isConnected()) {
      // Service calls, must be connected.
      invokeCall(conn, call);
    } else {
      // Warn user attemps to call service without being connected
      log.warn("Not connected, closing connection");
      conn.close();
    }

    if (invoke instanceof Invoke) {
      if ((source.getStreamId() != 0)
          && (call.getStatus() == Call.STATUS_SUCCESS_VOID || call
              .getStatus() == Call.STATUS_SUCCESS_NULL)) {
        // This fixes a bug in the FP on Intel Macs.
        if (log.isDebugEnabled()) {
          log
              .debug("Method does not have return value, do not reply");
View Full Code Here

Examples of org.red5.server.api.service.IServiceCall

 
  /** {@inheritDoc} */
    @Override
  protected void onInvoke(RTMPConnection conn, Channel channel,
      Header source, Notify invoke, RTMP rtmp) {
    final IServiceCall call = invoke.getCall();
    if (call.getServiceMethodName().equals("_result")
        || call.getServiceMethodName().equals("_error")) {
      handlePendingCallResult(conn, invoke);
      return;
    }
   
    if (serviceProvider == null) {
      // Client doesn't support calling methods on him
      call.setStatus(Call.STATUS_METHOD_NOT_FOUND);
      call.setException(new MethodNotFoundException(
          call.getServiceMethodName()));
    } else {
      serviceInvoker.invoke(call, serviceProvider);
    }
   
    if (call instanceof IPendingServiceCall) {
View Full Code Here
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.