use of org.alfresco.repo.content.transform.UnsupportedTransformationException in project alfresco-remote-api by Alfresco.
the class NodeContentGet method execute.
/**
* @param req WebScriptRequest
* @param res WebScriptResponse
* @throws IOException
*/
public void execute(WebScriptRequest req, WebScriptResponse res) throws IOException {
ContentReader textReader = null;
Exception transformException = null;
String nodeIDString = req.getParameter("nodeId");
if (nodeIDString == null) {
throw new WebScriptException("nodeID parameter is required for GetNodeContent");
}
long nodeId = Long.valueOf(nodeIDString).longValue();
String propertyQName = req.getParameter("propertyQName");
QName propertyName = null;
if (propertyQName == null) {
propertyName = ContentModel.PROP_CONTENT;
} else {
propertyName = QName.createQName(propertyQName);
}
Pair<Long, NodeRef> pair = nodeDAO.getNodePair(nodeId);
if (pair == null) {
// If the node does not exists we treat it as if it has no content
// We could be trying to update the content of a node in the index that has been deleted.
res.setStatus(HttpStatus.SC_NO_CONTENT);
return;
}
NodeRef nodeRef = pair.getSecond();
// check If-Modified-Since header and set Last-Modified header as appropriate
Date modified = (Date) nodeService.getProperty(nodeRef, ContentModel.PROP_MODIFIED);
// May be null - if so treat as just changed
if (modified == null) {
modified = new Date();
}
long modifiedSince = -1;
String modifiedSinceStr = req.getHeader("If-Modified-Since");
if (modifiedSinceStr != null) {
try {
modifiedSince = dateFormat.parse(modifiedSinceStr).getTime();
} catch (Throwable e) {
if (logger.isWarnEnabled()) {
logger.warn("Browser sent badly-formatted If-Modified-Since header: " + modifiedSinceStr);
}
}
if (modifiedSince > 0L) {
// round the date to the ignore millisecond value which is not supplied by header
long modDate = (modified.getTime() / 1000L) * 1000L;
if (modDate <= modifiedSince) {
res.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
return;
}
}
}
ContentReader reader = contentService.getReader(nodeRef, propertyName);
if (reader == null) {
res.setStatus(HttpStatus.SC_NO_CONTENT);
return;
}
try {
// get the transformer
TransformationOptions options = new TransformationOptions();
options.setUse("index");
options.setSourceNodeRef(nodeRef);
transformerDebug.pushAvailable(reader.getContentUrl(), reader.getMimetype(), MimetypeMap.MIMETYPE_TEXT_PLAIN, options);
long sourceSize = reader.getSize();
List<ContentTransformer> transformers = contentService.getActiveTransformers(reader.getMimetype(), sourceSize, MimetypeMap.MIMETYPE_TEXT_PLAIN, options);
transformerDebug.availableTransformers(transformers, sourceSize, options, "SolrIndexer");
if (transformers.isEmpty()) {
res.setHeader(TRANSFORM_STATUS_HEADER, "noTransform");
res.setStatus(HttpStatus.SC_NO_CONTENT);
return;
}
ContentTransformer transformer = transformers.get(0);
// Perform transformation catering for mimetype AND encoding
ContentWriter writer = contentService.getTempWriter();
writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN);
// Expect transformers to produce UTF-8
writer.setEncoding("UTF-8");
try {
long start = System.currentTimeMillis();
transformer.transform(reader, writer, options);
long transformDuration = System.currentTimeMillis() - start;
res.setHeader(TRANSFORM_DURATION_HEADER, String.valueOf(transformDuration));
} catch (ContentIOException | UnsupportedTransformationException e) {
transformException = e;
}
if (transformException == null) {
// point the reader to the new-written content
textReader = writer.getReader();
// Check that the reader is a view onto something concrete
if (textReader == null || !textReader.exists()) {
transformException = new ContentIOException("The transformation did not write any content, yet: \n" + " transformer: " + transformer + "\n" + " temp writer: " + writer);
}
}
if (transformException != null) {
res.setHeader(TRANSFORM_STATUS_HEADER, "transformFailed");
res.setHeader(TRANSFORM_EXCEPTION_HEADER, transformException.getMessage());
res.setStatus(HttpStatus.SC_NO_CONTENT);
} else {
res.setStatus(HttpStatus.SC_OK);
streamContentImpl(req, res, textReader, null, null, false, modified, String.valueOf(modified.getTime()), null, null);
}
} finally {
transformerDebug.popAvailable();
}
}
Aggregations