/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.ows;
import java.lang.reflect.Method;
import org.geoserver.platform.Service;
/**
* Hook to indicate the {@link Dispatcher} that a given service object doesn't want its operations
* to be called through reflection to avoid the performance penalty given by the synchronization
* inside {@link Method#invoke(Object, Object...)}.
* <p>
* Service beans (as targeted by {@link Service#getService()}) doesn't need to implement this
* inteface. It actually only makes sense if the service operations execute really fast and are
* supposed to be hit by a large number of concurrent requests, as in the case of GeoWebCache tile
* requests, where the synchronized blocks in the reflective method invocations may impose a
* noticeable performance degradation.
* <p>
* At the time of writing (March 2012) this behaviour has been noticed in both Sun Java6 and Java7
* JDK's, other virtual machine implementations may or may not incurr in such performance penalty.
*/
public interface DirectInvocationService {
/**
* Provides a more direct way of invoking a service operation than using reflection.
*
* @param operationName
* the name of the operation to execute, as declared in the
* {@link Service#getOperations() service operations} for the service descriptor that
* targets this service object.
* @param parameters
* the list of parameters for the actual operation, as if the actual method were
* invoked through {@link Method#invoke(Object, Object...)}
* @return the operation result
* @throws IllegalArgumentException
* if either the operation name or arguments list doesn't match one of the service
* provided operations
* under any other circumstances, specific to the operation being executed
*/
Object invokeDirect(String operationName, Object[] parameters) throws IllegalArgumentException,
Exception;
}