Example #1
0
  @Override
  public void write(
      Writer writer,
      SolrQueryRequest solrQueryRequest,
      org.apache.solr.response.SolrQueryResponse solrQueryResponse)
      throws IOException {

    final MessageContext msgContext =
        (MessageContext) solrQueryResponse.getValues().get("MessageContext");
    final Message message = msgContext.getResponseMessage();

    if (message == null) return;

    SolrSRWDatabase.RequestTypes requestType =
        (SolrSRWDatabase.RequestTypes)
            msgContext.getProperty(SolrSRWDatabase.RequestTypes.class.getSimpleName());
    String tag =
        (requestType == null)
            ? null
            : "</" + requestType.name().replace("Request", "Response") + ">";

    final SolrSRWDatabase.Transport transport =
        (SolrSRWDatabase.Transport)
            msgContext.getProperty(SolrSRWDatabase.Transport.class.getSimpleName());
    switch (transport) {
      case SRW:
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
          message.writeTo(baos);
        } catch (SOAPException e) {
          log.error(e, e); // Impossible at this point.
        }
        writer.write(baos.toString("UTF-8"));
        break;

      case SRU: // Response which requires removal of SOAP envelope and xsi:type attributes.
        writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        Object resource = msgContext.getProperty("resource");
        if (resource == null) // No system stylesheet... but sometimes people may add a custom one.
        {
          resource = msgContext.getProperty("stylesheet");
          if (resource != null) {
            writer.write(
                "<?xml-stylesheet title=\"Custom XSL formatting\" type=\"text/xsl\" href=\"");
            writer.write(String.valueOf(resource));
            writer.write("\"?>");
          }
        } else {
          Object _stylesheet = msgContext.getProperty("stylesheet");
          String stylesheet =
              (_stylesheet == null) ? String.valueOf(resource) : String.valueOf(_stylesheet);

          if (stylesheet.length() != 0) {
            writer.write(
                "<?xml-stylesheet title=\"OCLC XSL formatting\" type=\"text/xsl\" href=\"");
            writer.write(String.valueOf(resource));
            writer.write("\"?>");
          }
        }

        // We need to change the SOAP response into SRU
        writer.write(cleanup(message, tag, true));
        break;

      case JSON:
        SolrSRWDatabase db = (SolrSRWDatabase) msgContext.getProperty("db");
        String jsonp = (String) msgContext.getProperty("jsonp");

        writer.write(jsonp);
        writer.write("(");
        Transformer t = db.getTransformers("xml-2-json");
        StreamSource source = new StreamSource(new StringReader(cleanup(message, tag, true)));
        try {
          t.transform(source, new StreamResult(writer));
        } catch (TransformerException e) {
          log.error(e, e);
        }
        writer.write(")");

        break;
    }
  }