All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.red5.server.service.Call Maven / Gradle / Ivy

/*
 * RED5 Open Source Media Server - https://github.com/Red5/
 * 
 * Copyright 2006-2016 by respective authors (see below). All rights reserved.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.red5.server.service;

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

import org.red5.server.api.service.IServiceCall;

/**
 * Basic service call (remote call) implementation
 *
 * @author The Red5 Project
 * @author Luke Hubbard, Codegent Ltd ([email protected])
 */
public class Call implements IServiceCall, Externalizable {

    private static final long serialVersionUID = -3699712251588013875L;

    /**
     * Pending status constant
     */
    public static final byte STATUS_PENDING = 0x01;

    /**
     * Success result constant
     */
    public static final byte STATUS_SUCCESS_RESULT = 0x02;

    /**
     * Returned value is null constant
     */
    public static final byte STATUS_SUCCESS_NULL = 0x03;

    /**
     * Service returns no value constant
     */
    public static final byte STATUS_SUCCESS_VOID = 0x04;

    /**
     * Service not found constant
     */
    public static final byte STATUS_SERVICE_NOT_FOUND = 0x10;

    /**
     * Service's method not found constant
     */
    public static final byte STATUS_METHOD_NOT_FOUND = 0x11;

    /**
     * Access denied constant
     */
    public static final byte STATUS_ACCESS_DENIED = 0x12;

    /**
     * Exception on invocation constant
     */
    public static final byte STATUS_INVOCATION_EXCEPTION = 0x13;

    /**
     * General exception constant
     */
    public static final byte STATUS_GENERAL_EXCEPTION = 0x14;

    /**
     * The application for this service is currently shutting down
     */
    public static final byte STATUS_APP_SHUTTING_DOWN = 0x15;

    /**
     * The remote method cannot be invoked because the client is not connected. NOTE that it is possible that this error is returned in the situation where
     * the method has been invoked on the server the connection has failed before the result returned could be read. There is no way to establish whether this has happened.
     */
    public static final byte STATUS_NOT_CONNECTED = 0x20;

    /**
     * Service name
     */
    protected String serviceName;

    /**
     * Service method name
     */
    protected String serviceMethodName;

    /**
     * Call arguments
     */
    protected Object[] arguments = null;

    /**
     * Call status, initial one is pending
     */
    protected byte status = STATUS_PENDING;

    /**
     * Call exception if any, null by default
     */
    protected Exception exception;

    /**
     * Timestamp at which the call was deserialized.
     */
    private long readTime;

    /**
     * Timestamp at which the call was serialized.
     */
    private long writeTime;

    public Call() {
    }

    /**
     * Creates call from method name
     * 
     * @param method
     *            Method name
     */
    public Call(String method) {
        serviceMethodName = method;
    }

    /**
     * Creates call from method name and array of call parameters
     * 
     * @param method
     *            Method name
     * @param args
     *            Call parameters
     */
    public Call(String method, Object[] args) {
        serviceMethodName = method;
        arguments = args;
    }

    /**
     * Creates call from given service name, method name and array of call parameters
     * 
     * @param name
     *            Service name
     * @param method
     *            Service method name
     * @param args
     *            Call parameters
     */
    public Call(String name, String method, Object[] args) {
        serviceName = name;
        serviceMethodName = method;
        arguments = args;
    }

    /**
     * {@inheritDoc}
     */
    public boolean isSuccess() {
        return (status == STATUS_SUCCESS_RESULT) || (status == STATUS_SUCCESS_NULL) || (status == STATUS_SUCCESS_VOID);
    }

    /**
     * {@inheritDoc}
     */
    public String getServiceMethodName() {
        return serviceMethodName;
    }

    /**
     * Setter for service method name
     *
     * @param serviceMethodName
     *            New service method name value
     */
    public void setServiceMethodName(String serviceMethodName) {
        this.serviceMethodName = serviceMethodName;
    }

    /**
     * {@inheritDoc}
     */
    public String getServiceName() {
        return serviceName;
    }

    /**
     * Setter for service name
     *
     * @param serviceName
     *            New service name value
     */
    public void setServiceName(String serviceName) {
        this.serviceName = serviceName;
    }

    /**
     * {@inheritDoc}
     */
    public Object[] getArguments() {
        return arguments;
    }

    /**
     * Setter for arguments.
     *
     * @param args
     *            Arguments.
     */
    public void setArguments(Object[] args) {
        arguments = args;
    }

    /**
     * {@inheritDoc}
     */
    public byte getStatus() {
        return status;
    }

    /**
     * {@inheritDoc}
     */
    public void setStatus(byte status) {
        this.status = status;
    }

    /**
     * {@inheritDoc}
     */
    public long getReadTime() {
        return readTime;
    }

    /**
     * {@inheritDoc}
     */
    public long getWriteTime() {
        return writeTime;
    }

    /**
     * {@inheritDoc}
     */
    public Exception getException() {
        return exception;
    }

    /**
     * {@inheritDoc}
     */
    public void setException(Exception exception) {
        this.exception = exception;
    }

    /** {@inheritDoc} */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("Service: ");
        sb.append(serviceName);
        sb.append(" Method: ");
        sb.append(serviceMethodName);
        if (arguments != null) {
            sb.append(" Num Params: ");
            sb.append(arguments.length);
            for (int i = 0; i < arguments.length; i++) {
                sb.append(' ');
                sb.append(i);
                sb.append(": ");
                sb.append(arguments[i]);
            }
        } else {
            sb.append(" No params");
        }
        return sb.toString();
    }

    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        // keep a time of receipt
        readTime = System.currentTimeMillis();
        // read-in properties
        serviceName = (String) in.readObject();
        serviceMethodName = (String) in.readObject();
        arguments = (Object[]) in.readObject();
        status = in.readByte();
        exception = (Exception) in.readObject();
    }

    public void writeExternal(ObjectOutput out) throws IOException {
        // keep a time of receipt
        writeTime = System.currentTimeMillis();
        // write-out properties
        out.writeObject(serviceName);
        out.writeObject(serviceMethodName);
        out.writeObject(arguments);
        out.writeByte(status);
        out.writeObject(exception);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy