Author: tallison
Date: Fri Feb 20 19:29:42 2015
New Revision: 1661200

URL: http://svn.apache.org/r1661200
Log:
TIKA-1556 clean up whitespace in tika-server

Modified:
    
tika/trunk/tika-server/src/main/java/org/apache/tika/server/CSVMessageBodyWriter.java
    
tika/trunk/tika-server/src/main/java/org/apache/tika/server/DetectorResource.java
    tika/trunk/tika-server/src/main/java/org/apache/tika/server/HTMLHelper.java
    
tika/trunk/tika-server/src/main/java/org/apache/tika/server/JSONMessageBodyWriter.java
    
tika/trunk/tika-server/src/main/java/org/apache/tika/server/MetadataListMessageBodyWriter.java
    
tika/trunk/tika-server/src/main/java/org/apache/tika/server/MetadataResource.java
    
tika/trunk/tika-server/src/main/java/org/apache/tika/server/RecursiveMetadataResource.java
    
tika/trunk/tika-server/src/main/java/org/apache/tika/server/RichTextContentHandler.java
    tika/trunk/tika-server/src/main/java/org/apache/tika/server/TarWriter.java
    
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TextMessageBodyWriter.java
    
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaDetectors.java
    
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaLoggingFilter.java
    
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaMimeTypes.java
    tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaParsers.java
    
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaResource.java
    
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaServerCli.java
    
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaServerParseExceptionMapper.java
    tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaVersion.java
    tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaWelcome.java
    
tika/trunk/tika-server/src/main/java/org/apache/tika/server/UnpackerResource.java
    
tika/trunk/tika-server/src/main/java/org/apache/tika/server/XMPMessageBodyWriter.java
    tika/trunk/tika-server/src/main/java/org/apache/tika/server/ZipWriter.java
    tika/trunk/tika-server/src/test/java/org/apache/tika/server/CXFTestBase.java
    
tika/trunk/tika-server/src/test/java/org/apache/tika/server/DetectorResourceTest.java
    
tika/trunk/tika-server/src/test/java/org/apache/tika/server/MetadataResourceTest.java
    
tika/trunk/tika-server/src/test/java/org/apache/tika/server/RecursiveMetadataResourceTest.java
    
tika/trunk/tika-server/src/test/java/org/apache/tika/server/StackTraceOffTest.java
    
tika/trunk/tika-server/src/test/java/org/apache/tika/server/StackTraceTest.java
    
tika/trunk/tika-server/src/test/java/org/apache/tika/server/TikaDetectorsTest.java
    
tika/trunk/tika-server/src/test/java/org/apache/tika/server/TikaMimeTypesTest.java
    
tika/trunk/tika-server/src/test/java/org/apache/tika/server/TikaParsersTest.java
    
tika/trunk/tika-server/src/test/java/org/apache/tika/server/TikaResourceTest.java
    
tika/trunk/tika-server/src/test/java/org/apache/tika/server/TikaVersionTest.java
    
tika/trunk/tika-server/src/test/java/org/apache/tika/server/TikaWelcomeTest.java
    
tika/trunk/tika-server/src/test/java/org/apache/tika/server/UnpackerResourceTest.java

Modified: 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/CSVMessageBodyWriter.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-server/src/main/java/org/apache/tika/server/CSVMessageBodyWriter.java?rev=1661200&r1=1661199&r2=1661200&view=diff
==============================================================================
--- 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/CSVMessageBodyWriter.java
 (original)
+++ 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/CSVMessageBodyWriter.java
 Fri Feb 20 19:29:42 2015
@@ -37,34 +37,34 @@ import org.apache.tika.io.IOUtils;
 import org.apache.tika.metadata.Metadata;
 
 @Provider
-@Produces("text/csv")
-public class CSVMessageBodyWriter implements MessageBodyWriter<Metadata> {
-
-  public boolean isWriteable(Class<?> type, Type genericType, Annotation[] 
annotations, MediaType mediaType) {
-    return Metadata.class.isAssignableFrom(type);
-  }
-
-  public long getSize(Metadata data, Class<?> type, Type genericType, 
Annotation[] annotations, MediaType mediaType) {
-    return -1;
-  }
-
-  @Override
-  @SuppressWarnings("resource")
-  public void writeTo(Metadata metadata, Class<?> type, Type genericType, 
Annotation[] annotations,
-      MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, 
OutputStream entityStream) throws IOException,
-      WebApplicationException {
-
-    CSVWriter writer = new CSVWriter(new OutputStreamWriter(entityStream, 
IOUtils.UTF_8));
-
-    for (String name : metadata.names()) {
-      String[] values = metadata.getValues(name);
-      ArrayList<String> list = new ArrayList<String>(values.length + 1);
-      list.add(name);
-      list.addAll(Arrays.asList(values));
-      writer.writeNext(list.toArray(values));
-    }
-    
-    // Don't close, just flush the stream
-    writer.flush();
-  }
-}
+@Produces("text/csv")
+public class CSVMessageBodyWriter implements MessageBodyWriter<Metadata> {
+
+    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] 
annotations, MediaType mediaType) {
+        return Metadata.class.isAssignableFrom(type);
+    }
+
+    public long getSize(Metadata data, Class<?> type, Type genericType, 
Annotation[] annotations, MediaType mediaType) {
+        return -1;
+    }
+
+    @Override
+    @SuppressWarnings("resource")
+    public void writeTo(Metadata metadata, Class<?> type, Type genericType, 
Annotation[] annotations,
+                        MediaType mediaType, MultivaluedMap<String, Object> 
httpHeaders, OutputStream entityStream) throws IOException,
+            WebApplicationException {
+
+        CSVWriter writer = new CSVWriter(new OutputStreamWriter(entityStream, 
IOUtils.UTF_8));
+
+        for (String name : metadata.names()) {
+            String[] values = metadata.getValues(name);
+            ArrayList<String> list = new ArrayList<String>(values.length + 1);
+            list.add(name);
+            list.addAll(Arrays.asList(values));
+            writer.writeNext(list.toArray(values));
+        }
+
+        // Don't close, just flush the stream
+        writer.flush();
+    }
+}

Modified: 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/DetectorResource.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-server/src/main/java/org/apache/tika/server/DetectorResource.java?rev=1661200&r1=1661199&r2=1661200&view=diff
==============================================================================
--- 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/DetectorResource.java
 (original)
+++ 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/DetectorResource.java
 Fri Feb 20 19:29:42 2015
@@ -14,59 +14,59 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-package org.apache.tika.server;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
+
+package org.apache.tika.server;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.UriInfo;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.UriInfo;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.tika.config.TikaConfig;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.mime.MediaType;
 
-@Path("/detect")
-public class DetectorResource {
-
-       private static final Log logger = 
LogFactory.getLog(DetectorResource.class
-                       .getName());
-
-       private TikaConfig config = null;
-
-       public DetectorResource(TikaConfig config) {
-               this.config = config;
-       }
-
-       @PUT
-       @Path("stream")
-       @Consumes("*/*")
-       @Produces("text/plain")
-       public String detect(final InputStream is,
-                       @Context HttpHeaders httpHeaders, @Context final 
UriInfo info) {
-               Metadata met = new Metadata();
-               TikaInputStream tis = TikaInputStream.get(is);
-               String filename = TikaResource.detectFilename(httpHeaders
-                               .getRequestHeaders());
-               logger.info("Detecting media type for Filename: " + filename);
-               met.add(Metadata.RESOURCE_NAME_KEY, filename);
-               try {
-                       return this.config.getDetector().detect(tis, 
met).toString();
-               } catch (IOException e) {
-                       logger.warn("Unable to detect MIME type for file. 
Reason: "
-                                       + e.getMessage());
-                       e.printStackTrace();
-                       return MediaType.OCTET_STREAM.toString();
-               }
-       }
-
-}
+@Path("/detect")
+public class DetectorResource {
+
+    private static final Log logger = LogFactory.getLog(DetectorResource.class
+            .getName());
+
+    private TikaConfig config = null;
+
+    public DetectorResource(TikaConfig config) {
+        this.config = config;
+    }
+
+    @PUT
+    @Path("stream")
+    @Consumes("*/*")
+    @Produces("text/plain")
+    public String detect(final InputStream is,
+                         @Context HttpHeaders httpHeaders, @Context final 
UriInfo info) {
+        Metadata met = new Metadata();
+        TikaInputStream tis = TikaInputStream.get(is);
+        String filename = TikaResource.detectFilename(httpHeaders
+                .getRequestHeaders());
+        logger.info("Detecting media type for Filename: " + filename);
+        met.add(Metadata.RESOURCE_NAME_KEY, filename);
+        try {
+            return this.config.getDetector().detect(tis, met).toString();
+        } catch (IOException e) {
+            logger.warn("Unable to detect MIME type for file. Reason: "
+                    + e.getMessage());
+            e.printStackTrace();
+            return MediaType.OCTET_STREAM.toString();
+        }
+    }
+
+}

