use of org.apache.clerezza.rdf.core.serializedform.UnsupportedSerializationFormatException in project stanbol by apache.
the class ContentItemWriter method writeTo.
@Override
public void writeTo(ContentItem ci, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
//(0) handle default dataType
Map<String, Object> reqProp = ContentItemHelper.getRequestPropertiesContentPart(ci);
boolean omitMetadata = isOmitMetadata(reqProp);
if (!MULTIPART.isCompatible(mediaType)) {
//two possible cases
if (!omitMetadata) {
// (1) just return the RDF data
//(1.a) Backward support for default dataType if no Accept header is set
StringBuilder ctb = new StringBuilder();
if (mediaType.isWildcardType() || TEXT_PLAIN_TYPE.isCompatible(mediaType) || APPLICATION_OCTET_STREAM_TYPE.isCompatible(mediaType)) {
ctb.append(APPLICATION_LD_JSON);
} else {
ctb.append(mediaType.getType()).append('/').append(mediaType.getSubtype());
}
ctb.append(";charset=").append(UTF8.name());
String contentType = ctb.toString();
httpHeaders.putSingle(HttpHeaders.CONTENT_TYPE, contentType);
try {
serializer.serialize(entityStream, ci.getMetadata(), contentType);
} catch (UnsupportedSerializationFormatException e) {
throw new WebApplicationException("The enhancement results " + "cannot be serialized in the requested media type: " + mediaType.toString(), Response.Status.NOT_ACCEPTABLE);
}
} else {
// (2) return a single content part
Entry<IRI, Blob> contentPart = getBlob(ci, Collections.singleton(mediaType.toString()));
if (contentPart == null) {
//no alternate content with the requeste media type
throw new WebApplicationException("The requested enhancement chain has not created an " + "version of the parsed content in the reuqest media type " + mediaType.toString(), Response.Status.UNSUPPORTED_MEDIA_TYPE);
} else {
//found -> stream the content to the client
//NOTE: This assumes that the presence of a charset
// implies reading/writing character streams
String requestedCharset = mediaType.getParameters().get("charset");
String blobCharset = contentPart.getValue().getParameter().get("charset");
Charset readerCharset = blobCharset == null ? UTF8 : Charset.forName(blobCharset);
Charset writerCharset = requestedCharset == null ? null : Charset.forName(requestedCharset);
if (writerCharset != null && !writerCharset.equals(readerCharset)) {
//we need to transcode
Reader reader = new InputStreamReader(contentPart.getValue().getStream(), readerCharset);
Writer writer = new OutputStreamWriter(entityStream, writerCharset);
IOUtils.copy(reader, writer);
IOUtils.closeQuietly(reader);
} else {
//no transcoding
if (requestedCharset == null && blobCharset != null) {
httpHeaders.putSingle(HttpHeaders.CONTENT_TYPE, mediaType.toString() + "; charset=" + blobCharset);
}
InputStream in = contentPart.getValue().getStream();
IOUtils.copy(in, entityStream);
IOUtils.closeQuietly(in);
}
}
}
} else {
// multipart mime requested!
final String charsetName = mediaType.getParameters().get("charset");
final Charset charset = charsetName != null ? Charset.forName(charsetName) : UTF8;
MediaType rdfFormat;
String rdfFormatString = getRdfFormat(reqProp);
if (rdfFormatString == null || rdfFormatString.isEmpty()) {
rdfFormat = DEFAULT_RDF_FORMAT;
} else {
try {
rdfFormat = MediaType.valueOf(rdfFormatString);
if (rdfFormat.getParameters().get("charset") == null) {
//use the charset of the default RDF format
rdfFormat = new MediaType(rdfFormat.getType(), rdfFormat.getSubtype(), DEFAULT_RDF_FORMAT.getParameters());
}
} catch (IllegalArgumentException e) {
throw new WebApplicationException("The specified RDF format '" + rdfFormatString + "' (used to serialize all RDF parts of " + "multipart MIME responses) is not a well formated MIME type", Response.Status.BAD_REQUEST);
}
}
//(1) setting the correct header
String contentType = String.format("%s/%s; charset=%s; boundary=%s", mediaType.getType(), mediaType.getSubtype(), charset.toString(), CONTENT_ITEM_BOUNDARY);
httpHeaders.putSingle(HttpHeaders.CONTENT_TYPE, contentType);
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
entityBuilder.setBoundary(CONTENT_ITEM_BOUNDARY);
//(2) serialising the metadata
if (!isOmitMetadata(reqProp)) {
entityBuilder.addPart("metadata", new ClerezzaContentBody(ci.getUri().getUnicodeString(), ci.getMetadata(), rdfFormat));
// entity.addBodyPart(new FormBodyPart("metadata", new ClerezzaContentBody(
// ci.getUri().getUnicodeString(), ci.getMetadata(),
// rdfFormat)));
}
//(3) serialising the Content (Bloby)
//(3.a) Filter based on parameter
List<Entry<IRI, Blob>> includedBlobs = filterBlobs(ci, reqProp);
//(3.b) Serialise the filtered
if (!includedBlobs.isEmpty()) {
Map<String, ContentBody> contentParts = new LinkedHashMap<String, ContentBody>();
for (Entry<IRI, Blob> entry : includedBlobs) {
Blob blob = entry.getValue();
ContentType ct = ContentType.create(blob.getMimeType());
String cs = blob.getParameter().get("charset");
if (StringUtils.isNotBlank(cs)) {
ct = ct.withCharset(cs);
}
contentParts.put(entry.getKey().getUnicodeString(), new InputStreamBody(blob.getStream(), ct));
}
//add all the blobs
entityBuilder.addPart("content", new MultipartContentBody(contentParts, CONTENT_PARTS_BOUNDERY, MULTIPART_ALTERNATE));
}
//else no content to include
Set<String> includeContentParts = getIncludedContentPartURIs(reqProp);
if (includeContentParts != null) {
//(4) serialise the Request Properties
if (includeContentParts.isEmpty() || includeContentParts.contains(REQUEST_PROPERTIES_URI.getUnicodeString())) {
JSONObject object;
try {
object = toJson(reqProp);
} catch (JSONException e) {
String message = "Unable to convert Request Properties " + "to JSON (values : " + reqProp + ")!";
log.error(message, e);
throw new WebApplicationException(message, Response.Status.INTERNAL_SERVER_ERROR);
}
entityBuilder.addTextBody(REQUEST_PROPERTIES_URI.getUnicodeString(), object.toString(), ContentType.APPLICATION_JSON.withCharset(UTF8));
}
//(5) additional RDF metadata stored in contentParts
for (Entry<IRI, Graph> entry : getContentParts(ci, Graph.class).entrySet()) {
if (includeContentParts.isEmpty() || includeContentParts.contains(entry.getKey())) {
entityBuilder.addPart(entry.getKey().getUnicodeString(), new //no file name
ClerezzaContentBody(//no file name
null, entry.getValue(), rdfFormat));
}
// else ignore this content part
}
}
entityBuilder.build().writeTo(entityStream);
}
}
Aggregations