3789983e89
Reviewed-by: darcy, ihse
329 lines
15 KiB
Java
329 lines
15 KiB
Java
/*
|
|
* Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import javax.management.Query;
|
|
import javax.management.QueryExp;
|
|
import javax.management.ValueExp;
|
|
|
|
/**
|
|
* Class used for building QueryExp instances of all every possible type
|
|
* in terms of JMX API members; note that several JMX classes are private
|
|
* and appears in the JDK API only by their serial form.
|
|
* Comments in each case of the big switch in method getQuery() details which
|
|
* API member we cover with a given query.
|
|
*/
|
|
public class QueryFactory extends QueryData {
|
|
|
|
private String mbeanClassName = "";
|
|
private String primitiveIntAttName = "IntAtt";
|
|
private String primitiveLongAttName = "LongAtt";
|
|
private String integerAttName = "IntegerAtt";
|
|
private String primitiveBooleanAttName = "BooleanAtt";
|
|
private String primitiveDoubleAttName = "DoubleAtt";
|
|
private String primitiveFloatAttName = "FloatAtt";
|
|
private String stringAttName = "StringAtt";
|
|
private ArrayList<QueryExp> queries = new ArrayList<QueryExp>();
|
|
|
|
/**
|
|
* Creates a new instance of QueryFactory.
|
|
* The name is the fully qualified class name of an MBean.
|
|
* There is severe constraints on that MBean that must:
|
|
* <ul>
|
|
* <li>extend QueryData in order to inherit attribute values.
|
|
* <li>define a RW attribute IntAtt of type int
|
|
* initialized to QueryData.longValue
|
|
* <li>define a RW attribute LongAtt of type long
|
|
* initialized to QueryData.intValue
|
|
* <li>define a RW attribute IntegerAtt of type Integer
|
|
* initialized to QueryData.integerValue
|
|
* <li>define a RW attribute BooleanAtt of type boolean
|
|
* initialized to QueryData.booleanValue
|
|
* <li>define a RW attribute DoubleAtt of type double
|
|
* initialized to QueryData.doubleValue
|
|
* <li>define a RW attribute FloatAtt of type float
|
|
* initialized to QueryData.floatValue
|
|
* <li>define a RW attribute StringAtt of type String
|
|
* initialized to QueryData.stringValue
|
|
* </ul>
|
|
*/
|
|
public QueryFactory(String name) {
|
|
this.mbeanClassName = name;
|
|
}
|
|
|
|
/**
|
|
* Returns the highest index value the method getQuery supports.
|
|
* WARNING : returns 0 if buildQueries haven't been called first !
|
|
*/
|
|
public int getSize() {
|
|
return queries.size();
|
|
}
|
|
|
|
/**
|
|
* Populates an ArrayList of QueryExp.
|
|
* Lowest index is 1.
|
|
* Highest index is returned by getSize().
|
|
* <br>The queries numbered 1 to 23 allow to cover all the underlying
|
|
* Java classes of the JMX API used to build queries.
|
|
*/
|
|
public void buildQueries() {
|
|
if ( queries.size() == 0 ) {
|
|
int smallerIntValue = intValue - 1;
|
|
int biggerIntValue = intValue + 1;
|
|
|
|
// case 1:
|
|
// True if the MBean is of class mbeanClassName
|
|
// We cover javax.management.InstanceOfQueryExp
|
|
queries.add(Query.isInstanceOf(Query.value(mbeanClassName)));
|
|
|
|
// case 2:
|
|
// True if the MBean is of class mbeanClassName
|
|
// We cover javax.management.MatchQueryExp and
|
|
// javax.management.ClassAttributeValueExp
|
|
queries.add(Query.match(Query.classattr(),
|
|
Query.value(mbeanClassName)));
|
|
|
|
// case 3:
|
|
// True if an attribute named primitiveIntAttName of type int has
|
|
// the value intValue
|
|
// We cover javax.management.BinaryRelQueryExp with
|
|
// a relOp equal to EQ and javax.management.NumericValueExp
|
|
queries.add(Query.eq(Query.attr(primitiveIntAttName),
|
|
Query.value(intValue)));
|
|
|
|
// case 4:
|
|
// True if an attribute named primitiveLongAttName of type long has
|
|
// the value longValue
|
|
// We cover javax.management.BinaryRelQueryExp with
|
|
// a relOp equal to EQ and javax.management.NumericValueExp
|
|
queries.add(Query.eq(Query.attr(primitiveLongAttName),
|
|
Query.value(longValue)));
|
|
|
|
// case 5:
|
|
// True if an attribute named primitiveDoubleAttName of type double
|
|
// has the value doubleValue
|
|
// We cover javax.management.BinaryRelQueryExp with
|
|
// a relOp equal to EQ and javax.management.NumericValueExp
|
|
queries.add(Query.eq(Query.attr(primitiveDoubleAttName),
|
|
Query.value(doubleValue)));
|
|
|
|
// case 6:
|
|
// True if an attribute named primitiveFloatAttName of type float
|
|
// has the value floatValue
|
|
// We cover javax.management.BinaryRelQueryExp with
|
|
// a relOp equal to EQ and javax.management.NumericValueExp
|
|
queries.add(Query.eq(Query.attr(primitiveFloatAttName),
|
|
Query.value(floatValue)));
|
|
|
|
// case 7:
|
|
// True if an attribute named primitiveIntAttName of type int is
|
|
// hold by an MBean of class mbeanClassName and has
|
|
// the value intValue
|
|
// We cover javax.management.QualifiedAttributeValueExp
|
|
queries.add(Query.eq(Query.attr(mbeanClassName, primitiveIntAttName),
|
|
Query.value(intValue)));
|
|
|
|
// case 8:
|
|
// True if an attribute named stringAttName of type String has
|
|
// the value stringValue
|
|
// We cover javax.management.BinaryRelQueryExp with
|
|
// a relOp equal to EQ and javax.management.StringValueExp
|
|
queries.add(Query.eq(Query.attr(stringAttName),
|
|
Query.value(stringValue)));
|
|
|
|
// case 9:
|
|
// True if an attribute named integerAttName of type Integer has
|
|
// the value integerValue
|
|
// We cover javax.management.BinaryRelQueryExp with
|
|
// a relOp equal to EQ and javax.management.NumericValueExp
|
|
queries.add(Query.eq(Query.attr(integerAttName),
|
|
Query.value(integerValue)));
|
|
|
|
// case 10:
|
|
// True if an attribute named primitiveBooleanAttName of type boolean
|
|
// has the value booleanValue
|
|
// We cover javax.management.BinaryRelQueryExp with
|
|
// a relOp equal to EQ and javax.management.BooleanValueExp
|
|
queries.add(Query.eq(Query.attr(primitiveBooleanAttName),
|
|
Query.value(booleanValue)));
|
|
|
|
// case 11:
|
|
// True if an attribute named primitiveIntAttName of type int has
|
|
// not the value smallerIntValue
|
|
// We cover javax.management.NotQueryExp
|
|
queries.add(Query.not(Query.eq(Query.attr(primitiveIntAttName),
|
|
Query.value(smallerIntValue))));
|
|
|
|
// case 12:
|
|
// True if either
|
|
// an attribute named primitiveIntAttName of type int has
|
|
// the value intValue
|
|
// or
|
|
// an attribute named primitiveLongAttName of type long has
|
|
// the value longValue
|
|
// We cover javax.management.OrQueryExp
|
|
queries.add(Query.or(
|
|
Query.eq(Query.attr(primitiveIntAttName),
|
|
Query.value(intValue)),
|
|
Query.eq(Query.attr(primitiveLongAttName),
|
|
Query.value(longValue))));
|
|
|
|
// case 13:
|
|
// True if
|
|
// an attribute named primitiveIntAttName of type int has
|
|
// the value intValue
|
|
// and
|
|
// an attribute named primitiveLongAttName of type long has
|
|
// the value longValue
|
|
// We cover javax.management.AndQueryExp
|
|
queries.add(Query.and(
|
|
Query.eq(Query.attr(primitiveIntAttName),
|
|
Query.value(intValue)),
|
|
Query.eq(Query.attr(primitiveLongAttName),
|
|
Query.value(longValue))));
|
|
|
|
// case 14:
|
|
// True if an attribute named primitiveIntAttName of type int has
|
|
// the value intValue
|
|
// We cover javax.management.InQueryExp
|
|
ValueExp[] inArray = {Query.value(intValue)};
|
|
queries.add(Query.in(Query.attr(primitiveIntAttName), inArray));
|
|
|
|
// case 15:
|
|
// True if an attribute named primitiveIntAttName of type int has
|
|
// its value in between smallerIntValue and biggerIntValue
|
|
// We cover javax.management.BetweenRelQueryExp
|
|
queries.add(Query.between(Query.attr(primitiveIntAttName),
|
|
Query.value(smallerIntValue),
|
|
Query.value(biggerIntValue)));
|
|
|
|
// case 16:
|
|
// True if an attribute named primitiveIntAttName of type int has
|
|
// a value greater than smallerIntValue
|
|
// We cover javax.management.BinaryRelQueryExp with
|
|
// a relOp equal to GT
|
|
queries.add(Query.gt(Query.attr(primitiveIntAttName),
|
|
Query.value(smallerIntValue)));
|
|
|
|
// case 17:
|
|
// True if an attribute named primitiveIntAttName of type int has
|
|
// a value greater or equal to smallerIntValue
|
|
// We cover javax.management.BinaryRelQueryExp with
|
|
// a relOp equal to GE
|
|
queries.add(Query.geq(Query.attr(primitiveIntAttName),
|
|
Query.value(smallerIntValue)));
|
|
|
|
// case 18:
|
|
// True if an attribute named primitiveIntAttName of type int has
|
|
// a value smaller than biggerIntValue
|
|
// We cover javax.management.BinaryRelQueryExp with
|
|
// a relOp equal to LT
|
|
queries.add(Query.lt(Query.attr(primitiveIntAttName),
|
|
Query.value(biggerIntValue)));
|
|
|
|
// case 19:
|
|
// True if an attribute named primitiveIntAttName of type int has
|
|
// a value smaller or equal to biggerIntValue
|
|
// We cover javax.management.BinaryRelQueryExp with
|
|
// a relOp equal to LE
|
|
queries.add(Query.leq(Query.attr(primitiveIntAttName),
|
|
Query.value(biggerIntValue)));
|
|
|
|
// case 20:
|
|
// True if an attribute named primitiveIntAttName of type int has
|
|
// a value equal to intValue minus zero
|
|
// We cover javax.management.BinaryRelQueryExp with
|
|
// a relOp equal to MINUS
|
|
queries.add(Query.eq(Query.attr(primitiveIntAttName),
|
|
Query.minus(Query.value(intValue), Query.value(0))));
|
|
|
|
// case 21:
|
|
// True if an attribute named primitiveIntAttName of type int has
|
|
// a value equal to intValue plus zero
|
|
// We cover javax.management.BinaryRelQueryExp with
|
|
// a relOp equal to PLUS
|
|
queries.add(Query.eq(Query.attr(primitiveIntAttName),
|
|
Query.plus(Query.value(intValue), Query.value(0))));
|
|
|
|
// case 22:
|
|
// True if an attribute named primitiveIntAttName of type int has
|
|
// a value equal to intValue divided by one
|
|
// We cover javax.management.BinaryRelQueryExp with
|
|
// a relOp equal to DIV
|
|
queries.add(Query.eq(Query.attr(primitiveIntAttName),
|
|
Query.div(Query.value(intValue), Query.value(1))));
|
|
|
|
// case 23:
|
|
// True if an attribute named primitiveIntAttName of type int has
|
|
// a value equal to intValue multiplicated by one
|
|
// We cover javax.management.BinaryRelQueryExp with
|
|
// a relOp equal to TIMES
|
|
queries.add(Query.eq(Query.attr(primitiveIntAttName),
|
|
Query.times(Query.value(intValue), Query.value(1))));
|
|
|
|
// case 24:
|
|
// That query is a complex one that combines within a big AND
|
|
// queries with index 2 to 23 inclusive. But because a List is
|
|
// zero based, we must decrement all indexes by 1 when retrieving
|
|
// any previously stored query.
|
|
QueryExp q2_3 = Query.and(queries.get(2-1), queries.get(3-1));
|
|
QueryExp q4_5 = Query.and(queries.get(4-1), queries.get(5-1));
|
|
QueryExp q6_7 = Query.and(queries.get(6-1), queries.get(7-1));
|
|
QueryExp q8_9 = Query.and(queries.get(8-1), queries.get(9-1));
|
|
QueryExp q10_11 = Query.and(queries.get(10-1), queries.get(11-1));
|
|
QueryExp q12_13 = Query.and(queries.get(12-1), queries.get(13-1));
|
|
QueryExp q14_15 = Query.and(queries.get(14-1), queries.get(15-1));
|
|
QueryExp q16_17 = Query.and(queries.get(16-1), queries.get(17-1));
|
|
QueryExp q18_19 = Query.and(queries.get(18-1), queries.get(19-1));
|
|
QueryExp q20_21 = Query.and(queries.get(20-1), queries.get(21-1));
|
|
QueryExp q22_23 = Query.and(queries.get(22-1), queries.get(23-1));
|
|
QueryExp q2_5 = Query.and(q2_3, q4_5);
|
|
QueryExp q6_9 = Query.and(q6_7, q8_9);
|
|
QueryExp q10_13 = Query.and(q10_11, q12_13);
|
|
QueryExp q14_17 = Query.and(q14_15, q16_17);
|
|
QueryExp q18_21 = Query.and(q18_19, q20_21);
|
|
QueryExp q2_9 = Query.and(q2_5, q6_9);
|
|
QueryExp q10_17 = Query.and(q10_13, q14_17);
|
|
QueryExp q18_23 = Query.and(q18_21, q22_23);
|
|
QueryExp q2_17 = Query.and(q2_9, q10_17);
|
|
queries.add(Query.and(q2_17, q18_23));
|
|
|
|
// case 25:
|
|
// Complex query mixing AND and OR.
|
|
queries.add(Query.or(q6_9, q18_23));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns a QueryExp taken is the ArrayList populated by buildQueries().
|
|
* Lowest index is 1.
|
|
* Highest index is returned by getSize().
|
|
* <br>The queries numbered 1 to 23 allow to cover all the underlying
|
|
* Java classes of the JMX API used to build queries.
|
|
*/
|
|
public QueryExp getQuery(int index) {
|
|
return queries.get(index - 1);
|
|
}
|
|
}
|