001    /*
002     * Copyright 2006 John G. Wilson
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     *
016     */
017    
018    package org.codehaus.groovy.runtime.wrappers;
019    
020    //import java.lang.reflect.Constructor;
021    //import java.lang.reflect.Method;
022    //import java.util.List;
023    //import java.util.Map;
024    //
025    //import org.codehaus.groovy.ast.ClassNode;
026    
027    import groovy.lang.GroovyObject;
028    import groovy.lang.MetaClass;
029    //import groovy.lang.MetaMethod;
030    
031    /**
032     * @author John Wilson
033     *
034     */
035    
036    public abstract class Wrapper implements GroovyObject {
037        protected MetaClass delegatingMetaClass;
038        
039    //  protected MetaClass delegatingMetaClass = new MetaClass(Object.class) {
040    //    /**
041    //     * @param obj
042    //     * @see java.lang.Object#equals(java.lang.Object)
043    //     */
044    //    public boolean equals(Object obj) {
045    //      return Wrapper.this.getDelegatedMetaClass().equals(obj);
046    //    }
047    //
048    //    /**
049    //     * @param object
050    //     * @param attribute
051    //     * @see groovy.lang.MetaClass#getAttribute(java.lang.Object, java.lang.String)
052    //     */
053    //    public Object getAttribute(Object object, String attribute) {
054    //      return Wrapper.this.getDelegatedMetaClass().getAttribute(Wrapper.this.getWrapped(), attribute);
055    //    }
056    //
057    //    /**
058    //     * @see groovy.lang.MetaClass#getClassNode()
059    //     */
060    //    public ClassNode getClassNode() {
061    //      return Wrapper.this.getDelegatedMetaClass().getClassNode();
062    //    }
063    //
064    //    /**
065    //     * @see groovy.lang.MetaClass#getMetaMethods()
066    //     */
067    //    public List getMetaMethods() {
068    //      return Wrapper.this.getDelegatedMetaClass().getMetaMethods();
069    //    }
070    //
071    //    /**
072    //     * @see groovy.lang.MetaClass#getMethods()
073    //     */
074    //    public List getMethods() {
075    //      return Wrapper.this.getDelegatedMetaClass().getMethods();
076    //    }
077    //
078    //    /**
079    //     * @see groovy.lang.MetaClass#getProperties()
080    //     */
081    //    public List getProperties() {
082    //      return Wrapper.this.getDelegatedMetaClass().getProperties();
083    //    }
084    //
085    //    /**
086    //     * @param object
087    //     * @param property
088    //     * @see groovy.lang.MetaClass#getProperty(java.lang.Object, java.lang.String)
089    //     */
090    //    public Object getProperty(Object object, String property) {
091    //      return Wrapper.this.getDelegatedMetaClass().getProperty(Wrapper.this.getWrapped(), property);
092    //    }
093    //
094    //    /**
095    //     * @see java.lang.Object#hashCode()
096    //     */
097    //    public int hashCode() {
098    //      return Wrapper.this.getDelegatedMetaClass().hashCode();
099    //    }
100    //
101    //    /**
102    //     * @param arguments
103    //     * @see groovy.lang.MetaClass#invokeConstructor(java.lang.Object[])
104    //     */
105    //    public Object invokeConstructor(Object[] arguments) {
106    //      return Wrapper.this.getDelegatedMetaClass().invokeConstructor(arguments);
107    //    }
108    //
109    //    /**
110    //     * @param at
111    //     * @param arguments
112    //     * @see groovy.lang.MetaClass#invokeConstructorAt(java.lang.Class, java.lang.Object[])
113    //     */
114    //    public Object invokeConstructorAt(Class at, Object[] arguments) {
115    //      return Wrapper.this.getDelegatedMetaClass().invokeConstructorAt(at, arguments);
116    //    }
117    //
118    //    /**
119    //     * @param object
120    //     * @param methodName
121    //     * @param arguments
122    //     * @see groovy.lang.MetaClass#invokeMethod(java.lang.Object, java.lang.String, java.lang.Object)
123    //     */
124    //    public Object invokeMethod(Object object, String methodName, Object arguments) {
125    //      return Wrapper.this.getDelegatedMetaClass().invokeMethod(Wrapper.this.getWrapped(), methodName, arguments);
126    //    }
127    //
128    //    /**
129    //     * @param object
130    //     * @param methodName
131    //     * @param arguments
132    //     * @see groovy.lang.MetaClass#invokeMethod(java.lang.Object, java.lang.String, java.lang.Object[])
133    //     */
134    //    public Object invokeMethod(Object object, String methodName, Object[] arguments) {
135    //      return Wrapper.this.getDelegatedMetaClass().invokeMethod(Wrapper.this.getWrapped(), methodName, arguments);
136    //    }
137    //
138    //    /**
139    //     * @param object
140    //     * @param methodName
141    //     * @param arguments
142    //     * @see groovy.lang.MetaClass#invokeStaticMethod(java.lang.Object, java.lang.String, java.lang.Object[])
143    //     */
144    //    public Object invokeStaticMethod(Object object, String methodName, Object[] arguments) {
145    //      return Wrapper.this.getDelegatedMetaClass().invokeStaticMethod(Wrapper.this.getWrapped(), methodName, arguments);
146    //    }
147    //
148    //    /**
149    //     * @param arguments
150    //     * @see groovy.lang.MetaClass#retrieveConstructor(java.lang.Class[])
151    //     */
152    //    public Constructor retrieveConstructor(Class[] arguments) {
153    //      return Wrapper.this.getDelegatedMetaClass().retrieveConstructor(arguments);
154    //    }
155    //
156    //    /**
157    //     * @param owner
158    //     * @param methodName
159    //     * @param arguments
160    //     * @see groovy.lang.MetaClass#retrieveMethod(java.lang.Object, java.lang.String, java.lang.Object[])
161    //     */
162    //    public MetaMethod retrieveMethod(Object owner, String methodName, Object[] arguments) {
163    //      return Wrapper.this.getDelegatedMetaClass().retrieveMethod(owner, methodName, arguments);
164    //    }
165    //
166    //    /**
167    //     * @param methodName
168    //     * @param arguments
169    //     * @see groovy.lang.MetaClass#retrieveMethod(java.lang.String, java.lang.Class[])
170    //     */
171    //    public MetaMethod retrieveMethod(String methodName, Class[] arguments) {
172    //      return Wrapper.this.getDelegatedMetaClass().retrieveMethod(methodName, arguments);
173    //    }
174    //
175    //    /**
176    //     * @param methodName
177    //     * @param arguments
178    //     * @see groovy.lang.MetaClass#retrieveStaticMethod(java.lang.String, java.lang.Class[])
179    //     */
180    //    public MetaMethod retrieveStaticMethod(String methodName, Class[] arguments) {
181    //      return Wrapper.this.getDelegatedMetaClass().retrieveStaticMethod(methodName, arguments);
182    //    }
183    //
184    //    /**
185    //     * @param object
186    //     * @param attribute
187    //     * @param newValue
188    //     * @see groovy.lang.MetaClass#setAttribute(java.lang.Object, java.lang.String, java.lang.Object)
189    //     */
190    //    public void setAttribute(Object object, String attribute, Object newValue) {
191    //      Wrapper.this.getDelegatedMetaClass().setAttribute(Wrapper.this.getWrapped(), attribute, newValue);
192    //    }
193    //
194    //    /**
195    //     * @param bean
196    //     * @param map
197    //     * @see groovy.lang.MetaClass#setProperties(java.lang.Object, java.util.Map)
198    //     */
199    //    public void setProperties(Object bean, Map map) {
200    //      Wrapper.this.getDelegatedMetaClass().setProperties(Wrapper.this.getWrapped(), map);
201    //    }
202    //
203    //    /**
204    //     * @param object
205    //     * @param property
206    //     * @param newValue
207    //     * @see groovy.lang.MetaClass#setProperty(java.lang.Object, java.lang.String, java.lang.Object)
208    //     */
209    //    public void setProperty(Object object, String property, Object newValue) {
210    //      Wrapper.this.getDelegatedMetaClass().setProperty(Wrapper.this.getWrapped(), property, newValue);
211    //    }
212    //
213    //    /**
214    //     * @see java.lang.Object#toString()
215    //     */
216    //    public String toString() {
217    //      return Wrapper.this.getDelegatedMetaClass().toString();
218    //    }
219    //
220    //    /* (non-Javadoc)
221    //     * @see groovy.lang.MetaClass#addNewInstanceMethod(java.lang.reflect.Method)
222    //     */
223    //    public void addNewInstanceMethod(Method method) {
224    //      Wrapper.this.getDelegatedMetaClass().addNewInstanceMethod(method);
225    //    }
226    //
227    //    /* (non-Javadoc)
228    //     * @see groovy.lang.MetaClass#addNewStaticMethod(java.lang.reflect.Method)
229    //     */
230    //    public void addNewStaticMethod(Method method) {
231    //      Wrapper.this.getDelegatedMetaClass().addNewStaticMethod(method);
232    //    }
233    //
234    //    /* (non-Javadoc)
235    //     * @see groovy.lang.MetaClass#checkInitialised()
236    //     */
237    //    public void checkInitialised() {
238    //      Wrapper.this.getDelegatedMetaClass().checkInitialised();
239    //    }
240    //
241    //    /* (non-Javadoc)
242    //     * @see groovy.lang.MetaClass#pickMethod(java.lang.Object, java.lang.String, java.lang.Object[])
243    //     */
244    //    public MetaMethod pickMethod(Object object, String methodName, Object[] arguments) {
245    //      return Wrapper.this.getDelegatedMetaClass().pickMethod(object, methodName, arguments);
246    //    }
247    //
248    //    /* (non-Javadoc)
249    //     * @see groovy.lang.MetaClass#pickMethod(java.lang.String, java.lang.Class[])
250    //     */
251    //    public MetaMethod pickMethod(String methodName, Class[] arguments) {
252    //      return Wrapper.this.getDelegatedMetaClass().pickMethod(methodName, arguments);
253    //    }
254    //  };
255      
256      protected final Class constrainedType;
257      
258      public Wrapper(final Class constrainedType) {
259        this.constrainedType = constrainedType;
260      }
261    
262      /* (non-Javadoc)
263       * @see groovy.lang.GroovyObject#getMetaClass()
264       * 
265       * This will only be useful post 1.0
266       */
267      public MetaClass getMetaClass() {
268        return this.delegatingMetaClass;
269      }
270      
271      public abstract Object unwrap();
272      
273      public Class getType() {
274        return this.constrainedType;
275      }
276      
277      protected abstract Object getWrapped();
278      protected abstract MetaClass getDelegatedMetaClass();
279    }