mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Merge BRANCHES/DEV/BRIAN/FSTR to HEAD:
28906: File Transfer Receiver SPRINT1 29365: Initial check in 29378: Configuration properties can now be located in "filetransferreceiver.properties" separated from spring configuration files. 29417: Delete, first check in 29450: Now multiple distinct contents can be send over in one transfer. 29516: 29517: 29531: Manage cases like /F1/F2/F3 ... becoming /F3/F2/F1 29550: FTR: - Tidied project classpath - Removed incorrect reference to OpenOffice RuntimeException in JobLockServiceImpl - Removed references to StringOutputStream git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@29643 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -31,12 +31,18 @@ import java.nio.ByteBuffer;
|
||||
import java.nio.channels.Channels;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
import java.nio.channels.WritableByteChannel;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import org.alfresco.service.cmr.repository.AssociationRef;
|
||||
import org.alfresco.service.cmr.repository.ContentData;
|
||||
import org.alfresco.service.cmr.repository.ContentService;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.transfer.TransferException;
|
||||
import org.alfresco.service.cmr.transfer.TransferProgress;
|
||||
import org.alfresco.service.cmr.transfer.TransferTarget;
|
||||
@@ -68,34 +74,35 @@ import org.json.JSONObject;
|
||||
|
||||
/**
|
||||
* HTTP implementation of TransferTransmitter.
|
||||
*
|
||||
*
|
||||
* Sends data via HTTP to the server.
|
||||
*
|
||||
* @author brian
|
||||
*
|
||||
* @author brian
|
||||
*/
|
||||
public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
{
|
||||
private static final Log log = LogFactory.getLog(HttpClientTransmitterImpl.class);
|
||||
|
||||
|
||||
private static final String MSG_UNSUPPORTED_PROTOCOL = "transfer_service.comms.unsupported_protocol";
|
||||
private static final String MSG_UNSUCCESSFUL_RESPONSE = "transfer_service.comms.unsuccessful_response";
|
||||
private static final String MSG_HTTP_REQUEST_FAILED = "transfer_service.comms.http_request_failed";
|
||||
|
||||
|
||||
private static final int DEFAULT_HTTP_PORT = 80;
|
||||
private static final int DEFAULT_HTTPS_PORT = 443;
|
||||
private static final String HTTP_SCHEME_NAME = "http"; // lowercase is important
|
||||
private static final String HTTPS_SCHEME_NAME = "https"; // lowercase is important
|
||||
|
||||
|
||||
private HttpClient httpClient = null;
|
||||
private Protocol httpProtocol = new Protocol(HTTP_SCHEME_NAME, new DefaultProtocolSocketFactory(), DEFAULT_HTTP_PORT);
|
||||
private Protocol httpsProtocol = new Protocol(HTTPS_SCHEME_NAME, (ProtocolSocketFactory) new SSLProtocolSocketFactory(), DEFAULT_HTTPS_PORT);
|
||||
private Map<String,Protocol> protocolMap = null;
|
||||
private HttpMethodFactory httpMethodFactory = null;
|
||||
private JsonSerializer<Throwable, JSONObject> jsonErrorSerializer;
|
||||
|
||||
|
||||
private ContentService contentService;
|
||||
|
||||
|
||||
|
||||
private NodeService nodeService;
|
||||
|
||||
public HttpClientTransmitterImpl()
|
||||
{
|
||||
protocolMap = new TreeMap<String,Protocol>();
|
||||
@@ -107,7 +114,7 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
httpMethodFactory = new StandardHttpMethodFactoryImpl();
|
||||
jsonErrorSerializer = new ExceptionJsonSerializer();
|
||||
}
|
||||
|
||||
|
||||
public void init()
|
||||
{
|
||||
PropertyCheck.mandatory(this, "contentService", contentService);
|
||||
@@ -115,7 +122,7 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
|
||||
/**
|
||||
* By default this class uses the standard SSLProtocolSocketFactory, but this method allows this to be overridden.
|
||||
* Useful if, for example, one wishes to permit support of self-signed certificates on the target.
|
||||
* Useful if, for example, one wishes to permit support of self-signed certificates on the target.
|
||||
* @param socketFactory
|
||||
*/
|
||||
public void setHttpsSocketFactory(ProtocolSocketFactory socketFactory)
|
||||
@@ -124,7 +131,7 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
}
|
||||
|
||||
/**
|
||||
* By default, this class uses a plain HttpClient instance with the only non-default
|
||||
* By default, this class uses a plain HttpClient instance with the only non-default
|
||||
* option being the multi-threaded connection manager.
|
||||
* Use this method to replace this with your own HttpClient instance configured how you wish
|
||||
* @param httpClient
|
||||
@@ -144,24 +151,24 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
{
|
||||
HostConfiguration hostConfig = getHostConfig(target);
|
||||
HttpState httpState = getHttpState(target);
|
||||
|
||||
|
||||
verifyRequest.setPath(target.getEndpointPath() + "/test");
|
||||
try
|
||||
{
|
||||
int response = httpClient.executeMethod(hostConfig, verifyRequest, httpState);
|
||||
checkResponseStatus("verifyTarget", response, verifyRequest);
|
||||
}
|
||||
}
|
||||
catch (RuntimeException e)
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
String error = "Failed to execute HTTP request to target";
|
||||
log.debug(error, e);
|
||||
throw new TransferException(MSG_HTTP_REQUEST_FAILED, new Object[]{"verifyTraget", target.toString(), e.toString()}, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
verifyRequest.releaseConnection();
|
||||
@@ -176,14 +183,14 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
if (response != 200)
|
||||
{
|
||||
Throwable error = null;
|
||||
try
|
||||
try
|
||||
{
|
||||
log.error("Received \"unsuccessful\" response code from target server: " + response);
|
||||
String errorPayload = method.getResponseBodyAsString();
|
||||
JSONObject errorObj = new JSONObject(errorPayload);
|
||||
error = rehydrateError(errorObj);
|
||||
}
|
||||
catch (Exception ex)
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new TransferException(MSG_UNSUCCESSFUL_RESPONSE, new Object[] {methodName, response});
|
||||
}
|
||||
@@ -206,8 +213,8 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
protected HttpState getHttpState(TransferTarget target)
|
||||
{
|
||||
HttpState httpState = new HttpState();
|
||||
httpState.setCredentials(new AuthScope(target.getEndpointHost(), target.getEndpointPort(),
|
||||
AuthScope.ANY_REALM),
|
||||
httpState.setCredentials(new AuthScope(target.getEndpointHost(), target.getEndpointPort(),
|
||||
AuthScope.ANY_REALM),
|
||||
new UsernamePasswordCredentials(target.getUsername(), new String(target.getPassword())));
|
||||
return httpState;
|
||||
}
|
||||
@@ -223,7 +230,7 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
{
|
||||
throw new TransferException(MSG_UNSUPPORTED_PROTOCOL, new Object[] {target.getEndpointProtocol()});
|
||||
}
|
||||
|
||||
|
||||
Protocol protocol = protocolMap.get(requiredProtocol.toLowerCase().trim());
|
||||
if (protocol == null) {
|
||||
log.error("Unsupported protocol: " + target.getEndpointProtocol());
|
||||
@@ -242,32 +249,45 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
{
|
||||
HostConfiguration hostConfig = getHostConfig(target);
|
||||
HttpState httpState = getHttpState(target);
|
||||
|
||||
|
||||
beginRequest.setPath(target.getEndpointPath() + "/begin");
|
||||
try
|
||||
{
|
||||
beginRequest.setRequestBody( new NameValuePair[] {
|
||||
NameValuePair[] nameValuePair = new NameValuePair[] {
|
||||
new NameValuePair(TransferCommons.PARAM_FROM_REPOSITORYID, fromRepositoryId),
|
||||
new NameValuePair(TransferCommons.PARAM_ALLOW_TRANSFER_TO_SELF, "false"),
|
||||
new NameValuePair(TransferCommons.PARAM_VERSION_EDITION, fromVersion.getEdition()),
|
||||
new NameValuePair(TransferCommons.PARAM_VERSION_MAJOR, fromVersion.getVersionMajor()),
|
||||
new NameValuePair(TransferCommons.PARAM_VERSION_MINOR, fromVersion.getVersionMinor()),
|
||||
new NameValuePair(TransferCommons.PARAM_VERSION_REVISION, fromVersion.getVersionRevision()),
|
||||
new NameValuePair(TransferCommons.PARAM_VERSION_EDITION, fromVersion.getEdition())
|
||||
});
|
||||
|
||||
new NameValuePair(TransferCommons.PARAM_VERSION_REVISION, fromVersion.getVersionRevision())
|
||||
};
|
||||
|
||||
//add the parameter defining the root of the transfer on the file system if exist
|
||||
NodeRef transferRootNode = this.getFileTransferRootNodeRef(target.getNodeRef());
|
||||
if (transferRootNode != null)
|
||||
{
|
||||
//add the parameter
|
||||
ArrayList<NameValuePair> nameValuePairArrayList= new ArrayList<NameValuePair>(nameValuePair.length + 1);
|
||||
Collections.addAll(nameValuePairArrayList,nameValuePair);
|
||||
nameValuePairArrayList.add(new NameValuePair(TransferCommons.PARAM_ROOT_FILE_TRANSFER, transferRootNode.toString()));
|
||||
nameValuePair = nameValuePairArrayList.toArray(new NameValuePair[0]);
|
||||
}
|
||||
|
||||
beginRequest.setRequestBody(nameValuePair);
|
||||
|
||||
int responseStatus = httpClient.executeMethod(hostConfig, beginRequest, httpState);
|
||||
|
||||
|
||||
checkResponseStatus("begin", responseStatus, beginRequest);
|
||||
//If we get here then we've received a 200 response
|
||||
//We're expecting the transfer id encoded in a JSON object...
|
||||
JSONObject response = new JSONObject(beginRequest.getResponseBodyAsString());
|
||||
|
||||
|
||||
Transfer transfer = new Transfer();
|
||||
transfer.setTransferTarget(target);
|
||||
|
||||
|
||||
String transferId = response.getString(TransferCommons.PARAM_TRANSFER_ID);
|
||||
transfer.setTransferId(transferId);
|
||||
|
||||
|
||||
if(response.has(TransferCommons.PARAM_VERSION_MAJOR))
|
||||
{
|
||||
String versionMajor = response.getString(TransferCommons.PARAM_VERSION_MAJOR);
|
||||
@@ -282,26 +302,26 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
TransferVersion version = new TransferVersionImpl("0", "0", "0", "Unknown");
|
||||
transfer.setToVersion(version);
|
||||
}
|
||||
|
||||
|
||||
if(log.isDebugEnabled())
|
||||
{
|
||||
log.debug("begin transfer transferId:" + transferId +", target:" + target);
|
||||
}
|
||||
|
||||
|
||||
return transfer;
|
||||
}
|
||||
}
|
||||
catch (RuntimeException e)
|
||||
{
|
||||
log.debug("unexpected exception", e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
String error = "Failed to execute HTTP request to target";
|
||||
log.debug(error, e);
|
||||
throw new TransferException(MSG_HTTP_REQUEST_FAILED, new Object[] {"begin", target.toString(), e.toString()}, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
log.debug("releasing connection");
|
||||
@@ -314,38 +334,38 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
TransferTarget target = transfer.getTransferTarget();
|
||||
PostMethod postSnapshotRequest = getPostMethod();
|
||||
MultipartRequestEntity requestEntity;
|
||||
|
||||
|
||||
if(log.isDebugEnabled())
|
||||
{
|
||||
log.debug("does manifest exist? " + manifest.exists());
|
||||
log.debug("sendManifest file : " + manifest.getAbsoluteFile());
|
||||
}
|
||||
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
HostConfiguration hostConfig = getHostConfig(target);
|
||||
HttpState httpState = getHttpState(target);
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
postSnapshotRequest.setPath(target.getEndpointPath() + "/post-snapshot");
|
||||
|
||||
|
||||
//Put the transferId on the query string
|
||||
postSnapshotRequest.setQueryString(
|
||||
new NameValuePair[] {new NameValuePair("transferId", transfer.getTransferId())});
|
||||
|
||||
|
||||
//TODO encapsulate the name of the manifest part
|
||||
//And add the manifest file as a "part"
|
||||
Part file = new FilePart(TransferCommons.PART_NAME_MANIFEST, manifest);
|
||||
requestEntity = new MultipartRequestEntity(new Part[] {file}, postSnapshotRequest.getParams());
|
||||
postSnapshotRequest.setRequestEntity(requestEntity);
|
||||
|
||||
|
||||
int responseStatus = httpClient.executeMethod(hostConfig, postSnapshotRequest, httpState);
|
||||
checkResponseStatus("sendManifest", responseStatus, postSnapshotRequest);
|
||||
|
||||
|
||||
InputStream is = postSnapshotRequest.getResponseBodyAsStream();
|
||||
|
||||
|
||||
final ReadableByteChannel inputChannel = Channels.newChannel(is);
|
||||
final WritableByteChannel outputChannel = Channels.newChannel(result);
|
||||
try
|
||||
@@ -358,20 +378,20 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
inputChannel.close();
|
||||
outputChannel.close();
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (RuntimeException e)
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
String error = "Failed to execute HTTP request to target";
|
||||
log.debug(error, e);
|
||||
throw new TransferException(MSG_HTTP_REQUEST_FAILED, new Object[]{"sendManifest", target.toString(), e.toString()}, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
postSnapshotRequest.releaseConnection();
|
||||
@@ -386,30 +406,30 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
{
|
||||
HostConfiguration hostConfig = getHostConfig(target);
|
||||
HttpState httpState = getHttpState(target);
|
||||
|
||||
|
||||
abortRequest.setPath(target.getEndpointPath() + "/abort");
|
||||
//Put the transferId on the query string
|
||||
abortRequest.setQueryString(
|
||||
new NameValuePair[] {new NameValuePair("transferId", transfer.getTransferId())});
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
int responseStatus = httpClient.executeMethod(hostConfig, abortRequest, httpState);
|
||||
checkResponseStatus("abort", responseStatus, abortRequest);
|
||||
//If we get here then we've received a 200 response
|
||||
//We're expecting the transfer id encoded in a JSON object...
|
||||
}
|
||||
}
|
||||
catch (RuntimeException e)
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
String error = "Failed to execute HTTP request to target";
|
||||
log.debug(error, e);
|
||||
throw new TransferException(MSG_HTTP_REQUEST_FAILED, new Object[]{"abort", target.toString(), e.toString()}, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
abortRequest.releaseConnection();
|
||||
@@ -424,7 +444,7 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
{
|
||||
HostConfiguration hostConfig = getHostConfig(target);
|
||||
HttpState httpState = getHttpState(target);
|
||||
|
||||
|
||||
commitRequest.setPath(target.getEndpointPath() + "/commit");
|
||||
//Put the transferId on the query string
|
||||
commitRequest.setQueryString(
|
||||
@@ -435,18 +455,18 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
checkResponseStatus("commit", responseStatus, commitRequest);
|
||||
//If we get here then we've received a 200 response
|
||||
//We're expecting the transfer id encoded in a JSON object...
|
||||
}
|
||||
}
|
||||
catch (RuntimeException e)
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
String error = "Failed to execute HTTP request to target";
|
||||
log.error(error, e);
|
||||
throw new TransferException(MSG_HTTP_REQUEST_FAILED, new Object[]{"commit", target.toString(), e.toString()}, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
commitRequest.releaseConnection();
|
||||
@@ -461,7 +481,7 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
{
|
||||
HostConfiguration hostConfig = getHostConfig(target);
|
||||
HttpState httpState = getHttpState(target);
|
||||
|
||||
|
||||
prepareRequest.setPath(target.getEndpointPath() + "/prepare");
|
||||
//Put the transferId on the query string
|
||||
prepareRequest.setQueryString(
|
||||
@@ -472,18 +492,18 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
checkResponseStatus("prepare", responseStatus, prepareRequest);
|
||||
//If we get here then we've received a 200 response
|
||||
//We're expecting the transfer id encoded in a JSON object...
|
||||
}
|
||||
}
|
||||
catch (RuntimeException e)
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
String error = "Failed to execute HTTP request to target";
|
||||
log.debug(error, e);
|
||||
throw new TransferException(MSG_HTTP_REQUEST_FAILED, new Object[]{"prepare", target.toString(), e.toString()}, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
prepareRequest.releaseConnection();
|
||||
@@ -491,7 +511,7 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
public void sendContent(Transfer transfer, Set<ContentData> data) throws TransferException
|
||||
{
|
||||
@@ -514,54 +534,54 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
//Put the transferId on the query string
|
||||
postContentRequest.setQueryString(
|
||||
new NameValuePair[] {new NameValuePair("transferId", transfer.getTransferId())});
|
||||
|
||||
|
||||
//Put the transferId on the query string
|
||||
postContentRequest.setQueryString(
|
||||
new NameValuePair[] {new NameValuePair("transferId", transfer.getTransferId())});
|
||||
|
||||
|
||||
Part[] parts = new Part[data.size()];
|
||||
|
||||
|
||||
int index = 0;
|
||||
for(ContentData content : data)
|
||||
{
|
||||
{
|
||||
String contentUrl = content.getContentUrl();
|
||||
String fileName = TransferCommons.URLToPartName(contentUrl);
|
||||
log.debug("content partName: " + fileName);
|
||||
|
||||
parts[index++] = new ContentDataPart(getContentService(), fileName, content);
|
||||
|
||||
parts[index++] = new ContentDataPart(getContentService(), fileName, content);
|
||||
}
|
||||
|
||||
|
||||
MultipartRequestEntity requestEntity = new MultipartRequestEntity(parts, postContentRequest.getParams());
|
||||
postContentRequest.setRequestEntity(requestEntity);
|
||||
|
||||
int responseStatus = httpClient.executeMethod(hostConfig, postContentRequest, httpState);
|
||||
checkResponseStatus("sendContent", responseStatus, postContentRequest);
|
||||
|
||||
|
||||
if(log.isDebugEnabled())
|
||||
{
|
||||
log.debug("sent content");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
catch (RuntimeException e)
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
String error = "Failed to execute HTTP request to target";
|
||||
log.debug(error, e);
|
||||
throw new TransferException(MSG_HTTP_REQUEST_FAILED, new Object[]{"sendContent", target.toString(), e.toString()}, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
postContentRequest.releaseConnection();
|
||||
}
|
||||
} // end of sendContent
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
public TransferProgress getStatus(Transfer transfer) throws TransferException
|
||||
{
|
||||
@@ -571,12 +591,12 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
{
|
||||
HostConfiguration hostConfig = getHostConfig(target);
|
||||
HttpState httpState = getHttpState(target);
|
||||
|
||||
|
||||
statusRequest.setPath(target.getEndpointPath() + "/status");
|
||||
//Put the transferId on the query string
|
||||
statusRequest.setQueryString(
|
||||
new NameValuePair[] {new NameValuePair("transferId", transfer.getTransferId())});
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
int responseStatus = httpClient.executeMethod(hostConfig, statusRequest, httpState);
|
||||
@@ -584,45 +604,45 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
//If we get here then we've received a 200 response
|
||||
String statusPayload = statusRequest.getResponseBodyAsString();
|
||||
JSONObject statusObj = new JSONObject(statusPayload);
|
||||
//We're expecting the transfer progress encoded in a JSON object...
|
||||
//We're expecting the transfer progress encoded in a JSON object...
|
||||
int currentPosition = statusObj.getInt("currentPosition");
|
||||
int endPosition = statusObj.getInt("endPosition");
|
||||
String statusStr= statusObj.getString("status");
|
||||
|
||||
|
||||
TransferProgress p = new TransferProgress();
|
||||
|
||||
|
||||
if(statusObj.has("error"))
|
||||
{
|
||||
JSONObject errorJSON = statusObj.getJSONObject("error");
|
||||
Throwable throwable = rehydrateError(errorJSON);
|
||||
p.setError(throwable);
|
||||
}
|
||||
|
||||
|
||||
p.setStatus(TransferProgress.Status.valueOf(statusStr));
|
||||
p.setCurrentPosition(currentPosition);
|
||||
p.setEndPosition(endPosition);
|
||||
|
||||
|
||||
return p;
|
||||
}
|
||||
}
|
||||
catch (RuntimeException e)
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
String error = "Failed to execute HTTP request to target";
|
||||
log.debug(error, e);
|
||||
throw new TransferException(MSG_HTTP_REQUEST_FAILED, new Object[]{"status", target.toString(), e.toString()}, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
statusRequest.releaseConnection();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
public void getTransferReport(Transfer transfer, OutputStream result)
|
||||
{
|
||||
@@ -632,20 +652,20 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
{
|
||||
HostConfiguration hostConfig = getHostConfig(target);
|
||||
HttpState httpState = getHttpState(target);
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
getReportRequest.setPath(target.getEndpointPath() + "/report");
|
||||
|
||||
|
||||
//Put the transferId on the query string
|
||||
getReportRequest.setQueryString(
|
||||
new NameValuePair[] {new NameValuePair("transferId", transfer.getTransferId())});
|
||||
|
||||
|
||||
int responseStatus = httpClient.executeMethod(hostConfig, getReportRequest, httpState);
|
||||
checkResponseStatus("getReport", responseStatus, getReportRequest);
|
||||
|
||||
|
||||
InputStream is = getReportRequest.getResponseBodyAsStream();
|
||||
|
||||
|
||||
// Now copy the response input stream to result.
|
||||
final ReadableByteChannel inputChannel = Channels.newChannel(is);
|
||||
final WritableByteChannel outputChannel = Channels.newChannel(result);
|
||||
@@ -660,46 +680,46 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
inputChannel.close();
|
||||
outputChannel.close();
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (RuntimeException e)
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
String error = "Failed to execute HTTP request to target";
|
||||
log.debug(error, e);
|
||||
throw new TransferException(MSG_HTTP_REQUEST_FAILED, new Object[]{"getTransferReport", target.toString(), e.toString()}, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
getReportRequest.releaseConnection();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void channelCopy(final ReadableByteChannel src, final WritableByteChannel dest) throws IOException
|
||||
|
||||
private static void channelCopy(final ReadableByteChannel src, final WritableByteChannel dest) throws IOException
|
||||
{
|
||||
final ByteBuffer buffer = ByteBuffer.allocateDirect(2 * 1024);
|
||||
while (src.read(buffer) != -1)
|
||||
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())
|
||||
while (buffer.hasRemaining())
|
||||
{
|
||||
dest.write(buffer);
|
||||
}
|
||||
@@ -709,20 +729,20 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
{
|
||||
return httpMethodFactory.createPostMethod();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param errorJSON A JSON object expected to hold the name of the error class ("errorType"),
|
||||
* the error message ("errorMessage"), and, optionally, the Alfresco message id ("alfrescoErrorId")
|
||||
* and Alfresco message parameters ("alfrescoErrorParams").
|
||||
* @return The rehydrated error object, or null if errorJSON is null.
|
||||
* @throws JSONException if an error occurs while parsing the supplied JSON object
|
||||
*/
|
||||
private Throwable rehydrateError(JSONObject errorJSON)
|
||||
private Throwable rehydrateError(JSONObject errorJSON)
|
||||
{
|
||||
return jsonErrorSerializer.deserialize(errorJSON);
|
||||
}
|
||||
|
||||
|
||||
public void setContentService(ContentService contentService)
|
||||
{
|
||||
this.contentService = contentService;
|
||||
@@ -741,5 +761,26 @@ public class HttpClientTransmitterImpl implements TransferTransmitter
|
||||
public void setJsonErrorSerializer(JsonSerializer<Throwable, JSONObject> jsonErrorSerializer)
|
||||
{
|
||||
this.jsonErrorSerializer = jsonErrorSerializer;
|
||||
}
|
||||
}
|
||||
|
||||
public void setNodeService(NodeService nodeService)
|
||||
{
|
||||
this.nodeService = nodeService;
|
||||
}
|
||||
|
||||
private NodeRef getFileTransferRootNodeRef(NodeRef transferNodeRef)
|
||||
{
|
||||
//testing if transferring to file system
|
||||
if(!nodeService.hasAspect(transferNodeRef, TransferModel.ASPECT_FILE_TRANSFER_TARGET))
|
||||
return null;
|
||||
|
||||
//get association
|
||||
List<AssociationRef> assocs = nodeService.getTargetAssocs(transferNodeRef, TransferModel.ASSOC_ROOT_FILE_TRANSFER);
|
||||
if(assocs.size() == 0 || assocs.size() > 1)
|
||||
return null;
|
||||
|
||||
return assocs.get(0).getTargetRef();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user