/* * Copyright (C) 2011 Universidade Federal de Campina Grande * * This file is part of OurGrid. * * OurGrid is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package org.ourgrid.worker.communication.receiver; import java.io.File; import org.ourgrid.common.interfaces.Worker; import org.ourgrid.common.interfaces.WorkerClient; import org.ourgrid.common.interfaces.to.GridProcessHandle; import org.ourgrid.common.interfaces.to.IncomingHandle; import org.ourgrid.common.interfaces.to.MessageHandle; import org.ourgrid.common.interfaces.to.OutgoingHandle; import org.ourgrid.common.internal.OurGridRequestControl; import org.ourgrid.common.util.FileTransferHandlerUtils; import org.ourgrid.reqtrace.Req; import org.ourgrid.worker.WorkerConfiguration; import org.ourgrid.worker.WorkerConstants; import org.ourgrid.worker.business.dao.WorkerDAOFactory; import org.ourgrid.worker.request.IncomingTransferCompletedRequestTO; import org.ourgrid.worker.request.IncomingTransferFailedRequestTO; import org.ourgrid.worker.request.OutgoingTransferCancelledRequestTO; import org.ourgrid.worker.request.OutgoingTransferCompletedRequestTO; import org.ourgrid.worker.request.OutgoingTransferFailedRequestTO; import org.ourgrid.worker.request.StartWorkRequestTO; import org.ourgrid.worker.request.TransferRejectedRequestTO; import org.ourgrid.worker.request.TransferRequestReceivedRequestTO; import org.ourgrid.worker.request.UpdateTransferProgressRequestTO; import org.ourgrid.worker.request.WorkerClientIsDownRequestTO; import org.ourgrid.worker.request.WorkerClientIsUpRequestTO; import br.edu.ufcg.lsd.commune.api.FailureNotification; import br.edu.ufcg.lsd.commune.api.InvokeOnDeploy; import br.edu.ufcg.lsd.commune.api.MonitoredBy; import br.edu.ufcg.lsd.commune.api.RecoveryNotification; import br.edu.ufcg.lsd.commune.container.servicemanager.ServiceManager; import br.edu.ufcg.lsd.commune.context.ModuleContext; import br.edu.ufcg.lsd.commune.identification.DeploymentID; import br.edu.ufcg.lsd.commune.processor.filetransfer.IncomingTransferHandle; import br.edu.ufcg.lsd.commune.processor.filetransfer.OutgoingTransferHandle; import br.edu.ufcg.lsd.commune.processor.filetransfer.TransferProgress; /** * Worker implementation, called by Broker to start work, * The messages are given to WorkerController. * * @see org.ourgrid.common.interfaces.control.WorkerControl * @see org.ourgrid.worker.communication.receiver.WorkerComponentReceiver */ @Req("REQ003") public class WorkerReceiver implements Worker { private static final long serialVersionUID = 1L; private ServiceManager serviceManager; @Req("REQ079") @InvokeOnDeploy public void init(ServiceManager serviceManager) { this.serviceManager = serviceManager; } /** * @return the serviceManager */ protected ServiceManager getServiceManager() { return serviceManager; } @Req("REQ079") /** * Determines the worker must get prepared for starting its work. For that, * it cannot be working, and both the playpen and the storage directories * must be created. The worker warns its consumer it is ready to work. * * The worker, however, will only consider this message in case the sender's * public key is the same as the client's one. * * This message will not be fully completed if either the playpen or the * storage directories are not able to be created. * * @param workerClient * the client this worker will be working for. * @param requestID the request id associated to the current work session * @param replicaHandle a handle representing the replica. * */ public void startWork(@MonitoredBy(WorkerConstants.WORKER) WorkerClient workerClient, long requestID, GridProcessHandle replicaHandle) { DeploymentID brokerID = getServiceManager().getStubDeploymentID(workerClient); StartWorkRequestTO to = new StartWorkRequestTO(); to.setClientDeploymentID(brokerID.toString()); to.setBrokerPublicKey(brokerID.getPublicKey()); to.setSenderPublicKey(getServiceManager().getSenderPublicKey()); to.setPlaypenRoot(getPlaypenRoot(getServiceManager().getContainerContext())); to.setStorageRoot(getStorageRoot(getServiceManager().getContainerContext())); to.setSenderCerthPath(getServiceManager().getSenderCertPath()); OurGridRequestControl.getInstance().execute(to, getServiceManager()); } @Req("REQ079") /** * Returns the playpen root. * @return the playpen root. */ private String getPlaypenRoot(ModuleContext containerContext) { return containerContext.getProperty(WorkerConfiguration.PROP_PLAYPEN_ROOT); } /** * Returns the storage root. * @return the storage root. */ private String getStorageRoot(ModuleContext containerContext) { return containerContext.getProperty(WorkerConfiguration.PROP_STORAGE_DIR); } @Req("REQ080") public void transferRequestReceived(IncomingTransferHandle handle){ IncomingHandle incomingHandle = new IncomingHandle(); String destinationFile = parseDestinationFile(handle.getDescription()); incomingHandle.setDescription(handle.getDescription()); incomingHandle.setLogicalFileName(handle.getLogicalFileName()); incomingHandle.setLocalFile(new File(destinationFile)); incomingHandle.setFileSize(handle.getFileSize()); incomingHandle.setId(handle.getId()); incomingHandle.setSenderContainerID(handle.getSenderID().getContainerID().toString()); incomingHandle.setExecutable(handle.isExecutable()); incomingHandle.setReadable(handle.isReadable()); incomingHandle.setWritable(handle.isWritable()); TransferRequestReceivedRequestTO to = new TransferRequestReceivedRequestTO(); to.setHandle(incomingHandle); to.setConsumerPublicKey(getServiceManager().getSenderPublicKey()); OurGridRequestControl.getInstance().execute(to, getServiceManager()); } @Req("REQ080") public void incomingTransferFailed(IncomingTransferHandle handle, Exception failCause, long amountWritten) { IncomingHandle incomingHandle = new IncomingHandle(); String destinationFile = parseDestinationFile(handle.getDescription()); incomingHandle.setDescription(handle.getDescription()); incomingHandle.setLogicalFileName(handle.getLogicalFileName()); incomingHandle.setLocalFile(new File(destinationFile)); incomingHandle.setFileSize(handle.getFileSize()); incomingHandle.setId(handle.getId()); incomingHandle.setSenderContainerID(handle.getSenderID().getContainerID().toString()); incomingHandle.setExecutable(handle.isExecutable()); incomingHandle.setReadable(handle.isReadable()); incomingHandle.setWritable(handle.isWritable()); IncomingTransferFailedRequestTO to = new IncomingTransferFailedRequestTO(); to.setSenderPublicKey(handle.getSenderID().getPublicKey()); to.setHandle(incomingHandle); to.setAmountWritten(amountWritten); to.setFailCause(failCause); OurGridRequestControl.getInstance().execute(to, getServiceManager()); } @Req("REQ080") public void incomingTransferCompleted(IncomingTransferHandle handle, long amountWritten) { IncomingHandle incomingHandle = new IncomingHandle(); String destinationFile = parseDestinationFile(handle.getDescription()); incomingHandle.setDescription(handle.getDescription()); incomingHandle.setLogicalFileName(handle.getLogicalFileName()); incomingHandle.setLocalFile(new File(destinationFile)); incomingHandle.setFileSize(handle.getFileSize()); incomingHandle.setId(handle.getId()); incomingHandle.setSenderContainerID(handle.getSenderID().getContainerID().toString()); incomingHandle.setExecutable(handle.isExecutable()); incomingHandle.setWritable(handle.isExecutable()); incomingHandle.setReadable(handle.isReadable()); String senderPublicKey = handle.getSenderID().getPublicKey(); IncomingTransferCompletedRequestTO to = new IncomingTransferCompletedRequestTO(); to.setAmountWritten(amountWritten); to.setHandle(incomingHandle); to.setSenderPublicKey(senderPublicKey); OurGridRequestControl.getInstance().execute(to, getServiceManager()); } @Req("REQ0123") public void updateTransferProgress(TransferProgress transferProgress) { UpdateTransferProgressRequestTO to = new UpdateTransferProgressRequestTO(); to.setAmountWritten(transferProgress.getAmountWritten()); OurGridRequestControl.getInstance().execute(to, getServiceManager()); } @Req("REQ081") public void transferRejected(OutgoingTransferHandle handle) { OutgoingHandle outgoingHandle = new OutgoingHandle(); outgoingHandle.setDescription(handle.getDescription()); outgoingHandle.setDestinationID(handle.getDestinationID().toString()); outgoingHandle.setLocalFile(handle.getLocalFile()); outgoingHandle.setLogicalFileName(handle.getLogicalFileName()); outgoingHandle.setId(handle.getId()); TransferRejectedRequestTO to = new TransferRejectedRequestTO(); to.setSenderPublicKey(getServiceManager().getSenderPublicKey()); to.setHandle(outgoingHandle); OurGridRequestControl.getInstance().execute(to, getServiceManager()); } @Req("REQ081") public void outgoingTransferCancelled(OutgoingTransferHandle handle, long amountUploaded) { OutgoingHandle outgoingHandle = new OutgoingHandle(); outgoingHandle.setDescription(handle.getDescription()); outgoingHandle.setDestinationID(handle.getDestinationID().toString()); outgoingHandle.setLocalFile(handle.getLocalFile()); outgoingHandle.setLogicalFileName(handle.getLogicalFileName()); outgoingHandle.setId(handle.getId()); OutgoingTransferCancelledRequestTO to = new OutgoingTransferCancelledRequestTO(); to.setSenderPublicKey(getServiceManager().getSenderPublicKey()); to.setHandle(outgoingHandle); to.setAmountUploaded(amountUploaded); OurGridRequestControl.getInstance().execute(to, getServiceManager()); } @Req("REQ081") public void outgoingTransferFailed(OutgoingTransferHandle handle, Exception exception, long amountUploaded) { OutgoingHandle outgoingHandle = new OutgoingHandle(); outgoingHandle.setDescription(handle.getDescription()); outgoingHandle.setDestinationID(handle.getDestinationID().toString()); outgoingHandle.setLocalFile(handle.getLocalFile()); outgoingHandle.setLogicalFileName(handle.getLogicalFileName()); outgoingHandle.setId(handle.getId()); OutgoingTransferFailedRequestTO to = new OutgoingTransferFailedRequestTO(); to.setSenderPublicKey(getServiceManager().getSenderPublicKey()); to.setHandle(outgoingHandle); to.setAmountUploaded(amountUploaded); to.setException(exception); OurGridRequestControl.getInstance().execute(to, getServiceManager()); } @Req("REQ081") public void outgoingTransferCompleted(OutgoingTransferHandle handle, long amountUploaded) { OutgoingHandle outgoingHandle = new OutgoingHandle(); outgoingHandle.setDescription(handle.getDescription()); outgoingHandle.setDestinationID(handle.getDestinationID().toString()); outgoingHandle.setLogicalFileName(handle.getLogicalFileName()); outgoingHandle.setLocalFile(handle.getLocalFile()); outgoingHandle.setId(handle.getId()); OutgoingTransferCompletedRequestTO to = new OutgoingTransferCompletedRequestTO(); to.setSenderPublicKey(getServiceManager().getSenderPublicKey()); to.setHandle(outgoingHandle); to.setAmountUploaded(amountUploaded); OurGridRequestControl.getInstance().execute(to, getServiceManager()); } public void shutdown(boolean force) { // TODO Auto-generated method stub } private static String parseDestinationFile(String description) { return FileTransferHandlerUtils.getDestinationFile(description); } @RecoveryNotification public void workerClientIsUp(WorkerClient workerClient) { WorkerClientIsUpRequestTO to = new WorkerClientIsUpRequestTO(); to.setClientAddress(getServiceManager().getSenderServiceID().toString()); to.setClientDeploymentID(getServiceManager().getStubDeploymentID(workerClient).toString()); OurGridRequestControl.getInstance().execute(to, getServiceManager()); } @FailureNotification public void workerClientIsDown(WorkerClient workerClient) { WorkerClientIsDownRequestTO to = new WorkerClientIsDownRequestTO(); to.setClientAddress(getServiceManager().getSenderServiceID().toString()); OurGridRequestControl.getInstance().execute(to, getServiceManager()); } public void sendMessage(MessageHandle handle) { WorkerDAOFactory.getInstance().getWorkerMessageProcessorDAO().getMessageProcessor( handle.getActionName()).process(handle, getServiceManager()); } }