|
16 | 16 | */ |
17 | 17 | package org.apache.parquet.web.controller; |
18 | 18 |
|
19 | | -import com.fasterxml.jackson.core.JsonGenerator; |
20 | | -import com.fasterxml.jackson.databind.ObjectMapper; |
21 | | -import com.fasterxml.jackson.databind.SerializationFeature; |
22 | 19 | import jakarta.servlet.ServletContext; |
| 20 | +import jakarta.servlet.ServletOutputStream; |
23 | 21 | import jakarta.servlet.http.HttpServlet; |
24 | 22 | import jakarta.servlet.http.HttpServletRequest; |
25 | 23 | import jakarta.servlet.http.HttpServletResponse; |
| 24 | +import org.apache.avro.Schema; |
26 | 25 | import org.apache.avro.generic.GenericRecord; |
27 | 26 | import org.apache.commons.io.output.ByteArrayOutputStream; |
28 | 27 | import org.apache.hadoop.conf.Configuration; |
|
42 | 41 | import java.io.IOException; |
43 | 42 | import java.io.InputStream; |
44 | 43 | import java.net.HttpURLConnection; |
| 44 | +import java.util.ArrayList; |
| 45 | +import java.util.List; |
45 | 46 |
|
46 | 47 | public class ParquetContentViewerController extends HttpServlet { |
47 | 48 | private static final Logger logger = LoggerFactory.getLogger(ParquetContentViewerController.class); |
48 | 49 | private static final long MAX_CONTENT_SIZE = 1024 * 1024 * 2; // 10MB |
49 | 50 | private static final int BUFFER_SIZE = 8 * 1024; // 8KB |
50 | | - private static final ObjectMapper objectMapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT); |
51 | | - |
52 | | - static { |
53 | | - objectMapper.getFactory().configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false); |
54 | | - } |
| 51 | + private static final String indent = " "; |
55 | 52 |
|
56 | 53 | @Override |
57 | 54 | public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException { |
@@ -101,17 +98,27 @@ public void doGet(final HttpServletRequest request, final HttpServletResponse re |
101 | 98 | //Format and write out each record |
102 | 99 | GenericRecord record; |
103 | 100 | boolean firstRecord = true; |
104 | | - response.getOutputStream().write("[\n".getBytes()); |
105 | | - while ((record = reader.read()) != null) { |
106 | | - if (firstRecord) { |
107 | | - firstRecord = false; |
108 | | - } else { |
109 | | - response.getOutputStream().write(",\n".getBytes()); |
| 101 | + final List<Schema.Field> fields = new ArrayList<>(); |
| 102 | + try (ServletOutputStream outputStream = response.getOutputStream()) { |
| 103 | + outputStream.write("[\n".getBytes()); |
| 104 | + while ((record = reader.read()) != null) { |
| 105 | + if (firstRecord) { |
| 106 | + firstRecord = false; |
| 107 | + fields.addAll(record.getSchema().getFields()); |
| 108 | + } else { |
| 109 | + outputStream.write(",\n".getBytes()); |
| 110 | + } |
| 111 | + |
| 112 | + outputStream.write((indent + "{\n").getBytes()); |
| 113 | + for (Schema.Field field : fields) { |
| 114 | + outputStream.write((indent + indent).getBytes()); |
| 115 | + outputStream.write(("\"" + field.name() + "\": ").getBytes()); |
| 116 | + outputStream.write(("\"" + record.get(field.name()) + "\" \n").getBytes()); |
| 117 | + } |
| 118 | + outputStream.write((indent + "}").getBytes()); |
110 | 119 | } |
111 | | - |
112 | | - objectMapper.writerWithDefaultPrettyPrinter().writeValue(response.getOutputStream(), objectMapper.readTree(record.toString())); |
| 120 | + outputStream.write("\n]".getBytes()); |
113 | 121 | } |
114 | | - response.getOutputStream().write("\n]".getBytes()); |
115 | 122 | } catch (final Throwable t) { |
116 | 123 | logger.warn("Unable to format FlowFile content", t); |
117 | 124 | response.sendError(HttpURLConnection.HTTP_INTERNAL_ERROR, "Unable to format FlowFile content"); |
|
0 commit comments