1 /*
   2  * Copyright (c) 2005, 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  * @run clean QuerySubstringTest
  31  * @run build QuerySubstringTest
  32  * @run main QuerySubstringTest
  33  */
  34 
  35 import java.lang.management.ManagementFactory;
  36 import javax.management.MBeanServer;
  37 import javax.management.ObjectName;
  38 import javax.management.Query;
  39 import javax.management.QueryExp;
  40 
  41 public class QuerySubstringTest {
  42 
  43     public static interface SimpleMBean {
  44         public String getString();
  45     }
  46 
  47     public static class Simple implements SimpleMBean {
  48         public Simple(String value) {
  49             this.value = value;
  50         }
  51         public String getString() {
  52             return value;
  53         }
  54         private String value;
  55     }
  56 
  57     private static String[][] data = {
  58         { "a*b?c\\d[e-f]",   "OK", "OK", "OK" },
  59         { "a*b?c\\d[e-f]g",  "OK", "OK", "KO" },
  60         { "za*b?c\\d[e-f]",  "KO", "OK", "OK" },
  61         { "za*b?c\\d[e-f]g", "KO", "OK", "KO" },
  62         { "a*b?c\\de",       "KO", "KO", "KO" },
  63         { "a*b?c\\deg",      "KO", "KO", "KO" },
  64         { "za*b?c\\de",      "KO", "KO", "KO" },
  65         { "za*b?c\\deg",     "KO", "KO", "KO" },
  66         { "a*b?c\\df",       "KO", "KO", "KO" },
  67         { "a*b?c\\dfg",      "KO", "KO", "KO" },
  68         { "za*b?c\\df",      "KO", "KO", "KO" },
  69         { "za*b?c\\dfg",     "KO", "KO", "KO" },
  70         { "axxbxc\\de",      "KO", "KO", "KO" },
  71         { "axxbxc\\deg",     "KO", "KO", "KO" },
  72         { "zaxxbxc\\de",     "KO", "KO", "KO" },
  73         { "zaxxbxc\\deg",    "KO", "KO", "KO" },
  74         { "axxbxc\\df",      "KO", "KO", "KO" },
  75         { "axxbxc\\dfg",     "KO", "KO", "KO" },
  76         { "zaxxbxc\\df",     "KO", "KO", "KO" },
  77         { "zaxxbxc\\dfg",    "KO", "KO", "KO" },
  78     };
  79 
  80     private static int query(MBeanServer mbs,
  81                              int type,
  82                              String substring,
  83                              String[][] data) throws Exception {
  84 
  85         int error = 0;
  86 
  87         String querySubString = null;
  88         switch (type) {
  89             case 1:
  90                 querySubString = "InitialSubString";
  91                 break;
  92             case 2:
  93                 querySubString = "AnySubString";
  94                 break;
  95             case 3:
  96                 querySubString = "FinalSubString";
  97                 break;
  98         }
  99 
 100         System.out.println("\n" + querySubString + " = " + substring + "\n");
 101 
 102         for (int i = 0; i < data.length; i++) {
 103             ObjectName on = new ObjectName("test:type=Simple,query=" +
 104                                            querySubString + ",name=" + i);
 105             Simple s = new Simple(data[i][0]);
 106             mbs.registerMBean(s, on);
 107             QueryExp q = null;
 108             switch (type) {
 109                 case 1:
 110                     q = Query.initialSubString(Query.attr("String"),
 111                                                Query.value(substring));
 112                     break;
 113                 case 2:
 114                     q = Query.anySubString(Query.attr("String"),
 115                                            Query.value(substring));
 116                     break;
 117                 case 3:
 118                     q = Query.finalSubString(Query.attr("String"),
 119                                              Query.value(substring));
 120                     break;
 121             }
 122             q.setMBeanServer(mbs);
 123             boolean r = q.apply(on);
 124             System.out.print("Attribute Value = " +
 125                 mbs.getAttribute(on, "String"));
 126             if (r && "OK".equals(data[i][type])) {
 127                 System.out.println(" OK");
 128             } else if (!r && "KO".equals(data[i][type])) {
 129                 System.out.println(" KO");
 130             } else {
 131                 System.out.println(" Error");
 132                 error++;
 133             }
 134         }
 135 
 136         return error;
 137     }
 138 
 139     public static void main(String[] args) throws Exception {
 140 
 141         int error = 0;
 142 
 143         String pattern = "a*b?c\\d[e-f]";
 144 
 145         System.out.println(
 146           "\n--- Test javax.management.Query.{initial|any|final}SubString ---");
 147 
 148         MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
 149 
 150         error += query(mbs, 1, pattern, data);
 151 
 152         error += query(mbs, 2, pattern, data);
 153 
 154         error += query(mbs, 3, pattern, data);
 155 
 156         if (error > 0) {
 157             System.out.println("\nTest failed! " + error + " errors.\n");
 158             throw new IllegalArgumentException("Test failed");
 159         } else {
 160             System.out.println("\nTest passed!\n");
 161         }
 162     }
 163 }