protected void doGet()

in src/main/java/org/apache/sling/testing/clients/query/servlet/QueryServlet.java [52:167]


    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");

        try {
            final QueryManager qm = request.getResourceResolver().adaptTo(Session.class)
                    .getWorkspace().getQueryManager();

            long before = 0;
            long after = 0;
            long total = 0;

            String query = request.getParameter("query");
            String type = request.getParameter("type");

            // default for showResults is true, unless parameter is matching exactly "false"
            boolean showResults = !("false".equalsIgnoreCase(request.getParameter("showresults")));
            // default for explainQuery is false, unless parameter is present and is not matching "false"
            String explainParam = request.getParameter("explain");
            boolean explainQuery = (explainParam != null) && !("false".equalsIgnoreCase(explainParam));

            boolean tidy = false;
            for (String selector : request.getRequestPathInfo().getSelectors()) {
                if ("tidy".equals(selector)) {
                    tidy = true;
                }
            }

            if ((query == null) || query.equals("") || (type == null) || type.equals("")) {
                response.sendError(400, "Parameters query and type are required"); // invalid request
                return;
            }

            // prepare
            if (explainQuery) {
                query = "explain " + query;
            }

            Query q = qm.createQuery(query, type);

            // execute
            before = new Date().getTime();
            QueryResult result = q.execute();
            after = new Date().getTime();

            // collect results
            String firstSelector = null;
            if (result.getSelectorNames().length > 1) {
                firstSelector = result.getSelectorNames()[0];
                try {
                    String[] columnNames = result.getColumnNames();
                    if (columnNames.length > 0) {
                        String firstColumnName = columnNames[0];
                        int firstDot = firstColumnName.indexOf('.');
                        if (firstDot > 0) {
                            firstSelector = firstColumnName.substring(0, firstDot);
                        }
                    }
                } catch (Exception ignored) {
                }
            }

            ObjectMapper mapper = new ObjectMapper();
            ObjectNode responseJson = mapper.createObjectNode();

            if (explainQuery) {
                responseJson.put("plan", result.getRows().nextRow().getValue("plan").getString());
            } else if (showResults) {
                ArrayNode results = mapper.createArrayNode();

                RowIterator rows = result.getRows();
                while (rows.hasNext()) {
                    Row row = rows.nextRow();
                    String rowPath = (firstSelector != null) ? row.getPath(firstSelector) : row.getPath();
                    String rowType = (firstSelector != null)
                            ? row.getNode(firstSelector).getPrimaryNodeType().getName()
                            : row.getNode().getPrimaryNodeType().getName();

                    ObjectNode rowJson = mapper.createObjectNode();
                    rowJson.put("path", rowPath);
                    rowJson.put("type", rowType);
                    results.add(rowJson);

                    total++;
                }

                responseJson.set("results", results);
            } else {
                // only count results
                RowIterator rows = result.getRows();
                while (rows.hasNext()) {
                    rows.nextRow();
                    total++;
                }
            }

            responseJson.put("total", total);
            responseJson.put("time", after - before);

            if (tidy) {
                response.getWriter().write(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(responseJson));
            } else {
                response.getWriter().write(responseJson.toString());
            }

        } catch (InvalidQueryException e) {
            // Consider InvalidQueryException as an invalid request instead of sending 500 server error
            response.sendError(400, e.getMessage());
            e.printStackTrace(response.getWriter());
        } catch (final Exception e) {
            response.sendError(500, e.getMessage());
            e.printStackTrace(response.getWriter());
        }
    }