A simple example : databinding
Lets consider I want to bind some Label text to some model Bean value. Gwt
Label widget "text" can be accessed as a javaBean property, so this sound a
typical java.beans.binding use-case

This requires my model bean to support PropertyChangeListeners. As I'm lazy
I'd like a generator to create an "enhanced" model class with such support
for the "value" property.

I can get this to work today if my model Bean is created using GWT.create(),
but this makes my code GWT-dependant and not testable in "standalone" junit.
If the generator "enhanced" class is used even when I use " new Model() " or
get a Model bean from RPC, my code can be easily unit tested.

Cheers,
Nicolas

2009/4/21 Bruce Johnson <br...@google.com>

> On Tue, Apr 21, 2009 at 12:38 PM, nicolas de loof <
> nicolas.del...@gmail.com> wrote:
>
>> The only critism I'd have is the requirement to use GWT.create() to get
>> code from a generator. This is a requirement when the generated code doesn't
>> extend the source type (for example for Async interfaces) but not when the
>> genrator is used to add some capabilities (ie acts as a decorator), for
>> example to add PropertyChangeListener to a model bean.
>>
>
> Perhaps if you could distill down a more concrete example, it could get the
> wheels turning. Enhancements to GWT.create() certainly aren't off the table.
> Ray Cromwell has made some pretty useful-sounding suggestions in the past.
> We just have to find large-group consensus on what makes the most sense,
> striking a balance between power, clarity, and of course, optimizability.
>
> Here's a quick back-of-envelope pattern that could possibly work:
>
> class PersonBean {
>   void setName(String name):
>   String getName();
> }
>
> interface MethodCallLogger {
> }
>
> class MyEntryPoint {
>   class PersonBeanWithMethodCallLogger extends PersonBean implements
> MethodCallLogger {
>     // empty, but a subclass gets generated
>   }
>
>   public void onModuleLoad() {
>     // Have a generate-with rule for MethodCallLoggerGenerator, triggered
> by assignability to "MethodCallLogger"
>     PersonBean pb = GWT.create(PersonBeanWithMethodCallLogger.class);
>     pb.setName("Nicolas");
>   }
> }
>
> // Generated...
> class PersonBeanWithMethodCallLoggerImpl extends
> PersonBeanWithMethodCallLogger {
>   void setName(String name) {
>     someLogger.log("setName('" + name + "') called");
>     super.setName(name);
>   }
>
>   ...
> }
>
> As formulated above, this pattern doesn't compose well. But it might be
> that we can forge a pattern like this into something everyone likes
> eventually.
>
> -- Bruce
>
>
>>
>> This makes unit testing more difficult as code that uses GWT.create cannot
>> run in "classic" jUnit. It would be great to have the compiler use
>> generator-extended classes even when created using the standard "new"
>> keyword.
>>
>> Thanks a lot for the explanation.
>> Nicolas
>>
>> 2009/4/21 Bruce Johnson <br...@google.com>
>>
>> A sort of philosophical meta-point that may or may not be of interest...
>>>
>>> When we started GWT, we were worried about managing the complexity of
>>> compile-time code generation, so we tried to find the simplest, most
>>> easy-to-debug approach we could think of. GWT's model of never changing
>>> existing code[1], but only adding new Java source during the compile, is
>>> really a design choice, not a technical limitation. The benefit of the
>>> current design is that you can add -gen to hosted mode and map the
>>> corresponding folder into your source path, and then easily step through all
>>> your code, both handwritten and generated, in the debugger. This avoids
>>> tricky or confusing situations wherein the source code you see appears to be
>>> doing something different than the bytecode that's running. It seems good to
>>> avoid that kind of dichotomy, on the principle that
>>> straightforward-though-verbose is generally better than fancy-but-confusing.
>>>
>>> [1] Overlay types were the first time we ever even did bytecode
>>> rewriting, and that support is implemented at a very deep level. Also, JSOs
>>> are intended to be among only a very few "magic" things in GWT (basically,
>>> JSNI, GWT.create(), GWT.runAsync(), and JSOs). We went to a lot of effort to
>>> ensure that JSOs worked according to a fixed set of rules that are not hard
>>> to comply with, even if people don't fully understand why the implementation
>>> requires it.
>>>
>>>
>>> On Mon, Apr 20, 2009 at 11:11 AM, Thomas Broyer <t.bro...@gmail.com>wrote:
>>>
>>>>
>>>>
>>>>
>>>> On 20 avr, 08:43, nicolas de loof <nicolas.del...@gmail.com> wrote:
>>>> > > > I wonder if there is any way to also "pre-process" Java sources,
>>>> for
>>>> > > example
>>>> > > > this would enable support for Aspect Oriented Programming or maybe
>>>> some
>>>> > > > DataBinding framework.
>>>> >
>>>> > > Depends what you mean by "pre-process"... Generally, generators
>>>> > > analyze the class they're called for (for example, looking for
>>>> > > specific annotations on methods or on the class itself) and
>>>> according
>>>> > > to this generate a Java class extending the one they've been called
>>>> > > for.
>>>> > > (is this understandable? is this at least no-so-bad english?)
>>>> >
>>>> > In many case the generator will create from MyClassX some MyClassXImpl
>>>> or
>>>> > equivalent that extends the original one, bu not REPLACE it as Java
>>>> source.
>>>> > This is what I mean by "pre-process".
>>>> >
>>>> > For example, to implement a AOP framework I'd like to instrument all
>>>> calls
>>>> > to some method. For this reason I'd like a generator / pre-processor
>>>> to
>>>> > check the source files and detect the matching pointcuts to add some
>>>> adived
>>>> > code. Many other example can apply, including annotation processing
>>>> for
>>>> > declarative coding (ex : @Property annotation to automagically
>>>> introduce the
>>>> > required PropertyChangeListeners)
>>>>
>>>> You would generate a subclass that delegates to super.method() after/
>>>> before the aspect(s) code.
>>>>
>>>> > I never tried it myself, but I'n not sure a generator can REPLACE the
>>>> > original Java Source.
>>>>
>>>> AFAICT, it can't, but there's probably no need for this.
>>>>
>>>> > I may be wrong but I also thing the generated code is
>>>> > only available when using   GWT.create(),
>>>>
>>>> The generator is only called at the point where GWT.create() is called
>>>> (I may be wrong but you could generate a different output for each
>>>> GWT.create() call-point for the same class literal), so yes, you're
>>>> right.
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>
>>
>>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---

Reply via email to