Hi Thomas,

I combined the RequestFactoryServlet config into one instance, and branch 
on ("if non-static method and declared from a subclass of my base Entity 
class") to wrap the call itself in @Transactional (leaving "Service Pojo" 
Requests to determine which of their methods are @Transactional or not), 
but have the same issues I described above (at least now my server side GWT 
plumbing is a bit cleaner).

For the sake of debugging, I'll post the steps I take and resultant wire 
data below. If there's anything I can test and/or provide, let me know.

1. Load WineProxy and stage for edit via InstanceRequest.find(stableId()):

>>> 
{"F":"ws.web.shared.bindery.WineServiceRequestFactory","I":[{"O":"?","P":[{"S":"IjMi","T":"OPi7mudJuUS2QND9fE2xUf7Oo4I="}],"R":["wineType","estates.producer","mainEstate.producer","mainEstate.origin.appellation","mainEstate.origin.region","mainEstate.origin.subRegion","mainEstate.origin.originCountry","varietalComponents.id","varietalComponents.varietal"]}]}

<<< 
{"S":[true],"O":[{"T":"Rglf5pMW5kFN$TOzH6q0GhrHRys=","V":"MS4w","P":{"id":"637","name":"Côtes
 
du 
Rhône"},"S":"IjYzNyI=","O":"UPDATE"},{"T":"oZUy$OYUkgKfvuqnqmCIhHeChmI=","V":"MS4w","P":{"id":"194","name":"Chardonnay","wineType":1,"profile":""},"S":"IjE5NCI=","O":"UPDATE"},{"T":"jFwa66QILJFT494o4Fl_HHh4RaI=","V":"MC4w","P":{"id":"13","name":"France"},"S":"IjEzIg==","O":"UPDATE"},{"T":"W8dRM5FtHdJIAt2i6mFy98KdIF8=","V":"MS4w","P":{"id":"138","name":"Rhône"},"S":"IjEzOCI=","O":"UPDATE"},{"T":"7k4WXcrjIt8yA19bZ4wZpkdvoRA=","V":"MC4w","P":{"varietal":{"T":"oZUy$OYUkgKfvuqnqmCIhHeChmI=","S":"IjE5NCI="},"id":{"T":"98umNTSsoLc6SjKgecg_UJ8QcgA=","R":"2","Y":2}},"S":"eyJPIjpbeyJUIjoiOTh1bU5UU3NvTGM2U2pLZ2VjZ19VSjhRY2dBPSIsIlAiOnt9LCJSIjoiMiIsIlkiOjF9XSwiSSI6W3siUCI6W3siVCI6Ijk4dW1OVFNzb0xjNlNqS2dlY2dfVUo4UWNnQT0iLCJSIjoiMiIsIlkiOjF9XX1dfQ==","O":"UPDATE"},{"T":"OPi7mudJuUS2QND9fE2xUf7Oo4I=","V":"My4w","P":{"id":"3","varietalComponents":[{"T":"7k4WXcrjIt8yA19bZ4wZpkdvoRA=","S":"eyJPIjpbeyJUIjoiOTh1bU5UU3NvTGM2U2pLZ2VjZ19VSjhRY2dBPSIsIlAiOnt9LCJSIjoiMiIsIlkiOjF9XSwiSSI6W3siUCI6W3siVCI6Ijk4dW1OVFNzb0xjNlNqS2dlY2dfVUo4UWNnQT0iLCJSIjoiMiIsIlkiOjF9XX1dfQ=="}],"estates":[{"T":"Vqxe_RlQJX28$GxeJByGamu4OTk=","S":"Ijg1MjYi"}],"vintage":"2009","wineType":0,"displayName":"2009
 
Gilles Ferran - France, Rhône, Côtes du 
Rhône","varietalComponentsShortName":"Chardonnay","mainEstate":{"T":"Vqxe_RlQJX28$GxeJByGamu4OTk=","S":"Ijg1MjYi"}},"S":"IjMi","O":"UPDATE"},{"T":"Vqxe_RlQJX28$GxeJByGamu4OTk=","V":"My4w","P":{"id":"8526","name":"Gilles
 
Ferran","producer":{"T":"6ii4rVbu7YQPvm45Tik$ZR5YAw8=","S":"IjgyNzQi"},"origin":{"T":"H0c_n4HS3FqVwOgiGOZdHjNB4O4=","R":"2","Y":1}},"S":"Ijg1MjYi","O":"UPDATE"},{"T":"6ii4rVbu7YQPvm45Tik$ZR5YAw8=","V":"Mi4w","P":{"id":"8274","displayName":"Gilles
 
Ferran"},"S":"IjgyNzQi","O":"UPDATE"},{"T":"98umNTSsoLc6SjKgecg_UJ8QcgA=","P":{},"R":"2","Y":2},{"T":"H0c_n4HS3FqVwOgiGOZdHjNB4O4=","P":{"region":{"T":"W8dRM5FtHdJIAt2i6mFy98KdIF8=","S":"IjEzOCI="},"originCountry":{"T":"jFwa66QILJFT494o4Fl_HHh4RaI=","S":"IjEzIg=="},"appellation":{"T":"Rglf5pMW5kFN$TOzH6q0GhrHRys=","S":"IjYzNyI="},"originDisplayName":"France
 
- 
Rhône"},"R":"2","Y":1}],"I":[{"T":"OPi7mudJuUS2QND9fE2xUf7Oo4I=","S":"IjMi"}]}


2. Query "Selector" input for VarietalProxies and choose one (many were 
returned, only showing the one I selected and "hold" until save; the 
querying is done to a called a data service pojo that handles my "selector" 
queries)

>>> 
{"F":"ws.web.shared.bindery.WineServiceRequestFactory","I":[{"O":"df2QO3_6k4y6pWfJVgM4lxIy948=","P":["Pinot
 
Gr",20]}]}

<<< 
{"S":[true],"O":[{"T":"oZUy$OYUkgKfvuqnqmCIhHeChmI=","V":"MS4w","P":{"id":"791","name":"Pinot
 
Gris","wineType":1,"profile":""},"S":"Ijc5MSI=","O":"UPDATE"}],"I":[[{"T":"oZUy$OYUkgKfvuqnqmCIhHeChmI=","S":"Ijc5MSI="}]]
}


3. On "save" user action
 3a. create new VarietalComponentProxy instance 
 3b. take the held VarietalProxy instance and set it into the newly created 
VCP
 3c. add that VCP to the "varietalComponents" ListEditor
 3d. call fire() on the RequestContext from 
InstanceRequest.approve().using(WineProxy):

>>> 
{"F":"ws.web.shared.bindery.WineInstanceRequestFactory","I":[{"O":"6KYMbi3ql_XFgB7Qhd9B3Jr2$Q4=","P":[{"S":"IjMi","T":"OPi7mudJuUS2QND9fE2xUf7Oo4I="}],"R":["estates","mainEstate.origin","approval.submittedBy","approval.approvedBy"]}],"O":[{"O":"UPDATE","S":"IjMi","T":"OPi7mudJuUS2QND9fE2xUf7Oo4I=","V":"My4w","P":{"varietalComponents":[{"S":"eyJPIjpbeyJUIjoiOTh1bU5UU3NvTGM2U2pLZ2VjZ19VSjhRY2dBPSIsIlAiOnt9LCJSIjoiMiIsIlkiOjF9XSwiSSI6W3siUCI6W3siVCI6Ijk4dW1OVFNzb0xjNlNqS2dlY2dfVUo4UWNnQT0iLCJSIjoiMiIsIlkiOjF9XX1dfQ==","T":"7k4WXcrjIt8yA19bZ4wZpkdvoRA="},{"R":"1","C":17,"T":"7k4WXcrjIt8yA19bZ4wZpkdvoRA="}]}},{"O":"UPDATE","S":"Ijg1MjYi","T":"Vqxe_RlQJX28$GxeJByGamu4OTk=","V":"My4w"},{"O":"PERSIST","R":"1","C":136,"T":"H0c_n4HS3FqVwOgiGOZdHjNB4O4=","P":{"originDisplayName":"France
 
- 
Rhône","originCountry":{"S":"IjEzIg==","T":"jFwa66QILJFT494o4Fl_HHh4RaI="},"appellation":{"S":"IjYzNyI=","T":"Rglf5pMW5kFN$TOzH6q0GhrHRys="},"region":{"S":"IjEzOCI=","T":"W8dRM5FtHdJIAt2i6mFy98KdIF8="},"subregion":null}},{"O":"UPDATE","S":"IjEzIg==","T":"jFwa66QILJFT494o4Fl_HHh4RaI=","V":"MC4w"},{"O":"UPDATE","S":"IjYzNyI=","T":"Rglf5pMW5kFN$TOzH6q0GhrHRys=","V":"MS4w"},{"O":"UPDATE","S":"IjEzOCI=","T":"W8dRM5FtHdJIAt2i6mFy98KdIF8=","V":"MS4w"},{"O":"UPDATE","S":"IjgyNzQi","T":"6ii4rVbu7YQPvm45Tik$ZR5YAw8=","V":"Mi4w"},{"O":"UPDATE","S":"eyJPIjpbeyJUIjoiOTh1bU5UU3NvTGM2U2pLZ2VjZ19VSjhRY2dBPSIsIlAiOnt9LCJSIjoiMiIsIlkiOjF9XSwiSSI6W3siUCI6W3siVCI6Ijk4dW1OVFNzb0xjNlNqS2dlY2dfVUo4UWNnQT0iLCJSIjoiMiIsIlkiOjF9XX1dfQ==","T":"7k4WXcrjIt8yA19bZ4wZpkdvoRA=","V":"MC4w"},{"O":"PERSIST","R":"1","C":135,"T":"98umNTSsoLc6SjKgecg_UJ8QcgA="},{"O":"UPDATE","S":"IjE5NCI=","T":"oZUy$OYUkgKfvuqnqmCIhHeChmI=","V":"MS4w"},{"O":"PERSIST","R":"1","C":17,"T":"7k4WXcrjIt8yA19bZ4wZpkdvoRA=","P":{"id":{"R":"1","C":18,"T":"98umNTSsoLc6SjKgecg_UJ8QcgA="},"varietal":{"S":"Ijc5MSI=","T":"oZUy$OYUkgKfvuqnqmCIhHeChmI="},"wine":{"S":"IjMi","T":"OPi7mudJuUS2QND9fE2xUf7Oo4I="}}},{"O":"PERSIST","R":"1","C":18,"T":"98umNTSsoLc6SjKgecg_UJ8QcgA="},{"O":"UPDATE","S":"Ijc5MSI=","T":"oZUy$OYUkgKfvuqnqmCIhHeChmI=","V":"MS4w"}]}

<<< 
{"S":[true],"O":[{"T":"Rglf5pMW5kFN$TOzH6q0GhrHRys=","V":"MS4w","P":{"id":"637","name":"Côtes
 
du 
Rhône"},"S":"IjYzNyI=","O":"UPDATE"},{"T":"H0c_n4HS3FqVwOgiGOZdHjNB4O4=","R":"1","C":136},{"T":"jFwa66QILJFT494o4Fl_HHh4RaI=","V":"MC4w","P":{"id":"13","name":"France"},"S":"IjEzIg==","O":"UPDATE"},{"T":"7k4WXcrjIt8yA19bZ4wZpkdvoRA=","S":"eyJPIjpbeyJUIjoiOTh1bU5UU3NvTGM2U2pLZ2VjZ19VSjhRY2dBPSIsIlAiOnt9LCJSIjoiMiIsIlkiOjF9XSwiSSI6W3siUCI6W3siVCI6Ijk4dW1OVFNzb0xjNlNqS2dlY2dfVUo4UWNnQT0iLCJSIjoiMiIsIlkiOjF9XX1dfQ=="},{"T":"ve$F9PnxOROKmY8WGxmd$WaMo8s=","V":"MC4w","P":{"id":"1","lastName":"SYSTEM","email":"[email protected]","submitter":true,"approver":true,"active":true,"firstName":"SYSTEM"},"S":"IjEi","O":"UPDATE"},{"T":"oZUy$OYUkgKfvuqnqmCIhHeChmI=","V":"MS4w","S":"Ijc5MSI=","O":"UPDATE"},{"T":"OPi7mudJuUS2QND9fE2xUf7Oo4I=","V":"My4w","P":{"id":"3","estates":[{"T":"Vqxe_RlQJX28$GxeJByGamu4OTk=","S":"Ijg1MjYi"}],"vintage":"2009","approval":{"T":"Evq5qwLVzHIwYkk_bot_q0in1CY=","R":"2","Y":1},"wineType":0,"displayName":"2009
 
Gilles Ferran - France, Rhône, Côtes du 
Rhône","varietalComponentsShortName":"Pinot 
Gris","mainEstate":{"T":"Vqxe_RlQJX28$GxeJByGamu4OTk=","S":"Ijg1MjYi"}},"S":"IjMi","O":"UPDATE"},{"T":"98umNTSsoLc6SjKgecg_UJ8QcgA=","R":"1","C":135},{"T":"H0c_n4HS3FqVwOgiGOZdHjNB4O4=","P":{"region":{"T":"W8dRM5FtHdJIAt2i6mFy98KdIF8=","S":"IjEzOCI="},"originCountry":{"T":"jFwa66QILJFT494o4Fl_HHh4RaI=","S":"IjEzIg=="},"appellation":{"T":"Rglf5pMW5kFN$TOzH6q0GhrHRys=","S":"IjYzNyI="},"originDisplayName":"France
 
- 
Rhône"},"R":"2","Y":2},{"T":"Evq5qwLVzHIwYkk_bot_q0in1CY=","P":{"submittedOn":"1359322479397","approved":true,"approvedBy":{"T":"ve$F9PnxOROKmY8WGxmd$WaMo8s=","S":"IjEi"},"submittedBy":{"T":"ve$F9PnxOROKmY8WGxmd$WaMo8s=","S":"IjEi"},"approvedOn":"1359322479398"},"R":"2","Y":1},{"T":"7k4WXcrjIt8yA19bZ4wZpkdvoRA=","V":"MC4w","S":"eyJPIjpbeyJUIjoiOTh1bU5UU3NvTGM2U2pLZ2VjZ19VSjhRY2dBPSIsIlAiOnt9LCJSIjoiMiIsIlkiOjF9XSwiSSI6W3siUCI6W3siVCI6Ijk4dW1OVFNzb0xjNlNqS2dlY2dfVUo4UWNnQT0iLCJSIjoiMiIsIlkiOjF9XX1dfQ==","C":17,"O":"PERSIST"},{"T":"oZUy$OYUkgKfvuqnqmCIhHeChmI=","V":"MS4w","S":"IjE5NCI=","O":"UPDATE"},{"T":"98umNTSsoLc6SjKgecg_UJ8QcgA=","R":"1","C":18},{"T":"W8dRM5FtHdJIAt2i6mFy98KdIF8=","V":"MS4w","P":{"id":"138","name":"Rhône"},"S":"IjEzOCI=","O":"UPDATE"},{"T":"6ii4rVbu7YQPvm45Tik$ZR5YAw8=","V":"Mi4w","S":"IjgyNzQi","O":"UPDATE"},{"T":"Vqxe_RlQJX28$GxeJByGamu4OTk=","V":"My4w","P":{"id":"8526","name":"Gilles
 
Ferran","origin":{"T":"H0c_n4HS3FqVwOgiGOZdHjNB4O4=","R":"2","Y":2}},"S":"Ijg1MjYi","O":"UPDATE"}],"I":[{"T":"OPi7mudJuUS2QND9fE2xUf7Oo4I=","S":"IjMi"}]}


4. Re-load WineProxy into editor: (the original VCP [Chardonnay] is gone, 
only the added one [Pinot Gris] remains.. had I added 2 VCPs in step 3, 2 
would return here but they'd be duplicates of the last VCP added)

>>> 
{"F":"ws.web.shared.bindery.WineServiceRequestFactory","I":[{"O":"?","P":[{"S":"IjMi","T":"OPi7mudJuUS2QND9fE2xUf7Oo4I="}],"R":["wineType","estates.producer","mainEstate.producer","mainEstate.origin.appellation","mainEstate.origin.region","mainEstate.origin.subRegion","mainEstate.origin.originCountry","varietalComponents.id","varietalComponents.varietal"]}]}

<<< 
{"S":[true],"O":[{"T":"Rglf5pMW5kFN$TOzH6q0GhrHRys=","V":"MS4w","P":{"id":"637","name":"Côtes
 
du 
Rhône"},"S":"IjYzNyI=","O":"UPDATE"},{"T":"jFwa66QILJFT494o4Fl_HHh4RaI=","V":"MC4w","P":{"id":"13","name":"France"},"S":"IjEzIg==","O":"UPDATE"},{"T":"W8dRM5FtHdJIAt2i6mFy98KdIF8=","V":"MS4w","P":{"id":"138","name":"Rhône"},"S":"IjEzOCI=","O":"UPDATE"},{"T":"7k4WXcrjIt8yA19bZ4wZpkdvoRA=","V":"MC4w","P":{"varietal":{"T":"oZUy$OYUkgKfvuqnqmCIhHeChmI=","S":"Ijc5MSI="},"id":{"T":"98umNTSsoLc6SjKgecg_UJ8QcgA=","R":"2","Y":2}},"S":"eyJPIjpbeyJUIjoiOTh1bU5UU3NvTGM2U2pLZ2VjZ19VSjhRY2dBPSIsIlAiOnt9LCJSIjoiMiIsIlkiOjF9XSwiSSI6W3siUCI6W3siVCI6Ijk4dW1OVFNzb0xjNlNqS2dlY2dfVUo4UWNnQT0iLCJSIjoiMiIsIlkiOjF9XX1dfQ==","O":"UPDATE"},{"T":"OPi7mudJuUS2QND9fE2xUf7Oo4I=","V":"My4w","P":{"id":"3","varietalComponents":[{"T":"7k4WXcrjIt8yA19bZ4wZpkdvoRA=","S":"eyJPIjpbeyJUIjoiOTh1bU5UU3NvTGM2U2pLZ2VjZ19VSjhRY2dBPSIsIlAiOnt9LCJSIjoiMiIsIlkiOjF9XSwiSSI6W3siUCI6W3siVCI6Ijk4dW1OVFNzb0xjNlNqS2dlY2dfVUo4UWNnQT0iLCJSIjoiMiIsIlkiOjF9XX1dfQ=="}],"estates":[{"T":"Vqxe_RlQJX28$GxeJByGamu4OTk=","S":"Ijg1MjYi"}],"vintage":"2009","wineType":0,"displayName":"2009
 
Gilles Ferran - France, Rhône, Côtes du 
Rhône","varietalComponentsShortName":"Pinot 
Gris","mainEstate":{"T":"Vqxe_RlQJX28$GxeJByGamu4OTk=","S":"Ijg1MjYi"}},"S":"IjMi","O":"UPDATE"},{"T":"Vqxe_RlQJX28$GxeJByGamu4OTk=","V":"My4w","P":{"id":"8526","name":"Gilles
 
Ferran","producer":{"T":"6ii4rVbu7YQPvm45Tik$ZR5YAw8=","S":"IjgyNzQi"},"origin":{"T":"H0c_n4HS3FqVwOgiGOZdHjNB4O4=","R":"2","Y":1}},"S":"Ijg1MjYi","O":"UPDATE"},{"T":"6ii4rVbu7YQPvm45Tik$ZR5YAw8=","V":"Mi4w","P":{"id":"8274","displayName":"Gilles
 
Ferran"},"S":"IjgyNzQi","O":"UPDATE"},{"T":"oZUy$OYUkgKfvuqnqmCIhHeChmI=","V":"MS4w","P":{"id":"791","name":"Pinot
 
Gris","wineType":1,"profile":""},"S":"Ijc5MSI=","O":"UPDATE"},{"T":"98umNTSsoLc6SjKgecg_UJ8QcgA=","P":{},"R":"2","Y":2},{"T":"H0c_n4HS3FqVwOgiGOZdHjNB4O4=","P":{"region":{"T":"W8dRM5FtHdJIAt2i6mFy98KdIF8=","S":"IjEzOCI="},"originCountry":{"T":"jFwa66QILJFT494o4Fl_HHh4RaI=","S":"IjEzIg=="},"appellation":{"T":"Rglf5pMW5kFN$TOzH6q0GhrHRys=","S":"IjYzNyI="},"originDisplayName":"France
 
- 
Rhône"},"R":"2","Y":1}],"I":[{"T":"OPi7mudJuUS2QND9fE2xUf7Oo4I=","S":"IjMi"}]}





On Monday, January 28, 2013 10:17:21 AM UTC-5, bloo wrote:
>
> I like the idea of the ServiceLayerDecorator examining for non-static 
> methods on @Entity objects - that's basically what I was trying to do with 
> 2 separate RF's without the server side introspection. The last resort will 
> be to redo all my InstanceRequest calls as Requests - the client-side 
> refactoring is no big deal, but a boiler-plate CRUD-only (DAO-esque) 
> service would be needed which kind of annoys me (architecturally).
>
> Thanks again for your response. The shared static context between both 
> RF's I was unaware of. That's what I get for trying to be too clever. Will 
> report back in a few!
>
> -Blue
>
> On Monday, January 28, 2013 3:51:23 AM UTC-5, Thomas Broyer wrote:
>>
>>
>>
>> On Sunday, January 27, 2013 8:05:00 PM UTC+1, bloo wrote:
>>>
>>> I believe this may be similar to: 
>>> http://code.google.com/p/google-web-toolkit/issues/detail?id=7827 but I 
>>> can't be certain as I'm using slightly different components.
>>>
>>> I have a WineProxy EntityProxy with a list of VarietalComponentProxy 
>>> EntityProxies. The id of the VCP is a VarietalComponentIdProxy (which 
>>> proxies a JPA @EmbeddedId instance), but that id's ValueProxy has no 
>>> setters or getters (I set and get to the VCP itself client-side, and on the 
>>> server-side set up the VCId accordingly).
>>>
>>> When creating a new VCP foro the currently edited WineProxy, I call a 
>>> service to query for a list VarietalProxy objects, select one and hold it, 
>>> then before persisting the WineProxy, I 'set' the held VarietalProxy into a 
>>> newly created VCP which I then add to the WineProxy's VCP list editor 
>>> before calling a InstanceRequest.persist().using(WineProxy).
>>>
>>> Several problems arise when I go to edit a WineProxy.
>>>
>>>    1. First, if I have multiple VCs, the RF find() returns the same VC 
>>>    for the # of items it's supposed to be returning. This is odd.
>>>    2. Second, if I save as-is, the VCP list is fine. But if I add or 
>>>    remove a VCP to/from the list, any existing VCPs get sent to the server 
>>> as 
>>>    nulls, and if I filter them out to avoid NPEs, they're simply removed 
>>> from 
>>>    that Wine relation.
>>>
>>> I don't have a problem calling query services to give me EntityProxy 
>>> objects to add to another object's ListEditor for any non-composite id 
>>> based lists. This one is the only one that's giving me a bunch of issues, 
>>> so in light of the issue I linked to above, I think I may be doing 
>>> something fundamentally wrong.
>>>
>>> I'm using Guice with Guice-Persist, GP's PersistFilter on every http 
>>> request to enable Open-Session-In-View for the app, and JPA + Hibernate for 
>>> data access.
>>>
>>> I don't know if this is relevant, but since I'm querying for 
>>> VarietalProxy's via a "service" Request and I'm editing and persisting my 
>>> proxies via InstanceRequest "services" - each of which are backed by 
>>> different servlets:
>>>
>>> All of my InstanceRequest "services" are defined in one RequestFactory, 
>>> backed by a subclass of RequestFactoryServlet (at "/instanceRequest") that 
>>> uses a ServiceLayerDecorator that I've overridden invoke() with 
>>> Guice-Persist's @Transactional so that all of my InstanceRequests are 
>>> within a txn.
>>>
>>> All of my Request "services" are defined in another RequestFactory 
>>> backed by a separate RequestFactoryServlet (at "/gwtRequest") that uses my 
>>> own ServiceLocator to find the Guice bound services, which may or may not 
>>> have their service methods demarcated with @Transactional.
>>>
>>
>> That might be the problem.
>>
>> I can't see any reason you'd want to use 2 distinct RequestFactory 
>> interfaces and 2 distinct RequestFactoryServlet instances (particularly as 
>> RF uses shared static state, and doesn't preclude calling your 
>> InstanceRequest on /gwtRequest, or your other Requests on /instanceRequest.
>>
>> Can't you setup your ServiceLayerDecorator to only use an explicit 
>> transaction on non-static methods invoked on, say, a JPA entity object? 
>> (one that you know have not been provided by Guice and therefore isn't 
>> subject to AOP interception). Or alternatively, though impacting all your 
>> client code as well, how about ditching InstanceRequest and moving 
>> everything to Request, with separate "service" objects on the server-side? 
>> (that can be provided by Guice and thus intercepted by Guice-Persist)
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
Visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to