Modified: 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/HTMLHelper.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-server/src/main/java/org/apache/tika/server/HTMLHelper.java?rev=1661200&r1=1661199&r2=1661200&view=diff
==============================================================================
--- tika/trunk/tika-server/src/main/java/org/apache/tika/server/HTMLHelper.java 
(original)
+++ tika/trunk/tika-server/src/main/java/org/apache/tika/server/HTMLHelper.java 
Fri Feb 20 19:29:42 2015
@@ -21,22 +21,22 @@ import java.io.IOException;
 import java.io.InputStream;
 
 import org.apache.tika.io.IOUtils;
-
-/**
- * Helps produce user facing HTML output.
- * 
- * TODO Decide if this would be better done as a MessageBodyWriter
- */
-public class HTMLHelper {
+
+/**
+ * Helps produce user facing HTML output.
+ * <p/>
+ * TODO Decide if this would be better done as a MessageBodyWriter
+ */
+public class HTMLHelper {
     private static final String PATH = "/tikaserver-template.html";
     private static final String TITLE_VAR = "[[TITLE]]";
-    private static final String BODY_VAR = "[[BODY]]";
-    private String PRE_BODY;
-    private String POST_BODY;
-    
-    public HTMLHelper() {
-        InputStream htmlStr = getClass().getResourceAsStream(PATH);
-        if (htmlStr == null) {
+    private static final String BODY_VAR = "[[BODY]]";
+    private String PRE_BODY;
+    private String POST_BODY;
+
+    public HTMLHelper() {
+        InputStream htmlStr = getClass().getResourceAsStream(PATH);
+        if (htmlStr == null) {
             throw new IllegalArgumentException("Template Not Found - " + PATH);
         }
         try {
@@ -45,18 +45,18 @@ public class HTMLHelper {
             PRE_BODY = html.substring(0, bodyAt);
             POST_BODY = html.substring(bodyAt + BODY_VAR.length());
         } catch (IOException e) {
-            throw new IllegalStateException("Unable to read template");
-        }
-    }
-    
-    /**
-     * Generates the HTML Header for the user facing page, adding
-     *  in the given title as required
-     */
-    public void generateHeader(StringBuffer html, String title) {
-        html.append(PRE_BODY.replace(TITLE_VAR, title));
-    }
-    public void generateFooter(StringBuffer html) {
-        html.append(POST_BODY);
-    }
-}
\ No newline at end of file
+            throw new IllegalStateException("Unable to read template");
+        }
+    }
+
+    /**
+     * Generates the HTML Header for the user facing page, adding
+     * in the given title as required
+     */
+    public void generateHeader(StringBuffer html, String title) {
+        html.append(PRE_BODY.replace(TITLE_VAR, title));
+    }
+
+    public void generateFooter(StringBuffer html) {
+        html.append(POST_BODY);
+    }}
\ No newline at end of file

Modified: 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/JSONMessageBodyWriter.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-server/src/main/java/org/apache/tika/server/JSONMessageBodyWriter.java?rev=1661200&r1=1661199&r2=1661200&view=diff
==============================================================================
--- 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/JSONMessageBodyWriter.java
 (original)
+++ 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/JSONMessageBodyWriter.java
 Fri Feb 20 19:29:42 2015
@@ -37,28 +37,28 @@ import org.apache.tika.metadata.Metadata
 import org.apache.tika.metadata.serialization.JsonMetadata;
 
 @Provider
-@Produces(MediaType.APPLICATION_JSON)
-public class JSONMessageBodyWriter implements MessageBodyWriter<Metadata> {
-
-  public boolean isWriteable(Class<?> type, Type genericType, Annotation[] 
annotations, MediaType mediaType) {
-    return Metadata.class.isAssignableFrom(type);
-  }
-
-  public long getSize(Metadata data, Class<?> type, Type genericType, 
Annotation[] annotations, MediaType mediaType) {
-    return -1;
-  }
-
-  @Override
-  public void writeTo(Metadata metadata, Class<?> type, Type genericType, 
Annotation[] annotations,
-      MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, 
OutputStream entityStream) throws IOException,
-      WebApplicationException {
-        try {
-            Writer writer = new OutputStreamWriter(entityStream, 
IOUtils.UTF_8);
-            JsonMetadata.toJson(metadata, writer);
+@Produces(MediaType.APPLICATION_JSON)
+public class JSONMessageBodyWriter implements MessageBodyWriter<Metadata> {
+
+    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] 
annotations, MediaType mediaType) {
+        return Metadata.class.isAssignableFrom(type);
+    }
+
+    public long getSize(Metadata data, Class<?> type, Type genericType, 
Annotation[] annotations, MediaType mediaType) {
+        return -1;
+    }
+
+    @Override
+    public void writeTo(Metadata metadata, Class<?> type, Type genericType, 
Annotation[] annotations,
+                        MediaType mediaType, MultivaluedMap<String, Object> 
httpHeaders, OutputStream entityStream) throws IOException,
+            WebApplicationException {
+        try {
+            Writer writer = new OutputStreamWriter(entityStream, 
IOUtils.UTF_8);
+            JsonMetadata.toJson(metadata, writer);
             writer.flush();
         } catch (TikaException e) {
-            throw new IOException(e);
-        }
-        entityStream.flush();
-  }
-}
+            throw new IOException(e);
+        }
+        entityStream.flush();
+    }
+}

Modified: 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/MetadataListMessageBodyWriter.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-server/src/main/java/org/apache/tika/server/MetadataListMessageBodyWriter.java?rev=1661200&r1=1661199&r2=1661200&view=diff
==============================================================================
--- 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/MetadataListMessageBodyWriter.java
 (original)
+++ 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/MetadataListMessageBodyWriter.java
 Fri Feb 20 19:29:42 2015
@@ -36,31 +36,31 @@ import org.apache.tika.io.IOUtils;
 import org.apache.tika.metadata.serialization.JsonMetadataList;
 
 @Provider
-@Produces(MediaType.APPLICATION_JSON)
-public class MetadataListMessageBodyWriter implements 
MessageBodyWriter<MetadataList> {
-
-  public boolean isWriteable(Class<?> type, Type genericType, Annotation[] 
annotations, MediaType mediaType) {
-      if (! MediaType.APPLICATION_JSON_TYPE.equals(mediaType) ){
-          return false;
-      }
-      return type.isAssignableFrom(MetadataList.class);
-  }
-
-  public long getSize(MetadataList data, Class<?> type, Type genericType, 
Annotation[] annotations, MediaType mediaType) {
-    return -1;
-  }
-
-  @Override
-  public void writeTo(MetadataList list, Class<?> type, Type genericType, 
Annotation[] annotations,
-      MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, 
OutputStream entityStream) throws IOException,
-      WebApplicationException {
-        try {
-            Writer writer = new OutputStreamWriter(entityStream, 
IOUtils.UTF_8);
-            JsonMetadataList.toJson(list.getMetadata(), writer);
+@Produces(MediaType.APPLICATION_JSON)
+public class MetadataListMessageBodyWriter implements 
MessageBodyWriter<MetadataList> {
+
+    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] 
annotations, MediaType mediaType) {
+        if (!MediaType.APPLICATION_JSON_TYPE.equals(mediaType)) {
+            return false;
+        }
+        return type.isAssignableFrom(MetadataList.class);
+    }
+
+    public long getSize(MetadataList data, Class<?> type, Type genericType, 
Annotation[] annotations, MediaType mediaType) {
+        return -1;
+    }
+
+    @Override
+    public void writeTo(MetadataList list, Class<?> type, Type genericType, 
Annotation[] annotations,
+                        MediaType mediaType, MultivaluedMap<String, Object> 
httpHeaders, OutputStream entityStream) throws IOException,
+            WebApplicationException {
+        try {
+            Writer writer = new OutputStreamWriter(entityStream, 
IOUtils.UTF_8);
+            JsonMetadataList.toJson(list.getMetadata(), writer);
             writer.flush();
         } catch (TikaException e) {
-            throw new IOException(e);
-        }
-        entityStream.flush();
-  }
-}
+            throw new IOException(e);
+        }
+        entityStream.flush();
+    }
+}

Modified: 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/MetadataResource.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-server/src/main/java/org/apache/tika/server/MetadataResource.java?rev=1661200&r1=1661199&r2=1661200&view=diff
==============================================================================
--- 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/MetadataResource.java
 (original)
