/****************************************************************************
* Copyright (c) 2004, 2009 Composent, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Composent, Inc. - initial API and implementation
*****************************************************************************/
package org.eclipse.ecf.remoteservice.util.tracker;
import org.eclipse.ecf.remoteservice.IRemoteService;
import org.eclipse.ecf.remoteservice.IRemoteServiceReference;
/**
* The <code>IRemoteServiceTrackerCustomizer</code> interface allows a
* <code>RemoteServiceTracker</code> object to customize the service objects that
* are tracked. The <code>IRemoteServiceTrackerCustomizer</code> object is called
* when a service is being added to the <code>RemoteServiceTracker</code> object.
* The <code>IRemoteServiceTrackerCustomizer</code> can then return an object for the
* tracked service. The <code>IRemoteServiceTrackerCustomizer</code> object is also
* called when a tracked service is modified or has been removed from the
* <code>RemoteServiceTracker</code> object.
*
* <p>
* The methods in this interface may be called as the result of a
* <code>IRemoteServiceEvent</code> being received by a <code>RemoteServiceTracker</code>
* object. Since <code>IRemoteServiceEvent</code> s are synchronously delivered by
* the Framework, it is highly recommended that implementations of these methods
* do not register (<code>IRemoteServiceContainerAdapter.registerService</code>), modify (
* <code>IRemoteServiceRegistration.setProperties</code>) or unregister (
* <code>IRemoteServiceRegistration.unregister</code>) a service while being
* synchronized on any object.
*
* <p>
* The <code>RemoteServiceTracker</code> class is thread-safe. It does not call a
* <code>IRemoteServiceTrackerCustomizer</code> object while holding any locks.
* <code>IRemoteServiceTrackerCustomizer</code> implementations must also be
* thread-safe.
* @since 3.0
*
*/
public interface IRemoteServiceTrackerCustomizer {
/**
* A service is being added to the <code>RemoteServiceTracker</code> object.
*
* <p>
* This method is called before a remote service which matched the search
* parameters of the <code>RemoteServiceTracker</code> object is added to it.
* This method should return the IRemoteServic object to be tracked for this
* <code>IRemoteServiceReference</code> object. The returned remote service object is
* stored in the <code>RemoteServiceTracker</code> object and is available from
* the <code>getRemoteService</code> and <code>getRemoteServices</code> methods.
*
* @param reference remote reference to remote service being added to the
* <code>RemoteServiceTracker</code> object.
* @return The remote service object to be tracked for the
* <code>IRemoteServiceReference</code> object or <code>null</code> if
* the <code>IRemoteServiceReference</code> object should not be tracked.
*/
public IRemoteService addingService(IRemoteServiceReference reference);
/**
* A remote service tracked by the <code>RemoteServiceTracker</code> object has been
* modified.
*
* <p>
* This method is called when a remote service being tracked by the
* <code>RemoteServiceTracker</code> object has had it properties modified.
*
* @param reference IRemoteServiceReference to service that has been modified.
* @param remoteService The remote service object for the modified remote service.
*/
public void modifiedService(IRemoteServiceReference reference, IRemoteService remoteService);
/**
* A remote service tracked by the <code>RemoteServiceTracker</code> object has been
* removed.
*
* <p>
* This method is called after a remote service is no longer being tracked by the
* <code>RemoteServiceTracker</code> object.
*
* @param reference IRemoteServiceReference to remote service that has been removed.
* @param remoteService The service object for the removed service.
*/
public void removedService(IRemoteServiceReference reference, IRemoteService remoteService);
}