diff options
Diffstat (limited to 'tutorial/examples/adapter/AdapterClass.java')
-rw-r--r-- | tutorial/examples/adapter/AdapterClass.java | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/tutorial/examples/adapter/AdapterClass.java b/tutorial/examples/adapter/AdapterClass.java new file mode 100644 index 0000000..0b2e60c --- /dev/null +++ b/tutorial/examples/adapter/AdapterClass.java @@ -0,0 +1,155 @@ +/* + * This code was generated by ojc. + */ +/* + * AdapterClass.oj + * + * An OpenJava example to support programming with the Adapter pattern. + * + * @author Michiaki Tatsubori + * @version %VERSION% %DATE% + * @see java.lang.Object + * + * COPYRIGHT 1999 by Michiaki Tatsubori, ALL RIGHTS RESERVED. + */ +package examples.adapter; + + +import java.lang.Object; +import io.devnulllabs.openjava.mop.*; +import io.devnulllabs.openjava.ptree.*; +import io.devnulllabs.openjava.syntax.*; + + +/** + * The metaclass <code>AdapterClass</code> supports classes + * implementing an adapter role of the Adapter pattern. + * The target's methods with same signatures as the adaptee's are + * automatically implemented into the adapter class. + * <p> + * For example, the class <code>VectorStack</code>: + * <pre> + * public class VectorStack instantiates AdapterClass + * adapts Vector in v to Stack + * { + * Vector v; + * public VectorStack( Vector v ) { + * this.v = v; + * } + * public void push( Object o ) { + * v.addElement( o ); + * } + * public Object pop() { + * return v.removeElementAt( v.size() - 1 ); + * } + * } + * </pre> + * would be automatically implemented with the forwarding methods + * size(), isEmpty(), hashCode(), etc, which are found in both + * the class Vector(adaptee) and the class Stack(target). + * <p> + * + * @author Michiaki Tatsubori + * @version 1.0 + * @since $Id: AdapterClass.java,v 1.2 2003/02/19 02:55:02 tatsubori Exp $ + * @see java.lang.Object + */ +public class AdapterClass extends io.devnulllabs.openjava.mop.OJClass +{ + + public static final java.lang.String KEY_ADAPTS = "adapts"; + + /* overrides for translation */ + public void translateDefinition() + throws io.devnulllabs.openjava.mop.MOPException + { + io.devnulllabs.openjava.mop.OJClass target = getTarget(); + io.devnulllabs.openjava.mop.OJClass adaptee = getAdaptee(); + if (target == null || adaptee == null) { + return; + } + io.devnulllabs.openjava.mop.OJMethod[] adapteds = adaptee.getMethods( this ); + for (int i = 0; i < adapteds.length; ++i) { + io.devnulllabs.openjava.mop.OJMethod m; + try { + m = getTarget().getMethod( adapteds[i].getName(), adapteds[i].getParameterTypes(), this ); + } catch ( io.devnulllabs.openjava.mop.NoSuchMemberException e ) { + continue; + } + addMethod( makeForwardingMethod( m.getName(), m ) ); + } + addInterface( getTarget() ); + } + + /** + * Generates a forwarding method with specified name. + * + * @param name generating method's name. + * @param forwarded method to which the generated method forwards. + * @return a generated forwarding method. + */ + private io.devnulllabs.openjava.mop.OJMethod makeForwardingMethod( java.lang.String name, io.devnulllabs.openjava.mop.OJMethod forwarded ) + throws io.devnulllabs.openjava.mop.MOPException + { + io.devnulllabs.openjava.mop.OJMethod result = new io.devnulllabs.openjava.mop.OJMethod( this, forwarded.getModifiers().remove( OJModifier.ABSTRACT ), forwarded.getReturnType(), name, forwarded.getParameterTypes(), forwarded.getExceptionTypes(), null ); + io.devnulllabs.openjava.ptree.ExpressionList params = result.getParameterVariables(); + io.devnulllabs.openjava.ptree.Expression expr = new io.devnulllabs.openjava.ptree.MethodCall( getContainer(), name, params ); + io.devnulllabs.openjava.ptree.StatementList body = new io.devnulllabs.openjava.ptree.StatementList(); + if (forwarded.getReturnType() == OJSystem.VOID) { + body.add( new io.devnulllabs.openjava.ptree.ExpressionStatement( expr ) ); + body.add( new io.devnulllabs.openjava.ptree.ReturnStatement() ); + } else { + body.add( new io.devnulllabs.openjava.ptree.ReturnStatement( expr ) ); + } + result.setBody( body ); + return result; + } + + /* extended information */ + private io.devnulllabs.openjava.mop.OJClass getAdaptee() + throws io.devnulllabs.openjava.mop.MOPException + { + io.devnulllabs.openjava.ptree.ObjectList suffix = (io.devnulllabs.openjava.ptree.ObjectList) getSuffix( KEY_ADAPTS ); + return OJClass.forName( suffix.get( 0 ).toString() ); + } + + private io.devnulllabs.openjava.ptree.Variable getContainer() + throws io.devnulllabs.openjava.mop.MOPException + { + io.devnulllabs.openjava.ptree.ObjectList suffix = (io.devnulllabs.openjava.ptree.ObjectList) getSuffix( KEY_ADAPTS ); + return new io.devnulllabs.openjava.ptree.Variable( suffix.get( 1 ).toString() ); + } + + private io.devnulllabs.openjava.mop.OJClass getTarget() + throws io.devnulllabs.openjava.mop.MOPException + { + io.devnulllabs.openjava.ptree.ObjectList suffix = (io.devnulllabs.openjava.ptree.ObjectList) getSuffix( KEY_ADAPTS ); + return OJClass.forName( suffix.get( 2 ).toString() ); + } + + /* override to extend syntax */ + public static boolean isRegisteredKeyword( java.lang.String keyword ) + { + return keyword.equals( KEY_ADAPTS ); + } + + /* override to extend syntax */ + public static io.devnulllabs.openjava.syntax.SyntaxRule getDeclSuffixRule( java.lang.String keyword ) + { + if (keyword.equals( KEY_ADAPTS )) { + return new io.devnulllabs.openjava.syntax.CompositeRule( new io.devnulllabs.openjava.syntax.TypeNameRule(), new io.devnulllabs.openjava.syntax.PrepPhraseRule( "in", new io.devnulllabs.openjava.syntax.NameRule() ), new io.devnulllabs.openjava.syntax.PrepPhraseRule( "to", new io.devnulllabs.openjava.syntax.TypeNameRule() ) ); + } + return null; + } + + public AdapterClass( io.devnulllabs.openjava.mop.Environment oj_param0, io.devnulllabs.openjava.mop.OJClass oj_param1, io.devnulllabs.openjava.ptree.ClassDeclaration oj_param2 ) + { + super( oj_param0, oj_param1, oj_param2 ); + } + + public AdapterClass( java.lang.Class oj_param0, io.devnulllabs.openjava3.mop.MetaInfo oj_param1 ) + { + super( oj_param0, oj_param1 ); + } + +} |