Added: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/enhance/MethodSignatureImpl.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/enhance/MethodSignatureImpl.java?view=auto&rev=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/enhance/MethodSignatureImpl.java (added) +++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/enhance/MethodSignatureImpl.java Thu Feb 22 05:48:00 2007 @@ -0,0 +1,256 @@ +// Copyright 2004, 2005 The Apache Software Foundation +// +// Licensed 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 org.apache.tapestry.enhance; + +import java.lang.reflect.Method; + +import org.apache.hivemind.service.ClassFabUtils; + + +/** + * JDK 1.4 based version of [EMAIL PROTECTED] MethodSignature}. + */ +public class MethodSignatureImpl implements MethodSignature +{ + protected int _hashCode = -1; + + protected Class _returnType; + + protected String _name; + + protected Class[] _parameterTypes; + + protected Class[] _exceptionTypes; + + public MethodSignatureImpl(Class returnType, String name, + Class[] parameterTypes, Class[] exceptionTypes) + { + _returnType = returnType; + _name = name; + _parameterTypes = parameterTypes; + _exceptionTypes = exceptionTypes; + } + + public MethodSignatureImpl(Method m) + { + this(m.getReturnType(), m.getName(), m.getParameterTypes(), m.getExceptionTypes()); + } + + public Class[] getExceptionTypes() + { + return _exceptionTypes; + } + + public String getName() + { + return _name; + } + + public Class[] getParameterTypes() + { + return _parameterTypes; + } + + public Class getReturnType() + { + return _returnType; + } + + public int hashCode() + { + if (_hashCode == -1) + { + + _hashCode = _returnType.hashCode(); + + _hashCode = 31 * _hashCode + _name.hashCode(); + + int count = count(_parameterTypes); + + for (int i = 0; i < count; i++) + _hashCode = 31 * _hashCode + _parameterTypes[i].hashCode(); + + count = count(_exceptionTypes); + + for (int i = 0; i < count; i++) + _hashCode = 31 * _hashCode + _exceptionTypes[i].hashCode(); + } + + return _hashCode; + } + + protected static int count(Object[] array) + { + return array == null ? 0 : array.length; + } + + /** + * Returns true if the other object is an instance of MethodSignature with identical values for + * return type, name, parameter types and exception types. + */ + public boolean equals(Object o) + { + if (o == null || !(o instanceof MethodSignatureImpl)) + return false; + + MethodSignatureImpl ms = (MethodSignatureImpl) o; + + if (_returnType != ms._returnType) + return false; + + if (!_name.equals(ms._name)) + return false; + + if (mismatch(_parameterTypes, ms._parameterTypes)) + return false; + + return !mismatch(_exceptionTypes, ms._exceptionTypes); + } + + protected boolean mismatch(Class[] a1, Class[] a2) + { + int a1Count = count(a1); + int a2Count = count(a2); + + if (a1Count != a2Count) + return true; + + // Hm. What if order is important (for exceptions)? We're really saying here that they + // were derived from the name Method. + + for (int i = 0; i < a1Count; i++) + { + if (!a1[i].isAssignableFrom(a2[i])) + return true; + } + + return false; + } + + public String toString() + { + StringBuffer buffer = new StringBuffer(); + + buffer.append(ClassFabUtils.getJavaClassName(_returnType)); + buffer.append(" "); + buffer.append(_name); + buffer.append("("); + + for (int i = 0; i < count(_parameterTypes); i++) + { + if (i > 0) + buffer.append(", "); + + buffer.append(ClassFabUtils.getJavaClassName(_parameterTypes[i])); + } + + buffer.append(")"); + + for (int i = 0; i < count(_exceptionTypes); i++) + { + if (i == 0) + buffer.append(" throws "); + else + buffer.append(", "); + + buffer.append(_exceptionTypes[i].getName()); + } + + return buffer.toString(); + } + + public String getUniqueId() + { + StringBuffer buffer = new StringBuffer(_name); + buffer.append("("); + + for (int i = 0; i < count(_parameterTypes); i++) + { + if (i > 0) + buffer.append(","); + + buffer.append(ClassFabUtils.getJavaClassName(_parameterTypes[i])); + } + + buffer.append(")"); + + return buffer.toString(); + } + + public boolean isGeneric() + { + return false; + } + + public boolean isOverridingSignatureOf(MethodSignature ms) + { + if (!(ms instanceof MethodSignatureImpl)) + return false; + + MethodSignatureImpl sig = (MethodSignatureImpl)ms; + + if (_returnType != sig._returnType) + return false; + + if (!_name.equals(sig._name)) + return false; + + if (mismatch(_parameterTypes, sig._parameterTypes)) + return false; + + return exceptionsEncompass(sig._exceptionTypes); + } + + /** + * The nuts and bolts of checking that another method signature's exceptions are a subset of + * this signature's. + */ + + protected boolean exceptionsEncompass(Class[] otherExceptions) + { + int ourCount = count(_exceptionTypes); + int otherCount = count(otherExceptions); + + // If we have no exceptions, then ours encompass theirs only if they + // have no exceptions, either. + + if (ourCount == 0) + return otherCount == 0; + + boolean[] matched = new boolean[otherCount]; + int unmatched = otherCount; + + for (int i = 0; i < ourCount && unmatched > 0; i++) + { + for (int j = 0; j < otherCount; j++) + { + // Ignore exceptions that have already been matched + + if (matched[j]) + continue; + + // When one of our exceptions is a super-class of one of their exceptions, + // then their exceptions is matched. + + if (_exceptionTypes[i].isAssignableFrom(otherExceptions[j])) + { + matched[j] = true; + unmatched--; + } + } + } + + return unmatched == 0; + } +}
Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/enhance/SpecifiedPropertyWorker.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/enhance/SpecifiedPropertyWorker.java?view=diff&rev=510514&r1=510513&r2=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/enhance/SpecifiedPropertyWorker.java (original) +++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/enhance/SpecifiedPropertyWorker.java Thu Feb 22 05:48:00 2007 @@ -92,8 +92,8 @@ public void addProperty(EnhancementOperation op, String propertyName, String specifiedType, boolean persistent, String initialValue, Location location, IPropertySpecification ps) { - Class propertyType = EnhanceUtils.extractPropertyType(op, propertyName, specifiedType); - + Class propertyType = EnhanceUtils.extractPropertyType(op, propertyName, specifiedType, ps.isGeneric()); + op.claimProperty(propertyName); String field = "_$" + propertyName; @@ -194,6 +194,14 @@ if (persistent) { + if (!propertyType.isArray() && !propertyType.isPrimitive()) { + + body.addln("if ($1 != null && org.apache.tapestry.record.ObservedProperty.class.isAssignableFrom($1.getClass())) {"); + body.add(" $1 = (" + ClassFabUtils.getJavaClassName(propertyType) + ")((org.apache.tapestry.record.ObservedProperty)$1)"); + body.addln(".getCGProperty();"); + body.addln("}"); + } + body.add("org.apache.tapestry.Tapestry#fireObservedChange(this, "); body.addQuoted(propertyName); body.addln(", ($w) $1);"); @@ -213,7 +221,7 @@ } body.end(); - + MethodSignature sig = new MethodSignature(void.class, methodName, new Class[] { propertyType }, null); op.addMethod(Modifier.PUBLIC, sig, body.toString(), location); Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/CglibPropertyChangeInterceptor.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/CglibPropertyChangeInterceptor.java?view=diff&rev=510514&r1=510513&r2=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/CglibPropertyChangeInterceptor.java (original) +++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/CglibPropertyChangeInterceptor.java Thu Feb 22 05:48:00 2007 @@ -27,7 +27,7 @@ * * Used by the default [EMAIL PROTECTED] PropertyChangeObserver} service. */ -public class CglibPropertyChangeInterceptor implements MethodInterceptor +public class CglibPropertyChangeInterceptor implements MethodInterceptor, ObservedProperty { private Object _property; @@ -51,12 +51,20 @@ _propertyName = propertyName; } + public Object getCGProperty() + { + return _property; + } + /** * [EMAIL PROTECTED] */ public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { + if (method.getDeclaringClass() == ObservedProperty.class) + return getCGProperty(); + if (_component.getPage().getChangeObserver() != null && !_component.getPage().getChangeObserver().isLocked()) { Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/CglibProxiedPropertyChangeObserverImpl.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/CglibProxiedPropertyChangeObserverImpl.java?view=diff&rev=510514&r1=510513&r2=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/CglibProxiedPropertyChangeObserverImpl.java (original) +++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/CglibProxiedPropertyChangeObserverImpl.java Thu Feb 22 05:48:00 2007 @@ -81,8 +81,13 @@ _badMap.put(property.getClass().getName(), Boolean.TRUE); return property; } - - Object ret = Enhancer.create(property.getClass(), property.getClass().getInterfaces(), + + Class[] interfaces = new Class[property.getClass().getInterfaces().length + 1]; + System.arraycopy(property.getClass().getInterfaces(), 0, interfaces, 0, interfaces.length - 1); + + interfaces[interfaces.length - 1] = ObservedProperty.class; + + Object ret = Enhancer.create(property.getClass(), interfaces, new ObservableMethodFilter(), new Callback[] { new LazyProxyDelegate(property), new CglibPropertyChangeInterceptor(component, property, propertyName)}); Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/LazyProxyDelegate.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/LazyProxyDelegate.java?view=diff&rev=510514&r1=510513&r2=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/LazyProxyDelegate.java (original) +++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/LazyProxyDelegate.java Thu Feb 22 05:48:00 2007 @@ -20,8 +20,7 @@ * Implementation of [EMAIL PROTECTED] LazyLoader} interface for [EMAIL PROTECTED] CglibProxiedPropertyChangeObserverImpl}. */ public class LazyProxyDelegate implements LazyLoader -{ - +{ Object _target; /** Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/ObservableMethodFilter.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/ObservableMethodFilter.java?view=diff&rev=510514&r1=510513&r2=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/ObservableMethodFilter.java (original) +++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/ObservableMethodFilter.java Thu Feb 22 05:48:00 2007 @@ -32,8 +32,9 @@ { boolean hasParams = method.getParameterTypes() != null && method.getParameterTypes().length > 0; - if (method.getReturnType() == void.class && hasParams - || method.getReturnType() != boolean.class && hasParams) { + if (method.getDeclaringClass() == ObservedProperty.class + || (method.getReturnType() == void.class && hasParams + || method.getReturnType() != boolean.class && hasParams)) { return 1; } Added: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/ObservedProperty.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/ObservedProperty.java?view=auto&rev=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/ObservedProperty.java (added) +++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/ObservedProperty.java Thu Feb 22 05:48:00 2007 @@ -0,0 +1,23 @@ +// Copyright 2004, 2005 The Apache Software Foundation +// +// Licensed 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 org.apache.tapestry.record; + + +/** + * + */ +public interface ObservedProperty +{ + Object getCGProperty(); +} Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/PersistentPropertyDataEncoderImpl.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/PersistentPropertyDataEncoderImpl.java?view=diff&rev=510514&r1=510513&r2=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/PersistentPropertyDataEncoderImpl.java (original) +++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/record/PersistentPropertyDataEncoderImpl.java Thu Feb 22 05:48:00 2007 @@ -163,6 +163,7 @@ oos.writeUTF(componentPath); oos.writeUTF(propertyName); + oos.writeObject(value); } } Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/IPropertySpecification.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/IPropertySpecification.java?view=diff&rev=510514&r1=510513&r2=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/IPropertySpecification.java (original) +++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/IPropertySpecification.java Thu Feb 22 05:48:00 2007 @@ -53,6 +53,20 @@ void setType(String type); /** + * Sets whether or not this property represents a concrete generic type. + * + * @param isGeneric + */ + void setGeneric(boolean isGeneric); + + /** + * Checks if the type represented by this property is in a generic declaration. + * + * @return True if it is generic, false otherwise. + */ + boolean isGeneric(); + + /** * Checks if this property has previously had it's type information examined to * determine if it is elligable for proxying. Meaning [EMAIL PROTECTED] #canProxy()} should * be a real value. Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/PropertySpecification.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/PropertySpecification.java?view=diff&rev=510514&r1=510513&r2=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/PropertySpecification.java (original) +++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/PropertySpecification.java Thu Feb 22 05:48:00 2007 @@ -34,6 +34,8 @@ private String _type; + private boolean _isGeneric; + private String _initialValue; private String _persistence; @@ -90,6 +92,16 @@ _type = type; } + public void setGeneric(boolean isGeneric) + { + _isGeneric = isGeneric; + } + + public boolean isGeneric() + { + return _isGeneric; + } + /** @since 4.0 */ public String getPersistence() { Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/AbstractBase.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/AbstractBase.java?view=diff&rev=510514&r1=510513&r2=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/AbstractBase.java (original) +++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/AbstractBase.java Thu Feb 22 05:48:00 2007 @@ -26,4 +26,4 @@ public abstract class AbstractBase { public abstract void foo(); -} \ No newline at end of file +} Added: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/AbstractGenericBase.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/AbstractGenericBase.java?view=auto&rev=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/AbstractGenericBase.java (added) +++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/AbstractGenericBase.java Thu Feb 22 05:48:00 2007 @@ -0,0 +1,29 @@ +// Copyright 2004, 2005 The Apache Software Foundation +// +// Licensed 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 org.apache.tapestry.enhance; + + + +/** + * Tests generic interfaces functionality. + */ +public abstract class AbstractGenericBase<E extends SimpleGeneric> +{ + + public abstract E getValue(); + + public abstract void setSomethingCrazy(E val); + + public abstract E getOperationValue(); +} Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/EnhancedClassValidatorTest.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/EnhancedClassValidatorTest.java?view=diff&rev=510514&r1=510513&r2=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/EnhancedClassValidatorTest.java (original) +++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/EnhancedClassValidatorTest.java Thu Feb 22 05:48:00 2007 @@ -35,13 +35,14 @@ * methods. */ - public void testComplete() + public void test_Complete() { - EnhancedClassValidator v = new EnhancedClassValidatorImpl(); - + EnhancedClassValidatorImpl v = new EnhancedClassValidatorImpl(); + v.setClassInspector(new ClassInspectorImpl()); + v.validate(AbstractBase.class, Complete.class, new ComponentSpecification()); } - + /** * Pass in an abstract class (with enhancement, its possible that a supposedly concrete class * may omit implementing an inherited abstract method, which is the whole point of the @@ -68,6 +69,7 @@ replay(); EnhancedClassValidatorImpl v = new EnhancedClassValidatorImpl(); + v.setClassInspector(new ClassInspectorImpl()); v.setErrorLog(log); v.validate(AbstractBase.class, Incomplete.class, spec); @@ -75,7 +77,7 @@ verify(); } - public void testInheritsMissingMethod() + public void test_Inherits_Missing_Method() { ErrorLog log = newErrorLog(); Location l = newLocation(); @@ -96,6 +98,7 @@ EnhancedClassValidatorImpl v = new EnhancedClassValidatorImpl(); v.setErrorLog(log); + v.setClassInspector(new ClassInspectorImpl()); v.validate(AbstractRunnable.class, AbstractRunnableSubclass.class, spec); @@ -114,7 +117,8 @@ public void testObject() { - EnhancedClassValidator v = new EnhancedClassValidatorImpl(); + EnhancedClassValidatorImpl v = new EnhancedClassValidatorImpl(); + v.setClassInspector(new ClassInspectorImpl()); v.validate(Object.class, Object.class, new ComponentSpecification()); } Added: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/FooGeneric.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/FooGeneric.java?view=auto&rev=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/FooGeneric.java (added) +++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/FooGeneric.java Thu Feb 22 05:48:00 2007 @@ -0,0 +1,27 @@ +// Copyright 2004, 2005 The Apache Software Foundation +// +// Licensed 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 org.apache.tapestry.enhance; + + +/** + * + */ +public class FooGeneric implements SimpleGeneric +{ + + public boolean isGeneric() + { + return true; + } +} Added: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/FooGenericComponent.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/FooGenericComponent.java?view=auto&rev=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/FooGenericComponent.java (added) +++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/FooGenericComponent.java Thu Feb 22 05:48:00 2007 @@ -0,0 +1,34 @@ +// Copyright 2004, 2005 The Apache Software Foundation +// +// Licensed 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 org.apache.tapestry.enhance; + +import java.util.Map; + + +/** + * + */ +public abstract class FooGenericComponent extends AbstractGenericBase<FooGeneric> +{ + + public Map getMap() + { + return null; + } + + public FooGeneric getOperationValue() + { + return null; + } +} Added: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/MethodSignatureTest.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/MethodSignatureTest.java?view=auto&rev=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/MethodSignatureTest.java (added) +++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/MethodSignatureTest.java Thu Feb 22 05:48:00 2007 @@ -0,0 +1,113 @@ +// Copyright 2004, 2005 The Apache Software Foundation +// +// Licensed 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 org.apache.tapestry.enhance; + +import java.util.Map; + +import org.testng.annotations.Test; + +import com.javaforge.tapestry.testng.TestBase; + + +/** + * Tests functionality of [EMAIL PROTECTED] MethodSignature} implementations. + */ [EMAIL PROTECTED] +public class MethodSignatureTest extends TestBase +{ + // used for non generic tests + class Simple { + + public String getValue() + { + return "foo"; + } + + public void setMax(Integer val) + { + } + } + + public void test_Simple_Properties() + { + ClassInspector ins = new ClassInspectorImpl(); + + MethodSignature sig = ins.getPropertyAccessor(Simple.class, "value"); + + assert sig != null; + assertEquals(sig.getReturnType(), String.class); + + sig = ins.getPropertyAccessor(Simple.class, "max"); + + assert sig != null; + assertEquals(sig.getReturnType(), void.class); + assertEquals(sig.getParameterTypes().length, 1); + assertEquals(sig.getParameterTypes()[0], Integer.class); + } + + public void test_Generic_Properties() + { + ClassInspector ins = new GenericsClassInspectorImpl(); + + MethodSignature sig = ins.getPropertyAccessor(FooGenericComponent.class, "value"); + + assert sig != null; + assertEquals(sig.getReturnType(), FooGeneric.class); + } + + public void test_Generic_Parameters() + { + ClassInspector ins = new GenericsClassInspectorImpl(); + + MethodSignature sig = ins.getPropertyAccessor(FooGenericComponent.class, "somethingCrazy"); + + assert sig != null; + assertEquals(sig.getReturnType(), void.class); + assert sig.getParameterTypes() != null && sig.getParameterTypes().length > 0; + assertEquals(sig.getParameterTypes()[0], FooGeneric.class); + + sig = ins.getPropertyAccessor(AbstractGenericBase.class, "somethingCrazy"); + + assert sig != null; + assertEquals(sig.getReturnType(), void.class); + assert sig.getParameterTypes() != null && sig.getParameterTypes().length > 0; + assertEquals(sig.getParameterTypes()[0], SimpleGeneric.class); + } + + public void test_Generic_Simple_Property() + { + ClassInspector ins = new GenericsClassInspectorImpl(); + + MethodSignature sig = ins.getPropertyAccessor(FooGenericComponent.class, "map"); + + assert sig != null; + assertEquals(sig.getReturnType(), Map.class); + } + + public void test_Generic_Inheritance() + { + ClassInspector ins = new GenericsClassInspectorImpl(); + + MethodSignature child = ins.getPropertyAccessor(FooGenericComponent.class, "operationValue"); + MethodSignature base = ins.getPropertyAccessor(AbstractGenericBase.class, "operationValue"); + + assert child != null; + assert base != null; + + assert child.isOverridingSignatureOf(base); + + assert child.equals(base); + assert base.equals(child); + } +} Added: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/SimpleGeneric.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/SimpleGeneric.java?view=auto&rev=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/SimpleGeneric.java (added) +++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/SimpleGeneric.java Thu Feb 22 05:48:00 2007 @@ -0,0 +1,24 @@ +// Copyright 2004, 2005 The Apache Software Foundation +// +// Licensed 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 org.apache.tapestry.enhance; + + +/** + * + */ +public interface SimpleGeneric +{ + + boolean isGeneric(); +} Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/TestAutowireWorker.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/TestAutowireWorker.java?view=diff&rev=510514&r1=510513&r2=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/TestAutowireWorker.java (original) +++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/TestAutowireWorker.java Thu Feb 22 05:48:00 2007 @@ -31,24 +31,22 @@ * @author James Carman * */ [EMAIL PROTECTED](sequential = true) public class TestAutowireWorker extends BaseEnhancementTestCase { private static final String HELLO_SERVICE_PROPERTY = "helloService"; - - @Test(alwaysRun = true) + public void test_No_Service() throws Exception { assertNotAutowired( RegistryBuilder.constructDefaultRegistry() ); } - @Test public void test_Many_Services() throws Exception { assertNotAutowired( buildFrameworkRegistry("autowire-multiple.xml" ) ); } - @Test public void test_One_Service() throws Exception { final Registry registry = buildFrameworkRegistry("autowire-single.xml" ); Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/TestEnhancementOperation.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/TestEnhancementOperation.java?view=diff&rev=510514&r1=510513&r2=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/TestEnhancementOperation.java (original) +++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/TestEnhancementOperation.java Thu Feb 22 05:48:00 2007 @@ -885,9 +885,8 @@ ClassFactory cf = newClassFactory(ServiceLink.class); replay(); - - EnhancementOperation eo = new EnhancementOperationImpl(new DefaultClassResolver(), spec, - ServiceLink.class, cf, null); + + EnhancementOperation eo = new EnhancementOperationImpl(new DefaultClassResolver(), spec, ServiceLink.class, cf, null); assertEquals(String.class, eo.getPropertyType("target")); @@ -927,4 +926,5 @@ verify(); } + } Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/TestSpecifiedPropertyWorker.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/TestSpecifiedPropertyWorker.java?view=diff&rev=510514&r1=510513&r2=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/TestSpecifiedPropertyWorker.java (original) +++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/enhance/TestSpecifiedPropertyWorker.java Thu Feb 22 05:48:00 2007 @@ -27,6 +27,7 @@ import org.apache.hivemind.ErrorLog; import org.apache.hivemind.Location; import org.apache.hivemind.service.BodyBuilder; +import org.apache.hivemind.service.ClassFabUtils; import org.apache.hivemind.service.MethodSignature; import org.apache.tapestry.BaseComponent; import org.apache.tapestry.BaseComponentTestCase; @@ -258,6 +259,12 @@ BodyBuilder b = new BodyBuilder(); b.begin(); + + b.addln("if ($1 != null && org.apache.tapestry.record.ObservedProperty.class.isAssignableFrom($1.getClass())) {"); + b.add(" $1 = (" + ClassFabUtils.getJavaClassName(String.class) + ")((org.apache.tapestry.record.ObservedProperty)$1)"); + b.addln(".getCGProperty();"); + b.addln("}"); + b.addln("org.apache.tapestry.Tapestry#fireObservedChange(this, \"barney\", ($w) $1);"); b.addln("_$barney = $1;"); b.end(); Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/record/TestPropertyChangeObserver.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/record/TestPropertyChangeObserver.java?view=diff&rev=510514&r1=510513&r2=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/record/TestPropertyChangeObserver.java (original) +++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/record/TestPropertyChangeObserver.java Thu Feb 22 05:48:00 2007 @@ -229,6 +229,13 @@ assert state.getClass() != newState.getClass(); assert enewState.getClass() == state2.getClass(); + assert ObservedProperty.class.isAssignableFrom(state.getClass()); + + SimpleState preEnhanced = (SimpleState)((ObservedProperty)state).getCGProperty(); + + assert preEnhanced != null; + assert !ObservedProperty.class.isAssignableFrom(preEnhanced.getClass()); + verify(); } Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/services/impl/EngineServiceOuterProxyTest.java URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/services/impl/EngineServiceOuterProxyTest.java?view=diff&rev=510514&r1=510513&r2=510514 ============================================================================== --- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/services/impl/EngineServiceOuterProxyTest.java (original) +++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/services/impl/EngineServiceOuterProxyTest.java Thu Feb 22 05:48:00 2007 @@ -25,7 +25,7 @@ * @author Howard M. Lewis Ship * @since 4.0 */ [EMAIL PROTECTED] [EMAIL PROTECTED](sequential = true) public class EngineServiceOuterProxyTest extends AbstractEngineServiceProxyTestCase { public void testToString()
