package org.ourgrid.broker.business.requester; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import org.ourgrid.broker.BrokerConstants; import org.ourgrid.broker.business.dao.BrokerDAOFactory; import org.ourgrid.broker.business.dao.PeerDAO; import org.ourgrid.broker.business.messages.BrokerControlMessages; import org.ourgrid.broker.business.scheduler.SchedulerIF; import org.ourgrid.broker.business.scheduler.workqueue.WorkQueueReplication; import org.ourgrid.broker.communication.actions.SchedulerAction; import org.ourgrid.broker.communication.receiver.LocalWorkerProviderClientReceiver; import org.ourgrid.broker.communication.receiver.WorkerClientReceiver; import org.ourgrid.broker.request.StartBrokerRequestTO; import org.ourgrid.common.interfaces.LocalWorkerProvider; import org.ourgrid.common.internal.IResponseTO; import org.ourgrid.common.internal.RequesterIF; import org.ourgrid.common.internal.response.CreateMessageProcessorsResponseTO; import org.ourgrid.common.internal.response.CreateRepeatedActionResponseTO; import org.ourgrid.common.internal.response.DeployServiceResponseTO; import org.ourgrid.common.internal.response.LoggerResponseTO; import org.ourgrid.common.internal.response.RegisterInterestResponseTO; import org.ourgrid.common.job.JobCounter; import org.ourgrid.common.job.PersistentJobCounter; import org.ourgrid.common.job.SimpleJobCounter; import org.ourgrid.common.specification.peer.PeerSpecification; import org.ourgrid.common.util.StringUtil; import org.ourgrid.peer.PeerConstants; /** * Requirement 302 */ public class StartBrokerRequester implements RequesterIF<StartBrokerRequestTO> { public List<IResponseTO> execute(StartBrokerRequestTO request) { BrokerDAOFactory.getInstance().reset(); List<IResponseTO> responses = new ArrayList<IResponseTO>(); createServices(responses); createRepeatedActions(responses); responses.add(new LoggerResponseTO( BrokerControlMessages.getTryingToStartBrokerMessage(), LoggerResponseTO.INFO)); JobCounter jobCounter = createJobCounter(request); BrokerDAOFactory.getInstance().getJobCounterDAO().setJobCounter(jobCounter); initSchedulers(request); for(SchedulerIF scheduler: BrokerDAOFactory.getInstance().getJobDAO().getSchedulers()) { scheduler.start(); } setPeers(request.getPeersUserAtServer(), responses); responses.add( new LoggerResponseTO( BrokerControlMessages.getSuccessfullyStartedBrokerMessage(), LoggerResponseTO.INFO)); return responses; } private void setPeers(List<String> peersUsersAtServer, List<IResponseTO> responses) { List<PeerSpecification> peersSpecs = new LinkedList<PeerSpecification>(); responses.add(new LoggerResponseTO( "Trying to set peers " + peersUsersAtServer.toString(), LoggerResponseTO.INFO)); PeerDAO peerDAO = BrokerDAOFactory.getInstance().getPeerDAO(); for (String peerUserAtServer : peersUsersAtServer) { String peerAddress = StringUtil.userAtServerToAddress(peerUserAtServer, PeerConstants.MODULE_NAME, PeerConstants.LOCAL_WORKER_PROVIDER); RegisterInterestResponseTO to = new RegisterInterestResponseTO(); to.setMonitorableAddress(peerAddress); to.setMonitorableType(LocalWorkerProvider.class); to.setMonitorName(BrokerConstants.LOCAL_WORKER_PROVIDER_CLIENT); responses.add(to); PeerSpecification peerSpec = new PeerSpecification(); peerSpec.setUserAtServer(peerUserAtServer); peersSpecs.add(peerSpec); } peerDAO.setPeers(peersSpecs); for(SchedulerIF scheduler: BrokerDAOFactory.getInstance().getJobDAO().getSchedulers()) { scheduler.setPeers(peersUsersAtServer.toArray(new String[]{})); } } protected void createServices(List<IResponseTO> responses) { DeployServiceResponseTO deployTO = new DeployServiceResponseTO(); deployTO.setServiceName(BrokerConstants.LOCAL_WORKER_PROVIDER_CLIENT); deployTO.setServiceClass(LocalWorkerProviderClientReceiver.class); responses.add(deployTO); deployTO = new DeployServiceResponseTO(); deployTO.setServiceName(BrokerConstants.WORKER_CLIENT); deployTO.setServiceClass(WorkerClientReceiver.class); responses.add(deployTO); createMessageProcessors(responses); } private void createMessageProcessors(List<IResponseTO> responses) { responses.add(new CreateMessageProcessorsResponseTO()); } private void createRepeatedActions(List<IResponseTO> responses) { CreateRepeatedActionResponseTO to = new CreateRepeatedActionResponseTO(); to.setActionName(BrokerConstants.SCHEDULER_ACTION_NAME); to.setRepeatedAction(new SchedulerAction()); responses.add(to); } /** * Factory method for the JobCounter. * @return JobCounter based on the Broker Context */ private JobCounter createJobCounter(StartBrokerRequestTO request) { if (request.isPersistentJobEnable()) { try { return new PersistentJobCounter(request.getJobCounterFilePath()); } catch (IOException e) { } } return new SimpleJobCounter(); } private void initSchedulers(StartBrokerRequestTO request) { String maxReplicas = request.getMaxReplicas(); String maxFails = request.getMaxFails(); String maxBlFails = request.getMaxBlackListFails(); SchedulerIF scheduler = new WorkQueueReplication(Integer.valueOf(maxReplicas), Integer.valueOf(maxFails), Integer.valueOf(maxBlFails)); BrokerDAOFactory.getInstance().getJobDAO().addScheduler(scheduler); } }