You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2005/10/02 13:52:00 UTC
svn commit: r293093 - in /jakarta/tapestry/trunk: ./
framework/src/java/org/apache/tapestry/enhance/
framework/src/test/org/apache/tapestry/enhance/
Author: hlship
Date: Sun Oct 2 04:51:52 2005
New Revision: 293093
URL: http://svn.apache.org/viewcvs?rev=293093&view=rev
Log:
TAPESTRY-344: Unimplemented abstract method check broken
Added:
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/AbstractBase.java
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/AbstractRunnable.java
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/AbstractRunnableSubclass.java
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/Complete.java
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/EnhancedClassValidatorTest.java
- copied, changed from r292042, jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/TestEnhancedClassValidator.java
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/Incomplete.java
Removed:
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/TestEnhancedClassValidator.java
Modified:
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/enhance/EnhanceMessages.java
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/enhance/EnhanceStrings.properties
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/enhance/EnhancedClassValidatorImpl.java
jakarta/tapestry/trunk/status.xml
Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/enhance/EnhanceMessages.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/enhance/EnhanceMessages.java?rev=293093&r1=293092&r2=293093&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/enhance/EnhanceMessages.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/enhance/EnhanceMessages.java Sun Oct 2 04:51:52 2005
@@ -33,11 +33,20 @@
{
private final static MessageFormatter _formatter = new MessageFormatter(EnhanceMessages.class);
- static String noImplForAbstractMethod(Method method, Class declareClass, String className,
+ static String noImplForAbstractMethod(Method method, Class declareClass, Class baseClass,
Class enhancedClass)
{
return _formatter.format("no-impl-for-abstract-method", new Object[]
- { method, declareClass.getName(), className, enhancedClass.getName() });
+ { method, declareClass.getName(), baseClass.getName(), enhancedClass.getName() });
+ }
+
+ static String unimplementedInterfaceMethod(Method method, Class baseClass, Class enhancedClass)
+ {
+ return _formatter.format(
+ "unimplemented-interface-method",
+ method,
+ baseClass.getName(),
+ enhancedClass.getName());
}
static String unabelToIntrospectClass(Class targetClass, Throwable cause)
Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/enhance/EnhanceStrings.properties
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/enhance/EnhanceStrings.properties?rev=293093&r1=293092&r2=293093&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/enhance/EnhanceStrings.properties (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/enhance/EnhanceStrings.properties Sun Oct 2 04:51:52 2005
@@ -13,6 +13,7 @@
# limitations under the License.
no-impl-for-abstract-method=Method ''{0}'' (declared in class {1}) has no implementation in class {2} (or enhanced subclass {3}).
+unimplemented-interface-method=Method ''{0}'' has no implementation in class {1} (or enhanced subclass {2}).
property-type-mismatch=Unable to enhance class {0} because it contains property {1} of type {2}, not the expected type {3}.
unable-to-introspect-class=Unable to introspect properties of class {0}: {1}
error-adding-property=Error adding property {0} to class {1}: {2}
Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/enhance/EnhancedClassValidatorImpl.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/enhance/EnhancedClassValidatorImpl.java?rev=293093&r1=293092&r2=293093&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/enhance/EnhancedClassValidatorImpl.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/enhance/EnhancedClassValidatorImpl.java Sun Oct 2 04:51:52 2005
@@ -16,10 +16,14 @@
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
import org.apache.hivemind.ErrorLog;
+import org.apache.hivemind.Location;
import org.apache.hivemind.service.MethodSignature;
import org.apache.tapestry.spec.IComponentSpecification;
@@ -37,6 +41,8 @@
public void validate(Class baseClass, Class enhancedClass, IComponentSpecification specification)
{
Set implementedMethods = new HashSet();
+ List interfaceQueue = new ArrayList();
+ Location location = specification.getLocation();
Class current = enhancedClass;
@@ -57,31 +63,62 @@
if (implementedMethods.contains(s))
continue;
- _errorLog.error(EnhanceMessages.noImplForAbstractMethod(m, current, baseClass
- .getName(), enhancedClass), specification.getLocation(), null);
+ _errorLog.error(EnhanceMessages.noImplForAbstractMethod(
+ m,
+ current,
+ baseClass,
+ enhancedClass), location, null);
}
implementedMethods.add(s);
}
- // An earlier version of this code walked the interfaces directly,
- // but it appears that implementing an interface actually
- // puts abstract method declarations into the class
- // (at least, in terms of what getDeclaredMethods() returns).
+ interfaceQueue.addAll(Arrays.asList(current.getInterfaces()));
- // March up to the super class.
+ // Did an earlier JDK include methods from interfaces in
+ // getDeclaredMethods()? The old code here seemed to indicate
+ // that was the case, but it certainly is no longer, that's why
+ // we add all the interfaces to a queue to check after the rest.
current = current.getSuperclass();
- // Once advanced up to a concrete class, we trust that
- // the compiler did its checking. Alternately, if
- // we started on java.lang.Object for some reason, current
- // will be null and we can stop.S
+ // We need to run straight to the top, to find all the implemented methods.
- if (current == null || !Modifier.isAbstract(current.getModifiers()))
+ if (current == null)
break;
}
+ while (!interfaceQueue.isEmpty())
+ {
+ Class thisInterface = (Class) interfaceQueue.remove(0);
+
+ checkAllInterfaceMethodsImplemented(
+ thisInterface,
+ baseClass,
+ enhancedClass,
+ implementedMethods,
+ location);
+ }
+
+ }
+
+ private void checkAllInterfaceMethodsImplemented(Class interfaceClass, Class baseClass,
+ Class enhancedClass, Set implementedMethods, Location location)
+ {
+ // Get all methods defined by the interface, or its super-interfaces
+
+ Method[] methods = interfaceClass.getMethods();
+
+ for (int i = 0; i < methods.length; i++)
+ {
+ MethodSignature sig = new MethodSignature(methods[i]);
+
+ if (!implementedMethods.contains(sig))
+ _errorLog.error(EnhanceMessages.unimplementedInterfaceMethod(
+ methods[i],
+ baseClass,
+ enhancedClass), location, null);
+ }
}
public void setErrorLog(ErrorLog errorLog)
Added: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/AbstractBase.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/AbstractBase.java?rev=293093&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/AbstractBase.java (added)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/AbstractBase.java Sun Oct 2 04:51:52 2005
@@ -0,0 +1,29 @@
+// Copyright 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;
+
+/**
+ * Used by {@link org.apache.tapestry.enhance.EnhancedClassValidatorTest}.
+ *
+ * @author Howard M. Lewis Ship
+ * @since 4.0
+ */
+public abstract class AbstractBase
+{
+ public abstract void foo();
+}
\ No newline at end of file
Added: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/AbstractRunnable.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/AbstractRunnable.java?rev=293093&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/AbstractRunnable.java (added)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/AbstractRunnable.java Sun Oct 2 04:51:52 2005
@@ -0,0 +1,26 @@
+// Copyright 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;
+
+/**
+ * Used by {@link org.apache.tapestry.enhance.EnhancedClassValidatorTest}.
+ *
+ * @author Howard M. Lewis Ship
+ * @since 4.0
+ */
+public abstract class AbstractRunnable implements Runnable
+{
+
+}
Added: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/AbstractRunnableSubclass.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/AbstractRunnableSubclass.java?rev=293093&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/AbstractRunnableSubclass.java (added)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/AbstractRunnableSubclass.java Sun Oct 2 04:51:52 2005
@@ -0,0 +1,26 @@
+// Copyright 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;
+
+/**
+ * Used by {@link org.apache.tapestry.enhance.EnhancedClassValidatorTest}.
+ *
+ * @author Howard M. Lewis Ship
+ * @since 4.0
+ */
+public abstract class AbstractRunnableSubclass extends AbstractRunnable
+{
+
+}
Added: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/Complete.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/Complete.java?rev=293093&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/Complete.java (added)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/Complete.java Sun Oct 2 04:51:52 2005
@@ -0,0 +1,32 @@
+// Copyright 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;
+
+/**
+ * Used by {@link org.apache.tapestry.enhance.EnhancedClassValidatorTest}.
+ *
+ * @author Howard M. Lewis Ship
+ * @since 4.0
+ */
+public class Complete extends AbstractBase
+{
+ public void foo()
+ {
+ //
+ }
+}
\ No newline at end of file
Copied: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/EnhancedClassValidatorTest.java (from r292042, jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/TestEnhancedClassValidator.java)
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/EnhancedClassValidatorTest.java?p2=jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/EnhancedClassValidatorTest.java&p1=jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/TestEnhancedClassValidator.java&r1=292042&r2=293093&rev=293093&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/TestEnhancedClassValidator.java (original)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/EnhancedClassValidatorTest.java Sun Oct 2 04:51:52 2005
@@ -15,10 +15,11 @@
package org.apache.tapestry.enhance;
import org.apache.hivemind.ErrorLog;
+import org.apache.hivemind.Locatable;
import org.apache.hivemind.Location;
import org.apache.hivemind.test.HiveMindTestCase;
+import org.apache.tapestry.spec.ComponentSpecification;
import org.apache.tapestry.spec.IComponentSpecification;
-import org.easymock.MockControl;
/**
* Tests for {@link org.apache.tapestry.enhance.EnhancedClassValidatorImpl}.
@@ -26,29 +27,8 @@
* @author Howard M. Lewis Ship
* @since 4.0
*/
-public class TestEnhancedClassValidator extends HiveMindTestCase
+public class EnhancedClassValidatorTest extends HiveMindTestCase
{
- public static abstract class AbstractBase
- {
- public abstract void foo();
- }
-
- public static abstract class Incomplete extends AbstractBase
- {
- public void bar()
- {
- //
- }
- }
-
- public static class Complete extends AbstractBase
- {
- public void foo()
- {
- //
- }
- }
-
/**
* Test for a class that fulfills its requirements (by implementing all inherited abstract
* methods.
@@ -58,7 +38,7 @@
{
EnhancedClassValidator v = new EnhancedClassValidatorImpl();
- v.validate(AbstractBase.class, Complete.class, null);
+ v.validate(AbstractBase.class, Complete.class, new ComponentSpecification());
}
/**
@@ -69,18 +49,18 @@
public void testIncomplete()
{
- ErrorLog log = (ErrorLog) newMock(ErrorLog.class);
- Location l = fabricateLocation(11);
+ ErrorLog log = newErrorLog();
+ Location l = newLocation();
- MockControl specControl = newControl(IComponentSpecification.class);
- IComponentSpecification spec = (IComponentSpecification) specControl.getMock();
+ IComponentSpecification spec = newSpec();
- spec.getLocation();
- specControl.setReturnValue(l);
+ trainGetLocation(spec, l);
log
.error(
- "Method 'public abstract void org.apache.tapestry.enhance.TestEnhancedClassValidator$AbstractBase.foo()' (declared in class org.apache.tapestry.enhance.TestEnhancedClassValidator$AbstractBase) has no implementation in class org.apache.tapestry.enhance.TestEnhancedClassValidator$AbstractBase (or enhanced subclass org.apache.tapestry.enhance.TestEnhancedClassValidator$Incomplete).",
+ "Method 'public abstract void org.apache.tapestry.enhance.AbstractBase.foo()' "
+ + "(declared in class org.apache.tapestry.enhance.AbstractBase) has no implementation in class "
+ + "org.apache.tapestry.enhance.AbstractBase (or enhanced subclass org.apache.tapestry.enhance.Incomplete).",
l,
null);
@@ -94,6 +74,49 @@
verifyControls();
}
+ public void testInheritsMissingMethod()
+ {
+ ErrorLog log = newErrorLog();
+ Location l = newLocation();
+
+ IComponentSpecification spec = newSpec();
+
+ trainGetLocation(spec, l);
+
+ log
+ .error(
+ "Method 'public abstract void java.lang.Runnable.run()' "
+ + "has no implementation in class org.apache.tapestry.enhance.AbstractRunnable "
+ + "(or enhanced subclass org.apache.tapestry.enhance.AbstractRunnableSubclass).",
+ l,
+ null);
+
+ replayControls();
+
+ EnhancedClassValidatorImpl v = new EnhancedClassValidatorImpl();
+ v.setErrorLog(log);
+
+ v.validate(AbstractRunnable.class, AbstractRunnableSubclass.class, spec);
+
+ verifyControls();
+ }
+
+ private void trainGetLocation(Locatable locatable, Location location)
+ {
+ locatable.getLocation();
+ setReturnValue(locatable, location);
+ }
+
+ private IComponentSpecification newSpec()
+ {
+ return (IComponentSpecification) newMock(IComponentSpecification.class);
+ }
+
+ private ErrorLog newErrorLog()
+ {
+ return (ErrorLog) newMock(ErrorLog.class);
+ }
+
/**
* Ensures that the code works when passed java.lang.Object (which has different inheritance
* than other classes.
@@ -103,6 +126,6 @@
{
EnhancedClassValidator v = new EnhancedClassValidatorImpl();
- v.validate(Object.class, Object.class, null);
+ v.validate(Object.class, Object.class, new ComponentSpecification());
}
}
Added: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/Incomplete.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/Incomplete.java?rev=293093&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/Incomplete.java (added)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/enhance/Incomplete.java Sun Oct 2 04:51:52 2005
@@ -0,0 +1,32 @@
+// Copyright 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;
+
+/**
+ * Used by {@link org.apache.tapestry.enhance.EnhancedClassValidatorTest}.
+ *
+ * @author Howard M. Lewis Ship
+ * @since 4.0
+ */
+public abstract class Incomplete extends AbstractBase
+{
+ public void bar()
+ {
+ //
+ }
+}
\ No newline at end of file
Modified: jakarta/tapestry/trunk/status.xml
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/status.xml?rev=293093&r1=293092&r2=293093&view=diff
==============================================================================
--- jakarta/tapestry/trunk/status.xml (original)
+++ jakarta/tapestry/trunk/status.xml Sun Oct 2 04:51:52 2005
@@ -51,7 +51,7 @@
</todo>
<changes>
<release version="4.0-beta-10" date="unreleased">
-
+ <action type="fix" dev="HLS" fixes-bug="TAPESTRY-344">Unimplemented abstract method check broken</action>
</release>
<release version="4.0-beta-9" date="Oct 1 2005">
<action type="fix" dev="DS" fixes-bug="TAPESTRY-663">Document Button component</action>
---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-dev-help@jakarta.apache.org