OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libjava/] [classpath/] [javax/] [management/] [Query.java] - Blame information for rev 772

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 772 jeremybenn
/* Query.java -- Static methods for query construction.
2
   Copyright (C) 2007 Free Software Foundation, Inc.
3
 
4
This file is part of GNU Classpath.
5
 
6
GNU Classpath is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2, or (at your option)
9
any later version.
10
 
11
GNU Classpath is distributed in the hope that it will be useful, but
12
WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
General Public License for more details.
15
 
16
You should have received a copy of the GNU General Public License
17
along with GNU Classpath; see the file COPYING.  If not, write to the
18
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
02110-1301 USA.
20
 
21
Linking this library statically or dynamically with other modules is
22
making a combined work based on this library.  Thus, the terms and
23
conditions of the GNU General Public License cover the whole
24
combination.
25
 
26
As a special exception, the copyright holders of this library give you
27
permission to link this library with independent modules to produce an
28
executable, regardless of the license terms of these independent
29
modules, and to copy and distribute the resulting executable under
30
terms of your choice, provided that you also meet, for each linked
31
independent module, the terms and conditions of the license of that
32
module.  An independent module is a module which is not derived from
33
or based on this library.  If you modify this library, you may extend
34
this exception to your version of the library, but you are not
35
obligated to do so.  If you do not wish to do so, delete this
36
exception statement from your version. */
37
 
38
package javax.management;
39
 
40
/**
41
 * Provides static methods for constructing queries.  Queries
42
 * may be used to list and enumerate management beans, via
43
 * the {@link MBeanServer}.  By using the methods in this class,
44
 * complex queries can be created from their more basic
45
 * components.
46
 *
47
 * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
48
 * @since 1.5
49
 */
