package com.fourinone;
import java.io.Serializable;
import java.rmi.RemoteException;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class WorkerService extends MementoService
{
MigrantWorker migworker;
private Lock lk = new ReentrantLock();
public WorkerService(MigrantWorker migworker) throws RemoteException
{
this.migworker = migworker;
}
@Delegate(interfaceName="com.fourinone.Worker",methodName="setMigrantWorker",policy=DelegatePolicy.Implements)
public synchronized void setExtendedWorker(MigrantWorker migworker) throws RemoteException
{
//System.out.println("setMigrantWorker:"+migworker);
migworker.setHost(this.migworker.getHost());
migworker.setWorkerType(this.migworker.getWorkerType());
migworker.setWorkerJar(this.migworker.getWorkerJar());
migworker.setPort(this.migworker.getPort());
//migworker.setSelfIndex(this.migworker.getSelfIndex());
this.migworker = migworker;
}
//synchronized
@Delegate(interfaceName="com.fourinone.Worker",methodName="doTask",policy=DelegatePolicy.Implements)
public WareHouse doTask(WareHouse inhouse) throws RemoteException
{
//System.out.println("WorkerService doTask:"+inhouse);
//LogUtil.fine("", "", "WorkerService doTask:"+inhouse);
WareHouse wh = null;
try{
if(!ConfigContext.getServiceFlag()){
lk.lock();
migworker.interrupted(false);
}
wh = migworker.doTask(inhouse);
}finally{
if(!ConfigContext.getServiceFlag())
lk.unlock();
}
return wh;
}
@Delegate(interfaceName="com.fourinone.Worker",methodName="stopTask",policy=DelegatePolicy.Implements)
public void stopTask() throws RemoteException,InterruptedException{
if(!ConfigContext.getServiceFlag())
migworker.interrupted(true);
else throw new InterruptedException("Worker public service status cant be interrupted!");
}
@Delegate(interfaceName="com.fourinone.Worker",methodName="receiveMaterials",policy=DelegatePolicy.Implements)
public boolean receive(WareHouse inhouse) throws RemoteException
{
//System.out.println("WorkerService doTask:"+inhouse);
//LogUtil.fine("", "", "WorkerService doTask:"+inhouse);
//synchronized
return migworker.receiveMaterials(inhouse);
}
public static void main(String[] args)
{
/*try{
BeanService.putBean("localhost",true,Integer.parseInt(args[0]),"WorkerService",new WorkerService());
BeanService.putBean("localhost",true,Integer.parseInt(args[0]),"WorkerService2",new WorkerService());
}catch(RemoteException e){
e.printStackTrace();
}*/
}
}