1 /*
2  * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /*
25  * @test
26  * @bug 4886033
27  * @summary Query.{initial,any,final}SubString fail if the
28  *          matching constraint string contains wildcards.
29  * @author Luis-Miguel Alventosa
30  *
31  * @run clean QuerySubstringTest
32  * @run build QuerySubstringTest
33  * @run main QuerySubstringTest
34  */
35 
36 import java.lang.management.ManagementFactory;
37 import javax.management.MBeanServer;
38 import javax.management.ObjectName;
39 import javax.management.Query;
40 import javax.management.QueryExp;
41 
42 public class QuerySubstringTest {
43 
44     public static interface SimpleMBean {
getString()45         public String getString();
46     }
47 
48     public static class Simple implements SimpleMBean {
Simple(String value)49         public Simple(String value) {
50             this.value = value;
51         }
getString()52         public String getString() {
53             return value;
54         }
55         private String value;
56     }
57 
58     private static String[][] data = {
59         { "a*b?c\\d[e-f]",   "OK", "OK", "OK" },
60         { "a*b?c\\d[e-f]g",  "OK", "OK", "KO" },
61         { "za*b?c\\d[e-f]",  "KO", "OK", "OK" },
62         { "za*b?c\\d[e-f]g", "KO", "OK", "KO" },
63         { "a*b?c\\de",       "KO", "KO", "KO" },
64         { "a*b?c\\deg",      "KO", "KO", "KO" },
65         { "za*b?c\\de",      "KO", "KO", "KO" },
66         { "za*b?c\\deg",     "KO", "KO", "KO" },
67         { "a*b?c\\df",       "KO", "KO", "KO" },
68         { "a*b?c\\dfg",      "KO", "KO", "KO" },
69         { "za*b?c\\df",      "KO", "KO", "KO" },
70         { "za*b?c\\dfg",     "KO", "KO", "KO" },
71         { "axxbxc\\de",      "KO", "KO", "KO" },
72         { "axxbxc\\deg",     "KO", "KO", "KO" },
73         { "zaxxbxc\\de",     "KO", "KO", "KO" },
74         { "zaxxbxc\\deg",    "KO", "KO", "KO" },
75         { "axxbxc\\df",      "KO", "KO", "KO" },
76         { "axxbxc\\dfg",     "KO", "KO", "KO" },
77         { "zaxxbxc\\df",     "KO", "KO", "KO" },
78         { "zaxxbxc\\dfg",    "KO", "KO", "KO" },
79     };
80 
query(MBeanServer mbs, int type, String substring, String[][] data)81     private static int query(MBeanServer mbs,
82                              int type,
83                              String substring,
84                              String[][] data) throws Exception {
85 
86         int error = 0;
87 
88         String querySubString = null;
89         switch (type) {
90             case 1:
91                 querySubString = "InitialSubString";
92                 break;
93             case 2:
94                 querySubString = "AnySubString";
95                 break;
96             case 3:
97                 querySubString = "FinalSubString";
98                 break;
99         }
100 
101         System.out.println("\n" + querySubString + " = " + substring + "\n");
102 
103         for (int i = 0; i < data.length; i++) {
104             ObjectName on = new ObjectName("test:type=Simple,query=" +
105                                            querySubString + ",name=" + i);
106             Simple s = new Simple(data[i][0]);
107             mbs.registerMBean(s, on);
108             QueryExp q = null;
109             switch (type) {
110                 case 1:
111                     q = Query.initialSubString(Query.attr("String"),
112                                                Query.value(substring));
113                     break;
114                 case 2:
115                     q = Query.anySubString(Query.attr("String"),
116                                            Query.value(substring));
117                     break;
118                 case 3:
119                     q = Query.finalSubString(Query.attr("String"),
120                                              Query.value(substring));
121                     break;
122             }
123             q.setMBeanServer(mbs);
124             boolean r = q.apply(on);
125             System.out.print("Attribute Value = " +
126                 mbs.getAttribute(on, "String"));
127             if (r && "OK".equals(data[i][type])) {
128                 System.out.println(" OK");
129             } else if (!r && "KO".equals(data[i][type])) {
130                 System.out.println(" KO");
131             } else {
132                 System.out.println(" Error");
133                 error++;
134             }
135         }
136 
137         return error;
138     }
139 
main(String[] args)140     public static void main(String[] args) throws Exception {
141 
142         int error = 0;
143 
144         String pattern = "a*b?c\\d[e-f]";
145 
146         System.out.println(
147           "\n--- Test javax.management.Query.{initial|any|final}SubString ---");
148 
149         MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
150 
151         error += query(mbs, 1, pattern, data);
152 
153         error += query(mbs, 2, pattern, data);
154 
155         error += query(mbs, 3, pattern, data);
156 
157         if (error > 0) {
158             System.out.println("\nTest failed! " + error + " errors.\n");
159             throw new IllegalArgumentException("Test failed");
160         } else {
161             System.out.println("\nTest passed!\n");
162         }
163     }
164 }
165