summaryrefslogtreecommitdiff
path: root/tutorial/examples/adapter/AdapterClass.java
diff options
context:
space:
mode:
Diffstat (limited to 'tutorial/examples/adapter/AdapterClass.java')
-rw-r--r--tutorial/examples/adapter/AdapterClass.java155
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 );
+ }
+
+}