Third version and tests for client provider visitor
authorJaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:59:20 +0200
changeset 17767d6dceb1002
parent 176 0f658628beac
child 178 f3f2f73686d8
Third version and tests for client provider visitor
samples/visitor/21-clientprovider/build.xml
samples/visitor/21-clientprovider/nbproject/project.xml
samples/visitor/21-clientprovider/src-api1.0/org/apidesign/visitor/Language.java
samples/visitor/21-clientprovider/src-api2.0/org/apidesign/visitor/Language.java
samples/visitor/21-clientprovider/src-api3.0/org/apidesign/visitor/Language.java
samples/visitor/21-clientprovider/src-test/org/apidesign/test/visitor/PrintTest.java
samples/visitor/21-clientprovider/src-test2.0/org/apidesign/test/visitor/PrintOfMinusStructureTest.java
     1.1 --- a/samples/visitor/21-clientprovider/build.xml	Sat Jun 14 09:59:16 2008 +0200
     1.2 +++ b/samples/visitor/21-clientprovider/build.xml	Sat Jun 14 09:59:20 2008 +0200
     1.3 @@ -12,6 +12,9 @@
     1.4          <antcall target="-build-one">
     1.5              <param name="version" value="api2.0"/>
     1.6          </antcall>
     1.7 +        <antcall target="-build-one">
     1.8 +            <param name="version" value="api3.0"/>
     1.9 +        </antcall>
    1.10          
    1.11          <antcall target="-build-one">
    1.12              <param name="version" value="test"/>
     2.1 --- a/samples/visitor/21-clientprovider/nbproject/project.xml	Sat Jun 14 09:59:16 2008 +0200
     2.2 +++ b/samples/visitor/21-clientprovider/nbproject/project.xml	Sat Jun 14 09:59:20 2008 +0200
     2.3 @@ -23,6 +23,12 @@
     2.4                      <encoding>UTF-8</encoding>
     2.5                  </source-folder>
     2.6                  <source-folder>
     2.7 +                    <label>src-api3.0</label>
     2.8 +                    <type>java</type>
     2.9 +                    <location>src-api3.0</location>
    2.10 +                    <encoding>UTF-8</encoding>
    2.11 +                </source-folder>
    2.12 +                <source-folder>
    2.13                      <label>test</label>
    2.14                      <type>java</type>
    2.15                      <location>src-test</location>
    2.16 @@ -64,6 +70,10 @@
    2.17                          <location>src-api2.0</location>
    2.18                      </source-folder>
    2.19                      <source-folder style="packages">
    2.20 +                        <label>API Version 3.0</label>
    2.21 +                        <location>src-api3.0</location>
    2.22 +                    </source-folder>
    2.23 +                    <source-folder style="packages">
    2.24                          <label>Usage of the API</label>
    2.25                          <location>src-test</location>
    2.26                      </source-folder>
    2.27 @@ -93,6 +103,10 @@
    2.28                  <source-level>1.5</source-level>
    2.29              </compilation-unit>
    2.30              <compilation-unit>
    2.31 +                <package-root>src-api3.0</package-root>
    2.32 +                <source-level>1.5</source-level>
    2.33 +            </compilation-unit>
    2.34 +            <compilation-unit>
    2.35                  <package-root>src-test</package-root>
    2.36                  <classpath mode="compile">src-api1.0:../../libs/dist/junit-4.4.jar</classpath>
    2.37                  <source-level>1.5</source-level>
     3.1 --- a/samples/visitor/21-clientprovider/src-api1.0/org/apidesign/visitor/Language.java	Sat Jun 14 09:59:16 2008 +0200
     3.2 +++ b/samples/visitor/21-clientprovider/src-api1.0/org/apidesign/visitor/Language.java	Sat Jun 14 09:59:20 2008 +0200
     3.3 @@ -18,7 +18,7 @@
     3.4      public static abstract class Visitor {
     3.5          Visitor() {}
     3.6  
     3.7 -        public Visitor create(Version1_0 v) {
     3.8 +        public static Visitor create(Version1_0 v) {
     3.9              return create1_0(v);
    3.10          }
    3.11  
     4.1 --- a/samples/visitor/21-clientprovider/src-api2.0/org/apidesign/visitor/Language.java	Sat Jun 14 09:59:16 2008 +0200
     4.2 +++ b/samples/visitor/21-clientprovider/src-api2.0/org/apidesign/visitor/Language.java	Sat Jun 14 09:59:20 2008 +0200
     4.3 @@ -37,7 +37,7 @@
     4.4          public abstract void dispatchNumber(Number n);
     4.5      // FINISH: visitor.clientprovider.v2
     4.6          
     4.7 -        public Visitor create(Version1_0 v) {
     4.8 +        public static Visitor create(Version1_0 v) {
     4.9              return create1_0(v);
    4.10          }
    4.11  
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/samples/visitor/21-clientprovider/src-api3.0/org/apidesign/visitor/Language.java	Sat Jun 14 09:59:20 2008 +0200
     5.3 @@ -0,0 +1,162 @@
     5.4 +package org.apidesign.visitor;
     5.5 +
     5.6 +public final class Language {
     5.7 +    private Language() { }
     5.8 +    
     5.9 +    public interface Expression {
    5.10 +        public abstract void visit(Visitor v);
    5.11 +    }
    5.12 +    public interface Plus extends Expression {
    5.13 +        public Expression getFirst();
    5.14 +        public Expression getSecond();
    5.15 +    }
    5.16 +    public interface Number extends Expression {
    5.17 +        public int getValue();
    5.18 +    }
    5.19 +    /** @since 2.0 */
    5.20 +    public interface Minus extends Expression {
    5.21 +        public Expression getFirst();
    5.22 +        public Expression getSecond();
    5.23 +    }
    5.24 +    
    5.25 +    // BEGIN: visitor.clientprovider.v3
    5.26 +    /** @since 3.0 */
    5.27 +    public interface Real extends Expression {
    5.28 +        public double getValue();
    5.29 +    }
    5.30 +    public static abstract class Visitor {
    5.31 +        Visitor() {}
    5.32 +        
    5.33 +        
    5.34 +        /** @since 3.0 */
    5.35 +        public static Visitor create(Version3_0 v) {
    5.36 +            return create3_0(v);
    5.37 +        }
    5.38 +
    5.39 +        /** @since 3.0 */
    5.40 +        public interface Version3_0 {
    5.41 +            public boolean visitUnknown(Expression e);
    5.42 +            public void visitPlus(Plus s);
    5.43 +            public void visitMinus(Minus s);
    5.44 +            public void visitReal(Real r);
    5.45 +        }
    5.46 +
    5.47 +        /** @since 3.0 */
    5.48 +        public abstract void dispatchReal(Real r);
    5.49 +        
    5.50 +    // FINISH: visitor.clientprovider.v3
    5.51 +        /** @since 2.0 */
    5.52 +        public static Visitor create(Version2_0 v) {
    5.53 +            return create2_0(v);
    5.54 +        }
    5.55 +
    5.56 +        /** @since 2.0 */
    5.57 +        public interface Version2_0 extends Version1_0 {
    5.58 +            public void visitMinus(Minus m);
    5.59 +        }
    5.60 +
    5.61 +
    5.62 +        /** @since 2.0 */
    5.63 +        public abstract void dispatchNumber(Number n);
    5.64 +        
    5.65 +        public static Visitor create(Version1_0 v) {
    5.66 +            return create1_0(v);
    5.67 +        }
    5.68 +
    5.69 +        public interface Version1_0 {
    5.70 +            public boolean visitUnknown(Expression e);
    5.71 +            public void visitPlus(Plus s);
    5.72 +            public void visitNumber(Number n);
    5.73 +        }
    5.74 +
    5.75 +        public abstract void dispatchPlus(Plus p);
    5.76 +        public abstract void dispatchMinus(Minus m);
    5.77 +    }
    5.78 +    
    5.79 +    // BEGIN: visitor.clientprovider.dispatch.v3.l1
    5.80 +    static Visitor create1_0(final Visitor.Version1_0 v) {
    5.81 +        return new Visitor() {
    5.82 +            @Override
    5.83 +            public void dispatchPlus(Plus p) {
    5.84 +                v.visitPlus(p);
    5.85 +            }
    5.86 +
    5.87 +            @Override
    5.88 +            public void dispatchNumber(Number n) {
    5.89 +                v.visitNumber(n);
    5.90 +            }
    5.91 +
    5.92 +            @Override
    5.93 +            public void dispatchMinus(Minus m) {
    5.94 +                if (v.visitUnknown(m)) {
    5.95 +                    m.getFirst().visit(this);
    5.96 +                    m.getSecond().visit(this);
    5.97 +                }
    5.98 +            }
    5.99 +
   5.100 +            @Override
   5.101 +            public void dispatchReal(Real r) {
   5.102 +                v.visitUnknown(r);
   5.103 +            }
   5.104 +        };
   5.105 +    }
   5.106 +    // END: visitor.clientprovider.dispatch.v3.l1
   5.107 +    // BEGIN: visitor.clientprovider.dispatch.v3.l2
   5.108 +    static Visitor create2_0(final Visitor.Version2_0 v) {
   5.109 +        return new Visitor() {
   5.110 +            @Override
   5.111 +            public void dispatchPlus(Plus p) {
   5.112 +                v.visitPlus(p);
   5.113 +            }
   5.114 +
   5.115 +            @Override
   5.116 +            public void dispatchNumber(Number n) {
   5.117 +                v.visitNumber(n);
   5.118 +            }
   5.119 +
   5.120 +            @Override
   5.121 +            public void dispatchMinus(Minus m) {
   5.122 +                v.visitMinus(m);
   5.123 +            }
   5.124 +
   5.125 +            @Override
   5.126 +            public void dispatchReal(Real r) {
   5.127 +                v.visitUnknown(r);
   5.128 +            }
   5.129 +        };
   5.130 +    }
   5.131 +    // END: visitor.clientprovider.dispatch.v3.l2
   5.132 +    // BEGIN: visitor.clientprovider.dispatch.v3.l3
   5.133 +    static Visitor create3_0(final Visitor.Version3_0 v) {
   5.134 +        return new Visitor() {
   5.135 +            @Override
   5.136 +            public void dispatchReal(Real r) {
   5.137 +                v.visitReal(r);
   5.138 +            }
   5.139 +
   5.140 +            @Override
   5.141 +            public void dispatchNumber(final Number n) {
   5.142 +                class RealWrapper implements Real {
   5.143 +                    public double getValue() {
   5.144 +                        return n.getValue();
   5.145 +                    }
   5.146 +                    public void visit(Visitor v) {
   5.147 +                        n.visit(v);
   5.148 +                    }
   5.149 +                }
   5.150 +                v.visitReal(new RealWrapper());
   5.151 +            }
   5.152 +
   5.153 +            @Override
   5.154 +            public void dispatchPlus(Plus p) {
   5.155 +                v.visitPlus(p);
   5.156 +            }
   5.157 +
   5.158 +            @Override
   5.159 +            public void dispatchMinus(Minus m) {
   5.160 +                v.visitMinus(m);
   5.161 +            }
   5.162 +        };
   5.163 +    }
   5.164 +    // END: visitor.clientprovider.dispatch.v3.l3
   5.165 +}
     6.1 --- a/samples/visitor/21-clientprovider/src-test/org/apidesign/test/visitor/PrintTest.java	Sat Jun 14 09:59:16 2008 +0200
     6.2 +++ b/samples/visitor/21-clientprovider/src-test/org/apidesign/test/visitor/PrintTest.java	Sat Jun 14 09:59:20 2008 +0200
     6.3 @@ -1,48 +1,83 @@
     6.4  package org.apidesign.test.visitor;
     6.5  
     6.6 +import org.apidesign.visitor.Language.Expression;
     6.7 +import org.apidesign.visitor.Language.Number;
     6.8 +import org.apidesign.visitor.Language.Plus;
     6.9 +import org.apidesign.visitor.Language.Visitor;
    6.10 +import org.apidesign.visitor.Language.Visitor;
    6.11  import static junit.framework.Assert.*;
    6.12 -import org.apidesign.visitor.notevolutionready.Language.Expression;
    6.13 -import org.apidesign.visitor.notevolutionready.Language.Number;
    6.14 -import org.apidesign.visitor.notevolutionready.Language.Plus;
    6.15 -import org.apidesign.visitor.notevolutionready.Language.Visitor;
    6.16  import org.junit.Test;
    6.17  
    6.18  public class PrintTest {
    6.19 +    
    6.20 +    public static Number newNumber(final int value) {
    6.21 +        return new Number() {
    6.22 +            public int getValue() {
    6.23 +                return value;
    6.24 +            }
    6.25  
    6.26 -    // BEGIN: visitor.notevolutionready.print
    6.27 -    public static class PrintVisitor implements Visitor {
    6.28 +            public void visit(Visitor v) {
    6.29 +                v.dispatchNumber(this);
    6.30 +            }
    6.31 +        };
    6.32 +    }
    6.33 +    public static Plus newPlus(
    6.34 +        final Expression first, final Expression second
    6.35 +    ) {
    6.36 +        return new Plus() {
    6.37 +            public Expression getFirst() {
    6.38 +                return first;
    6.39 +            }
    6.40 +
    6.41 +            public Expression getSecond() {
    6.42 +                return second;
    6.43 +            }
    6.44 +
    6.45 +            public void visit(Visitor v) {
    6.46 +                v.dispatchPlus(this);
    6.47 +            }
    6.48 +        };
    6.49 +    }
    6.50 +
    6.51 +    public static class PrintVisitor implements Visitor.Version1_0 {
    6.52          StringBuffer sb = new StringBuffer();
    6.53          
    6.54 +        final Visitor dispatch = Visitor.create(this);
    6.55 +        
    6.56          public void visitPlus(Plus s) {
    6.57 -            s.getFirst().visit(this);
    6.58 +            s.getFirst().visit(dispatch);
    6.59              sb.append(" + ");
    6.60 -            s.getSecond().visit(this);
    6.61 +            s.getSecond().visit(dispatch);
    6.62          }
    6.63  
    6.64          public void visitNumber(Number n) {
    6.65              sb.append (n.getValue());
    6.66          }
    6.67 +
    6.68 +        public boolean visitUnknown(Expression e) {
    6.69 +            sb.append("unknown");
    6.70 +            return true;
    6.71 +        }
    6.72      }
    6.73      
    6.74      @Test public void printOnePlusOne() {
    6.75 -        Number one = new Number(1);
    6.76 -        Expression plus = new Plus(one, one);
    6.77 +        Number one = newNumber(1);
    6.78 +        Expression plus = newPlus(one, one);
    6.79          
    6.80          PrintVisitor print = new PrintVisitor();
    6.81 -        plus.visit(print);
    6.82 +        plus.visit(print.dispatch);
    6.83          
    6.84          assertEquals("1 + 1", print.sb.toString());
    6.85      }
    6.86 -    // END: visitor.notevolutionready.print
    6.87  
    6.88      @Test public void printOnePlusTwoPlusThree() {
    6.89 -        Number one = new Number(1);
    6.90 -        Number two = new Number(2);
    6.91 -        Number three = new Number(3);
    6.92 -        Expression plus = new Plus(one, new Plus(two, three));
    6.93 +        Number one = newNumber(1);
    6.94 +        Number two = newNumber(2);
    6.95 +        Number three = newNumber(3);
    6.96 +        Expression plus = newPlus(one, newPlus(two, three));
    6.97          
    6.98          PrintVisitor print = new PrintVisitor();
    6.99 -        plus.visit(print);
   6.100 +        plus.visit(print.dispatch);
   6.101          
   6.102          assertEquals("1 + 2 + 3", print.sb.toString());
   6.103      }
     7.1 --- a/samples/visitor/21-clientprovider/src-test2.0/org/apidesign/test/visitor/PrintOfMinusStructureTest.java	Sat Jun 14 09:59:16 2008 +0200
     7.2 +++ b/samples/visitor/21-clientprovider/src-test2.0/org/apidesign/test/visitor/PrintOfMinusStructureTest.java	Sat Jun 14 09:59:20 2008 +0200
     7.3 @@ -1,25 +1,41 @@
     7.4  package org.apidesign.test.visitor;
     7.5  
     7.6  import org.apidesign.test.visitor.PrintTest.PrintVisitor;
     7.7 +import org.apidesign.visitor.Language.Expression;
     7.8 +import org.apidesign.visitor.Language.Minus;
     7.9 +import org.apidesign.visitor.Language.Number;
    7.10  import static junit.framework.Assert.*;
    7.11 -import org.apidesign.visitor.notevolutionready.Language.Expression;
    7.12 -import org.apidesign.visitor.notevolutionready.Language.Minus;
    7.13 -import org.apidesign.visitor.notevolutionready.Language.Number;
    7.14 -import org.apidesign.visitor.notevolutionready.Language.Plus;
    7.15 -import org.apidesign.visitor.notevolutionready.Language.Visitor;
    7.16 +import org.apidesign.visitor.Language.Visitor;
    7.17  import org.junit.Test;
    7.18  
    7.19  public class PrintOfMinusStructureTest {
    7.20 +    public static Minus newMinus(
    7.21 +        final Expression first, final Expression second
    7.22 +    ) {
    7.23 +        return new Minus() {
    7.24 +            public Expression getFirst() {
    7.25 +                return first;
    7.26 +            }
    7.27 +
    7.28 +            public Expression getSecond() {
    7.29 +                return second;
    7.30 +            }
    7.31 +
    7.32 +            public void visit(Visitor v) {
    7.33 +                v.dispatchMinus(this);
    7.34 +            }
    7.35 +        };
    7.36 +    }
    7.37 +    
    7.38 +    
    7.39      @Test public void printOneMinusTwo() {
    7.40 -        // BEGIN: visitor.notevolutionready.oldwithnew
    7.41 -        Number one = new Number(1);
    7.42 -        Number two = new Number(2);
    7.43 -        Expression plus = new Minus(one, two);
    7.44 +        Number one = PrintTest.newNumber(1);
    7.45 +        Number two = PrintTest.newNumber(2);
    7.46 +        Expression plus = newMinus(one, two);
    7.47          
    7.48          PrintVisitor print = new PrintVisitor();
    7.49 -        plus.visit(print); // fails with AbstractMethodError
    7.50 +        plus.visit(print.dispatch);
    7.51          
    7.52          assertEquals("1 - 2", print.sb.toString());
    7.53 -        // END: visitor.notevolutionready.oldwithnew
    7.54      }
    7.55  }