You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2016/03/14 17:41:48 UTC
svn commit: r1734956 - in
/qpid/java/trunk/broker-plugins/management-http/src/main: grammar/
java/org/apache/qpid/server/management/plugin/servlet/query/
java/org/apache/qpid/server/management/plugin/servlet/rest/
Author: rgodfrey
Date: Mon Mar 14 16:41:48 2016
New Revision: 1734956
URL: http://svn.apache.org/viewvc?rev=1734956&view=rev
Log:
QPID-6969 : Address some review comments from [~lorenz.quack]
Added:
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQuery.java (with props)
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/QueryException.java (with props)
Modified:
qpid/java/trunk/broker-plugins/management-http/src/main/grammar/ConfiguredObjectFilterParser.jj
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectFilterParser.java
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/QueryServlet.java
Modified: qpid/java/trunk/broker-plugins/management-http/src/main/grammar/ConfiguredObjectFilterParser.jj
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/grammar/ConfiguredObjectFilterParser.jj?rev=1734956&r1=1734955&r2=1734956&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/grammar/ConfiguredObjectFilterParser.jj (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/grammar/ConfiguredObjectFilterParser.jj Mon Mar 14 16:41:48 2016
@@ -81,7 +81,7 @@ import org.apache.qpid.server.model.Conf
/**
* JMS Selector Parser generated by JavaCC
*
- * Do not edit this .java file directly - it is autogenerated from SelectorParser.jj
+ * Do not edit this .java file directly - it is autogenerated from ConfiguredObjectFilterParser.jj
*/
public class ConfiguredObjectFilterParser
{
@@ -195,7 +195,7 @@ TOKEN [IGNORE_CASE] :
}
// ----------------------------------------------------------------------------
-// Grammer
+// Grammar
// ----------------------------------------------------------------------------
BooleanExpression filter() :
{
Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectFilterParser.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectFilterParser.java?rev=1734956&r1=1734955&r2=1734956&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectFilterParser.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectFilterParser.java Mon Mar 14 16:41:48 2016
@@ -41,7 +41,7 @@ import org.apache.qpid.server.model.Conf
/**
* JMS Selector Parser generated by JavaCC
*
- * Do not edit this .java file directly - it is autogenerated from SelectorParser.jj
+ * Do not edit this .java file directly - it is autogenerated from ConfiguredObjectFilterParser.jj
*/
public class ConfiguredObjectFilterParser implements ConfiguredObjectFilterParserConstants {
private ConfiguredObjectExpressionFactory _factory;
@@ -87,7 +87,7 @@ public class ConfiguredObjectFilterParse
}
// ----------------------------------------------------------------------------
-// Grammer
+// Grammar
// ----------------------------------------------------------------------------
final public BooleanExpression filter() throws ParseException {
Expression left=null;
@@ -744,6 +744,58 @@ public class ConfiguredObjectFilterParse
catch(LookaheadSuccess ls) { return true; }
}
+ private boolean jj_3R_54() {
+ if (jj_scan_token(30)) return true;
+ if (jj_3R_49()) return true;
+ return false;
+ }
+
+ private boolean jj_3R_13() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_19()) {
+ jj_scanpos = xsp;
+ if (jj_3R_20()) return true;
+ }
+ return false;
+ }
+
+ private boolean jj_3_3() {
+ if (jj_scan_token(NOT)) return true;
+ if (jj_scan_token(BETWEEN)) return true;
+ if (jj_3R_51()) return true;
+ if (jj_scan_token(AND)) return true;
+ if (jj_3R_51()) return true;
+ return false;
+ }
+
+ private boolean jj_3R_53() {
+ if (jj_scan_token(29)) return true;
+ if (jj_3R_49()) return true;
+ return false;
+ }
+
+ private boolean jj_3R_50() {
+ Token xsp;
+ xsp = jj_scanpos;
+ if (jj_3R_53()) {
+ jj_scanpos = xsp;
+ if (jj_3R_54()) {
+ jj_scanpos = xsp;
+ if (jj_3_1()) {
+ jj_scanpos = xsp;
+ if (jj_3R_55()) return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private boolean jj_3R_39() {
+ if (jj_scan_token(TRUE)) return true;
+ return false;
+ }
+
private boolean jj_3R_62() {
if (jj_scan_token(BETWEEN)) return true;
if (jj_3R_51()) return true;
@@ -1248,58 +1300,6 @@ public class ConfiguredObjectFilterParse
return false;
}
- private boolean jj_3R_54() {
- if (jj_scan_token(30)) return true;
- if (jj_3R_49()) return true;
- return false;
- }
-
- private boolean jj_3R_13() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_19()) {
- jj_scanpos = xsp;
- if (jj_3R_20()) return true;
- }
- return false;
- }
-
- private boolean jj_3_3() {
- if (jj_scan_token(NOT)) return true;
- if (jj_scan_token(BETWEEN)) return true;
- if (jj_3R_51()) return true;
- if (jj_scan_token(AND)) return true;
- if (jj_3R_51()) return true;
- return false;
- }
-
- private boolean jj_3R_53() {
- if (jj_scan_token(29)) return true;
- if (jj_3R_49()) return true;
- return false;
- }
-
- private boolean jj_3R_50() {
- Token xsp;
- xsp = jj_scanpos;
- if (jj_3R_53()) {
- jj_scanpos = xsp;
- if (jj_3R_54()) {
- jj_scanpos = xsp;
- if (jj_3_1()) {
- jj_scanpos = xsp;
- if (jj_3R_55()) return true;
- }
- }
- }
- return false;
- }
-
- private boolean jj_3R_39() {
- if (jj_scan_token(TRUE)) return true;
- return false;
- }
-
/** Generated Token Manager. */
public ConfiguredObjectFilterParserTokenManager token_source;
SimpleCharStream jj_input_stream;
Added: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQuery.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQuery.java?rev=1734956&view=auto
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQuery.java (added)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQuery.java Mon Mar 14 16:41:48 2016
@@ -0,0 +1,184 @@
+/*
+ *
+ * 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.qpid.server.management.plugin.servlet.query;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.qpid.filter.BooleanExpression;
+import org.apache.qpid.filter.Expression;
+import org.apache.qpid.server.model.ConfiguredObject;
+
+public final class ConfiguredObjectQuery
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ConfiguredObjectQuery.class);
+
+ private static final String[] STANDARD_FIELDS = new String[]{ConfiguredObject.ID, ConfiguredObject.NAME};
+
+ private final ConfiguredObjectExpressionFactory _expressionFactory = new ConfiguredObjectExpressionFactory();
+
+ private final List<List<Object>> _results;
+ private final List<String> _headers;
+
+ interface HeadersAndValueExpressions
+ {
+ List<String> getHeaders();
+ List<Expression> getValueExpressions();
+ }
+
+ public ConfiguredObjectQuery(List<ConfiguredObject<?>> objects, String selectClause, String whereClause)
+ {
+
+ HeadersAndValueExpressions headersAndValueExpressions = parseSelectClause(selectClause);
+
+ List<ConfiguredObject<?>> filteredObjects = filterObjects(objects, whereClause);
+
+ _headers = headersAndValueExpressions.getHeaders();
+ _results = evaluateResults(filteredObjects, headersAndValueExpressions.getValueExpressions());
+
+ }
+
+ public List<List<Object>> getResults()
+ {
+ return _results;
+ }
+
+ public List<String> getHeaders()
+ {
+ return _headers;
+ }
+
+ private HeadersAndValueExpressions parseSelectClause(final String selectClause)
+ {
+ final List<String> headers = new ArrayList<>();
+ final List<Expression> valueExpressions = new ArrayList<>();
+ if (selectClause != null)
+ {
+ ConfiguredObjectFilterParser parser = new ConfiguredObjectFilterParser();
+ parser.setConfiguredObjectExpressionFactory(_expressionFactory);
+
+ try
+ {
+ final List<Map<String, Expression>> expressions =
+ parser.parseSelect(selectClause);
+ for (Map<String, Expression> expression : expressions)
+ {
+ final Map.Entry<String, Expression> entry = expression.entrySet().iterator().next();
+ headers.add(entry.getKey());
+ valueExpressions.add(entry.getValue());
+ }
+ }
+ catch (ParseException | TokenMgrError e)
+ {
+ throw new QueryException("Unable to parse select clause");
+ }
+ }
+ else
+ {
+ for (String field : STANDARD_FIELDS)
+ {
+ headers.add(field);
+ valueExpressions.add(_expressionFactory.createConfiguredObjectExpression(field));
+ }
+ }
+ return new HeadersAndValueExpressions()
+ {
+ @Override
+ public List<String> getHeaders()
+ {
+ return headers;
+ }
+
+ @Override
+ public List<Expression> getValueExpressions()
+ {
+ return valueExpressions;
+ }
+ };
+ }
+
+ private List<ConfiguredObject<?>> filterObjects(final List<ConfiguredObject<?>> objects, final String whereClause)
+ {
+ List<ConfiguredObject<?>> filteredObjects = new ArrayList<>();
+ ConfiguredObjectFilterParser parser = new ConfiguredObjectFilterParser();
+ parser.setConfiguredObjectExpressionFactory(_expressionFactory);
+ try
+ {
+ final BooleanExpression<ConfiguredObject> expression =
+ parser.parseWhere(whereClause);
+
+
+ for (ConfiguredObject<?> object : objects)
+ {
+ try
+ {
+ if (expression.matches(object))
+ {
+ filteredObjects.add(object);
+ }
+ }
+ catch (RuntimeException e)
+ {
+ LOGGER.debug("Error while evaluating object against where clause", e);
+ }
+ }
+
+ }
+ catch (ParseException | TokenMgrError e)
+ {
+ throw new QueryException("Unable to parse where clause");
+ }
+ return filteredObjects;
+ }
+
+
+ private List<List<Object>> evaluateResults(final List<ConfiguredObject<?>> filteredObjects, List<Expression> valueExpressions)
+ {
+ List<List<Object>> values = new ArrayList<>();
+ for (ConfiguredObject<?> object : filteredObjects)
+ {
+ List<Object> objectVals = new ArrayList<>();
+ for (Expression<ConfiguredObject<?>> evaluator : valueExpressions)
+ {
+ Object value;
+ try
+ {
+ value = evaluator.evaluate(object);
+ }
+ catch (RuntimeException e)
+ {
+ LOGGER.debug("Error while evaluating select clause", e);
+ value = null;
+ }
+ objectVals.add(value);
+ }
+ values.add(objectVals);
+ }
+ return values;
+ }
+
+
+
+}
Propchange: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQuery.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/QueryException.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/QueryException.java?rev=1734956&view=auto
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/QueryException.java (added)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/QueryException.java Mon Mar 14 16:41:48 2016
@@ -0,0 +1,29 @@
+/*
+ *
+ * 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.qpid.server.management.plugin.servlet.query;
+
+public class QueryException extends RuntimeException
+{
+ public QueryException(final String message)
+ {
+ super(message);
+ }
+}
Propchange: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/QueryException.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/QueryServlet.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/QueryServlet.java?rev=1734956&r1=1734955&r2=1734956&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/QueryServlet.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/QueryServlet.java Mon Mar 14 16:41:48 2016
@@ -21,7 +21,6 @@
package org.apache.qpid.server.management.plugin.servlet.rest;
import java.io.IOException;
-import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -33,20 +32,15 @@ import javax.servlet.http.HttpServletRes
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.apache.qpid.filter.BooleanExpression;
-import org.apache.qpid.filter.Expression;
-import org.apache.qpid.server.management.plugin.HttpManagementUtil;
-import org.apache.qpid.server.management.plugin.servlet.query.ConfiguredObjectExpressionFactory;
-import org.apache.qpid.server.management.plugin.servlet.query.ConfiguredObjectFilterParser;
-import org.apache.qpid.server.management.plugin.servlet.query.ParseException;
-import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.management.plugin.servlet.query.ConfiguredObjectQuery;
+import org.apache.qpid.server.management.plugin.servlet.query.QueryException;
import org.apache.qpid.server.model.ConfiguredObject;
import org.apache.qpid.server.model.Model;
public abstract class QueryServlet<X extends ConfiguredObject<?>> extends AbstractServlet
{
private static final Logger LOGGER = LoggerFactory.getLogger(QueryServlet.class);
- private static final String[] STANDARD_FIELDS = new String[]{ConfiguredObject.ID, ConfiguredObject.NAME};
+
@Override
protected void doGetWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response)
@@ -71,7 +65,6 @@ public abstract class QueryServlet<X ext
if( parent != null && ((categoryName = getRequestedCategory(request)) != null))
{
Model model = parent.getModel();
- ConfiguredObjectExpressionFactory expressionFactory = new ConfiguredObjectExpressionFactory();
Class<? extends ConfiguredObject> category = getSupportedCategory(categoryName, model);
@@ -79,110 +72,25 @@ public abstract class QueryServlet<X ext
{
List<ConfiguredObject<?>> objects = getAllObjects(parent, category, request);
Map<String, List<?>> resultsObject = new LinkedHashMap<>();
- List<String> headers = new ArrayList<>();
- List<Expression<ConfiguredObject<?>>> valueEvaluators = new ArrayList<>();
- if (request.getParameterMap().containsKey("select"))
- {
- ConfiguredObjectFilterParser parser = new ConfiguredObjectFilterParser();
- parser.setConfiguredObjectExpressionFactory(expressionFactory);
- String selectClause = request.getParameter("select");
-
- try
- {
- final List<Map<String, Expression>> expressions =
- parser.parseSelect(selectClause);
- for (Map<String, Expression> expression : expressions)
- {
- final Map.Entry<String, Expression> entry = expression.entrySet().iterator().next();
- headers.add(entry.getKey());
- valueEvaluators.add(entry.getValue());
- }
- }
- catch (ParseException e)
- {
- sendJsonErrorResponse (request,
- response,
- HttpServletResponse.SC_NOT_FOUND,
- "Unable to parse where clause");
- return;
- }
- }
- else
+ try
{
- for (String field : STANDARD_FIELDS)
- {
- headers.add(field);
- valueEvaluators.add(expressionFactory.createConfiguredObjectExpression(field));
- }
+ ConfiguredObjectQuery query = new ConfiguredObjectQuery(objects,
+ request.getParameter("select"),
+ request.getParameter("where"));
+
+ resultsObject.put("headers", query.getHeaders());
+ resultsObject.put("results", query.getResults());
+ sendJsonResponse(resultsObject, request, response);
}
-
- if (request.getParameterMap().containsKey("where"))
+ catch(QueryException e)
{
- String whereClause = request.getParameter("where");
-
- ConfiguredObjectFilterParser parser = new ConfiguredObjectFilterParser();
- parser.setConfiguredObjectExpressionFactory(expressionFactory);
- try
- {
- final BooleanExpression<ConfiguredObject> expression =
- parser.parseWhere(whereClause);
-
- List<ConfiguredObject<?>> filteredObjects = new ArrayList<>();
-
- for (ConfiguredObject<?> object : objects)
- {
- try
- {
- if (expression.matches(object))
- {
- filteredObjects.add(object);
- }
- }
- catch (RuntimeException e)
- {
- LOGGER.debug("Error while evaluating object against where clause", e);
- }
- }
-
- objects = filteredObjects;
- }
- catch (ParseException e)
- {
- sendJsonErrorResponse (request,
- response,
- HttpServletResponse.SC_NOT_FOUND,
- "Unable to parse where clause");
- return;
- }
-
+ sendJsonErrorResponse(request,
+ response,
+ HttpServletResponse.SC_NOT_FOUND,
+ e.getMessage());
}
-
- resultsObject.put("headers", headers);
- List<List<Object>> values = new ArrayList<>();
- for (ConfiguredObject<?> object : objects)
- {
- List<Object> objectVals = new ArrayList<>();
- for (Expression<ConfiguredObject<?>> evaluator : valueEvaluators)
- {
- Object value;
- try
- {
- value = evaluator.evaluate(object);
- }
- catch (RuntimeException e)
- {
- LOGGER.debug("Error while evaluating select clause", e);
- value = null;
- }
- objectVals.add(value);
- }
- values.add(objectVals);
- }
- resultsObject.put("results", values);
- sendJsonResponse(resultsObject, request, response);
}
-
else
{
sendJsonErrorResponse(request,
@@ -208,4 +116,5 @@ public abstract class QueryServlet<X ext
abstract protected List<ConfiguredObject<?>> getAllObjects(final X parent,
final Class<? extends ConfiguredObject> category,
final HttpServletRequest request);
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org