samples/visitor/21-clientprovider/src-api2.0/org/apidesign/visitor/Language.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:59:20 +0200
changeset 177 67d6dceb1002
parent 176 0f658628beac
child 266 47d5f1fe0b03
permissions -rw-r--r--
Third version and tests for client provider visitor
     1 package org.apidesign.visitor;
     2 
     3 public final class Language {
     4     private Language() { }
     5     
     6     public interface Expression {
     7         public abstract void visit(Visitor v);
     8     }
     9     public interface Plus extends Expression {
    10         public Expression getFirst();
    11         public Expression getSecond();
    12     }
    13     public interface Number extends Expression {
    14         public int getValue();
    15     }
    16     // BEGIN: visitor.clientprovider.v2
    17     /** @since 2.0 */
    18     public interface Minus extends Expression {
    19         public Expression getFirst();
    20         public Expression getSecond();
    21     }
    22     
    23     public static abstract class Visitor {
    24         Visitor() {}
    25         /** @since 2.0 */
    26         public static Visitor create(Version2_0 v) {
    27             return create2_0(v);
    28         }
    29 
    30         /** @since 2.0 */
    31         public interface Version2_0 extends Version1_0 {
    32             public void visitMinus(Minus m);
    33         }
    34 
    35 
    36         /** @since 2.0 */
    37         public abstract void dispatchNumber(Number n);
    38     // FINISH: visitor.clientprovider.v2
    39         
    40         public static Visitor create(Version1_0 v) {
    41             return create1_0(v);
    42         }
    43 
    44         public interface Version1_0 {
    45             public boolean visitUnknown(Expression e);
    46             public void visitPlus(Plus s);
    47             public void visitNumber(Number n);
    48         }
    49 
    50         public abstract void dispatchPlus(Plus p);
    51         public abstract void dispatchMinus(Minus m);
    52     }
    53     
    54     static Visitor create1_0(final Visitor.Version1_0 v) {
    55         return new Visitor() {
    56             @Override
    57             public void dispatchPlus(Plus p) {
    58                 v.visitPlus(p);
    59             }
    60 
    61             @Override
    62             public void dispatchNumber(Number n) {
    63                 v.visitNumber(n);
    64             }
    65 
    66             @Override
    67             public void dispatchMinus(Minus m) {
    68                 if (v.visitUnknown(m)) {
    69                     m.getFirst().visit(this);
    70                     m.getSecond().visit(this);
    71                 }
    72             }
    73         };
    74     }
    75     static Visitor create2_0(final Visitor.Version2_0 v) {
    76         return new Visitor() {
    77             @Override
    78             public void dispatchPlus(Plus p) {
    79                 v.visitPlus(p);
    80             }
    81 
    82             @Override
    83             public void dispatchNumber(Number n) {
    84                 v.visitNumber(n);
    85             }
    86 
    87             @Override
    88             public void dispatchMinus(Minus m) {
    89                 v.visitMinus(m);
    90             }
    91         };
    92     }
    93 }