package org.ourgrid.broker.controlws.gatewayws.transferserver; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import org.ourgrid.broker.controlws.gatewayws.Broker3GConstants; import br.edu.ufcg.lsd.commune.container.logging.CommuneLogger; import br.edu.ufcg.lsd.commune.container.logging.CommuneLoggerFactory; import br.edu.ufcg.lsd.commune.context.ModuleContext; public class Broker3GTransferServer implements Runnable { private final CommuneLogger logger = CommuneLoggerFactory.getInstance().getLogger("WS3GAPPENDER"); private final ModuleContext context; public Broker3GTransferServer(ModuleContext context) { this.context = context; } public void run() { int port = Integer.parseInt(this.context.getProperty( Broker3GConstants.BROKER_3G_TRANSFERPORT_PROP)); ServerSocket socket; try { socket = new ServerSocket(port); } catch (IOException e) { this.logger.error("Error on server socket creation", e); throw new RuntimeException(e); } while (true) { try { Socket accept = socket.accept(); runSocketThread(accept); } catch (IOException e) { logger.warnException(e); continue; } } } public static void sendFile(String remoteBaseDir, String logicalName, String inputPath, String fileTransferServerAddress, int fileTransferServerPort) throws IOException { Socket socket = null; try { socket = new Socket(fileTransferServerAddress, fileTransferServerPort); TransferHeader transferHeader = new TransferHeader(TransferHeader.PUT, remoteBaseDir, logicalName); TransferUtil.writeTransferHeader(transferHeader, socket.getOutputStream()); TransferUtil.writeToStream(new File(inputPath), socket.getOutputStream()); } finally { if (socket != null) { socket.close(); } } } public static void getFile(String remoteBaseDir, String logicalName, String outputPath, String fileTransferServerAddress, int fileTransferServerPort) throws IOException { Socket socket = null; try { socket = new Socket(fileTransferServerAddress, fileTransferServerPort); TransferHeader transferHeader = new TransferHeader(TransferHeader.GET, remoteBaseDir, logicalName); TransferUtil.writeTransferHeader(transferHeader, socket.getOutputStream()); TransferUtil.writeFromStream(new File(outputPath), socket.getInputStream()); } finally { if (socket != null){ socket.close(); } } } public static void sendFinishTransferMessage(String fileTransferServerAddress, int fileTransferServerPort) throws IOException { Socket socket = null; try { socket = new Socket(fileTransferServerAddress, fileTransferServerPort); TransferHeader transferHeader = new TransferHeader(TransferHeader.CLOSE); TransferUtil.writeTransferHeader(transferHeader, socket.getOutputStream()); } finally { if (socket != null) socket.close(); } } protected void runSocketThread(Socket accept) { try { InputStream inputStream = accept.getInputStream(); TransferHeader transferHeader = TransferUtil.readTransferHeader(inputStream); if (transferHeader.getOperationType() == TransferHeader.CLOSE) { return; } String baseDir = transferHeader.getRemoteBaseDir(); String jobDir = this.context.getProperty(Broker3GConstants.BROKER_3G_TMPDIR_PROP) + File.separator + baseDir; new File(jobDir).mkdirs(); String fullFilePath = jobDir + File.separator + transferHeader.getFileName(); switch (transferHeader.getOperationType()) { case TransferHeader.PUT: TransferUtil.writeFromStream(new File(fullFilePath), inputStream); break; case TransferHeader.GET: TransferUtil.writeToStream(new File(fullFilePath), accept.getOutputStream()); break; default: throw new IOException("Stream in wrong format"); } } catch (Exception e) { this.logger.warnException(e); } finally { try { accept.close(); } catch (IOException e) { this.logger.warnException(e); } } } }