package jadex.base.service.remote.commands;
import jadex.base.service.remote.IRemoteCommand;
import jadex.base.service.remote.RemoteServiceManagementService;
import jadex.bridge.IComponentIdentifier;
import jadex.bridge.IComponentManagementService;
import jadex.bridge.IExternalAccess;
import jadex.commons.Future;
import jadex.commons.IFuture;
import jadex.commons.concurrent.IResultListener;
import jadex.commons.service.IResultSelector;
import jadex.commons.service.ISearchManager;
import jadex.commons.service.IService;
import jadex.commons.service.IVisitDecider;
import jadex.commons.service.SServiceProvider;
import jadex.micro.IMicroExternalAccess;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
/**
* Command for performing a remote service search.
*/
public class RemoteSearchCommand implements IRemoteCommand
{
//-------- attributes --------
/** The providerid (i.e. the component to start with searching). */
protected Object providerid;
/** The serach manager. */
protected ISearchManager manager;
/** The visit decider. */
protected IVisitDecider decider;
/** The result selector. */
protected IResultSelector selector;
/** The callid. */
protected String callid;
//-------- constructors --------
/**
* Create a new remote search command.
*/
public RemoteSearchCommand()
{
}
/**
* Create a new remote search command.
*/
public RemoteSearchCommand(Object providerid, ISearchManager manager,
IVisitDecider decider, IResultSelector selector, String callid)
{
this.providerid = providerid;
this.manager = manager;
this.decider = decider;
this.selector = selector;
this.callid = callid;
}
//-------- methods --------
/**
* Execute the command.
* @param lrms The local remote management service.
* @return An optional result command that will be
* sent back to the command origin.
*/
public IFuture execute(final IMicroExternalAccess component, RemoteServiceManagementService rsms)
{
final Future ret = new Future();
SServiceProvider.getServiceUpwards(component.getServiceProvider(), IComponentManagementService.class)
.addResultListener(new IResultListener()
// .addResultListener(component.createResultListener(new IResultListener()
{
public void resultAvailable(Object source, Object result)
{
IComponentManagementService cms = (IComponentManagementService)result;
cms.getExternalAccess((IComponentIdentifier)providerid).addResultListener(new IResultListener()
{
public void resultAvailable(Object source, Object result)
{
IExternalAccess exta = (IExternalAccess)result;
// start serach on target component
// System.out.println("rem search start: "+manager+" "+decider+" "+selector);
exta.getServiceProvider().getServices(manager, decider, selector, new ArrayList())
.addResultListener(new IResultListener()
{
public void resultAvailable(Object source, Object result)
{
// System.out.println("rem search end: "+manager+" "+decider+" "+selector+" "+result);
// Create proxy info(s) for service(s)
Object content = null;
if(result instanceof Collection)
{
List res = new ArrayList();
for(Iterator it=((Collection)result).iterator(); it.hasNext(); )
{
IService service = (IService)it.next();
// RemoteServiceManagementService.getProxyInfo(component.getComponentIdentifier(), tmp,
// tmp.getServiceIdentifier(), tmp.getServiceIdentifier().getServiceType());
// ProxyInfo pi = getProxyInfo(component.getComponentIdentifier(), tmp);
// res.add(pi);
res.add(service);
}
content = res;
}
else //if(result instanceof Object[])
{
IService service = (IService)result;
// content = getProxyInfo(component.getComponentIdentifier(), tmp);
content = service;
}
ret.setResult(new RemoteResultCommand(content, null , callid));
}
public void exceptionOccurred(Object source, Exception exception)
{
ret.setResult(new RemoteResultCommand(null, exception, callid));
}
});
}
public void exceptionOccurred(Object source, Exception exception)
{
ret.setResult(new RemoteResultCommand(null, exception, callid));
}
});
}
public void exceptionOccurred(Object source, Exception exception)
{
ret.setResult(new RemoteResultCommand(null, exception, callid));
}
});
return ret;
}
/**
* Get the providerid.
* @return the providerid.
*/
public Object getProviderId()
{
return providerid;
}
/**
* Set the providerid.
* @param providerid The providerid to set.
*/
public void setProviderId(Object providerid)
{
this.providerid = providerid;
}
/**
* Get the manager.
* @return the manager.
*/
public ISearchManager getSearchManager()
{
return manager;
}
/**
* Set the manager.
* @param manager The manager to set.
*/
public void setSearchManager(ISearchManager manager)
{
this.manager = manager;
}
/**
* Get the decider.
* @return the decider.
*/
public IVisitDecider getVisitDecider()
{
return decider;
}
/**
* Set the decider.
* @param decider The decider to set.
*/
public void setVisitDecider(IVisitDecider decider)
{
this.decider = decider;
}
/**
* Get the selector.
* @return the selector.
*/
public IResultSelector getResultSelector()
{
return selector;
}
/**
* Set the selector.
* @param selector The selector to set.
*/
public void setResultSelector(IResultSelector selector)
{
this.selector = selector;
}
/**
* Get the callid.
* @return the callid.
*/
public String getCallId()
{
return callid;
}
/**
* Set the callid.
* @param callid The callid to set.
*/
public void setCallId(String callid)
{
this.callid = callid;
}
/**
* Get the string representation.
*/
public String toString()
{
return "RemoteSearchCommand(providerid=" + providerid + ", manager="
+ manager + ", decider=" + decider + ", selector=" + selector
+ ", callid=" + callid + ")";
}
}