/* * 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); } }