+++ 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/MetadataResource.java
 Fri Feb 20 19:29:42 2015
@@ -44,93 +44,93 @@ import org.xml.sax.helpers.DefaultHandle
 
 @Path("/meta")
 public class MetadataResource {
-  private static final Log logger = LogFactory.getLog(MetadataResource.class);
+    private static final Log logger = 
LogFactory.getLog(MetadataResource.class);
 
-  private TikaConfig tikaConfig;
+    private TikaConfig tikaConfig;
 
-  public MetadataResource(TikaConfig tikaConfig) {
-    this.tikaConfig = tikaConfig;
-  }
-
-  @POST
-  @Consumes("multipart/form-data")
-  @Produces({"text/csv", "application/json", "application/rdf+xml"})
-  @Path("form")
-  public Response getMetadataFromMultipart(Attachment att, @Context UriInfo 
info) throws Exception {
-    return Response.ok(
-            parseMetadata(att.getObject(InputStream.class), att.getHeaders(), 
info)).build();
-  }
-
-  @PUT
-  @Produces({"text/csv", "application/json", "application/rdf+xml"})
-  public Response getMetadata(InputStream is, @Context HttpHeaders 
httpHeaders, @Context UriInfo info) throws Exception {
-    return Response.ok(
-            parseMetadata(is, httpHeaders.getRequestHeaders(), info)).build();
-  }
-
-  /**
-   * Get a specific metadata field. If the input stream cannot be parsed, but a
-   * value was found for the given metadata field, then the value of the field
-   * is returned as part of a 200 OK response; otherwise a
-   * {@link javax.ws.rs.core.Response.Status#BAD_REQUEST} is generated. If the 
stream was successfully
-   * parsed but the specific metadata field was not found, then a
-   * {@link javax.ws.rs.core.Response.Status#NOT_FOUND} is returned.
-   * <p>
-   * Note that this method handles multivalue fields and returns possibly more
-   * metadata value than requested.
-   * <p>
-   * If you want XMP, you must be careful to specify the exact XMP key.
-   * For example, "Author" will return nothing, but "dc:creator" will return 
the correct value.
-   *
-   * @param is inputstream
-   * @param httpHeaders httpheaders
-   * @param info info
-   * @param field the tika metadata field name
-   * @return one of {@link javax.ws.rs.core.Response.Status#OK}, {@link 
javax.ws.rs.core.Response.Status#NOT_FOUND}, or
-   *         {@link javax.ws.rs.core.Response.Status#BAD_REQUEST}
-   * @throws Exception
-   */
-  @PUT
-  @Path("{field}")
-  @Produces({"text/csv", "application/json", "application/rdf+xml", 
"text/plain"})
-  public Response getMetadataField(InputStream is, @Context HttpHeaders 
httpHeaders,
-                                   @Context UriInfo info, @PathParam("field") 
String field) throws Exception {
-
-    // use BAD request to indicate that we may not have had enough data to
-    // process the request
-    Response.Status defaultErrorResponse = Response.Status.BAD_REQUEST;
-    Metadata metadata = null;
-    try {
-      metadata = parseMetadata(is, httpHeaders.getRequestHeaders(), info);
-      // once we've parsed the document successfully, we should use NOT_FOUND
-      // if we did not see the field
-      defaultErrorResponse = Response.Status.NOT_FOUND;
-    } catch (Exception e) {
-      logger.info("Failed to process field " + field, e);
+    public MetadataResource(TikaConfig tikaConfig) {
+        this.tikaConfig = tikaConfig;
     }
 
-    if (metadata == null || metadata.get(field) == null) {
-      return Response.status(defaultErrorResponse).entity("Failed to get 
metadata field " + field).build();
+    @POST
+    @Consumes("multipart/form-data")
+    @Produces({"text/csv", "application/json", "application/rdf+xml"})
+    @Path("form")
+    public Response getMetadataFromMultipart(Attachment att, @Context UriInfo 
info) throws Exception {
+        return Response.ok(
+                parseMetadata(att.getObject(InputStream.class), 
att.getHeaders(), info)).build();
     }
 
-    // remove fields we don't care about for the response
-    for (String name : metadata.names()) {
-      if (!field.equals(name)) {
-        metadata.remove(name);
-      }
+    @PUT
+    @Produces({"text/csv", "application/json", "application/rdf+xml"})
+    public Response getMetadata(InputStream is, @Context HttpHeaders 
httpHeaders, @Context UriInfo info) throws Exception {
+        return Response.ok(
+                parseMetadata(is, httpHeaders.getRequestHeaders(), 
info)).build();
     }
-    return Response.ok(metadata).build();
-  }
 
-  private Metadata parseMetadata(InputStream is,
-                                 MultivaluedMap<String, String> httpHeaders, 
UriInfo info) throws IOException {
-    final Metadata metadata = new Metadata();
-    final ParseContext context = new ParseContext();
-    AutoDetectParser parser = TikaResource.createParser(tikaConfig);
-    TikaResource.fillMetadata(parser, metadata, context, httpHeaders);
-    TikaResource.fillParseContext(context, httpHeaders);
-    TikaResource.logRequest(logger, info, metadata);
-    TikaResource.parse(parser, logger, info.getPath(), is, new 
DefaultHandler(), metadata, context);
-    return metadata;
-  }
+    /**
+     * Get a specific metadata field. If the input stream cannot be parsed, 
but a
+     * value was found for the given metadata field, then the value of the 
field
+     * is returned as part of a 200 OK response; otherwise a
+     * {@link javax.ws.rs.core.Response.Status#BAD_REQUEST} is generated. If 
the stream was successfully
+     * parsed but the specific metadata field was not found, then a
+     * {@link javax.ws.rs.core.Response.Status#NOT_FOUND} is returned.
+     * <p/>
+     * Note that this method handles multivalue fields and returns possibly 
more
+     * metadata value than requested.
+     * <p/>
+     * If you want XMP, you must be careful to specify the exact XMP key.
+     * For example, "Author" will return nothing, but "dc:creator" will return 
the correct value.
+     *
+     * @param is          inputstream
+     * @param httpHeaders httpheaders
+     * @param info        info
+     * @param field       the tika metadata field name
+     * @return one of {@link javax.ws.rs.core.Response.Status#OK}, {@link 
javax.ws.rs.core.Response.Status#NOT_FOUND}, or
+     * {@link javax.ws.rs.core.Response.Status#BAD_REQUEST}
+     * @throws Exception
+     */
+    @PUT
+    @Path("{field}")
+    @Produces({"text/csv", "application/json", "application/rdf+xml", 
"text/plain"})
+    public Response getMetadataField(InputStream is, @Context HttpHeaders 
httpHeaders,
+                                     @Context UriInfo info, 
@PathParam("field") String field) throws Exception {
+
+        // use BAD request to indicate that we may not have had enough data to
+        // process the request
+        Response.Status defaultErrorResponse = Response.Status.BAD_REQUEST;
+        Metadata metadata = null;
+        try {
+            metadata = parseMetadata(is, httpHeaders.getRequestHeaders(), 
info);
+            // once we've parsed the document successfully, we should use 
NOT_FOUND
+            // if we did not see the field
+            defaultErrorResponse = Response.Status.NOT_FOUND;
+        } catch (Exception e) {
+            logger.info("Failed to process field " + field, e);
+        }
+
+        if (metadata == null || metadata.get(field) == null) {
+            return Response.status(defaultErrorResponse).entity("Failed to get 
metadata field " + field).build();
+        }
+
+        // remove fields we don't care about for the response
+        for (String name : metadata.names()) {
+            if (!field.equals(name)) {
+                metadata.remove(name);
+            }
+        }
+        return Response.ok(metadata).build();
+    }
+
+    private Metadata parseMetadata(InputStream is,
+                                   MultivaluedMap<String, String> httpHeaders, 
UriInfo info) throws IOException {
+        final Metadata metadata = new Metadata();
+        final ParseContext context = new ParseContext();
+        AutoDetectParser parser = TikaResource.createParser(tikaConfig);
+        TikaResource.fillMetadata(parser, metadata, context, httpHeaders);
+        TikaResource.fillParseContext(context, httpHeaders);
+        TikaResource.logRequest(logger, info, metadata);
+        TikaResource.parse(parser, logger, info.getPath(), is, new 
DefaultHandler(), metadata, context);
+        return metadata;
+    }
 }

Modified: 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/RecursiveMetadataResource.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-server/src/main/java/org/apache/tika/server/RecursiveMetadataResource.java?rev=1661200&r1=1661199&r2=1661200&view=diff
==============================================================================
--- 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/RecursiveMetadataResource.java
 (original)
+++ 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/RecursiveMetadataResource.java
 Fri Feb 20 19:29:42 2015
@@ -43,43 +43,43 @@ import org.xml.sax.helpers.DefaultHandle
 
 @Path("/rmeta")
 public class RecursiveMetadataResource {
-  private static final Log logger = 
LogFactory.getLog(RecursiveMetadataResource.class);
-
-  private TikaConfig tikaConfig;
-
-  public RecursiveMetadataResource(TikaConfig tikaConfig) {
-    this.tikaConfig = tikaConfig;
-  }
-
-  @POST
-  @Consumes("multipart/form-data")
-  @Produces({"text/csv", "application/json"})
-  @Path("form")
-  public Response getMetadataFromMultipart(Attachment att, @Context UriInfo 
info) throws Exception {
-    return Response.ok(
-            parseMetadata(att.getObject(InputStream.class), att.getHeaders(), 
info)).build();
-  }
-
-  @PUT
-  @Produces("application/json")
-  public Response getMetadata(InputStream is, @Context HttpHeaders 
httpHeaders, @Context UriInfo info) throws Exception {
-    return Response.ok(
-            parseMetadata(is, httpHeaders.getRequestHeaders(), info)).build();
-  }
-
-  private MetadataList parseMetadata(InputStream is,
-                                 MultivaluedMap<String, String> httpHeaders, 
UriInfo info) throws Exception {
-    final Metadata metadata = new Metadata();
-    final ParseContext context = new ParseContext();
-    AutoDetectParser parser = TikaResource.createParser(tikaConfig);
-    //TODO: parameterize choice of handler and max chars?
-    BasicContentHandlerFactory.HANDLER_TYPE type = 
BasicContentHandlerFactory.HANDLER_TYPE.TEXT;
-    RecursiveParserWrapper wrapper = new RecursiveParserWrapper(parser,
-            new BasicContentHandlerFactory(type, -1));
-    TikaResource.fillMetadata(parser, metadata, context, httpHeaders);
-    TikaResource.fillParseContext(context, httpHeaders);
-    TikaResource.logRequest(logger, info, metadata);
-    TikaResource.parse(wrapper, logger, info.getPath(), is, new 
DefaultHandler(), metadata, context);
-    return new MetadataList(wrapper.getMetadata());
-  }
+    private static final Log logger = 
LogFactory.getLog(RecursiveMetadataResource.class);
+
+    private TikaConfig tikaConfig;
+
+    public RecursiveMetadataResource(TikaConfig tikaConfig) {
+        this.tikaConfig = tikaConfig;
+    }
+
+    @POST
+    @Consumes("multipart/form-data")
+    @Produces({"text/csv", "application/json"})
+    @Path("form")
+    public Response getMetadataFromMultipart(Attachment att, @Context UriInfo 
info) throws Exception {
+        return Response.ok(
+                parseMetadata(att.getObject(InputStream.class), 
att.getHeaders(), info)).build();
+    }
+
+    @PUT
+    @Produces("application/json")
+    public Response getMetadata(InputStream is, @Context HttpHeaders 
httpHeaders, @Context UriInfo info) throws Exception {
+        return Response.ok(
+                parseMetadata(is, httpHeaders.getRequestHeaders(), 
info)).build();
+    }
+
+    private MetadataList parseMetadata(InputStream is,
+                                       MultivaluedMap<String, String> 
httpHeaders, UriInfo info) throws Exception {
+        final Metadata metadata = new Metadata();
+        final ParseContext context = new ParseContext();
+        AutoDetectParser parser = TikaResource.createParser(tikaConfig);
+        //TODO: parameterize choice of handler and max chars?
+        BasicContentHandlerFactory.HANDLER_TYPE type = 
BasicContentHandlerFactory.HANDLER_TYPE.TEXT;
+        RecursiveParserWrapper wrapper = new RecursiveParserWrapper(parser,
+                new BasicContentHandlerFactory(type, -1));
+        TikaResource.fillMetadata(parser, metadata, context, httpHeaders);
+        TikaResource.fillParseContext(context, httpHeaders);
+        TikaResource.logRequest(logger, info, metadata);
+        TikaResource.parse(wrapper, logger, info.getPath(), is, new 
DefaultHandler(), metadata, context);
+        return new MetadataList(wrapper.getMetadata());
+    }
 }

Modified: 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/RichTextContentHandler.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-server/src/main/java/org/apache/tika/server/RichTextContentHandler.java?rev=1661200&r1=1661199&r2=1661200&view=diff
==============================================================================
--- 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/RichTextContentHandler.java
 (original)
+++ 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/RichTextContentHandler.java
 Fri Feb 20 19:29:42 2015
@@ -14,34 +14,34 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-package org.apache.tika.server;
-
-import org.apache.tika.sax.WriteOutContentHandler;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-import java.io.Writer;
-
-class RichTextContentHandler extends WriteOutContentHandler {
-  public RichTextContentHandler(Writer writer) {
-    super(writer);
-  }
-
-  @Override
-  public void startElement(String uri, String localName, String qName, 
Attributes attributes) throws SAXException {
-    super.startElement(uri, localName, qName, attributes);
-
-    if ("img".equals(localName) && attributes.getValue("alt")!=null) {
-      String nfo = "[image: "+attributes.getValue("alt")+ ']';
-
-      characters(nfo.toCharArray(), 0, nfo.length());
-    }
-
-    if ("a".equals(localName) && attributes.getValue("name")!=null) {
-      String nfo = "[bookmark: "+attributes.getValue("name")+ ']';
-
-      characters(nfo.toCharArray(), 0, nfo.length());
-    }
-  }
-}
+
+package org.apache.tika.server;
+
+import java.io.Writer;
+
+import org.apache.tika.sax.WriteOutContentHandler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+class RichTextContentHandler extends WriteOutContentHandler {
+    public RichTextContentHandler(Writer writer) {
+        super(writer);
+    }
+
+    @Override
+    public void startElement(String uri, String localName, String qName, 
Attributes attributes) throws SAXException {
+        super.startElement(uri, localName, qName, attributes);
+
+        if ("img".equals(localName) && attributes.getValue("alt") != null) {
+            String nfo = "[image: " + attributes.getValue("alt") + ']';
+
+            characters(nfo.toCharArray(), 0, nfo.length());
+        }
+
+        if ("a".equals(localName) && attributes.getValue("name") != null) {
+            String nfo = "[bookmark: " + attributes.getValue("name") + ']';
+
+            characters(nfo.toCharArray(), 0, nfo.length());
+        }
+    }
+}

Modified: 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TarWriter.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-server/src/main/java/org/apache/tika/server/TarWriter.java?rev=1661200&r1=1661199&r2=1661200&view=diff
==============================================================================
--- tika/trunk/tika-server/src/main/java/org/apache/tika/server/TarWriter.java 
(original)
+++ tika/trunk/tika-server/src/main/java/org/apache/tika/server/TarWriter.java 
Fri Feb 20 19:29:42 2015
@@ -14,54 +14,55 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-package org.apache.tika.server;
-
-import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
-import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
-
-import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.MessageBodyWriter;
-import javax.ws.rs.ext.Provider;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-import java.util.Map;
-
-@Provider
-@Produces("application/x-tar")
-public class TarWriter implements MessageBodyWriter<Map<String, byte[]>> {
-  private static void tarStoreBuffer(TarArchiveOutputStream zip, String name, 
byte[] dataBuffer) throws IOException {
-    TarArchiveEntry entry = new TarArchiveEntry(name);
-
-    entry.setSize(dataBuffer.length);
-
-    zip.putArchiveEntry(entry);
-
-    zip.write(dataBuffer);
-
-    zip.closeArchiveEntry();
-  }
-
-  public boolean isWriteable(Class<?> type, Type genericType, Annotation[] 
annotations, MediaType mediaType) {
-    return Map.class.isAssignableFrom(type);
-  }
-
-  public long getSize(Map<String, byte[]> stringMap, Class<?> type, Type 
genericType, Annotation[] annotations, MediaType mediaType) {
-    return -1;
-  }
-
-  public void writeTo(Map<String, byte[]> parts, Class<?> type, Type 
genericType, Annotation[] annotations, MediaType mediaType, 
MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws 
IOException, WebApplicationException {
-    TarArchiveOutputStream zip = new TarArchiveOutputStream(entityStream);
-
-    for (Map.Entry<String, byte[]> entry : parts.entrySet()) {
-      tarStoreBuffer(zip, entry.getKey(), entry.getValue());
-    }
-
-    zip.close();
-  }
-}
+
+package org.apache.tika.server;
+
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.Provider;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Map;
+
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
+
+@Provider
+@Produces("application/x-tar")
+public class TarWriter implements MessageBodyWriter<Map<String, byte[]>> {
+    private static void tarStoreBuffer(TarArchiveOutputStream zip, String 
name, byte[] dataBuffer) throws IOException {
+        TarArchiveEntry entry = new TarArchiveEntry(name);
+
+        entry.setSize(dataBuffer.length);
+
+        zip.putArchiveEntry(entry);
+
+        zip.write(dataBuffer);
+
+        zip.closeArchiveEntry();
+    }
+
+    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] 
annotations, MediaType mediaType) {
+        return Map.class.isAssignableFrom(type);
+    }
+
+    public long getSize(Map<String, byte[]> stringMap, Class<?> type, Type 
genericType, Annotation[] annotations, MediaType mediaType) {
+        return -1;
+    }
+
+    public void writeTo(Map<String, byte[]> parts, Class<?> type, Type 
genericType, Annotation[] annotations, MediaType mediaType, 
MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws 
IOException, WebApplicationException {
+        TarArchiveOutputStream zip = new TarArchiveOutputStream(entityStream);
+
+        for (Map.Entry<String, byte[]> entry : parts.entrySet()) {
+            tarStoreBuffer(zip, entry.getKey(), entry.getValue());
+        }
+
+        zip.close();
+    }
+}

Modified: 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TextMessageBodyWriter.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-server/src/main/java/org/apache/tika/server/TextMessageBodyWriter.java?rev=1661200&r1=1661199&r2=1661200&view=diff
==============================================================================
--- 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TextMessageBodyWriter.java
 (original)
+++ 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TextMessageBodyWriter.java
 Fri Feb 20 19:29:42 2015
@@ -35,41 +35,41 @@ import org.apache.tika.io.IOUtils;
 import org.apache.tika.metadata.Metadata;
 
 /**
- * Returns simple text string for a particular metadata value.
- * This assumes that the metadata object only has one key;
- * if there is more than one key or no keys, this will throw a webapp 
exception.
- * <p>
- * This will choose the first value returned for the one key.
- */
-@Provider
-@Produces(MediaType.TEXT_PLAIN)
-public class TextMessageBodyWriter implements MessageBodyWriter<Metadata> {
-
-  public boolean isWriteable(Class<?> type, Type genericType, Annotation[] 
annotations, MediaType mediaType) {
-    return mediaType.equals(MediaType.TEXT_PLAIN_TYPE) && 
Metadata.class.isAssignableFrom(type);
-  }
-
-  public long getSize(Metadata data, Class<?> type, Type genericType, 
Annotation[] annotations, MediaType mediaType) {
-    return -1;
-  }
-
-  @Override
-  @SuppressWarnings("resource")
-  public void writeTo(Metadata metadata, Class<?> type, Type genericType, 
Annotation[] annotations,
-      MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, 
OutputStream entityStream) throws IOException,
-      WebApplicationException {
-
-    if (metadata.names().length != 1) {
-      throw new WebApplicationException("Metadata object must only have one 
entry!");
-    }
-    Writer writer = new OutputStreamWriter(entityStream, IOUtils.UTF_8);
-
-    for (String name : metadata.names()) {
-      writer.write(metadata.get(name));
-    }
-    
-    // Don't close, just flush the stream
-    writer.flush();
-  }
-}
-
+ * Returns simple text string for a particular metadata value.
+ * This assumes that the metadata object only has one key;
+ * if there is more than one key or no keys, this will throw a webapp 
exception.
+ * <p/>
+ * This will choose the first value returned for the one key.
+ */
+@Provider
+@Produces(MediaType.TEXT_PLAIN)
+public class TextMessageBodyWriter implements MessageBodyWriter<Metadata> {
+
+    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] 
annotations, MediaType mediaType) {
+        return mediaType.equals(MediaType.TEXT_PLAIN_TYPE) && 
Metadata.class.isAssignableFrom(type);
+    }
+
+    public long getSize(Metadata data, Class<?> type, Type genericType, 
Annotation[] annotations, MediaType mediaType) {
+        return -1;
+    }
+
+    @Override
+    @SuppressWarnings("resource")
+    public void writeTo(Metadata metadata, Class<?> type, Type genericType, 
Annotation[] annotations,
+                        MediaType mediaType, MultivaluedMap<String, Object> 
httpHeaders, OutputStream entityStream) throws IOException,
+            WebApplicationException {
+
+        if (metadata.names().length != 1) {
+            throw new WebApplicationException("Metadata object must only have 
one entry!");
+        }
+        Writer writer = new OutputStreamWriter(entityStream, IOUtils.UTF_8);
+
+        for (String name : metadata.names()) {
+            writer.write(metadata.get(name));
+        }
+
+        // Don't close, just flush the stream
+        writer.flush();
+    }
+}
+

Modified: 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaDetectors.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaDetectors.java?rev=1661200&r1=1661199&r2=1661200&view=diff
==============================================================================
--- 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaDetectors.java 
(original)
+++ 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaDetectors.java 
Fri Feb 20 19:29:42 2015
@@ -13,113 +13,115 @@
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
- */
-package org.apache.tika.server;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-
-import org.apache.tika.config.TikaConfig;
-import org.apache.tika.detect.CompositeDetector;
-import org.apache.tika.detect.Detector;
+ */
+package org.apache.tika.server;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.tika.config.TikaConfig;
+import org.apache.tika.detect.CompositeDetector;
+import org.apache.tika.detect.Detector;
 import org.eclipse.jetty.util.ajax.JSON;
-
-/**
- * <p>Provides details of all the {@link Detector}s registered with
- *  Apache Tika, similar to <em>--list-detectors</em> with the Tika CLI.
- */
-@Path("/detectors")
-public class TikaDetectors {
-    private TikaConfig tika;
-    private HTMLHelper html;
-    
-    public TikaDetectors(TikaConfig tika) {
-        this.tika = tika;
-        this.html = new HTMLHelper();
-    }
-    
-    @GET
-    @Produces("text/html")
-    public String getDectorsHTML() {
+
+/**
+ * <p>Provides details of all the {@link Detector}s registered with
+ * Apache Tika, similar to <em>--list-detectors</em> with the Tika CLI.
+ */
+@Path("/detectors")
+public class TikaDetectors {
+    private TikaConfig tika;
+    private HTMLHelper html;
+
+    public TikaDetectors(TikaConfig tika) {
+        this.tika = tika;
+        this.html = new HTMLHelper();
+    }
+
+    @GET
+    @Produces("text/html")
+    public String getDectorsHTML() {
         StringBuffer h = new StringBuffer();
         html.generateHeader(h, "Detectors available to Apache Tika");
         detectorAsHTML(tika.getDetector(), h, 2);
-        html.generateFooter(h);
-        return h.toString();
-    }
-    private void detectorAsHTML(Detector d, StringBuffer html, int level) {
-        html.append("<h");
-        html.append(level);
-        html.append(">");
-        String name = d.getClass().getName();
-        html.append(name.substring(name.lastIndexOf('.')+1));
-        html.append("</h");
-        html.append(level);
-        html.append(">");
+        html.generateFooter(h);
+        return h.toString();
+    }
+
+    private void detectorAsHTML(Detector d, StringBuffer html, int level) {
+        html.append("<h");
+        html.append(level);
+        html.append(">");
+        String name = d.getClass().getName();
+        html.append(name.substring(name.lastIndexOf('.') + 1));
+        html.append("</h");
+        html.append(level);
+        html.append(">");
         html.append("<p>Class: ");
         html.append(name);
-        html.append("</p>");
-        if (d instanceof CompositeDetector) {
-            html.append("<p>Composite Detector</p>");
-            for (Detector cd : ((CompositeDetector)d).getDetectors()) {
-                detectorAsHTML(cd, html, level+1);
-            }            
-        }
-    }
-    
-    @GET
-    @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)
-    public String getDetectorsJSON() {
-        Map<String,Object> details = new HashMap<String, Object>();
-        detectorAsMap(tika.getDetector(), details);
-        return JSON.toString(details);
-    }
-    private void detectorAsMap(Detector d, Map<String, Object> details) {
-        details.put("name", d.getClass().getName());
-        
-        boolean isComposite = (d instanceof CompositeDetector);
-        details.put("composite", isComposite);
-        if (isComposite) {
-            List<Map<String, Object>> c = new ArrayList<Map<String,Object>>();
-            for (Detector cd : ((CompositeDetector)d).getDetectors()) {
-                Map<String,Object> cdet = new HashMap<String, Object>();
-                detectorAsMap(cd, cdet);
-                c.add(cdet);
-            }
-            details.put("children", c);
-        }
-    }
-    
-    @GET
-    @Produces("text/plain")
-    public String getDetectorsPlain() {
+        html.append("</p>");
+        if (d instanceof CompositeDetector) {
+            html.append("<p>Composite Detector</p>");
+            for (Detector cd : ((CompositeDetector) d).getDetectors()) {
+                detectorAsHTML(cd, html, level + 1);
+            }
+        }
+    }
+
+    @GET
+    @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)
+    public String getDetectorsJSON() {
+        Map<String, Object> details = new HashMap<String, Object>();
+        detectorAsMap(tika.getDetector(), details);
+        return JSON.toString(details);
+    }
+
+    private void detectorAsMap(Detector d, Map<String, Object> details) {
+        details.put("name", d.getClass().getName());
+
+        boolean isComposite = (d instanceof CompositeDetector);
+        details.put("composite", isComposite);
+        if (isComposite) {
+            List<Map<String, Object>> c = new ArrayList<Map<String, Object>>();
+            for (Detector cd : ((CompositeDetector) d).getDetectors()) {
+                Map<String, Object> cdet = new HashMap<String, Object>();
+                detectorAsMap(cd, cdet);
+                c.add(cdet);
+            }
+            details.put("children", c);
+        }
+    }
+
+    @GET
+    @Produces("text/plain")
+    public String getDetectorsPlain() {
         StringBuffer text = new StringBuffer();
-        renderDetector(tika.getDetector(), text, 0);
-        return text.toString();
-    }
-    private void renderDetector(Detector d, StringBuffer text, int indent) {
-        boolean isComposite = (d instanceof CompositeDetector);
-        String name = d.getClass().getName();
-        
-        for (int i=0; i<indent; i++) {
-            text.append("  ");
-        }
-        text.append(name);
-        if (isComposite) {
-            text.append(" (Composite Detector):\n");
-
-            List<Detector> subDetectors = 
((CompositeDetector)d).getDetectors();
-            for(Detector sd : subDetectors) {
-                renderDetector(sd, text, indent+1);
-            }
-        } else {
-            text.append("\n");
-        }
+        renderDetector(tika.getDetector(), text, 0);
+        return text.toString();
+    }
+
+    private void renderDetector(Detector d, StringBuffer text, int indent) {
+        boolean isComposite = (d instanceof CompositeDetector);
+        String name = d.getClass().getName();
+
+        for (int i = 0; i < indent; i++) {
+            text.append("  ");
+        }
+        text.append(name);
+        if (isComposite) {
+            text.append(" (Composite Detector):\n");
+
+            List<Detector> subDetectors = ((CompositeDetector) 
d).getDetectors();
+            for (Detector sd : subDetectors) {
+                renderDetector(sd, text, indent + 1);
+            }
+        } else {
+            text.append("\n");        }
     }
 }
\ No newline at end of file

Modified: 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaLoggingFilter.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaLoggingFilter.java?rev=1661200&r1=1661199&r2=1661200&view=diff
==============================================================================
--- 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaLoggingFilter.java
 (original)
+++ 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaLoggingFilter.java
 Fri Feb 20 19:29:42 2015
@@ -17,33 +17,35 @@
 
 package org.apache.tika.server;
 
-import java.io.IOException;
-
 import javax.ws.rs.container.ContainerRequestContext;
 import javax.ws.rs.container.ContainerRequestFilter;
 import javax.ws.rs.container.PreMatching;
 import javax.ws.rs.ext.Provider;
 
+import java.io.IOException;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 @Provider
 @PreMatching
 public class TikaLoggingFilter implements ContainerRequestFilter {
-       private static final Log logger = 
LogFactory.getLog(TikaLoggingFilter.class);
-       private boolean infoLevel;
-       public TikaLoggingFilter(boolean infoLevel) {
-               this.infoLevel = infoLevel;
-       }
-       @Override
-       public void filter(ContainerRequestContext requestContext) throws 
IOException {
-               String requestUri = 
requestContext.getUriInfo().getRequestUri().toString();
-               String logMessage = "Request URI: " + requestUri;
-               if (infoLevel) {
-                       logger.info(logMessage);
-               } else {
-                       logger.debug(logMessage);
-               }
-       }
-  
+    private static final Log logger = 
LogFactory.getLog(TikaLoggingFilter.class);
+    private boolean infoLevel;
+
+    public TikaLoggingFilter(boolean infoLevel) {
+        this.infoLevel = infoLevel;
+    }
+
+    @Override
+    public void filter(ContainerRequestContext requestContext) throws 
IOException {
+        String requestUri = 
requestContext.getUriInfo().getRequestUri().toString();
+        String logMessage = "Request URI: " + requestUri;
+        if (infoLevel) {
+            logger.info(logMessage);
+        } else {
+            logger.debug(logMessage);
+        }
+    }
+
 }

Modified: 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaMimeTypes.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaMimeTypes.java?rev=1661200&r1=1661199&r2=1661200&view=diff
==============================================================================
--- 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaMimeTypes.java 
(original)
+++ 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaMimeTypes.java 
Fri Feb 20 19:29:42 2015
@@ -13,163 +13,163 @@
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
- */
-package org.apache.tika.server;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-
-import org.apache.tika.config.TikaConfig;
-import org.apache.tika.mime.MediaType;
+ */
+package org.apache.tika.server;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import org.apache.tika.config.TikaConfig;
+import org.apache.tika.mime.MediaType;
 import org.apache.tika.mime.MediaTypeRegistry;
 import org.apache.tika.parser.CompositeParser;
 import org.apache.tika.parser.Parser;
 import org.eclipse.jetty.util.ajax.JSON;
-
-/**
- * <p>Provides details of all the mimetypes known to Apache Tika,
- *  similar to <em>--list-supported-types</em> with the Tika CLI.
- */
-@Path("/mime-types")
-public class TikaMimeTypes {
-    private TikaConfig tika;
-    private HTMLHelper html;
-    
-    public TikaMimeTypes(TikaConfig tika) {
-        this.tika = tika;
-        this.html = new HTMLHelper();
-    }
-    
-    @GET
-    @Produces("text/html")
-    public String getMimeTypesHTML() {
-        StringBuffer h = new StringBuffer();
-        html.generateHeader(h, "Apache Tika Supported Mime Types");
-        
-        // Get our types
-        List<MediaTypeDetails> types = getMediaTypes();
-        
-        // Get the first type in each section
-        SortedMap<String,String> firstType = new TreeMap<String, String>();
-        for (MediaTypeDetails type : types) {
-            if (! firstType.containsKey(type.type.getType())) {
-                firstType.put(type.type.getType(), type.type.toString());
-            }
-        }
+
+/**
+ * <p>Provides details of all the mimetypes known to Apache Tika,
+ * similar to <em>--list-supported-types</em> with the Tika CLI.
+ */
+@Path("/mime-types")
+public class TikaMimeTypes {
+    private TikaConfig tika;
+    private HTMLHelper html;
+
+    public TikaMimeTypes(TikaConfig tika) {
+        this.tika = tika;
+        this.html = new HTMLHelper();
+    }
+
+    @GET
+    @Produces("text/html")
+    public String getMimeTypesHTML() {
+        StringBuffer h = new StringBuffer();
+        html.generateHeader(h, "Apache Tika Supported Mime Types");
+
+        // Get our types
+        List<MediaTypeDetails> types = getMediaTypes();
+
+        // Get the first type in each section
+        SortedMap<String, String> firstType = new TreeMap<String, String>();
+        for (MediaTypeDetails type : types) {
+            if (!firstType.containsKey(type.type.getType())) {
+                firstType.put(type.type.getType(), type.type.toString());
+            }
+        }
         h.append("<ul>");
         for (String section : firstType.keySet()) {
-            h.append("<li><a 
href=\"#").append(firstType.get(section)).append("\">").append(section).append("</a></li>\n");
-        }
-        h.append("</ul>");
-        
-        // Output all of them
-        for (MediaTypeDetails type : types) {
-            h.append("<a name=\"").append(type.type).append("\"></a>\n");
-            h.append("<h2>").append(type.type).append("</h2>\n");
-            
-            for (MediaType alias : type.aliases) {
-                h.append("<div>Alias: ").append(alias).append("</div>\n");
-            }
-            if (type.supertype != null) {
-                h.append("<div>Super Type: <a 
href=\"#").append(type.supertype).append("\">").append(type.supertype).append("</a></div>\n");
-            }
-            
-            if (type.parser != null) {
-                h.append("<div>Parser: 
").append(type.parser).append("</div>\n");
-            }
-        }
-
-        html.generateFooter(h);
-        return h.toString();
-    }
-    
-    @GET
-    @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)
-    public String getMimeTypesJSON() {
-        Map<String,Object> details = new HashMap<String, Object>();
-        
-        for (MediaTypeDetails type : getMediaTypes()) {
-            Map<String,Object> typeDets = new HashMap<String, Object>();
-
-            typeDets.put("alias", type.aliases);
-            if (type.supertype != null) {
+            h.append("<li><a 
href=\"#").append(firstType.get(section)).append("\">").append(section).append("</a></li>\n");
+        }
+        h.append("</ul>");
+
+        // Output all of them
+        for (MediaTypeDetails type : types) {
+            h.append("<a name=\"").append(type.type).append("\"></a>\n");
+            h.append("<h2>").append(type.type).append("</h2>\n");
+
+            for (MediaType alias : type.aliases) {
+                h.append("<div>Alias: ").append(alias).append("</div>\n");
+            }
+            if (type.supertype != null) {
+                h.append("<div>Super Type: <a 
href=\"#").append(type.supertype).append("\">").append(type.supertype).append("</a></div>\n");
+            }
+
+            if (type.parser != null) {
+                h.append("<div>Parser: 
").append(type.parser).append("</div>\n");
+            }
+        }
+
+        html.generateFooter(h);
+        return h.toString();
+    }
+
+    @GET
+    @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)
+    public String getMimeTypesJSON() {
+        Map<String, Object> details = new HashMap<String, Object>();
+
+        for (MediaTypeDetails type : getMediaTypes()) {
+            Map<String, Object> typeDets = new HashMap<String, Object>();
+
+            typeDets.put("alias", type.aliases);
+            if (type.supertype != null) {
                 typeDets.put("supertype", type.supertype);
             }
             if (type.parser != null) {
                 typeDets.put("parser", type.parser);
             }
-
-            details.put(type.type.toString(), typeDets);
-        }
-        
-        return JSON.toString(details);
-    }
-    
-    @GET
-    @Produces("text/plain")
-    public String getMimeTypesPlain() {
-        StringBuffer text = new StringBuffer();
-        
-        for (MediaTypeDetails type : getMediaTypes()) {
-            text.append(type.type.toString());
-            text.append("\n");
-            
-            for (MediaType alias : type.aliases) {
-                text.append("  alias:     ").append(alias).append("\n");
-            }
-            if (type.supertype != null) {
-                text.append("  supertype: 
").append(type.supertype.toString()).append("\n");
-            }
-            
-            if (type.parser != null) {
-                text.append("  parser:    ").append(type.parser).append("\n");
-            }
-        }
-
-        return text.toString();
-    }
-    
-    protected List<MediaTypeDetails> getMediaTypes() {
-        MediaTypeRegistry registry = tika.getMediaTypeRegistry();
-        Map<MediaType, Parser> parsers = 
((CompositeParser)tika.getParser()).getParsers();
-        List<MediaTypeDetails> types = 
-                new 
ArrayList<TikaMimeTypes.MediaTypeDetails>(registry.getTypes().size());
-
-        for (MediaType type : registry.getTypes()) {
-            MediaTypeDetails details = new MediaTypeDetails();
-            details.type = type;
-            details.aliases = registry.getAliases(type).toArray(new 
MediaType[0]);
-            
-            MediaType supertype = registry.getSupertype(type);
-            if (supertype != null && 
!MediaType.OCTET_STREAM.equals(supertype)) {
-                details.supertype = supertype;
-            }
-            
-            Parser p = parsers.get(type);
-            if (p != null) {
-                if (p instanceof CompositeParser) {
-                    p = ((CompositeParser)p).getParsers().get(type);
-                }
-                details.parser = p.getClass().getName();
-            }
-            
-            types.add(details);
-        }
-        
-        return types;
-    }
-    
-    private static class MediaTypeDetails {
-        private MediaType type;
-        private MediaType[] aliases;
+
+            details.put(type.type.toString(), typeDets);
+        }
+
+        return JSON.toString(details);
+    }
+
+    @GET
+    @Produces("text/plain")
+    public String getMimeTypesPlain() {
+        StringBuffer text = new StringBuffer();
+
+        for (MediaTypeDetails type : getMediaTypes()) {
+            text.append(type.type.toString());
+            text.append("\n");
+
+            for (MediaType alias : type.aliases) {
+                text.append("  alias:     ").append(alias).append("\n");
+            }
+            if (type.supertype != null) {
+                text.append("  supertype: 
").append(type.supertype.toString()).append("\n");
+            }
+
+            if (type.parser != null) {
+                text.append("  parser:    ").append(type.parser).append("\n");
+            }
+        }
+
+        return text.toString();
+    }
+
+    protected List<MediaTypeDetails> getMediaTypes() {
+        MediaTypeRegistry registry = tika.getMediaTypeRegistry();
+        Map<MediaType, Parser> parsers = ((CompositeParser) 
tika.getParser()).getParsers();
+        List<MediaTypeDetails> types =
+                new 
ArrayList<TikaMimeTypes.MediaTypeDetails>(registry.getTypes().size());
+
+        for (MediaType type : registry.getTypes()) {
+            MediaTypeDetails details = new MediaTypeDetails();
+            details.type = type;
+            details.aliases = registry.getAliases(type).toArray(new 
MediaType[0]);
+
+            MediaType supertype = registry.getSupertype(type);
+            if (supertype != null && 
!MediaType.OCTET_STREAM.equals(supertype)) {
+                details.supertype = supertype;
+            }
+
+            Parser p = parsers.get(type);
+            if (p != null) {
+                if (p instanceof CompositeParser) {
+                    p = ((CompositeParser) p).getParsers().get(type);
+                }
+                details.parser = p.getClass().getName();
+            }
+
+            types.add(details);
+        }
+
+        return types;
+    }
+
+    private static class MediaTypeDetails {
+        private MediaType type;
+        private MediaType[] aliases;
         private MediaType supertype;
         private String parser;
     }

Modified: 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaParsers.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaParsers.java?rev=1661200&r1=1661199&r2=1661200&view=diff
==============================================================================
--- 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaParsers.java 
(original)
+++ 
tika/trunk/tika-server/src/main/java/org/apache/tika/server/TikaParsers.java 
Fri Feb 20 19:29:42 2015
@@ -13,69 +13,72 @@
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
- */
-package org.apache.tika.server;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
+ */
+package org.apache.tika.server;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-
-import org.apache.tika.config.TikaConfig;
-import org.apache.tika.mime.MediaType;
-import org.apache.tika.parser.CompositeParser;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.tika.config.TikaConfig;
+import org.apache.tika.mime.MediaType;
+import org.apache.tika.parser.CompositeParser;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.parser.ParserDecorator;
 import org.eclipse.jetty.util.ajax.JSON;
-
-/**
- * <p>Provides details of all the {@link Parser}s registered with
- *  Apache Tika, similar to <em>--list-parsers</em> and
- *  <em>--list-parser-details</em> within the Tika CLI.
- */
-@Path("/parsers")
-public class TikaParsers {
-    private static final ParseContext EMPTY_PC = new ParseContext();
-    private TikaConfig tika;
-    private HTMLHelper html;
-    
-    public TikaParsers(TikaConfig tika) {
-        this.tika = tika;
-        this.html = new HTMLHelper();
-    }
-    
-    @GET
-    @Path("/details")
-    @Produces("text/html")
-    public String getParserDetailsHTML() {
-        return getParsersHTML(true);
-    }
-    @GET
-    @Produces("text/html")
-    public String getParsersHTML() {
-        return getParsersHTML(false);
-    }
-    protected String getParsersHTML(boolean withMimeTypes) {
-        ParserDetails p = new ParserDetails(tika.getParser());
-        
-        StringBuffer h = new StringBuffer();
-        html.generateHeader(h, "Parsers available to Apache Tika");
-        parserAsHTML(p, withMimeTypes, h, 2);
-        html.generateFooter(h);
-        return h.toString();
-    }
-    private void parserAsHTML(ParserDetails p, boolean withMimeTypes, 
StringBuffer html, int level) {
-        html.append("<h");
-        html.append(level);
+
+/**
+ * <p>Provides details of all the {@link Parser}s registered with
+ * Apache Tika, similar to <em>--list-parsers</em> and
+ * <em>--list-parser-details</em> within the Tika CLI.
+ */
+@Path("/parsers")
+public class TikaParsers {
+    private static final ParseContext EMPTY_PC = new ParseContext();
+    private TikaConfig tika;
+    private HTMLHelper html;
+
+    public TikaParsers(TikaConfig tika) {
+        this.tika = tika;
+        this.html = new HTMLHelper();
+    }
+
+    @GET
+    @Path("/details")
+    @Produces("text/html")
+    public String getParserDetailsHTML() {
+        return getParsersHTML(true);
+    }
+
+    @GET
+    @Produces("text/html")
+    public String getParsersHTML() {
+        return getParsersHTML(false);
+    }
+
+    protected String getParsersHTML(boolean withMimeTypes) {
+        ParserDetails p = new ParserDetails(tika.getParser());
+
+        StringBuffer h = new StringBuffer();
+        html.generateHeader(h, "Parsers available to Apache Tika");
+        parserAsHTML(p, withMimeTypes, h, 2);
+        html.generateFooter(h);
+        return h.toString();
+    }
+
+    private void parserAsHTML(ParserDetails p, boolean withMimeTypes, 
StringBuffer html, int level) {
+        html.append("<h");
+        html.append(level);
         html.append(">");
         html.append(p.shortName);
         html.append("</h");
@@ -87,13 +90,13 @@ public class TikaParsers {
         if (p.isDecorated) {
             html.append("<p>Decorated Parser</p>");
         }
-        if (p.isComposite) {
-            html.append("<p>Composite Parser</p>");
-            for (Parser cp : p.childParsers) {
-                parserAsHTML(new ParserDetails(cp), withMimeTypes, html, 
level+1);
-            }
-        } else if (withMimeTypes) {
-            html.append("<p>Mime Types:");
+        if (p.isComposite) {
+            html.append("<p>Composite Parser</p>");
+            for (Parser cp : p.childParsers) {
+                parserAsHTML(new ParserDetails(cp), withMimeTypes, html, level 
+ 1);
+            }
+        } else if (withMimeTypes) {
+            html.append("<p>Mime Types:");
             html.append("<ul>");
             for (MediaType mt : p.supportedTypes) {
                 html.append("<li>");
@@ -101,70 +104,76 @@ public class TikaParsers {
                 html.append("</li>");
             }
             html.append("</ul>");
-            html.append("</p>");
-        }
-    }
-    
-    @GET
-    @Path("/details")
-    @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)
-    public String getParserDetailsJSON() {
-        return getParsersJSON(true);
-    }
-    @GET
-    @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)
-    public String getParsersJSON() {
-        return getParsersJSON(false);
-    }
-    protected String getParsersJSON(boolean withMimeTypes) {
-        Map<String,Object> details = new HashMap<String, Object>();
-        parserAsMap(new ParserDetails(tika.getParser()), withMimeTypes, 
details);
-        return JSON.toString(details);
-    }
-    private void parserAsMap(ParserDetails p, boolean withMimeTypes, 
Map<String, Object> details) {
-        details.put("name", p.className);
-        details.put("composite", p.isComposite);
-        details.put("decorated", p.isDecorated);
-        
-        if (p.isComposite) {
-            List<Map<String, Object>> c = new ArrayList<Map<String,Object>>();
-            for (Parser cp : p.childParsers) {
-                Map<String,Object> cdet = new HashMap<String, Object>();
-                parserAsMap(new ParserDetails(cp), withMimeTypes, cdet);
-                c.add(cdet);
-            }
+            html.append("</p>");
+        }
+    }
+
+    @GET
+    @Path("/details")
+    @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)
+    public String getParserDetailsJSON() {
+        return getParsersJSON(true);
+    }
+
+    @GET
+    @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)
+    public String getParsersJSON() {
+        return getParsersJSON(false);
+    }
+
+    protected String getParsersJSON(boolean withMimeTypes) {
+        Map<String, Object> details = new HashMap<String, Object>();
+        parserAsMap(new ParserDetails(tika.getParser()), withMimeTypes, 
details);
+        return JSON.toString(details);
+    }
+
+    private void parserAsMap(ParserDetails p, boolean withMimeTypes, 
Map<String, Object> details) {
+        details.put("name", p.className);
+        details.put("composite", p.isComposite);
+        details.put("decorated", p.isDecorated);
+
+        if (p.isComposite) {
+            List<Map<String, Object>> c = new ArrayList<Map<String, Object>>();
+            for (Parser cp : p.childParsers) {
+                Map<String, Object> cdet = new HashMap<String, Object>();
+                parserAsMap(new ParserDetails(cp), withMimeTypes, cdet);
+                c.add(cdet);
+            }
             details.put("children", c);
         } else if (withMimeTypes) {
             List<String> mts = new ArrayList<String>(p.supportedTypes.size());
             for (MediaType mt : p.supportedTypes) {
                 mts.add(mt.toString());
             }
-            details.put("supportedTypes", mts);
-        }
-    }
-    
-    @GET
-    @Path("/details")
-    @Produces("text/plain")
-    public String getParserDetailssPlain() {
-        return getParsersPlain(true);
-    }
-    @GET
-    @Produces("text/plain")
-    public String getParsersPlain() {
-        return getParsersPlain(false);
-    }
-    protected String getParsersPlain(boolean withMimeTypes) {
-        StringBuffer text = new StringBuffer();
-        renderParser(new ParserDetails(tika.getParser()), withMimeTypes, text, 
"");
-        return text.toString();
-    }
-    private void renderParser(ParserDetails p, boolean withMimeTypes, 
StringBuffer text, String indent) {
-        String nextIndent = indent + "  ";
-        
-        text.append(indent);
-        text.append(p.className);
-        if (p.isDecorated) {
+            details.put("supportedTypes", mts);
+        }
+    }
+
+    @GET
+    @Path("/details")
+    @Produces("text/plain")
+    public String getParserDetailssPlain() {
+        return getParsersPlain(true);
+    }
+
+    @GET
+    @Produces("text/plain")
+    public String getParsersPlain() {
+        return getParsersPlain(false);
+    }
+
+    protected String getParsersPlain(boolean withMimeTypes) {
+        StringBuffer text = new StringBuffer();
+        renderParser(new ParserDetails(tika.getParser()), withMimeTypes, text, 
"");
+        return text.toString();
+    }
+
+    private void renderParser(ParserDetails p, boolean withMimeTypes, 
StringBuffer text, String indent) {
+        String nextIndent = indent + "  ";
+
+        text.append(indent);
+        text.append(p.className);
+        if (p.isDecorated) {
             text.append(" (Decorated Parser)");
         }
         if (p.isComposite) {
@@ -182,38 +191,37 @@ public class TikaParsers {
                     text.append(mt.toString());
                     text.append("\n");
                 }
-            }
-        }
-    }
-    
-    private static class ParserDetails {
-        private String className;
-        private String shortName;
+            }
+        }
+    }
+
+    private static class ParserDetails {
+        private String className;
+        private String shortName;
         private boolean isComposite;
-        private boolean isDecorated;
-        private Set<MediaType> supportedTypes;
-        private List<Parser> childParsers;
-        
-        private ParserDetails(Parser p) {
-            if (p instanceof ParserDecorator) {
-                isDecorated = true;
-                p = ((ParserDecorator)p).getWrappedParser();
-            }
-            
-            className = p.getClass().getName();
-            shortName = className.substring(className.lastIndexOf('.')+1);
-            
-            if (p instanceof CompositeParser) {
-                isComposite = true;
-                supportedTypes = Collections.emptySet();
-                
-                // Get the unique set of child parsers
-                Set<Parser> children = new HashSet<Parser>(
-                        ((CompositeParser)p).getParsers(EMPTY_PC).values());
-                // Sort it by class name
-                childParsers = new ArrayList<Parser>(children);
-                Collections.sort(childParsers, new Comparator<Parser>() {
-                    @Override
+        private boolean isDecorated;
+        private Set<MediaType> supportedTypes;
+        private List<Parser> childParsers;
+
+        private ParserDetails(Parser p) {
+            if (p instanceof ParserDecorator) {
+                isDecorated = true;
+                p = ((ParserDecorator) p).getWrappedParser();
+            }
+
+            className = p.getClass().getName();
+            shortName = className.substring(className.lastIndexOf('.') + 1);
+
+            if (p instanceof CompositeParser) {
+                isComposite = true;
+                supportedTypes = Collections.emptySet();
+
+                // Get the unique set of child parsers
+                Set<Parser> children = new HashSet<Parser>(
+                        ((CompositeParser) p).getParsers(EMPTY_PC).values());
+                // Sort it by class name
+                childParsers = new ArrayList<Parser>(children);
+                Collections.sort(childParsers, new Comparator<Parser>() {      
              @Override
                     public int compare(Parser p1, Parser p2) {
                         return 
p1.getClass().getName().compareTo(p2.getClass().getName());
                     }


Reply via email to