ALF-4738 - preserve linefeed on transfer of destination transfer report.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@22517 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Mark Rogers
2010-09-14 15:23:47 +00:00
parent f95973d7a3
commit 975bac709a

View File

@@ -22,10 +22,15 @@ package org.alfresco.repo.transfer;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.BufferedWriter; import java.io.BufferedWriter;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.TreeMap; import java.util.TreeMap;
@@ -602,20 +607,22 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
int responseStatus = httpClient.executeMethod(hostConfig, getReportRequest, httpState); int responseStatus = httpClient.executeMethod(hostConfig, getReportRequest, httpState);
checkResponseStatus("getReport", responseStatus, getReportRequest); checkResponseStatus("getReport", responseStatus, getReportRequest);
InputStream is = getReportRequest.getResponseBodyAsStream(); InputStream is = getReportRequest.getResponseBodyAsStream();
InputStreamReader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader); // Now copy the response input stream to result.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(result)); final ReadableByteChannel inputChannel = Channels.newChannel(is);
final WritableByteChannel outputChannel = Channels.newChannel(result);
String s = br.readLine(); try
while(s != null)
{ {
bw.write(s); // copy the channels
s = br.readLine(); channelCopy(inputChannel, outputChannel);
}
finally
{
// closing the channels
inputChannel.close();
outputChannel.close();
} }
bw.close();
return; return;
} }
@@ -627,7 +634,7 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
{ {
String error = "Failed to execute HTTP request to target"; String error = "Failed to execute HTTP request to target";
log.debug(error, e); log.debug(error, e);
throw new TransferException(MSG_HTTP_REQUEST_FAILED, new Object[]{"sendManifest", target.toString(), e.toString()}, e); throw new TransferException(MSG_HTTP_REQUEST_FAILED, new Object[]{"getTransferReport", target.toString(), e.toString()}, e);
} }
} }
finally finally
@@ -636,6 +643,31 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
} }
} }
private static void channelCopy(final ReadableByteChannel src, final WritableByteChannel dest) throws IOException
{
final ByteBuffer buffer = ByteBuffer.allocateDirect(2 * 1024);
while (src.read(buffer) != -1)
{
// prepare the buffer to be drained
buffer.flip();
// write to the channel, may block
dest.write(buffer);
// If partial transfer, shift remainder down
// If buffer is empty, same as doing clear()
buffer.compact();
}
// EOF will leave buffer in fill state
buffer.flip();
// make sure the buffer is fully drained.
while (buffer.hasRemaining())
{
dest.write(buffer);
}
}
protected PostMethod getPostMethod() protected PostMethod getPostMethod()
{ {
return httpMethodFactory.createPostMethod(); return httpMethodFactory.createPostMethod();