Michael Blow has submitted this change and it was merged. Change subject: [NO ISSUE] Refactoring / cleanup ......................................................................
[NO ISSUE] Refactoring / cleanup - Use shared ObjectMapper instance where possible for servlets - Add StringUtil with camel-case conversion utility - Serialize properties in alphabetical order when using JSONUtil Change-Id: Idd1b805dfa425dcd87d83e361297a0351c56cc6a Reviewed-on: https://asterix-gerrit.ics.uci.edu/2033 Sonar-Qube: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Contrib: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Reviewed-by: Murtadha Hubail <[email protected]> --- M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveStatsApiServlet.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterApiServlet.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterControllerDetailsApiServlet.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/DiagnosticsApiServlet.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NodeControllerDetailsApiServlet.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RebalanceApiServlet.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ShutdownApiServlet.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/VersionApiServlet.java M asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_3/cluster_state_3.1.adm M asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_4/cluster_state_4.1.adm M asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/MetadataReplicationIT.java M asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.cluster_state.4.adm M asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.cluster_state.7.adm M asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.10.adm M asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.5.adm M hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOption.java M hyracks-fullstack/hyracks/hyracks-http/pom.xml M hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/AbstractServlet.java M hyracks-fullstack/hyracks/hyracks-util/pom.xml M hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/JSONUtil.java A hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StringUtil.java M hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ThreadDumpUtil.java A hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/StringUtilTest.java 27 files changed, 235 insertions(+), 160 deletions(-) Approvals: Jenkins: Verified; No violations found; ; Verified Murtadha Hubail: Looks good to me, approved Objections: Anon. E. Moose #1000171: diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveStatsApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveStatsApiServlet.java index 9e085a3..7e6d54b 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveStatsApiServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveStatsApiServlet.java @@ -33,9 +33,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.node.ObjectNode; - import io.netty.handler.codec.http.HttpResponseStatus; public class ActiveStatsApiServlet extends AbstractServlet { @@ -67,9 +65,7 @@ String localPath = localPath(request); int expireTime; IActiveEntityEventsListener[] listeners = activeNotificationHandler.getEventListeners(); - ObjectMapper om = new ObjectMapper(); - om.enable(SerializationFeature.INDENT_OUTPUT); - ObjectNode resNode = om.createObjectNode(); + ObjectNode resNode = OBJECT_MAPPER.createObjectNode(); PrintWriter responseWriter = response.writer(); try { response.setStatus(HttpResponseStatus.OK); @@ -81,10 +77,10 @@ long currentTime = System.currentTimeMillis(); for (int iter1 = 0; iter1 < listeners.length; iter1++) { resNode.putPOJO(listeners[iter1].getDisplayName(), - constructNode(om, listeners[iter1], currentTime, expireTime)); + constructNode(OBJECT_MAPPER, listeners[iter1], currentTime, expireTime)); } // Construct Response - responseWriter.write(om.writerWithDefaultPrettyPrinter().writeValueAsString(resNode)); + responseWriter.write(OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(resNode)); } catch (Exception e) { LOGGER.log(Level.INFO, "exception thrown for " + request, e); response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR); diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterApiServlet.java index 3e1a16d..3f065ee 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterApiServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterApiServlet.java @@ -39,7 +39,6 @@ import org.apache.hyracks.http.server.utils.HttpUtil; import org.apache.hyracks.util.JSONUtil; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -57,7 +56,6 @@ protected static final String FULL_SHUTDOWN_URI_KEY = "fullShutdownUri"; protected static final String VERSION_URI_KEY = "versionUri"; protected static final String DIAGNOSTICS_URI_KEY = "diagnosticsUri"; - private final ObjectMapper om = new ObjectMapper(); protected final ICcApplicationContext appCtx; public ClusterApiServlet(ICcApplicationContext appCtx, ConcurrentMap<String, Object> ctx, String... paths) { @@ -117,7 +115,7 @@ if (json.has("cc")) { cc = (ObjectNode) json.get("cc"); } else { - cc = om.createObjectNode(); + cc = OBJECT_MAPPER.createObjectNode(); json.set("cc", cc); } cc.put(CONFIG_URI_KEY, clusterURL + "cc/config"); diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterControllerDetailsApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterControllerDetailsApiServlet.java index 15f28a4..1faa316 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterControllerDetailsApiServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterControllerDetailsApiServlet.java @@ -32,7 +32,6 @@ import org.apache.hyracks.http.api.IServletResponse; import org.apache.hyracks.http.server.utils.HttpUtil; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import io.netty.handler.codec.http.HttpResponseStatus; @@ -40,7 +39,6 @@ public class ClusterControllerDetailsApiServlet extends ClusterApiServlet { private static final Logger LOGGER = Logger.getLogger(ClusterControllerDetailsApiServlet.class.getName()); - private final ObjectMapper om = new ObjectMapper(); public ClusterControllerDetailsApiServlet(ICcApplicationContext appCtx, ConcurrentMap<String, Object> ctx, String... paths) { @@ -60,7 +58,7 @@ json = processNode(request, hcc); } HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8); - responseWriter.write(new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(json)); + responseWriter.write(OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(json)); } catch (IllegalArgumentException e) { // NOSONAR - exception not logged or rethrown response.setStatus(HttpResponseStatus.NOT_FOUND); } catch (Exception e) { @@ -83,9 +81,9 @@ } else if (parts.length == 1) { switch (parts[0]) { case "config": - return om.readValue(hcc.getNodeDetailsJSON(null, false, true), ObjectNode.class); + return OBJECT_MAPPER.readValue(hcc.getNodeDetailsJSON(null, false, true), ObjectNode.class); case "stats": - return om.readValue(hcc.getNodeDetailsJSON(null, true, false), ObjectNode.class); + return OBJECT_MAPPER.readValue(hcc.getNodeDetailsJSON(null, true, false), ObjectNode.class); case "threaddump": return processCCThreadDump(hcc); @@ -103,6 +101,6 @@ if (dump == null) { throw new IllegalArgumentException(); } - return (ObjectNode) om.readTree(dump); + return (ObjectNode) OBJECT_MAPPER.readTree(dump); } } diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java index 52af643..b51187c 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java @@ -77,8 +77,7 @@ } PrintWriter out = response.writer(); try { - ObjectMapper om = new ObjectMapper(); - ObjectNode jsonResponse = om.createObjectNode(); + ObjectNode jsonResponse = OBJECT_MAPPER.createObjectNode(); String dataverseName = request.getParameter("dataverseName"); String datasetName = request.getParameter("datasetName"); if (dataverseName == null || datasetName == null) { @@ -140,8 +139,7 @@ private void formResponseObject(ObjectNode jsonResponse, FileSplit[] fileSplits, ARecordType recordType, String primaryKeys, boolean temp, Map<String, NodeControllerInfo> nodeMap) { - ObjectMapper om = new ObjectMapper(); - ArrayNode partititons = om.createArrayNode(); + ArrayNode partititons = OBJECT_MAPPER.createArrayNode(); // Whether the dataset is temp or not jsonResponse.put("temp", temp); // Adds a primary key. diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/DiagnosticsApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/DiagnosticsApiServlet.java index a631db0..3c58f30 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/DiagnosticsApiServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/DiagnosticsApiServlet.java @@ -43,22 +43,17 @@ import org.apache.hyracks.util.JSONUtil; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.TextNode; - import io.netty.handler.codec.http.HttpResponseStatus; public class DiagnosticsApiServlet extends NodeControllerDetailsApiServlet { private static final Logger LOGGER = Logger.getLogger(DiagnosticsApiServlet.class.getName()); - protected final ObjectMapper om; protected final IHyracksClientConnection hcc; protected final ExecutorService executor; public DiagnosticsApiServlet(ICcApplicationContext appCtx, ConcurrentMap<String, Object> ctx, String... paths) { super(appCtx, ctx, paths); - this.om = new ObjectMapper(); this.hcc = (IHyracksClientConnection) ctx.get(HYRACKS_CONNECTION_ATTR); this.executor = (ExecutorService) ctx.get(ServletConstants.EXECUTOR_SERVICE_ATTR); } @@ -68,7 +63,6 @@ HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8); PrintWriter responseWriter = response.writer(); response.setStatus(HttpResponseStatus.OK); - om.enable(SerializationFeature.INDENT_OUTPUT); try { if (!"".equals(localPath(request))) { throw new IllegalArgumentException(); @@ -94,7 +88,7 @@ for (String nc : csm.getParticipantNodes()) { ncDataMap.put(nc, getNcDiagnosticFutures(nc)); } - ObjectNode result = om.createObjectNode(); + ObjectNode result = OBJECT_MAPPER.createObjectNode(); result.putPOJO("cc", resolveFutures(ccFutureData)); List<Map<String, ?>> ncList = new ArrayList<>(); for (Map.Entry<String, Map<String, Future<JsonNode>>> entry : ncDataMap.entrySet()) { @@ -110,9 +104,11 @@ protected Map<String, Future<JsonNode>> getNcDiagnosticFutures(String nc) { Map<String, Future<JsonNode>> ncData; ncData = new HashMap<>(); - ncData.put("threaddump", executor.submit(() -> fixupKeys((ObjectNode) om.readTree(hcc.getThreadDump(nc))))); + ncData.put("threaddump", + executor.submit(() -> fixupKeys((ObjectNode) OBJECT_MAPPER.readTree(hcc.getThreadDump(nc))))); ncData.put("config", - executor.submit(() -> fixupKeys((ObjectNode) om.readTree(hcc.getNodeDetailsJSON(nc, false, true))))); + executor.submit( + () -> fixupKeys((ObjectNode) OBJECT_MAPPER.readTree(hcc.getNodeDetailsJSON(nc, false, true))))); ncData.put("stats", executor.submit(() -> fixupKeys(processNodeStats(hcc, nc)))); return ncData; } @@ -121,11 +117,13 @@ Map<String, Future<JsonNode>> ccFutureData; ccFutureData = new HashMap<>(); ccFutureData.put("threaddump", - executor.submit(() -> fixupKeys((ObjectNode) om.readTree(hcc.getThreadDump(null))))); + executor.submit(() -> fixupKeys((ObjectNode) OBJECT_MAPPER.readTree(hcc.getThreadDump(null))))); ccFutureData.put("config", - executor.submit(() -> fixupKeys((ObjectNode) om.readTree(hcc.getNodeDetailsJSON(null, false, true))))); + executor.submit(() -> fixupKeys( + (ObjectNode) OBJECT_MAPPER.readTree(hcc.getNodeDetailsJSON(null, false, true))))); ccFutureData.put("stats", - executor.submit(() -> fixupKeys((ObjectNode) om.readTree(hcc.getNodeDetailsJSON(null, true, false))))); + executor.submit(() -> fixupKeys( + (ObjectNode) OBJECT_MAPPER.readTree(hcc.getNodeDetailsJSON(null, true, false))))); return ccFutureData; } diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NodeControllerDetailsApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NodeControllerDetailsApiServlet.java index ee4812a..2c94f86 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NodeControllerDetailsApiServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NodeControllerDetailsApiServlet.java @@ -38,22 +38,17 @@ import org.apache.hyracks.http.server.utils.HttpUtil; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; - import io.netty.handler.codec.http.HttpResponseStatus; public class NodeControllerDetailsApiServlet extends ClusterApiServlet { private static final Logger LOGGER = Logger.getLogger(NodeControllerDetailsApiServlet.class.getName()); - private final ObjectMapper om = new ObjectMapper(); public NodeControllerDetailsApiServlet(ICcApplicationContext appCtx, ConcurrentMap<String, Object> ctx, String... paths) { super(appCtx, ctx, paths); - om.enable(SerializationFeature.INDENT_OUTPUT); } @Override @@ -64,13 +59,13 @@ ObjectNode json; response.setStatus(HttpResponseStatus.OK); if ("".equals(localPath(request))) { - json = om.createObjectNode(); + json = OBJECT_MAPPER.createObjectNode(); json.set("ncs", getClusterStateJSON(request, "../").get("ncs")); } else { json = processNode(request, hcc); } HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8); - responseWriter.write(om.writerWithDefaultPrettyPrinter().writeValueAsString(json)); + responseWriter.write(OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(json)); } catch (IllegalStateException e) { // NOSONAR - exception not logged or rethrown response.setStatus(HttpResponseStatus.SERVICE_UNAVAILABLE); } catch (IllegalArgumentException e) { // NOSONAR - exception not logged or rethrown @@ -99,7 +94,7 @@ } } if ("cc".equals(node)) { - return om.createObjectNode(); + return OBJECT_MAPPER.createObjectNode(); } throw new IllegalArgumentException(); } else if (parts.length == 2) { @@ -148,7 +143,7 @@ if (details == null) { throw new IllegalArgumentException(); } - ObjectNode json = (ObjectNode) om.readTree(details); + ObjectNode json = (ObjectNode) OBJECT_MAPPER.readTree(details); int index = json.get("rrd-ptr").asInt() - 1; json.remove("rrd-ptr"); @@ -178,10 +173,10 @@ } } } - ArrayNode gcs = om.createArrayNode(); + ArrayNode gcs = OBJECT_MAPPER.createArrayNode(); for (int i = 0; i < gcNames.size(); i++) { - ObjectNode gc = om.createObjectNode(); + ObjectNode gc = OBJECT_MAPPER.createObjectNode(); gc.set("name", gcNames.get(i)); gc.set("collection-time", gcCollectionTimes.get(i).get(index)); gc.set("collection-count", gcCollectionCounts.get(i).get(index)); @@ -198,12 +193,12 @@ if (config == null) { throw new IllegalArgumentException(); } - return (ObjectNode) om.readTree(config); + return (ObjectNode) OBJECT_MAPPER.readTree(config); } private ObjectNode processNodeThreadDump(IHyracksClientConnection hcc, String node) throws Exception { if ("cc".equals(node)) { - return om.createObjectNode(); + return OBJECT_MAPPER.createObjectNode(); } String dump = hcc.getThreadDump(node); if (dump == null) { @@ -212,6 +207,6 @@ ClusterPartition[] cp = csm.getNodePartitions(node); throw cp != null ? new IllegalStateException() : new IllegalArgumentException(); } - return (ObjectNode) om.readTree(dump); + return (ObjectNode) OBJECT_MAPPER.readTree(dump); } } diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java index ad34d96..c4f58f6 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java @@ -308,7 +308,7 @@ param.path = servletPath(request); if (HttpUtil.ContentType.APPLICATION_JSON.equals(contentType)) { try { - JsonNode jsonRequest = new ObjectMapper().readTree(HttpUtil.getRequestBody(request)); + JsonNode jsonRequest = OBJECT_MAPPER.readTree(HttpUtil.getRequestBody(request)); param.statement = jsonRequest.get(Parameter.STATEMENT.str()).asText(); param.format = toLower(getOptText(jsonRequest, Parameter.FORMAT.str())); param.pretty = getOptBoolean(jsonRequest, Parameter.PRETTY.str(), false); diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java index c798a7c..db39c5e 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java @@ -31,7 +31,6 @@ import org.apache.hyracks.http.server.StaticResourceServlet; import org.apache.hyracks.http.server.utils.HttpUtil; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import io.netty.handler.codec.http.HttpResponseStatus; @@ -61,8 +60,7 @@ HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8); ExternalProperties externalProperties = appCtx.getExternalProperties(); response.setStatus(HttpResponseStatus.OK); - ObjectMapper om = new ObjectMapper(); - ObjectNode obj = om.createObjectNode(); + ObjectNode obj = OBJECT_MAPPER.createObjectNode(); try { PrintWriter out = response.writer(); obj.put("api_port", String.valueOf(externalProperties.getAPIServerPort())); diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RebalanceApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RebalanceApiServlet.java index 8536571..5bd3d3c 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RebalanceApiServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RebalanceApiServlet.java @@ -53,7 +53,6 @@ import org.apache.hyracks.http.server.AbstractServlet; import org.apache.hyracks.http.server.utils.HttpUtil; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import io.netty.handler.codec.http.HttpResponseStatus; @@ -273,8 +272,7 @@ } } PrintWriter out = response.writer(); - ObjectMapper om = new ObjectMapper(); - ObjectNode jsonResponse = om.createObjectNode(); + ObjectNode jsonResponse = OBJECT_MAPPER.createObjectNode(); jsonResponse.put("results", message); response.setStatus(status); out.write(jsonResponse.toString()); diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java index ae5479d..3d00d88 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java @@ -56,7 +56,6 @@ import org.apache.hyracks.http.server.utils.HttpUtil; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import io.netty.handler.codec.http.HttpMethod; @@ -214,7 +213,7 @@ String errorMessage = ResultUtil.buildParseExceptionMessage(pe, query); ObjectNode errorResp = ResultUtil.getErrorResponse(2, errorMessage, "", ResultUtil.extractFullStackTrace(pe)); - sessionOutput.out().write(new ObjectMapper().writeValueAsString(errorResp)); + sessionOutput.out().write(OBJECT_MAPPER.writeValueAsString(errorResp)); } catch (Exception e) { GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, e.getMessage(), e); response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR); diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ShutdownApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ShutdownApiServlet.java index 0fe6863..1731697 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ShutdownApiServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ShutdownApiServlet.java @@ -38,7 +38,6 @@ import org.apache.hyracks.http.server.utils.HttpUtil; import org.apache.hyracks.util.JSONUtil; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -78,8 +77,7 @@ return; } response.setStatus(HttpResponseStatus.ACCEPTED); - ObjectMapper om = new ObjectMapper(); - ObjectNode jsonObject = om.createObjectNode(); + ObjectNode jsonObject = OBJECT_MAPPER.createObjectNode(); try { jsonObject.put("status", "SHUTTING_DOWN"); jsonObject.put("date", new Date().toString()); @@ -88,7 +86,7 @@ for (int i = 0; i < ncs.size(); i++) { ObjectNode nc = (ObjectNode) ncs.get(i); String node = nc.get(NODE_ID_KEY).asText(); - ObjectNode details = (ObjectNode) om.readTree(hcc.getNodeDetailsJSON(node, false, true)); + ObjectNode details = (ObjectNode) OBJECT_MAPPER.readTree(hcc.getNodeDetailsJSON(node, false, true)); nc.set(PID, details.get(PID)); if (details.has(INI) && details.get(INI).has(NCSERVICE_PID)) { nc.put(NCSERVICE_PID, details.get(INI).get(NCSERVICE_PID).asInt()); diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/VersionApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/VersionApiServlet.java index eeef8e8..81e0cfd 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/VersionApiServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/VersionApiServlet.java @@ -33,7 +33,6 @@ import org.apache.hyracks.http.server.AbstractServlet; import org.apache.hyracks.http.server.utils.HttpUtil; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import io.netty.handler.codec.http.HttpResponseStatus; @@ -50,8 +49,7 @@ response.setStatus(HttpResponseStatus.OK); ICcApplicationContext props = (ICcApplicationContext) ctx.get(ASTERIX_APP_CONTEXT_INFO_ATTR); Map<String, String> buildProperties = props.getBuildProperties().getAllProps(); - ObjectMapper om = new ObjectMapper(); - ObjectNode responseObject = om.createObjectNode(); + ObjectNode responseObject = OBJECT_MAPPER.createObjectNode(); for (Map.Entry<String, String> e : buildProperties.entrySet()) { responseObject.put(e.getKey(), e.getValue()); } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_3/cluster_state_3.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_3/cluster_state_3.1.adm index 14a00d0..a5f098f 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_3/cluster_state_3.1.adm +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_3/cluster_state_3.1.adm @@ -3,11 +3,11 @@ "node_id" : "asterix_nc1", "state" : "ACTIVE", "partitions" : [ { - "partition_id" : "partition_0", - "active" : true + "active" : true, + "partition_id" : "partition_0" }, { - "partition_id" : "partition_1", - "active" : true + "active" : true, + "partition_id" : "partition_1" } ], "configUri" : "http://127.0.0.1:19002/admin/cluster/node/asterix_nc1/config", "statsUri" : "http://127.0.0.1:19002/admin/cluster/node/asterix_nc1/stats", @@ -16,11 +16,11 @@ "node_id" : "asterix_nc2", "state" : "ACTIVE", "partitions" : [ { - "partition_id" : "partition_2", - "active" : true + "active" : true, + "partition_id" : "partition_2" }, { - "partition_id" : "partition_3", - "active" : true + "active" : true, + "partition_id" : "partition_3" } ], "configUri" : "http://127.0.0.1:19002/admin/cluster/node/asterix_nc2/config", "statsUri" : "http://127.0.0.1:19002/admin/cluster/node/asterix_nc2/stats", diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_4/cluster_state_4.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_4/cluster_state_4.1.adm index 5e88f5c..1c555b3 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_4/cluster_state_4.1.adm +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_4/cluster_state_4.1.adm @@ -2,11 +2,11 @@ "node_id" : "asterix_nc1", "state" : "ACTIVE", "partitions" : [ { - "partition_id" : "partition_0", - "active" : true + "active" : true, + "partition_id" : "partition_0" }, { - "partition_id" : "partition_1", - "active" : true + "active" : true, + "partition_id" : "partition_1" } ], "configUri" : "http://127.0.0.1:19002/admin/cluster/node/asterix_nc1/config", "statsUri" : "http://127.0.0.1:19002/admin/cluster/node/asterix_nc1/stats", diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/MetadataReplicationIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/MetadataReplicationIT.java index 7fe156a..809e815 100644 --- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/MetadataReplicationIT.java +++ b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/MetadataReplicationIT.java @@ -83,7 +83,7 @@ public void before() throws Exception { LOGGER.info("Creating new instance..."); AsterixInstallerIntegrationUtil.init(AsterixInstallerIntegrationUtil.LOCAL_CLUSTER_METADATA_ONLY_REP_PATH); - LOGGER.info("Instacne created."); + LOGGER.info("Instance created."); AsterixInstallerIntegrationUtil.transformIntoRequiredState(State.ACTIVE); LOGGER.info("Instance is in ACTIVE state."); } diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.cluster_state.4.adm b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.cluster_state.4.adm index 06e4d80..c327ecf 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.cluster_state.4.adm +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.cluster_state.4.adm @@ -2,36 +2,36 @@ "metadata_node" : "asterix_nc1", "partitions" : { "0" : { - "partitionId" : 0, - "nodeId" : "asterix_nc1", - "activeNodeId" : "asterix_nc1", "active" : false, - "pendingActivation" : false, - "iodeviceNum" : 0 + "activeNodeId" : "asterix_nc1", + "iodeviceNum" : 0, + "nodeId" : "asterix_nc1", + "partitionId" : 0, + "pendingActivation" : false }, "1" : { - "partitionId" : 1, - "nodeId" : "asterix_nc1", - "activeNodeId" : "asterix_nc1", "active" : false, - "pendingActivation" : false, - "iodeviceNum" : 1 + "activeNodeId" : "asterix_nc1", + "iodeviceNum" : 1, + "nodeId" : "asterix_nc1", + "partitionId" : 1, + "pendingActivation" : false }, "2" : { - "partitionId" : 2, - "nodeId" : "asterix_nc2", - "activeNodeId" : "asterix_nc2", "active" : true, - "pendingActivation" : false, - "iodeviceNum" : 0 + "activeNodeId" : "asterix_nc2", + "iodeviceNum" : 0, + "nodeId" : "asterix_nc2", + "partitionId" : 2, + "pendingActivation" : false }, "3" : { - "partitionId" : 3, - "nodeId" : "asterix_nc2", - "activeNodeId" : "asterix_nc2", "active" : true, - "pendingActivation" : false, - "iodeviceNum" : 1 + "activeNodeId" : "asterix_nc2", + "iodeviceNum" : 1, + "nodeId" : "asterix_nc2", + "partitionId" : 3, + "pendingActivation" : false } }, "state" : "UNUSABLE" diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.cluster_state.7.adm b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.cluster_state.7.adm index e0ec010..c0697b7 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.cluster_state.7.adm +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.cluster_state.7.adm @@ -2,36 +2,36 @@ "metadata_node" : "asterix_nc1", "partitions" : { "0" : { - "partitionId" : 0, - "nodeId" : "asterix_nc1", - "activeNodeId" : "asterix_nc1", "active" : true, - "pendingActivation" : false, - "iodeviceNum" : 0 + "activeNodeId" : "asterix_nc1", + "iodeviceNum" : 0, + "nodeId" : "asterix_nc1", + "partitionId" : 0, + "pendingActivation" : false }, "1" : { - "partitionId" : 1, - "nodeId" : "asterix_nc1", - "activeNodeId" : "asterix_nc1", "active" : true, - "pendingActivation" : false, - "iodeviceNum" : 1 + "activeNodeId" : "asterix_nc1", + "iodeviceNum" : 1, + "nodeId" : "asterix_nc1", + "partitionId" : 1, + "pendingActivation" : false }, "2" : { - "partitionId" : 2, - "nodeId" : "asterix_nc2", - "activeNodeId" : "asterix_nc2", "active" : true, - "pendingActivation" : false, - "iodeviceNum" : 0 + "activeNodeId" : "asterix_nc2", + "iodeviceNum" : 0, + "nodeId" : "asterix_nc2", + "partitionId" : 2, + "pendingActivation" : false }, "3" : { - "partitionId" : 3, - "nodeId" : "asterix_nc2", - "activeNodeId" : "asterix_nc2", "active" : true, - "pendingActivation" : false, - "iodeviceNum" : 1 + "activeNodeId" : "asterix_nc2", + "iodeviceNum" : 1, + "nodeId" : "asterix_nc2", + "partitionId" : 3, + "pendingActivation" : false } }, "state" : "ACTIVE" diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.10.adm b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.10.adm index e0ec010..c0697b7 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.10.adm +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.10.adm @@ -2,36 +2,36 @@ "metadata_node" : "asterix_nc1", "partitions" : { "0" : { - "partitionId" : 0, - "nodeId" : "asterix_nc1", - "activeNodeId" : "asterix_nc1", "active" : true, - "pendingActivation" : false, - "iodeviceNum" : 0 + "activeNodeId" : "asterix_nc1", + "iodeviceNum" : 0, + "nodeId" : "asterix_nc1", + "partitionId" : 0, + "pendingActivation" : false }, "1" : { - "partitionId" : 1, - "nodeId" : "asterix_nc1", - "activeNodeId" : "asterix_nc1", "active" : true, - "pendingActivation" : false, - "iodeviceNum" : 1 + "activeNodeId" : "asterix_nc1", + "iodeviceNum" : 1, + "nodeId" : "asterix_nc1", + "partitionId" : 1, + "pendingActivation" : false }, "2" : { - "partitionId" : 2, - "nodeId" : "asterix_nc2", - "activeNodeId" : "asterix_nc2", "active" : true, - "pendingActivation" : false, - "iodeviceNum" : 0 + "activeNodeId" : "asterix_nc2", + "iodeviceNum" : 0, + "nodeId" : "asterix_nc2", + "partitionId" : 2, + "pendingActivation" : false }, "3" : { - "partitionId" : 3, - "nodeId" : "asterix_nc2", - "activeNodeId" : "asterix_nc2", "active" : true, - "pendingActivation" : false, - "iodeviceNum" : 1 + "activeNodeId" : "asterix_nc2", + "iodeviceNum" : 1, + "nodeId" : "asterix_nc2", + "partitionId" : 3, + "pendingActivation" : false } }, "state" : "ACTIVE" diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.5.adm b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.5.adm index 2de5a55..15c200c 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.5.adm +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.5.adm @@ -2,36 +2,36 @@ "metadata_node" : "asterix_nc2", "partitions" : { "0" : { - "partitionId" : 0, - "nodeId" : "asterix_nc1", - "activeNodeId" : "asterix_nc2", "active" : true, - "pendingActivation" : false, - "iodeviceNum" : 0 + "activeNodeId" : "asterix_nc2", + "iodeviceNum" : 0, + "nodeId" : "asterix_nc1", + "partitionId" : 0, + "pendingActivation" : false }, "1" : { - "partitionId" : 1, - "nodeId" : "asterix_nc1", - "activeNodeId" : "asterix_nc2", "active" : true, - "pendingActivation" : false, - "iodeviceNum" : 1 + "activeNodeId" : "asterix_nc2", + "iodeviceNum" : 1, + "nodeId" : "asterix_nc1", + "partitionId" : 1, + "pendingActivation" : false }, "2" : { - "partitionId" : 2, - "nodeId" : "asterix_nc2", - "activeNodeId" : "asterix_nc2", "active" : true, - "pendingActivation" : false, - "iodeviceNum" : 0 + "activeNodeId" : "asterix_nc2", + "iodeviceNum" : 0, + "nodeId" : "asterix_nc2", + "partitionId" : 2, + "pendingActivation" : false }, "3" : { - "partitionId" : 3, - "nodeId" : "asterix_nc2", - "activeNodeId" : "asterix_nc2", "active" : true, - "pendingActivation" : false, - "iodeviceNum" : 1 + "activeNodeId" : "asterix_nc2", + "iodeviceNum" : 1, + "nodeId" : "asterix_nc2", + "partitionId" : 3, + "pendingActivation" : false } }, "state" : "ACTIVE" diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOption.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOption.java index b8e7635..ed6dcd0 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOption.java +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOption.java @@ -20,8 +20,7 @@ import java.util.function.Function; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.text.WordUtils; +import org.apache.hyracks.util.StringUtil; public interface IOption { @@ -67,8 +66,8 @@ return name().toLowerCase().replace("_", "."); } - default String json() { - return StringUtils.remove(WordUtils.capitalize("z" + name().toLowerCase(), '_').substring(1), '_'); + default String camelCase() { + return StringUtil.toCamelCase(name()); } default String toIniString() { diff --git a/hyracks-fullstack/hyracks/hyracks-http/pom.xml b/hyracks-fullstack/hyracks/hyracks-http/pom.xml index 09bf513..7d0ddb2 100644 --- a/hyracks-fullstack/hyracks/hyracks-http/pom.xml +++ b/hyracks-fullstack/hyracks/hyracks-http/pom.xml @@ -71,5 +71,9 @@ <artifactId>hyracks-util</artifactId> <version>${project.version}</version> </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + </dependency> </dependencies> </project> \ No newline at end of file diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/AbstractServlet.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/AbstractServlet.java index 30d599d..baba540 100644 --- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/AbstractServlet.java +++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/AbstractServlet.java @@ -18,6 +18,9 @@ */ package org.apache.hyracks.http.server; +import static com.fasterxml.jackson.databind.MapperFeature.SORT_PROPERTIES_ALPHABETICALLY; +import static com.fasterxml.jackson.databind.SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS; + import java.io.IOException; import java.util.Arrays; import java.util.concurrent.ConcurrentMap; @@ -29,12 +32,21 @@ import org.apache.hyracks.http.api.IServletResponse; import org.apache.hyracks.http.server.utils.HttpUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; import io.netty.handler.codec.http.HttpHeaderNames; import io.netty.handler.codec.http.HttpMethod; import io.netty.handler.codec.http.HttpResponseStatus; public abstract class AbstractServlet implements IServlet { private static final Logger LOGGER = Logger.getLogger(AbstractServlet.class.getName()); + protected static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + static { + OBJECT_MAPPER.enable(SerializationFeature.INDENT_OUTPUT); + OBJECT_MAPPER.configure(SORT_PROPERTIES_ALPHABETICALLY, true); + OBJECT_MAPPER.configure(ORDER_MAP_ENTRIES_BY_KEYS, true); + } protected final String[] paths; protected final ConcurrentMap<String, Object> ctx; diff --git a/hyracks-fullstack/hyracks/hyracks-util/pom.xml b/hyracks-fullstack/hyracks/hyracks-util/pom.xml index ea7779f..f728de9 100644 --- a/hyracks-fullstack/hyracks/hyracks-util/pom.xml +++ b/hyracks-fullstack/hyracks/hyracks-util/pom.xml @@ -68,6 +68,10 @@ <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-collections4</artifactId> + </dependency> </dependencies> </project> diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/JSONUtil.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/JSONUtil.java index 0cb87dd..51855c6 100644 --- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/JSONUtil.java +++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/JSONUtil.java @@ -26,6 +26,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; @@ -42,6 +43,7 @@ static { SORTED_MAPPER.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true); + SORTED_MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); } public static String convertNode(final JsonNode node) throws JsonProcessingException { diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StringUtil.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StringUtil.java new file mode 100644 index 0000000..b457c79 --- /dev/null +++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StringUtil.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, 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.hyracks.util; + +import java.util.Collections; +import java.util.Map; +import java.util.regex.Pattern; + +import org.apache.commons.collections4.map.LRUMap; +import org.apache.commons.lang3.text.WordUtils; + +public class StringUtil { + private static final Map<String, String> CAMEL_CACHE = Collections.synchronizedMap(new LRUMap<>(1024)); + private static final Pattern SEPARATORS_PATTERN = Pattern.compile("[_\\-\\s]"); + + private StringUtil() { + } + + public static String toCamelCase(String input) { + return CAMEL_CACHE.computeIfAbsent(input, s -> SEPARATORS_PATTERN + .matcher(WordUtils.capitalize("z" + s.toLowerCase(), '_', '-', ' ').substring(1)).replaceAll("")); + } +} diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ThreadDumpUtil.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ThreadDumpUtil.java index ec1a0b2..221d4b0 100644 --- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ThreadDumpUtil.java +++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ThreadDumpUtil.java @@ -37,10 +37,13 @@ private static final ObjectMapper om = new ObjectMapper(); private static final ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); - private ThreadDumpUtil() { + static { om.enable(SerializationFeature.INDENT_OUTPUT); } + private ThreadDumpUtil() { + } + public static String takeDumpJSONString() throws IOException { ObjectNode json = takeDumpJSON(); return om.writerWithDefaultPrettyPrinter().writeValueAsString(json); diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/StringUtilTest.java b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/StringUtilTest.java new file mode 100644 index 0000000..e279968 --- /dev/null +++ b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/StringUtilTest.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, 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.hyracks.util; + +import org.junit.Assert; +import org.junit.Test; + +public class StringUtilTest { + + @Test + public void camelCaseTest() { + testCamelCase("FOO_BAR", "fooBar"); + testCamelCase("FOO BAr", "fooBar"); + testCamelCase("FOO_Bar", "fooBar"); + testCamelCase("FOO_Bar baz", "fooBarBaz"); + } + + private void testCamelCase(String input, String expected) { + Assert.assertEquals(expected, StringUtil.toCamelCase(input)); + Assert.assertEquals(expected, StringUtil.toCamelCase(input)); + } +} -- To view, visit https://asterix-gerrit.ics.uci.edu/2033 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: Idd1b805dfa425dcd87d83e361297a0351c56cc6a Gerrit-PatchSet: 5 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Michael Blow <[email protected]> Gerrit-Reviewer: Anon. E. Moose #1000171 Gerrit-Reviewer: Jenkins <[email protected]> Gerrit-Reviewer: Michael Blow <[email protected]> Gerrit-Reviewer: Murtadha Hubail <[email protected]> Gerrit-Reviewer: Till Westmann <[email protected]>
