# HG changeset patch # User Jaroslav Tulach # Date 1213430360 -7200 # Node ID 67d6dceb1002acd4b430e58651abe570df6c1795 # Parent 0f658628beacc603895f44204356cf7c7e9bc7ab Third version and tests for client provider visitor diff -r 0f658628beac -r 67d6dceb1002 samples/visitor/21-clientprovider/build.xml --- a/samples/visitor/21-clientprovider/build.xml Sat Jun 14 09:59:16 2008 +0200 +++ b/samples/visitor/21-clientprovider/build.xml Sat Jun 14 09:59:20 2008 +0200 @@ -12,6 +12,9 @@ + + + diff -r 0f658628beac -r 67d6dceb1002 samples/visitor/21-clientprovider/nbproject/project.xml --- a/samples/visitor/21-clientprovider/nbproject/project.xml Sat Jun 14 09:59:16 2008 +0200 +++ b/samples/visitor/21-clientprovider/nbproject/project.xml Sat Jun 14 09:59:20 2008 +0200 @@ -23,6 +23,12 @@ UTF-8 + + java + src-api3.0 + UTF-8 + + java src-test @@ -64,6 +70,10 @@ src-api2.0 + + src-api3.0 + + src-test @@ -93,6 +103,10 @@ 1.5 + src-api3.0 + 1.5 + + src-test src-api1.0:../../libs/dist/junit-4.4.jar 1.5 diff -r 0f658628beac -r 67d6dceb1002 samples/visitor/21-clientprovider/src-api1.0/org/apidesign/visitor/Language.java --- a/samples/visitor/21-clientprovider/src-api1.0/org/apidesign/visitor/Language.java Sat Jun 14 09:59:16 2008 +0200 +++ b/samples/visitor/21-clientprovider/src-api1.0/org/apidesign/visitor/Language.java Sat Jun 14 09:59:20 2008 +0200 @@ -18,7 +18,7 @@ public static abstract class Visitor { Visitor() {} - public Visitor create(Version1_0 v) { + public static Visitor create(Version1_0 v) { return create1_0(v); } diff -r 0f658628beac -r 67d6dceb1002 samples/visitor/21-clientprovider/src-api2.0/org/apidesign/visitor/Language.java --- a/samples/visitor/21-clientprovider/src-api2.0/org/apidesign/visitor/Language.java Sat Jun 14 09:59:16 2008 +0200 +++ b/samples/visitor/21-clientprovider/src-api2.0/org/apidesign/visitor/Language.java Sat Jun 14 09:59:20 2008 +0200 @@ -37,7 +37,7 @@ public abstract void dispatchNumber(Number n); // FINISH: visitor.clientprovider.v2 - public Visitor create(Version1_0 v) { + public static Visitor create(Version1_0 v) { return create1_0(v); } diff -r 0f658628beac -r 67d6dceb1002 samples/visitor/21-clientprovider/src-api3.0/org/apidesign/visitor/Language.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/visitor/21-clientprovider/src-api3.0/org/apidesign/visitor/Language.java Sat Jun 14 09:59:20 2008 +0200 @@ -0,0 +1,162 @@ +package org.apidesign.visitor; + +public final class Language { + private Language() { } + + public interface Expression { + public abstract void visit(Visitor v); + } + public interface Plus extends Expression { + public Expression getFirst(); + public Expression getSecond(); + } + public interface Number extends Expression { + public int getValue(); + } + /** @since 2.0 */ + public interface Minus extends Expression { + public Expression getFirst(); + public Expression getSecond(); + } + + // BEGIN: visitor.clientprovider.v3 + /** @since 3.0 */ + public interface Real extends Expression { + public double getValue(); + } + public static abstract class Visitor { + Visitor() {} + + + /** @since 3.0 */ + public static Visitor create(Version3_0 v) { + return create3_0(v); + } + + /** @since 3.0 */ + public interface Version3_0 { + public boolean visitUnknown(Expression e); + public void visitPlus(Plus s); + public void visitMinus(Minus s); + public void visitReal(Real r); + } + + /** @since 3.0 */ + public abstract void dispatchReal(Real r); + + // FINISH: visitor.clientprovider.v3 + /** @since 2.0 */ + public static Visitor create(Version2_0 v) { + return create2_0(v); + } + + /** @since 2.0 */ + public interface Version2_0 extends Version1_0 { + public void visitMinus(Minus m); + } + + + /** @since 2.0 */ + public abstract void dispatchNumber(Number n); + + public static Visitor create(Version1_0 v) { + return create1_0(v); + } + + public interface Version1_0 { + public boolean visitUnknown(Expression e); + public void visitPlus(Plus s); + public void visitNumber(Number n); + } + + public abstract void dispatchPlus(Plus p); + public abstract void dispatchMinus(Minus m); + } + + // BEGIN: visitor.clientprovider.dispatch.v3.l1 + static Visitor create1_0(final Visitor.Version1_0 v) { + return new Visitor() { + @Override + public void dispatchPlus(Plus p) { + v.visitPlus(p); + } + + @Override + public void dispatchNumber(Number n) { + v.visitNumber(n); + } + + @Override + public void dispatchMinus(Minus m) { + if (v.visitUnknown(m)) { + m.getFirst().visit(this); + m.getSecond().visit(this); + } + } + + @Override + public void dispatchReal(Real r) { + v.visitUnknown(r); + } + }; + } + // END: visitor.clientprovider.dispatch.v3.l1 + // BEGIN: visitor.clientprovider.dispatch.v3.l2 + static Visitor create2_0(final Visitor.Version2_0 v) { + return new Visitor() { + @Override + public void dispatchPlus(Plus p) { + v.visitPlus(p); + } + + @Override + public void dispatchNumber(Number n) { + v.visitNumber(n); + } + + @Override + public void dispatchMinus(Minus m) { + v.visitMinus(m); + } + + @Override + public void dispatchReal(Real r) { + v.visitUnknown(r); + } + }; + } + // END: visitor.clientprovider.dispatch.v3.l2 + // BEGIN: visitor.clientprovider.dispatch.v3.l3 + static Visitor create3_0(final Visitor.Version3_0 v) { + return new Visitor() { + @Override + public void dispatchReal(Real r) { + v.visitReal(r); + } + + @Override + public void dispatchNumber(final Number n) { + class RealWrapper implements Real { + public double getValue() { + return n.getValue(); + } + public void visit(Visitor v) { + n.visit(v); + } + } + v.visitReal(new RealWrapper()); + } + + @Override + public void dispatchPlus(Plus p) { + v.visitPlus(p); + } + + @Override + public void dispatchMinus(Minus m) { + v.visitMinus(m); + } + }; + } + // END: visitor.clientprovider.dispatch.v3.l3 +} diff -r 0f658628beac -r 67d6dceb1002 samples/visitor/21-clientprovider/src-test/org/apidesign/test/visitor/PrintTest.java --- a/samples/visitor/21-clientprovider/src-test/org/apidesign/test/visitor/PrintTest.java Sat Jun 14 09:59:16 2008 +0200 +++ b/samples/visitor/21-clientprovider/src-test/org/apidesign/test/visitor/PrintTest.java Sat Jun 14 09:59:20 2008 +0200 @@ -1,48 +1,83 @@ package org.apidesign.test.visitor; +import org.apidesign.visitor.Language.Expression; +import org.apidesign.visitor.Language.Number; +import org.apidesign.visitor.Language.Plus; +import org.apidesign.visitor.Language.Visitor; +import org.apidesign.visitor.Language.Visitor; import static junit.framework.Assert.*; -import org.apidesign.visitor.notevolutionready.Language.Expression; -import org.apidesign.visitor.notevolutionready.Language.Number; -import org.apidesign.visitor.notevolutionready.Language.Plus; -import org.apidesign.visitor.notevolutionready.Language.Visitor; import org.junit.Test; public class PrintTest { + + public static Number newNumber(final int value) { + return new Number() { + public int getValue() { + return value; + } - // BEGIN: visitor.notevolutionready.print - public static class PrintVisitor implements Visitor { + public void visit(Visitor v) { + v.dispatchNumber(this); + } + }; + } + public static Plus newPlus( + final Expression first, final Expression second + ) { + return new Plus() { + public Expression getFirst() { + return first; + } + + public Expression getSecond() { + return second; + } + + public void visit(Visitor v) { + v.dispatchPlus(this); + } + }; + } + + public static class PrintVisitor implements Visitor.Version1_0 { StringBuffer sb = new StringBuffer(); + final Visitor dispatch = Visitor.create(this); + public void visitPlus(Plus s) { - s.getFirst().visit(this); + s.getFirst().visit(dispatch); sb.append(" + "); - s.getSecond().visit(this); + s.getSecond().visit(dispatch); } public void visitNumber(Number n) { sb.append (n.getValue()); } + + public boolean visitUnknown(Expression e) { + sb.append("unknown"); + return true; + } } @Test public void printOnePlusOne() { - Number one = new Number(1); - Expression plus = new Plus(one, one); + Number one = newNumber(1); + Expression plus = newPlus(one, one); PrintVisitor print = new PrintVisitor(); - plus.visit(print); + plus.visit(print.dispatch); assertEquals("1 + 1", print.sb.toString()); } - // END: visitor.notevolutionready.print @Test public void printOnePlusTwoPlusThree() { - Number one = new Number(1); - Number two = new Number(2); - Number three = new Number(3); - Expression plus = new Plus(one, new Plus(two, three)); + Number one = newNumber(1); + Number two = newNumber(2); + Number three = newNumber(3); + Expression plus = newPlus(one, newPlus(two, three)); PrintVisitor print = new PrintVisitor(); - plus.visit(print); + plus.visit(print.dispatch); assertEquals("1 + 2 + 3", print.sb.toString()); } diff -r 0f658628beac -r 67d6dceb1002 samples/visitor/21-clientprovider/src-test2.0/org/apidesign/test/visitor/PrintOfMinusStructureTest.java --- a/samples/visitor/21-clientprovider/src-test2.0/org/apidesign/test/visitor/PrintOfMinusStructureTest.java Sat Jun 14 09:59:16 2008 +0200 +++ b/samples/visitor/21-clientprovider/src-test2.0/org/apidesign/test/visitor/PrintOfMinusStructureTest.java Sat Jun 14 09:59:20 2008 +0200 @@ -1,25 +1,41 @@ package org.apidesign.test.visitor; import org.apidesign.test.visitor.PrintTest.PrintVisitor; +import org.apidesign.visitor.Language.Expression; +import org.apidesign.visitor.Language.Minus; +import org.apidesign.visitor.Language.Number; import static junit.framework.Assert.*; -import org.apidesign.visitor.notevolutionready.Language.Expression; -import org.apidesign.visitor.notevolutionready.Language.Minus; -import org.apidesign.visitor.notevolutionready.Language.Number; -import org.apidesign.visitor.notevolutionready.Language.Plus; -import org.apidesign.visitor.notevolutionready.Language.Visitor; +import org.apidesign.visitor.Language.Visitor; import org.junit.Test; public class PrintOfMinusStructureTest { + public static Minus newMinus( + final Expression first, final Expression second + ) { + return new Minus() { + public Expression getFirst() { + return first; + } + + public Expression getSecond() { + return second; + } + + public void visit(Visitor v) { + v.dispatchMinus(this); + } + }; + } + + @Test public void printOneMinusTwo() { - // BEGIN: visitor.notevolutionready.oldwithnew - Number one = new Number(1); - Number two = new Number(2); - Expression plus = new Minus(one, two); + Number one = PrintTest.newNumber(1); + Number two = PrintTest.newNumber(2); + Expression plus = newMinus(one, two); PrintVisitor print = new PrintVisitor(); - plus.visit(print); // fails with AbstractMethodError + plus.visit(print.dispatch); assertEquals("1 - 2", print.sb.toString()); - // END: visitor.notevolutionready.oldwithnew } }