/*
* Copyright 2008 Alin Dreghiciu.
*
* 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.ops4j.pax.exam.rbc.internal;
import java.lang.reflect.InvocationTargetException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import org.ops4j.pax.exam.RelativeTimeout;
import org.osgi.framework.BundleException;
/**
* Remote BundleContext like access.
* <p>
* TODO: this is probably somewhat too fluffy (too shaky interface) - improve here
*
* @author Alin Dreghiciu (adreghiciu@gmail.com)
* @since 0.3.0, December 10, 2008
*/
public interface RemoteBundleContext extends Remote {
/**
* Timeout specifing that there should be no waiting.
*/
long NO_WAIT = 0;
/**
* Timeout specifing that it should wait forever.
*/
long WAIT_FOREVER = Long.MAX_VALUE;
/**
* Makes a remote call on a service.
*
* @param serviceType
* service class of the remote service
* @param methodName
* method name
* @param methodParamTypes
* method parameters types
* @param filter
* service filter
* @param timeout
* timeout for looking up the service
* @param actualParams
* actual parameters (must match the given method params)
* @return remote call rsult
* @throws NoSuchServiceException
* - If a service of the specified type cannot be located
* @throws NoSuchMethodException
* - If the given method cannot be found
* @throws IllegalAccessException
* - Specified method cannot be accessed
* @throws InvocationTargetException
* - Wraps an eventual exception occured during method invocation
* @throws RemoteException
* - Remote communication related exception (mandatory by RMI)
*/
Object remoteCall(Class<?> serviceType, String methodName, Class<?>[] methodParamTypes,
String filter, RelativeTimeout timeout, Object... actualParams) throws RemoteException,
NoSuchServiceException, NoSuchMethodException, IllegalAccessException,
InvocationTargetException;
/**
* Installs a bundle remotly.
*
* @param bundleUrl
* url of the bundle to be installed. The url must be accessible from the remote OSGi
* container.
* @return bundle id of the installed bundle
* @throws RemoteException
* - Remote communication related exception (mandatory by RMI)
* @throws BundleException
* - Re-thrown from installing the bundle
*/
long installBundle(String bundleUrl) throws RemoteException, BundleException;
/**
* Installs a bundle remotly given the bundle content.
*
* @param bundleLocation
* bundle location
* @param bundle
* bundle content as a byte array
* @return bundle id of the installed bundle
* @throws RemoteException
* - Remote communication related exception (mandatory by RMI)
* @throws BundleException
* - Re-thrown from installing the bundle
*/
long installBundle(String bundleLocation, byte[] bundle) throws RemoteException,
BundleException;
/**
* Starts a bundle.
*
* @param bundleId
* id of the bundle to be started
* @throws RemoteException
* - Remote communication related exception (mandatory by RMI)
* @throws BundleException
* - Re-thrown from starting the bundle
*/
void startBundle(long bundleId) throws RemoteException, BundleException;
/**
* Stops a bundle.
*
* @param bundleId
* id of the bundle to be stopped
* @throws RemoteException
* - Remote communication related exception (mandatory by RMI)
* @throws BundleException
* - Re-thrown from stopping the bundle
*/
void stopBundle(long bundleId) throws RemoteException, BundleException;
/**
* Sets bundle start level.
*
* @param bundleId
* id of the bundle to which the start level should be set
* @param startLevel
* bundle start level
* @throws RemoteException
* - Remote communication related exception (mandatory by RMI)
* @throws BundleException
* - If bundle level cannot be set
*/
void setBundleStartLevel(long bundleId, int startLevel) throws RemoteException, BundleException;
/**
* Waits for a bundle to be in a certain state and returns.
*
* @param bundleId
* bundle id
* @param state
* expected state
* @param timeout
* max time to wait for state
* @throws RemoteException
* - Remote communication related exception (mandatory by RMI)
* @throws BundleException
* - If bundle cannot be found
* @throws org.ops4j.pax.exam.TimeoutException
* - if timeout occured and expected state has not being reached
*/
void waitForState(long bundleId, int state, RelativeTimeout timeout) throws RemoteException,
BundleException;
/**
* @param id
* of bundle to uninstall
* @throws RemoteException
* - Remote communication related exception (mandatory by RMI)
* @throws BundleException
* - If bundle cannot be found
*/
void uninstallBundle(long id) throws RemoteException, BundleException;
}