Cannot use Scala for Tapestry IOC Modules
-----------------------------------------
Key: TAP5-927
URL: https://issues.apache.org/jira/browse/TAP5-927
Project: Tapestry 5
Issue Type: Improvement
Components: tapestry-ioc
Affects Versions: 5.1.0.5
Reporter: Philip Lopez
Scala (as of 2.7.7) adds a public method $tag() to classes. It's not
particularly pretty (and $tag() is apparently deprecated) but it's there. (See
http://programming-scala.labs.oreilly.com/ch14.html#CommandLineToolDecompilers)
The (new, in 5.1.0.x) checks in
org.apache.tapestry5.ioc.internal.DefaultModuleDefImp mean that a module
implemented in Scala throws an exception on load:
java.lang.RuntimeException: Module class <MODULE_NAME> contains unrecognized
public methods: public static final int <MODULE_NAME>.$tag() throws
java.rmi.RemoteException.
It would be nice to have a way to work around this so that Scala could be used
with Tapestry IOC 5.1.0.x (including Modules). One generic approach may be to
have an @IgnoredPublicMethods annotation applicable to Module classes that took
an array of Strings that named methods that should also be removed from the
"methods" set before checking whether there are superfluous public methods. Of
course, there's always the hard-code exception too (ugly but a lot less
"investment" for this pesky incompatibility).
As an example, the following article describes Scala and Tapestry:
http://fanf42.blogspot.com/2009/02/tapestry-5-scala-view-article-in-html.html.
If you checkout the git project and update the Tapestry release version to
5.1.0.5, you'll see it fail, where in 5.0.x it worked.
The relevant code is:
109 // Want to verify that every public method is meaningful to
Tapestry IoC. Remaining methods might
110 // have typos, i.e., "createFoo" that should be "buildFoo".
111
112 Set<Method> methods =
CollectionFactory.newSet(moduleClass.getMethods());
113
114 methods.removeAll(OBJECT_METHODS);
115
116 boolean modulePreventsServiceDecoration =
moduleClass.getAnnotation(PreventServiceDecoration.class) != null;
117
118 grind(methods, modulePreventsServiceDecoration);
119 bind(methods, modulePreventsServiceDecoration);
120
121 if (methods.isEmpty()) return;
122
123 throw new RuntimeException(String.format("Module class %s
contains unrecognized public methods: %s.",
124 moduleClass.getName(),
125
InternalUtils.joinSorted(methods)));
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.