package org.ourgrid.peer.business.requester;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.ourgrid.common.interfaces.DiscoveryService;
import org.ourgrid.common.internal.IResponseTO;
import org.ourgrid.common.internal.RequesterIF;
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.internal.response.ScheduleActionWithFixedDelayResponseTO;
import org.ourgrid.common.specification.main.JDLTagsPublisher;
import org.ourgrid.common.statistics.control.LoginControl;
import org.ourgrid.common.statistics.control.PeerControl;
import org.ourgrid.common.statistics.util.hibernate.HibernateUtil;
import org.ourgrid.peer.PeerConfiguration;
import org.ourgrid.peer.PeerConstants;
import org.ourgrid.peer.business.controller.accounting.AccountingConstants;
import org.ourgrid.peer.business.controller.actions.DelayedInterestRegistrationOnDiscoveryService;
import org.ourgrid.peer.business.controller.actions.DiscoveryServiceUpdateAction;
import org.ourgrid.peer.business.controller.actions.InvokeGarbageCollectorAction;
import org.ourgrid.peer.business.controller.actions.RequestWorkersAction;
import org.ourgrid.peer.business.controller.actions.SaveAccountingAction;
import org.ourgrid.peer.business.controller.actions.UpdatePeerUptimeAction;
import org.ourgrid.peer.business.controller.messages.PeerControlMessages;
import org.ourgrid.peer.business.dao.PeerDAOFactory;
import org.ourgrid.peer.communication.dao.PeerCertificationDAO;
import org.ourgrid.peer.communication.receiver.DiscoveryServiceClientReceiver;
import org.ourgrid.peer.communication.receiver.LocalWorkerProviderReceiver;
import org.ourgrid.peer.communication.receiver.RemoteWorkerManagementClientReceiver;
import org.ourgrid.peer.communication.receiver.RemoteWorkerProviderClientReceiver;
import org.ourgrid.peer.communication.receiver.RemoteWorkerProviderReceiver;
import org.ourgrid.peer.communication.receiver.WorkerManagementClientReceiver;
import org.ourgrid.peer.dao.DiscoveryServiceClientDAO;
import org.ourgrid.peer.request.StartPeerRequestTO;
import org.ourgrid.peer.response.AddActionForRepetitionResponseTO;
import br.edu.ufcg.lsd.commune.network.certification.CertificateCRLPair;
import br.edu.ufcg.lsd.commune.network.certification.CertificationUtils;
public class StartPeerRequester implements RequesterIF<StartPeerRequestTO> {
private static final String CONF_XML_PATH = "peer-hibernate.cfg.xml";
public List<IResponseTO> execute(StartPeerRequestTO request) {
PeerDAOFactory.getInstance().reset();
List<IResponseTO> responses = new ArrayList<IResponseTO>();
HibernateUtil.setUp(CONF_XML_PATH);
//Loading glue tags
String glueTagsFilePath = request.getProperties().get(PeerConfiguration.PROP_TAGS_FILE_PATH);
if(glueTagsFilePath != null && !(glueTagsFilePath.length() == 0)){
JDLTagsPublisher.loadGLUETags(glueTagsFilePath);
}
createDAOs(request);
createServices(responses);
//TODO Discovery Service Client
configRepetitionActions(responses);
configBalanceRanking(responses, request.getFilePath());
if (request.shouldJoinCommunity()) {
DeployServiceResponseTO deployTO = new DeployServiceResponseTO();
deployTO.setServiceClass(DiscoveryServiceClientReceiver.class);
deployTO.setServiceName(PeerConstants.DS_CLIENT);
responses.add(deployTO);
String networkStr = request.getNetworkStr();
if (networkStr == null || networkStr.equals("")) {
throw new RuntimeException("Context could not be loaded. " +
"If join community is set to 'yes', Discovery Service network property is required.");
}
List<String> dsAddresses = request.getDsAddress();
DiscoveryServiceClientDAO discoveryServiceClientDAO = PeerDAOFactory.getInstance().getDiscoveryServiceClientDAO();
for (String dsAddress : dsAddresses) {
RegisterInterestResponseTO registerTO = new RegisterInterestResponseTO();
registerTO.setMonitorName(PeerConstants.DS_CLIENT);
registerTO.setMonitorableType(DiscoveryService.class);
registerTO.setMonitorableAddress(dsAddress);
responses.add(registerTO);
discoveryServiceClientDAO.addDsAddress(dsAddress);
}
AddActionForRepetitionResponseTO dsUpdateActionTO = new AddActionForRepetitionResponseTO();
dsUpdateActionTO.setActionClass(DiscoveryServiceUpdateAction.class);
dsUpdateActionTO.setActionName(PeerConstants.DS_ACTION_NAME);
responses.add(dsUpdateActionTO);
AddActionForRepetitionResponseTO delayedInterestTO = new AddActionForRepetitionResponseTO();
delayedInterestTO.setActionClass(DelayedInterestRegistrationOnDiscoveryService.class);
delayedInterestTO.setActionName(PeerConstants.DELAYED_DS_INTEREST_ACTION_NAME);
responses.add(delayedInterestTO);
}
PeerControl.getInstance().updatePeer(responses, request.getMyUserAtServer(), request.getMyCertSubjectDN(), request.getDescription(),
request.getEmail(), request.getLabel(), request.getLatitude(), request.getLongitude());
PeerControl.getInstance().registerPeerStatusChange(responses, request.getMyUserAtServer());
LoginControl.getInstance().clearLogins(responses, request.getMyUserAtServer());
ScheduleActionWithFixedDelayResponseTO peerUpdateTimeScheduleTO = new ScheduleActionWithFixedDelayResponseTO();
peerUpdateTimeScheduleTO.setActionName(PeerConstants.UPDATE_PEER_UPTIME_ACTION_NAME);
peerUpdateTimeScheduleTO.setDelay(PeerConstants.UPDATE_UPTIME_DELAY);
peerUpdateTimeScheduleTO.setTimeUnit(TimeUnit.SECONDS);
responses.add(peerUpdateTimeScheduleTO);
ScheduleActionWithFixedDelayResponseTO invokeGarbageCollectorTO = new ScheduleActionWithFixedDelayResponseTO();
invokeGarbageCollectorTO.setActionName(PeerConstants.INVOKE_GARBAGE_COLLECTOR_ACTION_NAME);
invokeGarbageCollectorTO.setDelay(PeerConstants.INVOKE_GARBAGE_COLLECTOR_DELAY);
invokeGarbageCollectorTO.setTimeUnit(TimeUnit.SECONDS);
responses.add(invokeGarbageCollectorTO);
responses.add(new LoggerResponseTO(PeerControlMessages.getSuccessfullyStartedPeerMessage(),
LoggerResponseTO.INFO));
return responses;
}
private void createDAOs(StartPeerRequestTO request) {
PeerCertificationDAO peerCertificationDAO = PeerDAOFactory.getInstance().getPeerCertificationDAO();
List<CertificateCRLPair> requestingCAsData = CertificationUtils.loadCAsData(
request.getRequestingCACertificatePath());
List<CertificateCRLPair> receivingCAsData = CertificationUtils.loadCAsData(
request.getReceivingCACertificatePath());
peerCertificationDAO.setReceivingCAsData(receivingCAsData);
peerCertificationDAO.setRequestingCAsData(requestingCAsData);
PeerDAOFactory.getInstance().getPeerPropertiesDAO().setRequestRepeatDelayInSeconds(
Integer.valueOf(request.getProperties().get(PeerConfiguration.PROP_REPEAT_REQUEST_DELAY)));
}
private void configRepetitionActions(List<IResponseTO> responses) {
AddActionForRepetitionResponseTO actionTO = new AddActionForRepetitionResponseTO();
actionTO.setActionClass(RequestWorkersAction.class);
actionTO.setActionName(PeerConstants.REQUEST_WORKERS_ACTION_NAME);
responses.add(actionTO);
actionTO = new AddActionForRepetitionResponseTO();
actionTO.setActionClass(SaveAccountingAction.class);
actionTO.setActionName(PeerConstants.SAVE_ACCOUNTING_ACTION_NAME);
responses.add(actionTO);
actionTO = new AddActionForRepetitionResponseTO();
actionTO.setActionClass(UpdatePeerUptimeAction.class);
actionTO.setActionName(PeerConstants.UPDATE_PEER_UPTIME_ACTION_NAME);
responses.add(actionTO);
actionTO = new AddActionForRepetitionResponseTO();
actionTO.setActionClass(InvokeGarbageCollectorAction.class);
actionTO.setActionName(PeerConstants.INVOKE_GARBAGE_COLLECTOR_ACTION_NAME);
responses.add(actionTO);
}
/**
* Load balances from the ranking file and configure the timer to save
* the balances in the file periodically.
*/
private void configBalanceRanking(List<IResponseTO> responses, String filePath) {
PeerDAOFactory.getInstance().getAccountingDAO().loadBalancesRanking(filePath);
long frequence = AccountingConstants.RANKING_SAVING_FREQ;
ScheduleActionWithFixedDelayResponseTO to = new ScheduleActionWithFixedDelayResponseTO();
to.setActionName(PeerConstants.SAVE_ACCOUNTING_ACTION_NAME);
to.setDelay(frequence);
to.setTimeUnit(TimeUnit.SECONDS);
responses.add(to);
}
private void createServices(List<IResponseTO> responses) {
DeployServiceResponseTO to = new DeployServiceResponseTO();
to.setServiceClass(WorkerManagementClientReceiver.class);
to.setServiceName(PeerConstants.WORKER_MANAGEMENT_CLIENT_OBJECT_NAME);
responses.add(to);
to = new DeployServiceResponseTO();
to.setServiceClass(LocalWorkerProviderReceiver.class);
to.setServiceName(PeerConstants.LOCAL_WORKER_PROVIDER);
responses.add(to);
to = new DeployServiceResponseTO();
to.setServiceClass(RemoteWorkerProviderReceiver.class);
to.setServiceName(PeerConstants.REMOTE_WORKER_PROVIDER);
responses.add(to);
to = new DeployServiceResponseTO();
to.setServiceClass(RemoteWorkerProviderClientReceiver.class);
to.setServiceName(PeerConstants.REMOTE_WORKER_PROVIDER_CLIENT);
responses.add(to);
to = new DeployServiceResponseTO();
to.setServiceClass(RemoteWorkerManagementClientReceiver.class);
to.setServiceName(PeerConstants.REMOTE_WORKER_MANAGEMENT_CLIENT);
responses.add(to);
// to = new DeployServiceResponseTO();
// to.setServiceClass(DiscoveryServiceClientController.class);
// to.setServiceName(PeerConstants.DS_CLIENT);
// responses.add(to);
}
}