package org.ourgrid.broker.controlws.gatewayws.transferserver; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class TransferUtil { private static final String ERROR_TOKEN = "#ERROR#"; private static final String EOF = "#EOF#"; private static final int PACKET_SIZE = 1024; public static void writeTransferHeader(TransferHeader header, OutputStream outputStream) throws IOException { writeToStream(header.toString(), outputStream); } public static TransferHeader readTransferHeader(InputStream inputStream) throws IOException { return TransferHeader.parseHeader(readFromStream(inputStream)); } private static void writeToStream(String string, OutputStream outputStream) throws IOException { byte[] buffer = new byte[PACKET_SIZE]; byte[] strBytes = (string + EOF).getBytes(); for (int i = 0; i < strBytes.length; ++i) { buffer[i] = strBytes[i]; } outputStream.write(buffer); } public static void writeToStream(File sourceFile, OutputStream outputStream) throws IOException { FileInputStream inputStream = null; try { inputStream = new FileInputStream(sourceFile); byte[] buffer = new byte[PACKET_SIZE]; int len = 0; boolean reachEnd = false; int i; while ((len = inputStream.read(buffer)) > 0) { if (len < PACKET_SIZE) { byte[] eofBytes = EOF.getBytes(); for (i = len; i < len + eofBytes.length; ++i) { buffer[i] = eofBytes[(i - len)]; } reachEnd = true; } outputStream.write(buffer); buffer = new byte[PACKET_SIZE]; } if (!(reachEnd)) { buffer = new byte[PACKET_SIZE]; byte[] strBytes = EOF.getBytes(); for (i = 0; i < strBytes.length; ++i) { buffer[i] = strBytes[i]; } outputStream.write(buffer); } inputStream.close(); } catch (IOException e) { outputStream.write(ERROR_TOKEN.getBytes()); throw e; } finally { if (inputStream != null) { inputStream.close(); } } } public static void main(String[] args) throws IOException { FileOutputStream outputStream = new FileOutputStream("teste.tar"); writeTransferHeader(new TransferHeader(1, "remotedir", "filename"), outputStream); writeToStream(new File("spin520.tar.gz"), outputStream); outputStream.close(); FileInputStream inputStream = new FileInputStream("teste.tar"); System.out.println(readTransferHeader(inputStream)); writeFromStream(new File("teste2.tar"), inputStream); inputStream.close(); } public static String readFromStream(InputStream inputStream) throws IOException { byte[] buffer = new byte[PACKET_SIZE]; inputStream.read(buffer); String bytesToString = bytesToString(buffer, buffer.length); return bytesToString.substring(0, bytesToString.indexOf(EOF)); } public static void writeFromStream(File destinationFile, InputStream inputStream) throws IOException { FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(destinationFile); byte buffer[] = new byte[1024]; while (true) { inputStream.read(buffer); String packet = bytesToString(buffer, buffer.length); if(packet.contains(ERROR_TOKEN)) { throw new IOException((new StringBuilder("Error while receiving file ")).append(destinationFile).toString()); } if(packet.contains(EOF)) { for(int i = 0; i < buffer.length - EOF.getBytes().length; i++) { byte copyOfRange[] = copyOfRange(buffer, i, i + EOF.getBytes().length); if(bytesToString(copyOfRange, copyOfRange.length).equals("#EOF#")) { fileOutputStream.write(buffer, 0, i); } } break; } fileOutputStream.write(buffer); buffer = new byte[1024]; } } finally { if(fileOutputStream != null) { fileOutputStream.close(); } } } private static String bytesToString(byte[] buffer, int len) { return new String(buffer, 0, len); } private static byte[] copyOfRange(byte[] original, int from, int to) { int newLength = to - from; if (newLength < 0) throw new IllegalArgumentException(from + " > " + to); byte[] copy = new byte[newLength]; System.arraycopy(original, from, copy, 0, Math.min(original.length - from, newLength)); return copy; } }