package org.ourgrid.peer.business.requester;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.ourgrid.common.internal.IResponseTO;
import org.ourgrid.common.internal.RequesterIF;
import org.ourgrid.common.internal.response.OperationSucceedResponseTO;
import org.ourgrid.common.specification.worker.WorkerSpecification;
import org.ourgrid.common.statistics.control.WorkerControl;
import org.ourgrid.peer.business.dao.PeerDAOFactory;
import org.ourgrid.peer.request.AddAnnotationsWorkersRequestTO;
import org.ourgrid.peer.to.LocalAllocableWorker;
import org.ourgrid.peer.to.LocalWorker;
public class AddAnnotationsWorkersRequester implements RequesterIF<AddAnnotationsWorkersRequestTO> {
public List<IResponseTO> execute(AddAnnotationsWorkersRequestTO request) {
List<IResponseTO> responses = new ArrayList<IResponseTO>();
if ( request.canComponentBeUsed()) {
// TODO Not sure if we can use like this...
// In this way, I would like to allow anyone to update the peer's
// work.
// if(!getServiceManager().isThisMyPublicKey(senderPubKey)) {
// getServiceManager().getLog().warn(PeerControlMessages.getUnknownSenderSettingWorkersMessage(senderPubKey));
// return;
// }
updateWorkersWithAnnotations( responses, request.getNewWorkersAnnotations() );
OperationSucceedResponseTO to = new OperationSucceedResponseTO();
to.setClientAddress(request.getClientAddress());
}
return responses;
}
private void updateWorkersWithAnnotations(List<IResponseTO> responses, Collection< WorkerSpecification > workersWithTags ) {
for ( WorkerSpecification workerSpec : workersWithTags ) {
updateWorkerWithAnnotations( responses, workerSpec );
}
}
private void updateWorkerWithAnnotations( List<IResponseTO> responses, WorkerSpecification workerSpecWithNewAnnotations ) {
// TODO The name of these methods are bad. Actually, this method checks
// if a worker does not exist. It should be changed to doesWorkerExist
// and then every call for isNewWorker be replaced to !doesWorkExist
String workerUserAtServer = workerSpecWithNewAnnotations.getUserAndServer();
if ( WorkerControl.getInstance().isNewWorker( responses, workerUserAtServer)) {
return;
// TODO Should We send some warn to up methods?
}
LocalWorker localWorker = WorkerControl.getInstance()
.getLocalWorker( responses, workerUserAtServer );
WorkerSpecification newWorkerSpec = localWorker.getWorkerSpecification();
newWorkerSpec.addAllAnnotations( workerSpecWithNewAnnotations.getAnnotations() );
WorkerControl.getInstance().updateWorker( responses, workerUserAtServer, newWorkerSpec.getAttributes(),
newWorkerSpec.getAnnotations());
LocalAllocableWorker allocableWorker = PeerDAOFactory.getInstance().getAllocationDAO().getLocalAllocableWorker(localWorker.getPublicKey());
// If there was no request, no allocable worker was created
if ( allocableWorker != null ) {
allocableWorker.getLocalWorker().setWorkerSpecification( newWorkerSpec );
}
// TODO Should We avail the alocableWorker issues?
}
}