public String getContentType(SolrQueryRequest request,
SolrQueryResponse response) {
Transformer t = null;
try {
t = getTransformer(request);
} catch(Exception e) {
// TODO should our parent interface throw (IO)Exception?
throw new RuntimeException("getTransformer fails in getContentType",e);
}
final String mediaTypeFromXslt = t.getOutputProperty("media-type");
if(mediaTypeFromXslt == null || mediaTypeFromXslt.length()==0) {
// This did not happen in my tests, mediaTypeFromXslt is set to "text/xml"
// if the XSLT transform does not contain an xsl:output element. Not sure
// if this is standard behavior or if it's just my JVM/libraries
return DEFAULT_CONTENT_TYPE;
}
return mediaTypeFromXslt;
}
|
protected Transformer getTransformer(SolrQueryRequest request) throws IOException {
final String xslt = request.getParams().get(TRANSFORM_PARAM,null);
if(xslt==null) {
throw new IOException("'" + TRANSFORM_PARAM + "' request parameter is required to use the XSLTResponseWriter");
}
// no need to synchronize access to context, right?
// Nothing else happens with it at the same time
final Map< Object,Object > ctx = request.getContext();
Transformer result = (Transformer)ctx.get(CONTEXT_TRANSFORMER_KEY);
if(result==null) {
result = TransformerProvider.instance.getTransformer(xslt,xsltCacheLifetimeSeconds.intValue());
ctx.put(CONTEXT_TRANSFORMER_KEY,result);
}
return result;
}
Get Transformer from request context, or from TransformerProvider.
This allows either getContentType(...) or write(...) to instantiate the Transformer,
depending on which one is called first, then the other one reuses the same Transformer |
public void write(Writer writer,
SolrQueryRequest request,
SolrQueryResponse response) throws IOException {
final Transformer t = getTransformer(request);
// capture the output of the XMLWriter
final CharArrayWriter w = new CharArrayWriter();
XMLWriter.writeResponse(w,request,response);
// and write transformed result to our writer
final Reader r = new BufferedReader(new CharArrayReader(w.toCharArray()));
final StreamSource source = new StreamSource(r);
final StreamResult result = new StreamResult(writer);
try {
t.transform(source, result);
} catch(TransformerException te) {
final IOException ioe = new IOException("XSLT transformation error");
ioe.initCause(te);
throw ioe;
}
}
|