50
public class Query
51
{
52
 
53
  /**
54
   * A code representing the {@link #plus(ValueExp, ValueExp)
55
   * query to be used in serialization.
56
   */
57
  public static final int PLUS = 0;
58
 
59
  /**
60
   * A code representing the {@link #minus(ValueExp, ValueExp)
61
   * query to be used in serialization.
62
   */
63
  public static final int MINUS = 1;
64
 
65
  /**
66
   * A code representing the {@link #times(ValueExp, ValueExp)
67
   * query to be used in serialization.
68
   */
69
  public static final int TIMES = 2;
70
 
71
  /**
72
   * A code representing the {@link #div(ValueExp, ValueExp)
73
   * query to be used in serialization.
74
   */
75
  public static final int DIV = 3;
76
 
77
  /**
78
   * A code representing the {@link #gt(ValueExp, ValueExp)
79
   * query to be used in serialization.
80
   */
81
  public static final int GT = 0;
82
 
83
  /**
84
   * A code representing the {@link #lt(ValueExp, ValueExp)
85
   * query to be used in serialization.
86
   */
87
  public static final int LT = 1;
88
 
89
  /**
90
   * A code representing the {@link #ge(ValueExp, ValueExp)
91
   * query to be used in serialization.
92
   */
93
  public static final int GE = 2;
94
 
95
  /**
96
   * A code representing the {@link #le(ValueExp, ValueExp)
97
   * query to be used in serialization.
98
   */
99
  public static final int LE = 3;
100
 
101
  /**
102
   * A code representing the {@link #eq(ValueExp, ValueExp)
103
   * query to be used in serialization.
104
   */
105
  public static final int EQ = 4;
106
 
107
  /**
108
   * Returns a query expression formed from the conjunction
109
   * of the two supplied query expressions.
110
   *
111
   * @param q1 the first query expression.
112
   * @param q2 the second query expression.
113
   * @return a query expression representing q1 && q2.  This
114
   *         will be serialized as the non-public class
115
   *         {@link AndQueryExp}.
116
   */
117
  public static QueryExp and(QueryExp q1, QueryExp q2)
118
  {
119
    return new AndQueryExp(q1, q2);
120
  }
121
 
122
  /**
123
   * Returns a query expression which checks that an
124
   * attribute value held by the specified
125
   * {@link AttributeValueExp} contains the string
126
   * specified by the given {@link StringValueExp}.
127
   *
128
   * @param attrib the attribute to match.
129
   * @param string the substring to find.
130
   * @return a query expression representing
131
   *         <code>attrib.matches("*" + string + "*")</code>.
132
   *         This will be serialized as the non-public class
133
   *         {@link MatchQueryExp}.
134
   */
135
  public static QueryExp anySubString(AttributeValueExp attrib,
136
                                      StringValueExp string)
137
  {
138
    return new MatchQueryExp(attrib, "*" + string.getValue() + "*");
139
  }
140
 
141
  /**
142
   * Returns a value expression for the value of the
143
   * named attribute.  Evaluating this using an
144
   * {@link ObjectName} involves an underlying call
145
   * to {@link MBeanServer#getAttribute(ObjectName,String)}.
146
   *
147
   * @param name the name of the attribute.
148
   * @return a value expression which returns the value
149
   *         of the named attribute when applied.
150
   */
151
  public static AttributeValueExp attr(String name)
152
  {
153
    return new AttributeValueExp(name);
154
  }
155
 
156
  /**
157
   * Returns a value expression for the value of the
158
   * named attribute from the specified class.  Evaluating
159
   * this using an {@link ObjectName} involves an underlying call
160
   * to both {@link MBeanServer#getObjectInstance(ObjectName)} and
161
   * {@link MBeanServer#getAttribute(ObjectName,String)}.
162
   *
163
   * @param className the class containing the attribute.
164
   * @param name the name of the attribute.
165
   * @return a value expression which returns the value
166
   *         of the named attribute when applied.
167
   *         This will be serialized as the non-public class
168
   *         {@link QualifiedAttributeValueExp}.
169
   */
170
  public static AttributeValueExp attr(String className,
171
                                       String name)
172
  {
173
    return new QualifiedAttributeValueExp(className, name);
174
  }
175
 
176
  /**
177
   * Returns a query expression representing the constraint
178
   * that the value, <code>v1</code>, lies between <code>v2</code>
179
   * and <code>v3</code>.
180
   *
181
   * @param v1 the value to compare against the boundaries.
182
   * @param v2 the lower boundary.
183
   * @param v3 the upper boundary.
184
   * @return a query expression representing a comparison
185
   *         of <code>v1</code> against <code>v2</code>
186
   *         and <code>v3</code>.  It returns true if
187
   *         <code>v2 <= v1 <= v3</code>.  This
188
   *         will be serialized as the non-public class
189
   *         {@link BetweenQueryExp}.
190
   */
191
  public static QueryExp between(ValueExp v1, ValueExp v2,
192
                                 ValueExp v3)
193
  {
194
    return new BetweenQueryExp(v1, v2, v3);
195
  }
196
 
197
  /**
198
   * Returns a value expression which evaluates to the name of
199
   * the class of the bean when applied. Associating the expression
200
   * with an {@link ObjectName} involves an underlying call
201
   * to both {@link MBeanServer#getObjectInstance(ObjectName)}
202
   * to obtain this information.
203
   *
204
   * @return a value expression which returns the class name
205
   *         of the bean to which it is applied.
206
   *         This will be serialized as the non-public class
207
   *         {@link ClassAttributeValueExp}.
208
   */
209
  public static AttributeValueExp classattr()
210
  {
211
    return new ClassAttributeValueExp();
212
  }
213
 
214
  /**
215
   * Returns a value expression which evaluates to the result of
216
   * dividing <code>v1</code> by <code>v2</code>.
217
   *
218
   * @param v1 the left-hand operand.
219
   * @param v2 the right-hand operand.
220
   * @return a value expression which returns the result of
221
   *         the division when applied.  This will be serialized
222
   *         as the non-public class {@link BinaryOpValueExp}
223
   *         with an operation of {@link #DIV}.
224
   */
225
  public static ValueExp div(ValueExp v1, ValueExp v2)
226
  {
227
    return new BinaryOpValueExp(DIV, v1, v2);
228
  }
229
 
230
  /**
231
   * Returns a query expression which evaluates to the result of
232
   * comparing <code>v1</code> to <code>v2</code> for equality.
233
   *
234
   * @param v1 the left-hand operand.
235
   * @param v2 the right-hand operand.
236
   * @return a value expression which returns the result of
237
   *         the comparison when applied.  This will be serialized
238
   *         as the non-public class {@link BinaryRelQueryExp}
239
   *         with an operation of {@link #EQ}.
240
   */
241
  public static QueryExp eq(ValueExp v1, ValueExp v2)
242
  {
243
    return new BinaryRelQueryExp(EQ, v1, v2);
244
  }
245
 
246
  /**
247
   * Returns a query expression which checks that an
248
   * attribute value held by the specified
249
   * {@link AttributeValueExp} ends with the string
250
   * specified by the given {@link StringValueExp}.
251
   *
252
   * @param attrib the attribute to match.
253
   * @param string the substring to find.
254
   * @return a query expression representing
255
   *         <code>attrib.matches("*" + string)</code>.
256
   *         This will be serialized as the non-public class
257
   *         {@link MatchQueryExp}.
258
   */
259
  public static QueryExp finalSubString(AttributeValueExp attrib,
260
                                        StringValueExp string)
261
  {
262
    return new MatchQueryExp(attrib, "*" + string.getValue());
263
  }
264
 
265
  /**
266
   * Returns a query expression which evaluates to the result of
267
   * comparing <code>v1</code> to <code>v2</code> to see if
268
   * <code>v1</code> is greater than or equal to <code>v2</code>.
269
   *
270
   * @param v1 the left-hand operand.
271
   * @param v2 the right-hand operand.
272
   * @return a value expression which returns the result of
273
   *         the comparison when applied.  This will be serialized
274
   *         as the non-public class {@link BinaryRelQueryExp}
275
   *         with an operation of {@link #GE}.
276
   */
277
  public static QueryExp geq(ValueExp v1, ValueExp v2)
278
  {
279
    return new BinaryRelQueryExp(GE, v1, v2);
280
  }
281
 
282
  /**
283
   * Returns a query expression which evaluates to the result of
284
   * comparing <code>v1</code> to <code>v2</code> to see if
285
   * <code>v1</code> is greater than <code>v2</code>.
286
   *
287
   * @param v1 the left-hand operand.
288
   * @param v2 the right-hand operand.
289
   * @return a value expression which returns the result of
290
   *         the comparison when applied.  This will be serialized
291
   *         as the non-public class {@link BinaryRelQueryExp}
292
   *         with an operation of {@link #GT}.
293
   */
294
  public static QueryExp gt(ValueExp v1, ValueExp v2)
295
  {
296
    return new BinaryRelQueryExp(GT, v1, v2);
297
  }
298
 
299
  /**
300
   * Returns a query expression representing the constraint
301
   * that the value, <code>v</code>, is a member of the
302
   * list, <code>vlist</code>.
303
   *
304
   * @param v the value to look for in the list.
305
   * @param vlist the list of allowed values.
306
   * @return a query expression representing a membership check
307
   *         of <code>v</code> against the list, <code>vlist</code>.
308
   *         This will be serialized as the non-public class
309
   *         {@link InQueryExp}.
310
   */
311
  public static QueryExp in(ValueExp v, ValueExp[] vlist)
312
  {
313
    return new InQueryExp(v, vlist);
314
  }
315
 
316
  /**
317
   * Returns a query expression which checks that an
318
   * attribute value held by the specified
319
   * {@link AttributeValueExp} starts with the string
320
   * specified by the given {@link StringValueExp}.
321
   *
322
   * @param attrib the attribute to match.
323
   * @param string the substring to find.
324
   * @return a query expression representing
325
   *         <code>attrib.matches(string + "*")</code>.
326
   *         This will be serialized as the non-public class
327
   *         {@link MatchQueryExp}.
328
   */
329
  public static QueryExp initialSubString(AttributeValueExp attrib,
330
                                          StringValueExp string)
331
  {
332
    return new MatchQueryExp(attrib, string.getValue() + "*");
333
  }
334
 
335
  /**
336
   * Returns a query expression which checks that a
337
   * bean is an instance of the class specified
338
   * by the given {@link StringValueExp}.  Associating the
339
   * expression with an {@link ObjectName} involves an underlying
340
   * call to {@link MBeanServer#isInstanceOf(ObjectName, String)}
341
   * using the value of <code>((StringValueExp)
342
   * className.apply(objectName)).getValue()</code> as the
343
   * class name.
344
   *
345
   * @param className the name of the class which the bean
346
   *                  should be an instance of.
347
   * @return a query expression representing
348
   *         the inheritance check.  This will be serialized
349
   *         as the non-public class {@link InstanceOfQueryExp}.
350
   * @since 1.6
351
   */
352
  public static QueryExp isInstanceOf(StringValueExp className)
353
  {
354
    return new InstanceOfQueryExp(className);
355
  }
356
 
357
  /**
358
   * Returns a query expression which evaluates to the result of
359
   * comparing <code>v1</code> to <code>v2</code> to see if
360
   * <code>v1</code> is less than or equal to <code>v2</code>.
361
   *
362
   * @param v1 the left-hand operand.
363
   * @param v2 the right-hand operand.
364
   * @return a value expression which returns the result of
365
   *         the comparison when applied.  This will be serialized
366
   *         as the non-public class {@link BinaryRelQueryExp}
367
   *         with an operation of {@link #LE}.
368
   */
369
  public static QueryExp leq(ValueExp v1, ValueExp v2)
370
  {
371
    return new BinaryRelQueryExp(LE, v1, v2);
372
  }
373
 
374
  /**
375
   * Returns a query expression which evaluates to the result of
376
   * comparing <code>v1</code> to <code>v2</code> to see if
377
   * <code>v1</code> is less than <code>v2</code>.
378
   *
379
   * @param v1 the left-hand operand.
380
   * @param v2 the right-hand operand.
381
   * @return a value expression which returns the result of
382
   *         the comparison when applied.  This will be serialized
383
   *         as the non-public class {@link BinaryRelQueryExp}
384
   *         with an operation of {@link #LT}.
385
   */
386
  public static QueryExp lt(ValueExp v1, ValueExp v2)
387
  {
388
    return new BinaryRelQueryExp(LT, v1, v2);
389
  }
390
 
391
  /**
392
   * <p>
393
   * Returns a query expression which checks that an
394
   * attribute value matches the pattern
395
   * specified by the given {@link StringValueExp}.
396
   * The pattern uses file-globbing syntax:
397
   * </p>
398
   * <ul>
399
   * <li>'*' stands for any number of arbitrary characters.</li>
400
   * <li>'?' stands for a single arbitrary characters.</li>
401
   * <li>An expression within '[' and ']' specify a character
402
   * class.</li>
403
   * <ul>
404
   * <li>A range of characters can be specified by separating
405
   * the start and end character with '-'.</li>
406
   * <li>The complement of the class can be obtained by using
407
   * '!' as the first character of the class.</li>
408
   * <li>'?', '*' and '[' can occur freely within the class. '-'
409
   * may occur as the first or last character.  '!' may occur
410
   * normally in any position other than the first.  ']' may occur
411
   * as the first element of the class.</li>
412
   * </ul>
413
   * <li>'?', '*' and '[' may be escaped using a backslash
414
   * character, '\'.</li>
415
   * </ul>
416
   *
417
   * @param attrib the attribute to match.
418
   * @param string the substring to find.
419
   * @return a query expression representing the result of
420
   *         matching the pattern against the evaluated
421
   *         value of the attribute.  This will be serialized
422
   *         as the non-public class {@link MatchQueryExp}.
423
   */
424
  public static QueryExp match(AttributeValueExp attrib,
425
                               StringValueExp string)
426
  {
427
    return new MatchQueryExp(attrib, string.getValue());
428
  }
429
 
430
  /**
431
   * Returns a value expression which evaluates to the result of
432
   * subtracting <code>v2</code> from <code>v1</code>.
433
   *
434
   * @param v1 the left-hand operand.
435
   * @param v2 the right-hand operand.
436
   * @return a value expression which returns the result of
437
   *         the subtraction when applied.  This will be serialized
438
   *         as the non-public class {@link BinaryOpValueExp}
439
   *         with an operation of {@link #MINUS}.
440
   */
441
  public static ValueExp minus(ValueExp v1, ValueExp v2)
442
  {
443
    return new BinaryOpValueExp(MINUS, v1, v2);
444
  }
445
 
446
  /**
447
   * Returns a query expression representing the negation
448
   * of the specified query expression.
449
   *
450
   * @param q the query to negate.
451
   * @return a query expression representing the negation of
452
   *         <code>q</code>.  This will be serialized as the
453
   *         non-public class {@link NotQueryExp}.
454
   */
455
  public static QueryExp not(QueryExp q)
456
  {
457
    return new NotQueryExp(q);
458
  }
459
 
460
  /**
461
   * Returns a query expression formed from the disjunction
462
   * of the two supplied query expressions.
463
   *
464
   * @param q1 the first query expression.
465
   * @param q2 the second query expression.
466
   * @return a query expression representing q1 || q2.  This
467
   *         will be serialized as the non-public class
468
   *         {@link OrQueryExp}.
469
   */
470
  public static QueryExp or(QueryExp q1, QueryExp q2)
471
  {
472
    return new OrQueryExp(q1, q2);
473
  }
474
 
475
  /**
476
   * Returns a value expression which evaluates to the result of
477
   * adding <code>v1</code> to <code>v2</code>.
478
   *
479
   * @param v1 the left-hand operand.
480
   * @param v2 the right-hand operand.
481
   * @return a value expression which returns the result of
482
   *         the addition when applied.  This will be serialized
483
   *         as the non-public class {@link BinaryOpValueExp}
484
   *         with an operation of {@link #PLUS}.
485
   */
486
  public static ValueExp plus(ValueExp v1, ValueExp v2)
487
  {
488
    return new BinaryOpValueExp(PLUS, v1, v2);
489
  }
490
 
491
  /**
492
   * Returns a value expression which evaluates to the result of
493
   * multiplying <code>v1</code> by <code>v2</code>.
494
   *
495
   * @param v1 the left-hand operand.
496
   * @param v2 the right-hand operand.
497
   * @return a value expression which returns the result of
498
   *         the multiplication when applied.  This will be serialized
499
   *         as the non-public class {@link BinaryOpValueExp}
500
   *         with an operation of {@link #TIMES}.
501
   */
502
  public static ValueExp times(ValueExp v1, ValueExp v2)
503
  {
504
    return new BinaryOpValueExp(TIMES, v1, v2);
505
  }
506
 
507
  /**
508
   * Returns a value expression wrapping the specified value.
509
   *
510
   * @param val the boolean value to wrap.
511
   * @return a value expression wrapping <code>val</code>.  This
512
   *         will be serialized as the non-public class
513
   *         {@link BooleanValueExp}.
514
   */
515
  public static ValueExp value(boolean val)
516
  {
517
    return new BooleanValueExp(val);
518
  }
519
 
520
  /**
521
   * Returns a value expression wrapping the specified value.
522
   *
523
   * @param val the double value to wrap.
524
   * @return a value expression wrapping <code>val</code>.  This
525
   *         will be serialized as the non-public class
526
   *         {@link NumericValueExp}.
527
   */
528
  public static ValueExp value(double val)
529
  {
530
    return new NumericValueExp(val);
531
  }
532
 
533
  /**
534
   * Returns a value expression wrapping the specified value.
535
   *
536
   * @param val the float value to wrap.
537
   * @return a value expression wrapping <code>val</code>.  This
538
   *         will be serialized as the non-public class
539
   *         {@link NumericValueExp}.
540
   */
541
  public static ValueExp value(float val)
542
  {
543
    return new NumericValueExp(val);
544
  }
545
 
546
  /**
547
   * Returns a value expression wrapping the specified value.
548
   *
549
   * @param val the integer value to wrap.
550
   * @return a value expression wrapping <code>val</code>.  This
551
   *         will be serialized as the non-public class
552
   *         {@link NumericValueExp}.
553
   */
554
  public static ValueExp value(int val)
555
  {
556
    return new NumericValueExp(val);
557
  }
558
 
559
  /**
560
   * Returns a value expression wrapping the specified value.
561
   *
562
   * @param val the long value to wrap.
563
   * @return a value expression wrapping <code>val</code>.  This
564
   *         will be serialized as the non-public class
565
   *         {@link NumericValueExp}.
566
   */
567
  public static ValueExp value(long val)
568
  {
569
    return new NumericValueExp(val);
570
  }
571
 
572
  /**
573
   * Returns a value expression wrapping the specified value.
574
   *
575
   * @param val the {@link Number} value to wrap.
576
   * @return a value expression wrapping <code>val</code>.  This
577
   *         will be serialized as the non-public class
578
   *         {@link NumericValueExp}.
579
   */
580
  public static ValueExp value(Number val)
581
  {
582
    return new NumericValueExp(val);
583
  }
584
 
585
  /**
586
   * Returns a value expression wrapping the specified string.
587
   *
588
   * @param val the {@link String} to wrap.
589
   * @return a {@link StringValueExp} wrapping <code>val</code>.
590
   */
591
  public static StringValueExp value(String val)
592
  {
593
    return new StringValueExp(val);
594
  }
595
 
596
  /**
597
   * Representation of the conjunction formed using
598
   * {@link #and(QueryExp, QueryExp).
599
   *
600
   * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
601
   * @since 1.5
602
   */
603
  private static final class AndQueryExp
604
    extends QueryEval
605
    implements QueryExp
606
  {
607
 
608
    /**
609
     * Compatible with JDK 1.6
610
     */
611
    private static final long serialVersionUID = -1081892073854801359L;
612
 
613
    /**
614
     * The first operand.
615
     */
616
    private QueryExp exp1;
617
 
618
    /**
619
     * The second operand.
620
     */
621
    private QueryExp exp2;
622
 
623
    /**
624
     * Constructs a new {@link AndQueryExp} using
625
     * the two specified operands.
626
     *
627
     * @param exp1 the first query expression.
628
     * @param exp2 the second query expression.
629
     */
630
    public AndQueryExp(QueryExp exp1, QueryExp exp2)
631
    {
632
      this.exp1 = exp1;
633
      this.exp2 = exp2;
634
    }
635
 
636
    /**
637
     * Returns the conjunction of the two query
638
     * expressions.
639
     *
640
     * @param name the {@link ObjectName} to apply
641
     *             the query to.
642
     * @return the conjunction of applying the name
643
     *         to both operands.
644
     * @throws BadStringOperationException if an invalid string
645
     *                                     operation is used by
646
     *                                     the query.
647
     * @throws BadBinaryOpValueExpException if an invalid expression
648
     *                                      is used by the query.
649
     * @throws BadAttributeValueExpException if an invalid attribute
650
     *                                       is used by the query.
651
     * @throws InvalidApplicationException if the query is applied
652
     *                                     to the wrong type of bean.
653
     */
654
    public boolean apply(ObjectName name)
655
      throws BadStringOperationException, BadBinaryOpValueExpException,
656
             BadAttributeValueExpException, InvalidApplicationException
657
    {
658
      return exp1.apply(name) && exp2.apply(name);
659
    }
660
 
661
  }
662
 
663
  /**
664
   * Representation of a query that matches an
665
   * attribute's value against a given pattern.
666
   *
667
   * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
668
   * @since 1.5
669
   */
670
  private static final class MatchQueryExp
671
    extends QueryEval
672
    implements QueryExp
673
  {
674
 
675
    /**
676
     * Compatible with JDK 1.6
677
     */
678
    private static final long serialVersionUID = -7156603696948215014L;
679
 
680
    /**
681
     * The attribute to match against.
682
     */
683
    private AttributeValueExp exp;
684
 
685
    /**
686
     * The pattern to be matched.
687
     */
688
    private String pattern;
689
 
690
    /**
691
     * Constructs a new {@link MatchQueryExp} using
692
     * the specified attribute value and pattern.
693
     *
694
     * @param exp the attribute value expression.
695
     * @param pattern the pattern.
696
     */
697
    public MatchQueryExp(AttributeValueExp exp,
698
                         String pattern)
699
    {
700
      this.exp = exp;
701
      this.pattern = pattern;
702
    }
703
 
704
    /**
705
     * Returns the result of matching the attribute
706
     * value against the pattern.
707
     *
708
     * @param name the {@link ObjectName} to apply
709
     *             the query to.
710
     * @return the result of the match.
711
     * @throws BadStringOperationException if an invalid string
712
     *                                     operation is used by
713
     *                                     the query.
714
     * @throws BadBinaryOpValueExpException if an invalid expression
715
     *                                      is used by the query.
716
     * @throws BadAttributeValueExpException if an invalid attribute
717
     *                                       is used by the query.
718
     * @throws InvalidApplicationException if the query is applied
719
     *                                     to the wrong type of bean.
720
     */
721
    public boolean apply(ObjectName name)
722
      throws BadStringOperationException, BadBinaryOpValueExpException,
723
             BadAttributeValueExpException, InvalidApplicationException
724
    {
725
      String val = ((StringValueExp) exp.apply(name)).getValue();
726
      int valPos = 0;
727
      int fallback = -1;
728
      int fallbackP = -1;
729
      boolean backslash = false;
730
      for (int a = 0; a < pattern.length(); ++a)
731
        {
732
          boolean matched = false;
733
          int next = pattern.codePointAt(a);
734
          if (!backslash)
735
            {
736
              if (next == '?' && valPos < val.length())
737
                {
738
                  ++valPos;
739
                  matched = true;
740
                }
741
              else if (next == '*')
742
                {
743
                  fallback = valPos;
744
                  fallbackP = a;
745
                  matched = true;
746
                }
747
              else if (next == '[' && valPos < val.length())
748
                {
749
                  boolean negated = false;
750
                  int b = a + 1;
751
                  int classChar = pattern.codePointAt(b);
752
                  do
753
                    {
754
                      if (classChar == '!' && b == a + 1)
755
                        negated = true;
756
                      else if (pattern.codePointAt(b + 1) == '-' &&
757
                               pattern.codePointAt(b + 2) != ']')
758
                        {
759
                          if (classChar > pattern.codePointAt(b + 2))
760
                            throw new BadStringOperationException("Invalid range: " +
761
                                                                  classChar + " to " +
762
                                                                  pattern.codePointAt(b+2));
763
                          for (int c = classChar; c <= pattern.codePointAt(b+2); ++c)
764
                            if (val.codePointAt(valPos) == c)
765
                              matched = true;
766
                          b = b + 2;
767
                        }
768
                      else if (val.codePointAt(valPos) == classChar)
769
                        matched = true;
770
                      ++b;
771
                      classChar = pattern.codePointAt(b);
772
                    } while (classChar != ']');
773
                  if (negated)
774
                    matched = !matched;
775
                  ++valPos;
776
                  a = b;
777
                }
778
              else if (next == '\\')
779
                backslash = true;
780
              else if (valPos < val.length() && next == val.codePointAt(valPos))
781
                {
782
                  matched = true;
783
                  ++valPos;
784
                }
785
            }
786
          else
787
            {
788
              backslash = false;
789
              if (valPos < val.length() && next == val.codePointAt(valPos))
790
                {
791
                  matched = true;
792
                  ++valPos;
793
                }
794
            }
795
          if (!matched)
796
            if (fallback != -1)
797
              {
798
                ++fallback;
799
                valPos = fallback;
800
                a = fallbackP;
801
                if (valPos == val.length())
802
                  return false;
803
                continue;
804
              }
805
            else
806
              return false;
807
        }
808
      return true;
809
    }
810
  }
811
 
812
  /**
813
   * Representation of the retrieval of an attribute
814
   * value from a certain class for {@link #attr(String,String)}.
815
   *
816
   * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
817
   * @since 1.5
818
   */
819
  private static final class QualifiedAttributeValueExp
820
    extends AttributeValueExp
821
  {
822
 
823
    /**
824
     * Compatible with JDK 1.6
825
     */
826
    private static final long serialVersionUID = 8832517277410933254L;
827
 
828
    /**
829
     * The name of the class from which the attribute is taken.
830
     */
831
    private String className;
832
 
833
    /**
834
     * Constructs a new {@link QualifiedAttributeValueExp} using
835
     * the specified class name and attribute name.
836
     *
837
     * @param className the class name.
838
     * @param name the attribute name.
839
     */
840
    public QualifiedAttributeValueExp(String className, String name)
841
    {
842
      super(name);
843
      this.className = className;
844
    }
845
 
846
    /**
847
     * Applies the {@link AttributeValueExp} to the specified
848
     * management bean by checking that the attribute will be
849
     * obtained from the correct class (by a class to
850
     * {@link MBeanServer#getObjectInstance(ObjectName)} and
851
     * then obtaining the attribute value from the
852
     * {@link MBeanServer}, using it to create a
853
     * {@link StringValueExp}.
854
     *
855
     * @param name the {@link ObjectName} of the bean to obtain
856
     *             the value from.
857
     * @return a {@link StringValueExp} containing the result.
858
     * @throws BadStringOperationException if an invalid string
859
     *                                     operation is used by
860
     *                                     the value expression.
861
     * @throws BadBinaryOpValueExpException if an invalid expression
862
     *                                      is used by the value expression.
863
     * @throws BadAttributeValueExpException if an invalid attribute
864
     *                                       is used by the value expression.
865
     * @throws InvalidApplicationException if the value expression is applied
866
     *                                     to the wrong type of bean.
867
     */
868
    public ValueExp apply(ObjectName name)
869
      throws BadStringOperationException, BadBinaryOpValueExpException,
870
             BadAttributeValueExpException, InvalidApplicationException
871
    {
872
      try
873
        {
874
          if (!(QueryEval.getMBeanServer().getObjectInstance(name).getClassName().equals(className)))
875
            throw new BadAttributeValueExpException("The value is not from " +
876
                                                    "the correct class.");
877
        }
878
      catch (InstanceNotFoundException e)
879
        {
880
          throw (BadAttributeValueExpException)
881
            new BadAttributeValueExpException("The named bean is not registered.").initCause(e);
882
        }
883
      return super.apply(name);
884
    }
885
 
886
  }
887
 
888
  /**
889
   * Representation of the comparison of a value with
890
   * a pair of bounds formed using
891
   * {@link #between(ValueExp, ValueExp, ValueExp).
892
   *
893
   * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
894
   * @since 1.5
895
   */
896
  private static final class BetweenQueryExp
897
    extends QueryEval
898
    implements QueryExp
899
  {
900
 
901
    /**
902
     * Compatible with JDK 1.6
903
     */
904
    private static final long serialVersionUID = -2933597532866307444L;
905
 
906
    /**
907
     * The value to compare.
908
     */
909
    private ValueExp exp1;
910
 
911
    /**
912
     * The lower boundary.
913
     */
914
    private ValueExp exp2;
915
 
916
    /**
917
     * The upper boundary.
918
     */
919
    private ValueExp exp3;
920
 
921
    /**
922
     * Constructs a new {@link BetweenQueryExp} using
923
     * the specified comparison value and the given
924
     * bounds.
925
     *
926
     * @param exp1 the value to compare.
927
     * @param exp2 the lower bound.
928
     * @param exp3 the upper bound.
929
     */
930
    public BetweenQueryExp(ValueExp exp1, ValueExp exp2,
931
                           ValueExp exp3)
932
    {
933
      this.exp1 = exp1;
934
      this.exp2 = exp2;
935
      this.exp3 = exp3;
936
    }
937
 
938
    /**
939
     * Returns the result of the comparison between
940
     * the value and the two bounds.
941
     *
942
     * @param name the {@link ObjectName} to apply
943
     *             the query to.
944
     * @return the result of the comparison.
945
     * @throws BadStringOperationException if an invalid string
946
     *                                     operation is used by
947
     *                                     the query.
948
     * @throws BadBinaryOpValueExpException if an invalid expression
949
     *                                      is used by the query.
950
     * @throws BadAttributeValueExpException if an invalid attribute
951
     *                                       is used by the query.
952
     * @throws InvalidApplicationException if the query is applied
953
     *                                     to the wrong type of bean.
954
     */
955
    public boolean apply(ObjectName name)
956
      throws BadStringOperationException, BadBinaryOpValueExpException,
957
             BadAttributeValueExpException, InvalidApplicationException
958
    {
959
      String v1 = exp1.apply(name).toString();
960
      String v2 = exp2.apply(name).toString();
961
      String v3 = exp3.apply(name).toString();
962
      return v1.compareTo(v2) >= 0 && v1.compareTo(v3) <= 0;
963
    }
964
 
965
  }
966
 
967
  /**
968
   * Representation of the retrieval of the name of
969
   * a bean's class for {@link #classattr()}.
970
   *
971
   * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
972
   * @since 1.5
973
   */
974
  private static final class ClassAttributeValueExp
975
    extends AttributeValueExp
976
  {
977
 
978
    /**
979
     * Compatible with JDK 1.6
980
     */
981
    private static final long serialVersionUID = -1081892073854801359L;
982
 
983
    /**
984
     * Obtains the name of the specified bean's class using a call
985
     * to {@link MBeanServer#getObjectInstance(ObjectName)}.
986
     *
987
     * @param name the {@link ObjectName} of the bean to obtain
988
     *             the class name from.
989
     * @return a {@link StringValueExp} containing the result.
990
     * @throws BadStringOperationException if an invalid string
991
     *                                     operation is used by
992
     *                                     the value expression.
993
     * @throws BadBinaryOpValueExpException if an invalid expression
994
     *                                      is used by the value expression.
995
     * @throws BadAttributeValueExpException if an invalid attribute
996
     *                                       is used by the value expression.
997
     * @throws InvalidApplicationException if the value expression is applied
998
     *                                     to the wrong type of bean.
999
     */
1000
    public ValueExp apply(ObjectName name)
1001
      throws BadStringOperationException, BadBinaryOpValueExpException,
1002
             BadAttributeValueExpException, InvalidApplicationException
1003
    {
1004
      try
1005
        {
1006
          return new StringValueExp(QueryEval.getMBeanServer().getObjectInstance(name).getClassName());
1007
        }
1008
      catch (InstanceNotFoundException e)
1009
        {
1010
          throw (BadAttributeValueExpException)
1011
            new BadAttributeValueExpException("The named bean is not registered.").initCause(e);
1012
        }
1013
    }
1014
 
1015
  }
1016
 
1017
  /**
1018
   * Representation of a binary operation formed using
1019
   * {@link #div(ValueExp, ValueExp), {@link #plus(ValueExp,ValueExp)},
1020
   * {@link #minus(ValueExp, ValueExp) or
1021
   * {@link #times(ValueExp, ValueExp)}.
1022
   *
1023
   * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
1024
   * @since 1.5
1025
   */
1026
  private static final class BinaryOpValueExp
1027
    extends QueryEval
1028
    implements ValueExp
1029
  {
1030
 
1031
    /**
1032
     * Compatible with JDK 1.6
1033
     */
1034
    private static final long serialVersionUID = 1216286847881456786L;
1035
 
1036
    /**
1037
     * The operation to perform.
1038
     */
1039
    private int op;
1040
 
1041
    /**
1042
     * The left-hand operand.
1043
     */
1044
    private ValueExp exp1;
1045
 
1046
    /**
1047
     * The right-hand operand.
1048
     */
1049
    private ValueExp exp2;
1050
 
1051
    /**
1052
     * Constructs a new {@link BinaryOpValueExp} using
1053
     * the specified operation and the two values supplied.
1054
     *
1055
     * @param op the operation to perform.
1056
     * @param exp1 the left-hand operand.
1057
     * @param exp2 the right-hand operand.
1058
     */
1059
    public BinaryOpValueExp(int op, ValueExp exp1, ValueExp exp2)
1060
    {
1061
      this.op = op;
1062
      this.exp1 = exp1;
1063
      this.exp2 = exp2;
1064
    }
1065
 
1066
    /**
1067
     * Returns the result of performing the operation on
1068
     * <code>exp1</code> and <code>exp2</code>.
1069
     *
1070
     * @param name the {@link ObjectName} to apply
1071
     *             the query to.
1072
     * @return the result of the operation.
1073
     * @throws BadStringOperationException if an invalid string
1074
     *                                     operation is used by
1075
     *                                     the query.
1076
     * @throws BadBinaryOpValueExpException if an invalid expression
1077
     *                                      is used by the query.
1078
     * @throws BadAttributeValueExpException if an invalid attribute
1079
     *                                       is used by the query.
1080
     * @throws InvalidApplicationException if the query is applied
1081
     *                                     to the wrong type of bean.
1082
     */
1083
    public ValueExp apply(ObjectName name)
1084
      throws BadStringOperationException, BadBinaryOpValueExpException,
1085
             BadAttributeValueExpException, InvalidApplicationException
1086
    {
1087
      NumericValueExp v1 = (NumericValueExp) exp1.apply(name);
1088
      NumericValueExp v2 = (NumericValueExp) exp2.apply(name);
1089
      switch (op)
1090
        {
1091
        case PLUS:
1092
          return v1.plus(v2);
1093
        case MINUS:
1094
          return v1.minus(v2);
1095
        case TIMES:
1096
          return v1.times(v2);
1097
        case DIV:
1098
          return v1.div(v2);
1099
        default:
1100
          throw new BadBinaryOpValueExpException(this);
1101
        }
1102
    }
1103
 
1104
    /**
1105
     * Returns a textual representation of the operation.
1106
     *
1107
     * @return a textual version of the operation.
1108
     */
1109
    public String toString()
1110
    {
1111
      String opS;
1112
      switch (op)
1113
        {
1114
        case PLUS:
1115
          opS = "+";
1116
          break;
1117
        case MINUS:
1118
          opS = "-";
1119
          break;
1120
        case TIMES:
1121
          opS = "x";
1122
          break;
1123
        case DIV:
1124
          opS = "/";
1125
          break;
1126
        default:
1127
          opS = "?";
1128
        }
1129
      return exp1 + " " + opS + " " + exp2;
1130
    }
1131
  }
1132
 
1133
  /**
1134
   * Representation of a binary operation formed using
1135
   * {@link #eq(ValueExp, ValueExp), {@link #geq(ValueExp, ValueExp)},
1136
   * {@link #leq(ValueExp, ValueExp), {@link #gt(ValueExp, ValueExp)}
1137
   * or {@link #lt(ValueExp, ValueExp)}.
1138
   *
1139
   * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
1140
   * @since 1.5
1141
   */
1142
  private static final class BinaryRelQueryExp
1143
    extends QueryEval
1144
    implements QueryExp
1145
  {
1146
 
1147
    /**
1148
     * Compatible with JDK 1.6
1149
     */
1150
    private static final long serialVersionUID = -5690656271650491000L;
1151
 
1152
    /**
1153
     * The operation to perform.
1154
     */
1155
    private int relOp;
1156
 
1157
    /**
1158
     * The left-hand operand.
1159
     */
1160
    private ValueExp exp1;
1161
 
1162
    /**
1163
     * The right-hand operand.
1164
     */
1165
    private ValueExp exp2;
1166
 
1167
    /**
1168
     * Constructs a new {@link BinaryRelQueryExp} using
1169
     * the specified operation and the two values supplied.
1170
     *
1171
     * @param relOp the operation to perform.
1172
     * @param exp1 the left-hand operand.
1173
     * @param exp2 the right-hand operand.
1174
     */
1175
    public BinaryRelQueryExp(int relOp, ValueExp exp1, ValueExp exp2)
1176
    {
1177
      this.relOp = relOp;
1178
      this.exp1 = exp1;
1179
      this.exp2 = exp2;
1180
    }
1181
 
1182
    /**
1183
     * Returns the result of performing the operation on
1184
     * <code>exp1</code> and <code>exp2</code>.
1185
     *
1186
     * @param name the {@link ObjectName} to apply
1187
     *             the query to.
1188
     * @return the result of the comparison.
1189
     * @throws BadStringOperationException if an invalid string
1190
     *                                     operation is used by
1191
     *                                     the query.
1192
     * @throws BadBinaryOpValueExpException if an invalid expression
1193
     *                                      is used by the query.
1194
     * @throws BadAttributeValueExpException if an invalid attribute
1195
     *                                       is used by the query.
1196
     * @throws InvalidApplicationException if the query is applied
1197
     *                                     to the wrong type of bean.
1198
     */
1199
    public boolean apply(ObjectName name)
1200
      throws BadStringOperationException, BadBinaryOpValueExpException,
1201
             BadAttributeValueExpException, InvalidApplicationException
1202
    {
1203
      String v1 = exp1.apply(name).toString();
1204
      String v2 = exp2.apply(name).toString();
1205
      switch (relOp)
1206
        {
1207
        case EQ:
1208
          return v1.equals(v2);
1209
        case GT:
1210
          return v1.compareTo(v2) > 0;
1211
        case GE:
1212
          return v1.compareTo(v2) >= 0;
1213
        case LE:
1214
          return v1.compareTo(v2) <= 0;
1215
        case LT:
1216
          return v1.compareTo(v2) < 0;
1217
        default:
1218
          throw new BadStringOperationException("Invalid operator: " + relOp);
1219
        }
1220
    }
1221
 
1222
    /**
1223
     * Returns a textual representation of the operation.
1224
     *
1225
     * @return a textual version of the operation.
1226
     */
1227
    public String toString()
1228
    {
1229
      String op;
1230
      switch (relOp)
1231
        {
1232
        case EQ:
1233
          op = "=";
1234
          break;
1235
        case GT:
1236
          op = ">";
1237
          break;
1238
        case GE:
1239
          op = ">=";
1240
          break;
1241
        case LE:
1242
          op = "<=";
1243
          break;
1244
        case LT:
1245
          op = "<";
1246
          break;
1247
        default:
1248
          op = "?";
1249
        }
1250
      return exp1 + " " + op + " " + exp2;
1251
    }
1252
  }
1253
 
1254
  /**
1255
   * Representation of the comparison of a value with
1256
   * the members of a list formed using
1257
   * {@link #in(ValueExp, ValueExp[]).
1258
   *
1259
   * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
1260
   * @since 1.5
1261
   */
1262
  private static final class InQueryExp
1263
    extends QueryEval
1264
    implements QueryExp
1265
  {
1266
 
1267
    /**
1268
     * Compatible with JDK 1.6
1269
     */
1270
    private static final long serialVersionUID = -5801329450358952434L;
1271
 
1272
    /**
1273
     * The value to look for.
1274
     */
1275
    private ValueExp val;
1276
 
1277
    /**
1278
     * The array to search.
1279
     */
1280
    private ValueExp[] valueList;
1281
 
1282
    /**
1283
     * Constructs a new {@link InQueryExp} using
1284
     * the specified comparison value and the given
1285
     * list.
1286
     *
1287
     * @param val the value to compare.
1288
     * @param valueList the list of values.
1289
     */
1290
    public InQueryExp(ValueExp val, ValueExp[] valueList)
1291
    {
1292
      this.val = val;
1293
      this.valueList = valueList;
1294
    }
1295
 
1296
    /**
1297
     * Returns the result of the comparison between
1298
     * the value and the list of allowed values.
1299
     *
1300
     * @param name the {@link ObjectName} to apply
1301
     *             the query to.
1302
     * @return the result of the comparison.
1303
     * @throws BadStringOperationException if an invalid string
1304
     *                                     operation is used by
1305
     *                                     the query.
1306
     * @throws BadBinaryOpValueExpException if an invalid expression
1307
     *                                      is used by the query.
1308
     * @throws BadAttributeValueExpException if an invalid attribute
1309
     *                                       is used by the query.
1310
     * @throws InvalidApplicationException if the query is applied
1311
     *                                     to the wrong type of bean.
1312
     */
1313
    public boolean apply(ObjectName name)
1314
      throws BadStringOperationException, BadBinaryOpValueExpException,
1315
             BadAttributeValueExpException, InvalidApplicationException
1316
    {
1317
      String v = val.apply(name).toString();
1318
      for (ValueExp vl : valueList)
1319
        if (v.equals(vl.apply(name).toString()))
1320
          return true;
1321
      return false;
1322
    }
1323
 
1324
  }
1325
 
1326
  /**
1327
   * Representation of the inheritance check on a
1328
   * bean for {@link #isInstanceOf(StringValueExp)}.
1329
   *
1330
   * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
1331
   * @since 1.6
1332
   */
1333
  private static final class InstanceOfQueryExp
1334
    extends QueryEval
1335
    implements QueryExp
1336
  {
1337
 
1338
    /**
1339
     * Compatible with JDK 1.6
1340
     */
1341
    private static final long serialVersionUID = -1081892073854801359L;
1342
 
1343
    /**
1344
     * The name of the class from which the attribute is taken.
1345
     */
1346
    private StringValueExp classNameValue;
1347
 
1348
    /**
1349
     * Constructs a new {@link InstanceOfQueryExp} using
1350
     * the specified class name.
1351
     *
1352
     * @param classNameValue the class name.
1353
     */
1354
    public InstanceOfQueryExp(StringValueExp classNameValue)
1355
    {
1356
      this.classNameValue = classNameValue;
1357
    }
1358
 
1359
    /**
1360
     * Checks that the bean specified by the supplied
1361
     * {@link ObjectName} is of the correct class
1362
     * using {@link MBeanServer#isInstanceOf(ObjectName,String)}.
1363
     * where the string is obtained by evaluating
1364
     * <code>classNameValue</code>.
1365
     *
1366
     * @param name the {@link ObjectName} of the bean to obtain
1367
     *             the value from.
1368
     * @return true if the bean is an instance of the class.
1369
     * @throws BadStringOperationException if an invalid string
1370
     *                                     operation is used by
1371
     *                                     the value expression.
1372
     * @throws BadBinaryOpValueExpException if an invalid expression
1373
     *                                      is used by the value expression.
1374
     * @throws BadAttributeValueExpException if an invalid attribute
1375
     *                                       is used by the value expression.
1376
     * @throws InvalidApplicationException if the value expression is applied
1377
     *                                     to the wrong type of bean.
1378
     */
1379
    public boolean apply(ObjectName name)
1380
      throws BadStringOperationException, BadBinaryOpValueExpException,
1381
             BadAttributeValueExpException, InvalidApplicationException
1382
    {
1383
      try
1384
        {
1385
          String className = ((StringValueExp)
1386
                              classNameValue.apply(name)).getValue();
1387
          return QueryEval.getMBeanServer().isInstanceOf(name, className);
1388
        }
1389
      catch (InstanceNotFoundException e)
1390
        {
1391
          throw (BadAttributeValueExpException)
1392
            new BadAttributeValueExpException("The named bean is not registered.").initCause(e);
1393
        }
1394
    }
1395
 
1396
  }
1397
 
1398
  /**
1399
   * Representation of the negation of a query formed using
1400
   * {@link #not(QueryExp).
1401
   *
1402
   * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
1403
   * @since 1.5
1404
   */
1405
  private static final class NotQueryExp
1406
    extends QueryEval
1407
    implements QueryExp
1408
  {
1409
 
1410
    /**
1411
     * Compatible with JDK 1.6
1412
     */
1413
    private static final long serialVersionUID = 5269643775896723397L;
1414
 
1415
    /**
1416
     * The expression to negate.
1417
     */
1418
    private QueryExp exp;
1419
 
1420
    /**
1421
     * Constructs a new {@link NotQueryExp} using
1422
     * the specified query expression.
1423
     *
1424
     * @param exp the expression to negate.
1425
     */
1426
    public NotQueryExp(QueryExp exp)
1427
    {
1428
      this.exp = exp;
1429
    }
1430
 
1431
    /**
1432
     * Returns the result of the negation.
1433
     *
1434
     * @param name the {@link ObjectName} to apply
1435
     *             the query to.
1436
     * @return the result of the negation.
1437
     * @throws BadStringOperationException if an invalid string
1438
     *                                     operation is used by
1439
     *                                     the query.
1440
     * @throws BadBinaryOpValueExpException if an invalid expression
1441
     *                                      is used by the query.
1442
     * @throws BadAttributeValueExpException if an invalid attribute
1443
     *                                       is used by the query.
1444
     * @throws InvalidApplicationException if the query is applied
1445
     *                                     to the wrong type of bean.
1446
     */
1447
    public boolean apply(ObjectName name)
1448
      throws BadStringOperationException, BadBinaryOpValueExpException,
1449
             BadAttributeValueExpException, InvalidApplicationException
1450
    {
1451
      return !(exp.apply(name));
1452
    }
1453
 
1454
  }
1455
 
1456
  /**
1457
   * Representation of the disjunction formed using
1458
   * {@link #or(QueryExp, QueryExp).
1459
   *
1460
   * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
1461
   * @since 1.5
1462
   */
1463
  private static final class OrQueryExp
1464
    extends QueryEval
1465
    implements QueryExp
1466
  {
1467
 
1468
    /**
1469
     * Compatible with JDK 1.6
1470
     */
1471
    private static final long serialVersionUID = 2962973084421716523L;
1472
 
1473
    /**
1474
     * The first operand.
1475
     */
1476
    private QueryExp exp1;
1477
 
1478
    /**
1479
     * The second operand.
1480
     */
1481
    private QueryExp exp2;
1482
 
1483
    /**
1484
     * Constructs a new {@link OrQueryExp} using
1485
     * the two specified operands.
1486
     *
1487
     * @param exp1 the first query expression.
1488
     * @param exp2 the second query expression.
1489
     */
1490
    public OrQueryExp(QueryExp exp1, QueryExp exp2)
1491
    {
1492
      this.exp1 = exp1;
1493
      this.exp2 = exp2;
1494
    }
1495
 
1496
    /**
1497
     * Returns the disjunction of the two query
1498
     * expressions.
1499
     *
1500
     * @param name the {@link ObjectName} to apply
1501
     *             the query to.
1502
     * @return the disjunction of applying the name
1503
     *         to both operands.
1504
     * @throws BadStringOperationException if an invalid string
1505
     *                                     operation is used by
1506
     *                                     the query.
1507
     * @throws BadBinaryOpValueExpException if an invalid expression
1508
     *                                      is used by the query.
1509
     * @throws BadAttributeValueExpException if an invalid attribute
1510
     *                                       is used by the query.
1511
     * @throws InvalidApplicationException if the query is applied
1512
     *                                     to the wrong type of bean.
1513
     */
1514
    public boolean apply(ObjectName name)
1515
      throws BadStringOperationException, BadBinaryOpValueExpException,
1516
             BadAttributeValueExpException, InvalidApplicationException
1517
    {
1518
      return exp1.apply(name) || exp2.apply(name);
1519
    }
1520
 
1521
  }
1522
 
1523
  /**
1524
   * Representation of a boolean being used as an argument
1525
   * to a relational constraint, formed using
1526
   * {@link #value(boolean)}.
1527
   *
1528
   * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
1529
   * @since 1.5
1530
   */
1531
  private static final class BooleanValueExp
1532
    extends QueryEval
1533
    implements ValueExp
1534
  {
1535
 
1536
    /**
1537
     * Compatible with JDK 1.6
1538
     */
1539
    private static final long serialVersionUID = 7754922052666594581L;
1540
 
1541
    /**
1542
     * The boolean value.
1543
     */
1544
    private boolean val;
1545
 
1546
    /**
1547
     * Constructs a new {@link BooleanValueExp} using the
1548
     * specified value.
1549
     *
1550
     * @param val the boolean value used for this expression.
1551
     */
1552
    public BooleanValueExp(boolean val)
1553
    {
1554
      this.val = val;
1555
    }
1556
 
1557
    /**
1558
     * Applies the {@link BooleanValueExp} to the specified
1559
     * management bean by simply returning the value.
1560
     *
1561
     * @param name the {@link ObjectName} of the bean.
1562
     * @return the {@link BooleanValueExp} itself.
1563
     * @throws BadStringOperationException if an invalid string
1564
     *                                     operation is used by
1565
     *                                     the value expression.
1566
     * @throws BadBinaryOpValueExpException if an invalid expression
1567
     *                                      is used by the value expression.
1568
     * @throws BadAttributeValueExpException if an invalid attribute
1569
     *                                       is used by the value expression.
1570
     * @throws InvalidApplicationException if the value expression is applied
1571
     *                                     to the wrong type of bean.
1572
     */
1573
    public ValueExp apply(ObjectName name)
1574
      throws BadStringOperationException, BadBinaryOpValueExpException,
1575
             BadAttributeValueExpException, InvalidApplicationException
1576
    {
1577
      return this;
1578
    }
1579
 
1580
    /**
1581
     * Returns the value as a string.
1582
     *
1583
     * @return the value in textual form.
1584
     */
1585
    public String toString()
1586
    {
1587
      return Boolean.toString(val);
1588
    }
1589
 
1590
  }
1591
 
1592
  /**
1593
   * Representation of a number being used as an argument
1594
   * to a relational constraint, formed using
1595
   * {@link #value(double)}, {@link #value(float)},
1596
   * {@link #value(int)}, {@link #value(long)} or
1597
   * {@link #value(Number)}.
1598
   *
1599
   * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
1600
   * @since 1.5
1601
   */
1602
  private static final class NumericValueExp
1603
    extends QueryEval
1604
    implements ValueExp
1605
  {
1606
 
1607
    /**
1608
     * Compatible with JDK 1.6
1609
     */
1610
    private static final long serialVersionUID = -4679739485102359104L;
1611
 
1612
    /**
1613
     * The numeric value.
1614
     */
1615
    private Number val;
1616
 
1617
    /**
1618
     * Constructs a new {@link NumericValueExp} using the
1619
     * specified value.
1620
     *
1621
     * @param val the numeric value used for this expression.
1622
     */
1623
    public NumericValueExp(Number val)
1624
    {
1625
      this.val = val;
1626
    }
1627
 
1628
    /**
1629
     * Applies the {@link NumericValueExp} to the specified
1630
     * management bean by simply returning the value.
1631
     *
1632
     * @param name the {@link ObjectName} of the bean.
1633
     * @return the {@link NumericValueExp} itself.
1634
     * @throws BadStringOperationException if an invalid string
1635
     *                                     operation is used by
1636
     *                                     the value expression.
1637
     * @throws BadBinaryOpValueExpException if an invalid expression
1638
     *                                      is used by the value expression.
1639
     * @throws BadAttributeValueExpException if an invalid attribute
1640
     *                                       is used by the value expression.
1641
     * @throws InvalidApplicationException if the value expression is applied
1642
     *                                     to the wrong type of bean.
1643
     */
1644
    public ValueExp apply(ObjectName name)
1645
      throws BadStringOperationException, BadBinaryOpValueExpException,
1646
             BadAttributeValueExpException, InvalidApplicationException
1647
    {
1648
      return this;
1649
    }
1650
 
1651
    /**
1652
     * Returns the value.
1653
     */
1654
    public Number getValue()
1655
    {
1656
      return val;
1657
    }
1658
 
1659
    /**
1660
     * Returns the value as a string.
1661
     *
1662
     * @return the value in textual form.
1663
     */
1664
    public String toString()
1665
    {
1666
      return val.toString();
1667
    }
1668
 
1669
    /**
1670
     * Return the result of adding the specified
1671
     * {@link NumericValueExp} to this one.
1672
     *
1673
     * @param o the value to add.
1674
     * @return the result of the addition.
1675
     */
1676
    public NumericValueExp plus(NumericValueExp o)
1677
    {
1678
      Number v = o.getValue();
1679
      if (val instanceof Double)
1680
        {
1681
          double d = val.doubleValue();
1682
          if (v instanceof Double)
1683
            return new NumericValueExp(d + v.doubleValue());
1684
          else if (v instanceof Float)
1685
            return new NumericValueExp(d + v.floatValue());
1686
          else if (v instanceof Long)
1687
            return new NumericValueExp(d + v.longValue());
1688
          else
1689
            return new NumericValueExp(d + v.intValue());
1690
        }
1691
      else if (val instanceof Float)
1692
        {
1693
          float f = val.floatValue();
1694
          if (v instanceof Double)
1695
            return new NumericValueExp(f + v.doubleValue());
1696
          else if (v instanceof Float)
1697
            return new NumericValueExp(f + v.floatValue());
1698
          else if (v instanceof Long)
1699
            return new NumericValueExp(f + v.longValue());
1700
          else
1701
            return new NumericValueExp(f + v.intValue());
1702
        }
1703
      else if (val instanceof Long)
1704
        {
1705
          long l = val.longValue();
1706
          if (v instanceof Double)
1707
            return new NumericValueExp(l + v.doubleValue());
1708
          else if (v instanceof Float)
1709
            return new NumericValueExp(l + v.floatValue());
1710
          else if (v instanceof Long)
1711
            return new NumericValueExp(l + v.longValue());
1712
          else
1713
            return new NumericValueExp(l + v.intValue());
1714
        }
1715
      int i = val.intValue();
1716
      if (v instanceof Double)
1717
        return new NumericValueExp(i + v.doubleValue());
1718
      else if (v instanceof Float)
1719
        return new NumericValueExp(i + v.floatValue());
1720
      else if (v instanceof Long)
1721
        return new NumericValueExp(i + v.longValue());
1722
      else
1723
        return new NumericValueExp(i + v.intValue());
1724
    }
1725
 
1726
    /**
1727
     * Return New NumericValueExp(the result of subtracting the specified
1728
     * {@link NumericValueExp} from this one.
1729
     *
1730
     * @param o the value to subtract.
1731
     * @return new NumericValueExp(the result of the subtraction.
1732
     */
1733
    public NumericValueExp minus(NumericValueExp o)
1734
    {
1735
      Number v = o.getValue();
1736
      if (val instanceof Double)
1737
        {
1738
          double d = val.doubleValue();
1739
          if (v instanceof Double)
1740
            return new NumericValueExp(d - v.doubleValue());
1741
          else if (v instanceof Float)
1742
            return new NumericValueExp(d - v.floatValue());
1743
          else if (v instanceof Long)
1744
            return new NumericValueExp(d - v.longValue());
1745
          else
1746
            return new NumericValueExp(d - v.intValue());
1747
        }
1748
      else if (val instanceof Float)
1749
        {
1750
          float f = val.floatValue();
1751
          if (v instanceof Double)
1752
            return new NumericValueExp(f - v.doubleValue());
1753
          else if (v instanceof Float)
1754
            return new NumericValueExp(f - v.floatValue());
1755
          else if (v instanceof Long)
1756
            return new NumericValueExp(f - v.longValue());
1757
          else
1758
            return new NumericValueExp(f - v.intValue());
1759
        }
1760
      else if (val instanceof Long)
1761
        {
1762
          long l = val.longValue();
1763
          if (v instanceof Double)
1764
            return new NumericValueExp(l - v.doubleValue());
1765
          else if (v instanceof Float)
1766
            return new NumericValueExp(l - v.floatValue());
1767
          else if (v instanceof Long)
1768
            return new NumericValueExp(l - v.longValue());
1769
          else
1770
            return new NumericValueExp(l - v.intValue());
1771
        }
1772
      int i = val.intValue();
1773
      if (v instanceof Double)
1774
        return new NumericValueExp(i - v.doubleValue());
1775
      else if (v instanceof Float)
1776
        return new NumericValueExp(i - v.floatValue());
1777
      else if (v instanceof Long)
1778
        return new NumericValueExp(i - v.longValue());
1779
      else
1780
        return new NumericValueExp(i - v.intValue());
1781
    }
1782
 
1783
    /**
1784
     * Return New NumericValueExp(the result of multiplying the specified
1785
     * {@link NumericValueExp} to this one.
1786
     *
1787
     * @param o the value to multiply by.
1788
     * @return new NumericValueExp(the result of the multiplication.
1789
     */
1790
    public NumericValueExp times(NumericValueExp o)
1791
    {
1792
      Number v = o.getValue();
1793
      if (val instanceof Double)
1794
        {
1795
          double d = val.doubleValue();
1796
          if (v instanceof Double)
1797
            return new NumericValueExp(d * v.doubleValue());
1798
          else if (v instanceof Float)
1799
            return new NumericValueExp(d * v.floatValue());
1800
          else if (v instanceof Long)
1801
            return new NumericValueExp(d * v.longValue());
1802
          else
1803
            return new NumericValueExp(d * v.intValue());
1804
        }
1805
      else if (val instanceof Float)
1806
        {
1807
          float f = val.floatValue();
1808
          if (v instanceof Double)
1809
            return new NumericValueExp(f * v.doubleValue());
1810
          else if (v instanceof Float)
1811
            return new NumericValueExp(f * v.floatValue());
1812
          else if (v instanceof Long)
1813
            return new NumericValueExp(f * v.longValue());
1814
          else
1815
            return new NumericValueExp(f * v.intValue());
1816
        }
1817
      else if (val instanceof Long)
1818
        {
1819
          long l = val.longValue();
1820
          if (v instanceof Double)
1821
            return new NumericValueExp(l * v.doubleValue());
1822
          else if (v instanceof Float)
1823
            return new NumericValueExp(l * v.floatValue());
1824
          else if (v instanceof Long)
1825
            return new NumericValueExp(l * v.longValue());
1826
          else
1827
            return new NumericValueExp(l * v.intValue());
1828
        }
1829
      int i = val.intValue();
1830
      if (v instanceof Double)
1831
        return new NumericValueExp(i * v.doubleValue());
1832
      else if (v instanceof Float)
1833
        return new NumericValueExp(i * v.floatValue());
1834
      else if (v instanceof Long)
1835
        return new NumericValueExp(i * v.longValue());
1836
      else
1837
        return new NumericValueExp(i * v.intValue());
1838
    }
1839
 
1840
    /**
1841
     * Return New NumericValueExp(the result of dividing this
1842
     * number by value of the specified
1843
     * {@link NumericValueExp}.
1844
     *
1845
     * @param o the value to divide by.
1846
     * @return new NumericValueExp(the result of the division.
1847
     */
1848
    public NumericValueExp div(NumericValueExp o)
1849
    {
1850
      Number v = o.getValue();
1851
      if (val instanceof Double)
1852
        {
1853
          double d = val.doubleValue();
1854
          if (v instanceof Double)
1855
            return new NumericValueExp(d / v.doubleValue());
1856
          else if (v instanceof Float)
1857
            return new NumericValueExp(d / v.floatValue());
1858
          else if (v instanceof Long)
1859
            return new NumericValueExp(d / v.longValue());
1860
          else
1861
            return new NumericValueExp(d / v.intValue());
1862
        }
1863
      else if (val instanceof Float)
1864
        {
1865
          float f = val.floatValue();
1866
          if (v instanceof Double)
1867
            return new NumericValueExp(f / v.doubleValue());
1868
          else if (v instanceof Float)
1869
            return new NumericValueExp(f / v.floatValue());
1870
          else if (v instanceof Long)
1871
            return new NumericValueExp(f / v.longValue());
1872
          else
1873
            return new NumericValueExp(f / v.intValue());
1874
        }
1875
      else if (val instanceof Long)
1876
        {
1877
          long l = val.longValue();
1878
          if (v instanceof Double)
1879
            return new NumericValueExp(l / v.doubleValue());
1880
          else if (v instanceof Float)
1881
            return new NumericValueExp(l / v.floatValue());
1882
          else if (v instanceof Long)
1883
            return new NumericValueExp(l / v.longValue());
1884
          else
1885
            return new NumericValueExp(l / v.intValue());
1886
        }
1887
      int i = val.intValue();
1888
      if (v instanceof Double)
1889
        return new NumericValueExp(i / v.doubleValue());
1890
      else if (v instanceof Float)
1891
        return new NumericValueExp(i / v.floatValue());
1892
      else if (v instanceof Long)
1893
        return new NumericValueExp(i / v.longValue());
1894
      else
1895
        return new NumericValueExp(i / v.intValue());
1896
    }
1897
 
1898
  }
1899
 
1900
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.