/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package groovy.lang; import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.runtime.InvokerHelper; import java.lang.reflect.Method; import java.util.List; /** * @author John Wilson */ public class DelegatingMetaClass implements MetaClass, MutableMetaClass, GroovyObject { protected MetaClass delegate; public DelegatingMetaClass(final MetaClass delegate) { this.delegate = delegate; } public DelegatingMetaClass(final Class theClass) { this(GroovySystem.getMetaClassRegistry().getMetaClass(theClass)); } public boolean isModified() { return this.delegate instanceof MutableMetaClass && ((MutableMetaClass) this.delegate).isModified(); } /* (non-Javadoc) * @see groovy.lang.MetaClass#addNewInstanceMethod(java.lang.reflect.Method) */ public void addNewInstanceMethod(Method method) { if (delegate instanceof MutableMetaClass) ((MutableMetaClass) delegate).addNewInstanceMethod(method); } /* (non-Javadoc) * @see groovy.lang.MetaClass#addNewStaticMethod(java.lang.reflect.Method) */ public void addNewStaticMethod(Method method) { if (delegate instanceof MutableMetaClass) ((MutableMetaClass) delegate).addNewStaticMethod(method); } public void addMetaMethod(MetaMethod metaMethod) { if (delegate instanceof MutableMetaClass) ((MutableMetaClass) delegate).addMetaMethod(metaMethod); } public void addMetaBeanProperty(MetaBeanProperty metaBeanProperty) { if (delegate instanceof MutableMetaClass) ((MutableMetaClass) delegate).addMetaBeanProperty(metaBeanProperty); } /* (non-Javadoc) * @see groovy.lang.MetaClass#initialize() */ public void initialize() { delegate.initialize(); } /* (non-Javadoc) * @see groovy.lang.MetaClass#getAttribute(java.lang.Object, java.lang.String) */ public Object getAttribute(Object object, String attribute) { return delegate.getAttribute(object, attribute); } /* (non-Javadoc) * @see groovy.lang.MetaClass#getClassNode() */ public ClassNode getClassNode() { return delegate.getClassNode(); } /* (non-Javadoc) * @see groovy.lang.MetaClass#getMetaMethods() */ public List<MetaMethod> getMetaMethods() { return delegate.getMetaMethods(); } /* (non-Javadoc) * @see groovy.lang.MetaClass#getMethods() */ public List<MetaMethod> getMethods() { return delegate.getMethods(); } public List<MetaMethod> respondsTo(Object obj, String name, Object[] argTypes) { return delegate.respondsTo(obj, name, argTypes); } public List<MetaMethod> respondsTo(Object obj, String name) { return delegate.respondsTo(obj, name); } public MetaProperty hasProperty(Object obj, String name) { return delegate.hasProperty(obj, name); } /* (non-Javadoc) * @see groovy.lang.MetaClass#getProperties() */ public List<MetaProperty> getProperties() { return delegate.getProperties(); } /* (non-Javadoc) * @see groovy.lang.MetaClass#getProperty(java.lang.Object, java.lang.String) */ public Object getProperty(Object object, String property) { return delegate.getProperty(object, property); } /* (non-Javadoc) * @see groovy.lang.MetaClass#invokeConstructor(java.lang.Object[]) */ public Object invokeConstructor(Object[] arguments) { return delegate.invokeConstructor(arguments); } /* (non-Javadoc) * @see groovy.lang.MetaClass#invokeMethod(java.lang.Object, java.lang.String, java.lang.Object) */ public Object invokeMethod(Object object, String methodName, Object arguments) { return delegate.invokeMethod(object, methodName, arguments); } /* (non-Javadoc) * @see groovy.lang.MetaClass#invokeMethod(java.lang.Object, java.lang.String, java.lang.Object[]) */ public Object invokeMethod(Object object, String methodName, Object[] arguments) { return delegate.invokeMethod(object, methodName, arguments); } /* (non-Javadoc) * @see groovy.lang.MetaClass#invokeStaticMethod(java.lang.Object, java.lang.String, java.lang.Object[]) */ public Object invokeStaticMethod(Object object, String methodName, Object[] arguments) { return delegate.invokeStaticMethod(object, methodName, arguments); } /* (non-Javadoc) * @see groovy.lang.MetaClass#setAttribute(java.lang.Object, java.lang.String, java.lang.Object) */ public void setAttribute(Object object, String attribute, Object newValue) { delegate.setAttribute(object, attribute, newValue); } /* (non-Javadoc) * @see groovy.lang.MetaClass#setProperty(java.lang.Object, java.lang.String, java.lang.Object) */ public void setProperty(Object object, String property, Object newValue) { delegate.setProperty(object, property, newValue); } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object obj) { return delegate.equals(obj); } /* (non-Javadoc) * @see java.lang.Object#hashCode() */ public int hashCode() { return delegate.hashCode(); } public String toString() { return super.toString() + "[" + delegate.toString() + "]"; } /** * @deprecated */ @Deprecated public MetaMethod pickMethod(String methodName, Class[] arguments) { return delegate.pickMethod(methodName, arguments); } public Object getAttribute(Class sender, Object receiver, String messageName, boolean useSuper) { return this.delegate.getAttribute(sender, receiver, messageName, useSuper); } public Object getProperty(Class sender, Object receiver, String messageName, boolean useSuper, boolean fromInsideClass) { return this.delegate.getProperty(sender, receiver, messageName, useSuper, fromInsideClass); } public MetaProperty getMetaProperty(String name) { return this.delegate.getMetaProperty(name); } public MetaMethod getStaticMetaMethod(String name, Object[] args) { return this.delegate.getStaticMetaMethod(name, args); } public MetaMethod getStaticMetaMethod(String name, Class[] argTypes) { return this.delegate.getStaticMetaMethod(name, argTypes); } public MetaMethod getMetaMethod(String name, Object[] args) { return this.delegate.getMetaMethod(name, args); } public Class getTheClass() { return this.delegate.getTheClass(); } public Object invokeMethod(Class sender, Object receiver, String methodName, Object[] arguments, boolean isCallToSuper, boolean fromInsideClass) { return this.delegate.invokeMethod(sender, receiver, methodName, arguments, isCallToSuper, fromInsideClass); } public Object invokeMissingMethod(Object instance, String methodName, Object[] arguments) { return this.delegate.invokeMissingMethod(instance, methodName, arguments); } public Object invokeMissingProperty(Object instance, String propertyName, Object optionalValue, boolean isGetter) { return this.delegate.invokeMissingProperty(instance, propertyName, optionalValue, isGetter); } public boolean isGroovyObject() { return GroovyObject.class.isAssignableFrom(this.delegate.getTheClass()); } public void setAttribute(Class sender, Object receiver, String messageName, Object messageValue, boolean useSuper, boolean fromInsideClass) { this.delegate.setAttribute(sender, receiver, messageName, messageValue, useSuper, fromInsideClass); } public void setProperty(Class sender, Object receiver, String messageName, Object messageValue, boolean useSuper, boolean fromInsideClass) { this.delegate.setProperty(sender, receiver, messageName, messageValue, useSuper, fromInsideClass); } public int selectConstructorAndTransformArguments(int numberOfConstructors, Object[] arguments) { return this.delegate.selectConstructorAndTransformArguments(numberOfConstructors, arguments); } public void setAdaptee(MetaClass adaptee) { this.delegate = adaptee; } public MetaClass getAdaptee() { return this.delegate; } public Object invokeMethod(String name, Object args) { try { return getMetaClass().invokeMethod(this, name, args); } catch (MissingMethodException e) { if (delegate instanceof GroovyObject) return ((GroovyObject) delegate).invokeMethod(name, args); else throw e; } } public Object getProperty(String property) { try { return getMetaClass().getProperty(this, property); } catch (MissingPropertyException e) { if (delegate instanceof GroovyObject) return ((GroovyObject) delegate).getProperty(property); else throw e; } } public void setProperty(String property, Object newValue) { try { getMetaClass().setProperty(this, property, newValue); } catch (MissingPropertyException e) { if (delegate instanceof GroovyObject) ((GroovyObject) delegate).setProperty(property, newValue); else throw e; } } public MetaClass getMetaClass() { return InvokerHelper.getMetaClass(getClass()); } public void setMetaClass(MetaClass metaClass) { throw new UnsupportedOperationException(); } }