[gwt-contrib] Automatic Split Point Creation and JS Stack Emulation

2009-10-01 Thread Sami Jaber
Hi all,

I have two questions.
I was wondering why wouldn't it be possible to automatically create the
split point based on the information provided by the AST and Compilation
Analysis 
We know precisely where the code cost JS size and where are the call sites
for a given split point. Why not hooking up the AST to create a balanced
tree and thus create several small sized fragment ?
Those generated split points would be adapted regarding the code evolution
and the user would never care of this hidden functionality

the second question has nothing to do with the first one :-)
As I said to Fred privately, I don't see how SymbolsMaps and JSEmulatedStack
fit together. When I activate JSEmulatedStack module, all work perfectly (my
stacktrace contains line numbers and filenames) but the methods names are
still obfuscated. In the extra directory, the SymbolMaps has been
effectively generated by the linker but how and when can I merge in
production the StackTrace with the SymbolMaps to unobfuscate the StackTrace
?

Last but not least, is JSEmulatedStack a feature of GWT 2 MS1 ?

thanks all for taking time to respond

Sami

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



[gwt-contrib] [google-web-toolkit] r6278 committed - Changes to hyperlink, indexable hyperlink, and Showcase...

2009-10-01 Thread codesite-noreply

Revision: 6278
Author: kpro...@google.com
Date: Thu Oct  1 06:38:59 2009
Log: Changes to hyperlink, indexable hyperlink, and Showcase

Review by: rice, zundel


http://code.google.com/p/google-web-toolkit/source/detail?r=6278

Modified:
  /branches/crawlability/eclipse/README.txt
   
/branches/crawlability/samples/showcase/src/com/google/gwt/sample/showcase/client/Showcase.java
   
/branches/crawlability/samples/showcase/src/com/google/gwt/sample/showcase/server/CrawlServlet.java
  /branches/crawlability/servlet/build.xml
  /branches/crawlability/user/src/com/google/gwt/user/client/History.java
   
/branches/crawlability/user/src/com/google/gwt/user/client/ui/IndexableHyperlink.java

===
--- /branches/crawlability/eclipse/README.txt   Mon Sep 28 07:05:23 2009
+++ /branches/crawlability/eclipse/README.txt   Thu Oct  1 06:38:59 2009
@@ -240,6 +240,39 @@
  4) Now you should be able to run the 'Hello' project from the
Run dialog!

+== Launching 'Showcase' ==
+
+1) Import the 'Showcase' project if you haven't already.
+
+  File-Import-General-Existing Projects into Workspace-Next
+  Browse to the 'trunk/eclipse' folder and select it
+  Deselect All
+  Select 'Showcase'
+
+2) Non-windows users: Replace the windows project dependency.
+
+  Right-click on the Showcase project and select 'Properties'.
+  Select 'Java Build Path', the 'Libraries'.
+  Click on GWT_ROOT/build/staging/gwt-windows-0.0.0/gwt-servlet.jar and
+'Edit'.  Change gwt-windows-0.0.0 to gwt-linux-0.0.0  
or gwt-mac-0.0.0.
+
+3) Non-windows users: Replace the gwt-dev-windows project dependency and  
paths.
+
+  Run-Open Run Dialog...-Java Application-Showcase
+  Select the 'Classpath' tab
+  Remove gwt-dev-windows paths
+  Select 'User Entries'
+  Advanced-Add Folder- Add gwt-dev-platform/core/super
+  Select the (default classpath) item and use the 'Down' button
+to make it the last item in the list.
+  You could also just edit Showcase.launch and search/replace windows  
with
+linux or mac.
+
+4) Repeat step 2 for the 'Showcase compile' project.
+
+5) Now you should be able to run the 'Showcase' project from the
+  Run dialog!
+

  == Creating a Launch config for a new project ==

===
---  
/branches/crawlability/samples/showcase/src/com/google/gwt/sample/showcase/client/Showcase.java
  
Tue Sep 29 07:49:01 2009
+++  
/branches/crawlability/samples/showcase/src/com/google/gwt/sample/showcase/client/Showcase.java
  
Thu Oct  1 06:38:59 2009
@@ -222,8 +222,6 @@
  app.getMainMenu().ensureSelectedItemVisible();
  Window.setTitle(item.getText());

-
-
  // Show the associated ContentWidget
  displayContentWidget(itemWidgets.get(item));
}
@@ -234,9 +232,9 @@
  app.addSelectionHandler(new SelectionHandlerTreeItem() {
public void onSelection(SelectionEventTreeItem event) {
  TreeItem item = event.getSelectedItem();
-String historyToken = ((Hyperlink)  
item.getWidget()).getTargetHistoryToken();
  ContentWidget content = itemWidgets.get(item);
  if (content != null  !content.equals(app.getContent())) {
+  String historyToken = ((Hyperlink)  
item.getWidget()).getTargetHistoryToken();
History.newItem(historyToken);
  }
}
@@ -415,11 +413,11 @@
 */
private void setupMainMenuOption(TreeItem parent, ContentWidget content,
AbstractImagePrototype image) {
-
  // Create the TreeItem
-Hyperlink hl = new IndexableHyperlink(image.getHTML() +   +  
content.getName(),true,getContentWidgetToken(content));
+Hyperlink hl = new IndexableHyperlink(image.getHTML() +  
++ content.getName(), true, getContentWidgetToken(content));
  TreeItem option = parent.addItem(hl);
-
+
  // Map the item to its history token and content widget
  itemWidgets.put(option, content);
  itemTokens.put(getContentWidgetToken(content), option);
===
---  
/branches/crawlability/samples/showcase/src/com/google/gwt/sample/showcase/server/CrawlServlet.java
  
Mon Sep 28 07:05:23 2009
+++  
/branches/crawlability/samples/showcase/src/com/google/gwt/sample/showcase/server/CrawlServlet.java
  
Thu Oct  1 06:38:59 2009
@@ -38,26 +38,54 @@
   */
  public final class CrawlServlet implements Filter {

+  /**
+   * Special URL token that gets passed from the crawler to the servlet  
filter.
+   * This token is used in case there are already existing query  
parameters.
+   */
+  private static final String ESCAPED_FRAGMENT_FORMAT1  
= _escaped_fragment_=;
+  /**
+   * Special URL token that gets passed from the crawler to the servlet  
filter.
+   * This token is used in case there are not already existing query  
parameters.
+   */
+  private static final String ESCAPED_FRAGMENT_FORMAT2  
= ?_escaped_fragment_=;
+  /**
+   * Length of the special URL tokens.
+   */
+  private static final int 

[gwt-contrib] Re: changes to hyperlink and Showcase sample

2009-10-01 Thread kprobst

Thanks to both of you!  Committed to branch at r6278.


http://gwt-code-reviews.appspot.com/74801/diff/1002/1006
File
samples/showcase/src/com/google/gwt/sample/showcase/server/CrawlServlet.java
(right):

http://gwt-code-reviews.appspot.com/74801/diff/1002/1006#newcode37
Line 37: * Servlet that makes this application crawlable.
On 2009/09/30 20:48:34, zundel wrote:
 On 2009/09/30 20:38:21, kathrin wrote:
  On 2009/09/30 14:09:43, zundel wrote:
   I don't see anything in here that looks showcase specific.  Is
there a plan
 to
   bundle this up as a library?
 
  Good question.  The plan was to ship a modified app that serves as a
template
  for other applications, and the CrawlServlet would be part of this
sample app.

  How do you think we could bundle this up as a library?

 I dunno, I was just thinking we might include this class in GWT proper
and
 bundle it up along with the gwt-servlet distro.  Then, could anyone
just throw
 it in their web.xml?



This sounds like a good idea.  I'll leave this as a to-do for now until
I figure out where it should best go, etc.

http://gwt-code-reviews.appspot.com/74801/diff/1015/31#newcode45
Line 45: if (i == -1) {
On 2009/09/30 21:01:41, Dan Rice wrote:
 comment

Done.

http://gwt-code-reviews.appspot.com/74801/diff/1015/31#newcode46
Line 46: i = queryStringSb.indexOf(?_escaped_fragment_=);
On 2009/09/30 21:01:41, Dan Rice wrote:
 comment

Done.

http://gwt-code-reviews.appspot.com/74801

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



[gwt-contrib] Re: Automatic Split Point Creation and JS Stack Emulation

2009-10-01 Thread John Tamplin
On Thu, Oct 1, 2009 at 9:24 AM, Sami Jaber sami.ja...@gmail.com wrote:

 I was wondering why wouldn't it be possible to automatically create the
 split point based on the information provided by the AST and Compilation
 Analysis 
 We know precisely where the code cost JS size and where are the call sites
 for a given split point. Why not hooking up the AST to create a balanced
 tree and thus create several small sized fragment ?
 Those generated split points would be adapted regarding the code evolution
 and the user would never care of this hidden functionality


If you mean transparently changing a synchronous call into an asynchronous
call, there are a couple of insurmountable (IMHO) problems:

   - you can't return back to the event loop or you lose the call stack,
   which means the browser is totally locked (except on Chrome) until the fetch
   returns.  On most browsers, timers won't fire during a busy-wait poll and
   you will also get slow script warnings
   - async calls can fail, and you have no way of handling the errors in a
   useful way.  Even if you throw an exception, the programmer has to be
   prepared for every call to fail, which in practice means only catching the
   exception at a high level and aborting

I think it is far better to have the programmer explicitly specify the split
point so they know that it is in fact an async call, can usefully handle
error conditions at that point, and allows the browser to run its event
loop.

-- 
John A. Tamplin
Software Engineer (GWT), Google

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



[gwt-contrib] Re: Automatic Split Point Creation and JS Stack Emulation

2009-10-01 Thread Sami Jaber
In fact, I meant keeping the actual code as a normal developer would have to
write manually.
Most of them will likely provide a kind of generic Async implementation. If
one is able to find the right split point, all the call sites would be
rewritten with a :
GWT.runAsync() {success();failure();}. The error handling would be defined
with a custom method or impl provided by the developer..
The idea is to get rid of all the boiler plate code required by
codesplitting, specially all the soyc report analysis steps that many dev
will (unfortunately) give up...
I'm sure that I miss something, but this is the something that I would
want to know :-)
Sami

On Thu, Oct 1, 2009 at 3:45 PM, John Tamplin j...@google.com wrote:

 On Thu, Oct 1, 2009 at 9:24 AM, Sami Jaber sami.ja...@gmail.com wrote:

 I was wondering why wouldn't it be possible to automatically create the
 split point based on the information provided by the AST and Compilation
 Analysis 
 We know precisely where the code cost JS size and where are the call sites
 for a given split point. Why not hooking up the AST to create a balanced
 tree and thus create several small sized fragment ?
 Those generated split points would be adapted regarding the code evolution
 and the user would never care of this hidden functionality


 If you mean transparently changing a synchronous call into an asynchronous
 call, there are a couple of insurmountable (IMHO) problems:

- you can't return back to the event loop or you lose the call stack,
which means the browser is totally locked (except on Chrome) until the 
 fetch
returns.  On most browsers, timers won't fire during a busy-wait poll and
you will also get slow script warnings
- async calls can fail, and you have no way of handling the errors in a
useful way.  Even if you throw an exception, the programmer has to be
prepared for every call to fail, which in practice means only catching the
exception at a high level and aborting

 I think it is far better to have the programmer explicitly specify the
 split point so they know that it is in fact an async call, can usefully
 handle error conditions at that point, and allows the browser to run its
 event loop.

 --
 John A. Tamplin
 Software Engineer (GWT), Google

 


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



[gwt-contrib] Re: Automatic Split Point Creation and JS Stack Emulation

2009-10-01 Thread John Tamplin
On Thu, Oct 1, 2009 at 10:39 AM, Sami Jaber sami.ja...@gmail.com wrote:

 In fact, I meant keeping the actual code as a normal developer would have
 to write manually.
 Most of them will likely provide a kind of generic Async implementation. If
 one is able to find the right split point, all the call sites would be
 rewritten with a :
 GWT.runAsync() {success();failure();}. The error handling would be defined
 with a custom method or impl provided by the developer..
 The idea is to get rid of all the boiler plate code required by
 codesplitting, specially all the soyc report analysis steps that many dev
 will (unfortunately) give up...
 I'm sure that I miss something, but this is the something that I would
 want to know :-)


How can the developer provide the failure handling code if that point can be
made anywhere at the compiler's discretion?  How can the compiler know where
is a good point to split the program from a user's perspective?

-- 
John A. Tamplin
Software Engineer (GWT), Google

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



[gwt-contrib] Re: Automatic Split Point Creation and JS Stack Emulation

2009-10-01 Thread Sami Jaber
Yes you are right, but do you really think that in the case of a failure,
you would try to change your code flow differently depending on where you
are ? Except displaying a generic message, you won't be able to go further
as I understand the mechanism.
Concerning the second point, this is the crucial question. There are a few
scenarios that could be conceivable.
We can imagine that a permuation of 1 Mo could be splitted into 2 chunks of
500 Ko or 4 chunks of 250 Ko of 10 chunks of 5 Ko, that is what I call a
balanced tree or balanced split points. Most people would probably want
to split their permutations only to get responsiveness and decrease startup
time without digging more in the code flow...
But if you say that it is not possible at all, I believe you ...

Sami

On Thu, Oct 1, 2009 at 4:56 PM, John Tamplin j...@google.com wrote:

 On Thu, Oct 1, 2009 at 10:39 AM, Sami Jaber sami.ja...@gmail.com wrote:

 In fact, I meant keeping the actual code as a normal developer would have
 to write manually.
 Most of them will likely provide a kind of generic Async implementation.
 If one is able to find the right split point, all the call sites would be
 rewritten with a :
 GWT.runAsync() {success();failure();}. The error handling would be defined
 with a custom method or impl provided by the developer..
 The idea is to get rid of all the boiler plate code required by
 codesplitting, specially all the soyc report analysis steps that many dev
 will (unfortunately) give up...
 I'm sure that I miss something, but this is the something that I would
 want to know :-)


 How can the developer provide the failure handling code if that point can
 be made anywhere at the compiler's discretion?  How can the compiler know
 where is a good point to split the program from a user's perspective?


 --
 John A. Tamplin
 Software Engineer (GWT), Google

 


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



[gwt-contrib] Re: Automatic Split Point Creation and JS Stack Emulation

2009-10-01 Thread Ian Petersen

On Thu, Oct 1, 2009 at 8:18 AM, Sami Jaber sami.ja...@gmail.com wrote:
 Yes you are right, but do you really think that in the case of a failure,
 you would try to change your code flow differently depending on where you
 are ? Except displaying a generic message, you won't be able to go further
 as I understand the mechanism.
 Concerning the second point, this is the crucial question. There are a few
 scenarios that could be conceivable.
 We can imagine that a permuation of 1 Mo could be splitted into 2 chunks of
 500 Ko or 4 chunks of 250 Ko of 10 chunks of 5 Ko, that is what I call a
 balanced tree or balanced split points. Most people would probably want
 to split their permutations only to get responsiveness and decrease startup
 time without digging more in the code flow...
 But if you say that it is not possible at all, I believe you ...

I'm not sure that it's not possible, I think it's more that doing it
under automatic control is undesirable.  A split point will, on first
execution, introduce a delay in processing.  Such delays can be
acceptable if the programmer can control where they go.  If the
compiler introduces a delay at an apparently random place in the code,
the delay could very well be disruptive.  Forcing the programmer to
choose when to allow delays and when not leaves the control in the
programmer's hands, and prevents automatically-generated catastrophes.

Ian

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



[gwt-contrib] Comment on UiBinder in google-web-toolkit

2009-10-01 Thread codesite-noreply

Comment by Yegor.Jbanov:

@xavier.mehaut According to samples above, one of the goals is to support a  
subset of the native HTML syntax, such as div and span. XML looks like  
a reasonable compromise to achieve this. In JavaFX it would not be as  
natural. My 2 cents.


For more information:
http://code.google.com/p/google-web-toolkit/wiki/UiBinder

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



[gwt-contrib] [google-web-toolkit] r6279 committed - Test batches will be sent to the client as they are executed by JUnitS...

2009-10-01 Thread codesite-noreply

Revision: 6279
Author: jlaba...@google.com
Date: Thu Oct  1 10:34:33 2009
Log: Test batches will be sent to the client as they are executed by  
JUnitShell if NoBatchingStrategy (the default) is used. This allows users  
to use test runners that shard test methods across different clients.

Patch by: jlabanca
Review by: fabbott


http://code.google.com/p/google-web-toolkit/source/detail?r=6279

Added:
  /trunk/user/test/com/google/gwt/junit/CompileStrategyTest.java
Modified:
  /trunk/user/src/com/google/gwt/junit/BatchingStrategy.java
  /trunk/user/src/com/google/gwt/junit/CompileStrategy.java
  /trunk/user/src/com/google/gwt/junit/JUnitShell.java
  /trunk/user/test/com/google/gwt/junit/BatchingStrategyTest.java
  /trunk/user/test/com/google/gwt/junit/JUnitSuite.java

===
--- /dev/null
+++ /trunk/user/test/com/google/gwt/junit/CompileStrategyTest.java  Thu Oct 
  
1 10:34:33 2009
@@ -0,0 +1,274 @@
+/*
+ * Copyright 2009 Google Inc.
+ *
+ * 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 com.google.gwt.junit;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.dev.cfg.ModuleDef;
+import com.google.gwt.junit.JUnitShell.Strategy;
+import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.junit.client.impl.JUnitHost.TestInfo;
+
+import junit.framework.TestCase;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests of {...@link BatchingStrategy}. This test must run after a
+ * {...@link GWTTestCase} to ensure that JUnitShell is already initialized.
+ */
+public class CompileStrategyTest extends TestCase {
+
+  /**
+   * A mock {...@link RunStyle} used for testing.
+   */
+  private static class MockRunStyle extends RunStyle {
+
+public MockRunStyle() {
+  super(null);
+}
+
+@Override
+public boolean isLocal() {
+  return true;
+}
+
+@Override
+public void launchModule(String moduleName) {
+}
+
+@Override
+public void maybeCompileModule(String moduleName) {
+}
+  }
+
+  /**
+   * A mock {...@link JUnitMessageQueue} used for testing.
+   */
+  private static class MockJUnitMessageQueue extends JUnitMessageQueue {
+
+/**
+ * The test blocks added to the queue.
+ */
+private ListTestInfo[] testBlocks;
+
+/**
+ * Indicates that this is the last test block.
+ */
+private boolean isLastBlock;
+
+public MockJUnitMessageQueue() {
+  super(1);
+}
+
+@Override
+void addTestBlocks(ListTestInfo[] newTestBlocks, boolean  
isLastBlock) {
+  assertNull(testBlocks);
+  this.testBlocks = newTestBlocks;
+  this.isLastBlock = isLastBlock;
+}
+
+void assertIsLastBlock(boolean expected) {
+  assertEquals(expected, isLastBlock);
+}
+
+void assertTestBlocks(ListTestInfo[] expected) {
+  if (expected == null || testBlocks == null) {
+assertEquals(expected, testBlocks);
+return;
+  }
+
+  assertEquals(expected.size(), testBlocks.size());
+  for (int i = 0; i  testBlocks.size(); i++) {
+TestInfo[] actualBlock = testBlocks.get(i);
+TestInfo[] expectedBlock = expected.get(i);
+assertEquals(expectedBlock.length, actualBlock.length);
+for (int j = 0; j  expectedBlock.length; j++) {
+  assertEquals(expectedBlock[j], actualBlock[j]);
+}
+  }
+}
+  }
+
+  /**
+   * A mock {...@link CompileStrategy} used for testing.
+   */
+  private static class MockCompileStrategy extends CompileStrategy {
+
+/**
+ * The number of modules to mock.
+ */
+private int mockModuleCount;
+
+private MockJUnitMessageQueue messageQueue = new  
MockJUnitMessageQueue();
+
+/**
+ * Construct a new {...@link MockCompileStrategy}.
+ *
+ * @param mockModuleCount the number of modules
+ */
+public MockCompileStrategy(int mockModuleCount) {
+  this.mockModuleCount = mockModuleCount;
+}
+
+@Override
+public ModuleDef maybeCompileModule(String moduleName,
+String syntheticModuleName, Strategy strategy, RunStyle runStyle,
+BatchingStrategy batchingStrategy, TreeLogger treeLogger) {
+  fail(This method should not be called.);
+  return null;
+}
+
+@Override
+MockJUnitMessageQueue getMessageQueue() {
+  return messageQueue;
+}
+
+@Override
+int getModuleCount() {
+  return 

[gwt-contrib] [google-web-toolkit] r6280 committed - Merging tr...@6278:6279 trunk....

2009-10-01 Thread codesite-noreply

Revision: 6280
Author: jlaba...@google.com
Date: Thu Oct  1 10:42:54 2009
Log: Merging tr...@6278:6279 trunk.
- NoBatchingStrategy now runs tests as they are executed by JUnit.

svn merge -r6278:6279 --ignore-ancestry  
https://google-web-toolkit.googlecode.com/svn/trunk/ .


http://code.google.com/p/google-web-toolkit/source/detail?r=6280

Added:
   
/branches/snapshot-2009.09.23-r6200/user/test/com/google/gwt/junit/CompileStrategyTest.java
Modified:
  /branches/snapshot-2009.09.23-r6200/branch-info.txt
   
/branches/snapshot-2009.09.23-r6200/user/src/com/google/gwt/junit/BatchingStrategy.java
   
/branches/snapshot-2009.09.23-r6200/user/src/com/google/gwt/junit/CompileStrategy.java
   
/branches/snapshot-2009.09.23-r6200/user/src/com/google/gwt/junit/JUnitShell.java
   
/branches/snapshot-2009.09.23-r6200/user/test/com/google/gwt/junit/BatchingStrategyTest.java
   
/branches/snapshot-2009.09.23-r6200/user/test/com/google/gwt/junit/JUnitSuite.java

===
--- /dev/null
+++  
/branches/snapshot-2009.09.23-r6200/user/test/com/google/gwt/junit/CompileStrategyTest.java
  
Thu Oct  1 10:42:54 2009
@@ -0,0 +1,274 @@
+/*
+ * Copyright 2009 Google Inc.
+ *
+ * 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 com.google.gwt.junit;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.dev.cfg.ModuleDef;
+import com.google.gwt.junit.JUnitShell.Strategy;
+import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.junit.client.impl.JUnitHost.TestInfo;
+
+import junit.framework.TestCase;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests of {...@link BatchingStrategy}. This test must run after a
+ * {...@link GWTTestCase} to ensure that JUnitShell is already initialized.
+ */
+public class CompileStrategyTest extends TestCase {
+
+  /**
+   * A mock {...@link RunStyle} used for testing.
+   */
+  private static class MockRunStyle extends RunStyle {
+
+public MockRunStyle() {
+  super(null);
+}
+
+@Override
+public boolean isLocal() {
+  return true;
+}
+
+@Override
+public void launchModule(String moduleName) {
+}
+
+@Override
+public void maybeCompileModule(String moduleName) {
+}
+  }
+
+  /**
+   * A mock {...@link JUnitMessageQueue} used for testing.
+   */
+  private static class MockJUnitMessageQueue extends JUnitMessageQueue {
+
+/**
+ * The test blocks added to the queue.
+ */
+private ListTestInfo[] testBlocks;
+
+/**
+ * Indicates that this is the last test block.
+ */
+private boolean isLastBlock;
+
+public MockJUnitMessageQueue() {
+  super(1);
+}
+
+@Override
+void addTestBlocks(ListTestInfo[] newTestBlocks, boolean  
isLastBlock) {
+  assertNull(testBlocks);
+  this.testBlocks = newTestBlocks;
+  this.isLastBlock = isLastBlock;
+}
+
+void assertIsLastBlock(boolean expected) {
+  assertEquals(expected, isLastBlock);
+}
+
+void assertTestBlocks(ListTestInfo[] expected) {
+  if (expected == null || testBlocks == null) {
+assertEquals(expected, testBlocks);
+return;
+  }
+
+  assertEquals(expected.size(), testBlocks.size());
+  for (int i = 0; i  testBlocks.size(); i++) {
+TestInfo[] actualBlock = testBlocks.get(i);
+TestInfo[] expectedBlock = expected.get(i);
+assertEquals(expectedBlock.length, actualBlock.length);
+for (int j = 0; j  expectedBlock.length; j++) {
+  assertEquals(expectedBlock[j], actualBlock[j]);
+}
+  }
+}
+  }
+
+  /**
+   * A mock {...@link CompileStrategy} used for testing.
+   */
+  private static class MockCompileStrategy extends CompileStrategy {
+
+/**
+ * The number of modules to mock.
+ */
+private int mockModuleCount;
+
+private MockJUnitMessageQueue messageQueue = new  
MockJUnitMessageQueue();
+
+/**
+ * Construct a new {...@link MockCompileStrategy}.
+ *
+ * @param mockModuleCount the number of modules
+ */
+public MockCompileStrategy(int mockModuleCount) {
+  this.mockModuleCount = mockModuleCount;
+}
+
+@Override
+public ModuleDef maybeCompileModule(String moduleName,
+String syntheticModuleName, Strategy strategy, RunStyle runStyle,
+BatchingStrategy batchingStrategy, TreeLogger treeLogger) {
+  fail(This method 

[gwt-contrib] Re: Comment on LayoutDesign in google-web-toolkit

2009-10-01 Thread Joel Webber
It is expected that it should work fine on IE[678], and did last time I
checked (and the tests still pass). If you could follow up with the specific
issues you're running into, it would be quite helpful.

On Wed, Sep 30, 2009 at 5:44 AM, codesite-nore...@google.com wrote:


 Comment by federico.monaldi:

 i'm trying to use this new classes from the trunk, everithing works fine in
 firefox but the layout seems doesn't work in explorer is this expected or
 i've miss something?


 For more information:
 http://code.google.com/p/google-web-toolkit/wiki/LayoutDesign

 


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



[gwt-contrib] Add .if.enabled to emma ant targets to avoid confusion

2009-10-01 Thread jlabanca

Reviewers: Ray Ryan,

Description:
Description
===
The ant targets compile.emma and -create.emma.coverage only run if
emma.enabled is defined, but they may cause confusion because it looks
like they always run.

Fix
===
Changed the names to compile.emma.if.enabled and
-create.emma.coverage.if.enabled to avoid confusion.

Testing
===
I'm less confused. I'll run ant test and ant test
-Demma.enabled=true before submitting.

Please review this at http://gwt-code-reviews.appspot.com/75801

Affected files:
   build-tools/ant-gwt/build.xml
   common.ant.xml
   dev/core/build.xml
   tools/api-checker/build.xml
   user/build.xml


Index: build-tools/ant-gwt/build.xml
===
--- build-tools/ant-gwt/build.xml   (revision 6278)
+++ build-tools/ant-gwt/build.xml   (working copy)
@@ -15,7 +15,7 @@
  /gwt.javac
/target

-  target name=compile.tests depends=build, compile.emma  
description=Compiles the test code for this project
+  target name=compile.tests depends=build, compile.emma.if.enabled  
description=Compiles the test code for this project
  mkdir dir=${javac.junit.out} /
  gwt.javac srcdir=test destdir=${javac.junit.out}
classpath
Index: tools/api-checker/build.xml
===
--- tools/api-checker/build.xml (revision 6278)
+++ tools/api-checker/build.xml (working copy)
@@ -22,7 +22,7 @@
  /gwt.javac
/target

-  target name=compile.tests depends=compile.emma  
description=Compiles the test code for this project
+  target name=compile.tests depends=compile.emma.if.enabled  
description=Compiles the test code for this project
  mkdir dir=${javac.junit.out} /
  gwt.javac srcdir=test destdir=${javac.junit.out}
classpath
Index: common.ant.xml
===
--- common.ant.xml  (revision 6278)
+++ common.ant.xml  (working copy)
@@ -192,7 +192,7 @@
echo message=Writing test results to @{test.reports} for  
@{test.cases} /
mkdir dir=@{test.reports} /

-  antcall target=-create.emma.coverage
+  antcall target=-create.emma.coverage.if.enabled
  param name=test.emma.coverage value=@{test.emma.coverage}/
/antcall
condition property=emma.lib  
value=${emma.dir}/emma-2.0.5312-patched.jar else=
@@ -357,7 +357,7 @@

taskdef resource=emma_ant.properties classpathref=emma.taskdef.lib  
/

-  target name=compile.emma description=Instruments emma classes  
unless=emma.compiled
+  target name=compile.emma.if.enabled description=Instruments emma  
classes unless=emma.compiled
  delete dir=${javac.emma.out} /
  property name=emma.compiled value=true /
  antcall target=-compile.emma.if.enabled /
@@ -376,7 +376,7 @@
  /emma
/target

-  target name=-create.emma.coverage description=Create the emma  
coverage directory if=emma.enabled
+  target name=-create.emma.coverage.if.enabled description=Create the  
emma coverage directory if=emma.enabled
  delete dir=${test.emma.coverage} /
  mkdir dir=${test.emma.coverage} /
/target
Index: user/build.xml
===
--- user/build.xml  (revision 6278)
+++ user/build.xml  (working copy)
@@ -66,7 +66,7 @@
  gwt.ant dir=../dev/core target=compile.tests /
/target

-  target name=compile.tests depends=compile.dev.core.tests,  
compile.emma description=Compiles the test code for this project
+  target name=compile.tests depends=compile.dev.core.tests,  
compile.emma.if.enabled description=Compiles the test code for this  
project
  mkdir dir=${javac.junit.out} /
  gwt.javac srcdir=test excludes=com/google/gwt/langtest/**  
destdir=${javac.junit.out}
classpath
Index: dev/core/build.xml
===
--- dev/core/build.xml  (revision 6278)
+++ dev/core/build.xml  (working copy)
@@ -7,7 +7,7 @@
property name=gwt.junit.testcase.dev.core.includes  
value=**/com/google/**/*Test.class /
property name=gwt.junit.testcase.dev.core.excludes value= /

-  target name=compile.tests depends=build, compile.emma  
description=Compiles the test code for this project
+  target name=compile.tests depends=build, compile.emma.if.enabled  
description=Compiles the test code for this project
  mkdir dir=${javac.junit.out} /
  gwt.javac srcdir=test destdir=${javac.junit.out}
classpath



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



[gwt-contrib] [google-web-toolkit] r6281 committed - Create a branch for abstracting out the Development Mode UI....

2009-10-01 Thread codesite-noreply

Revision: 6281
Author: j...@google.com
Date: Thu Oct  1 11:31:25 2009
Log: Create a branch for abstracting out the Development Mode UI.

svn copy \
   https://google-web-toolkit.googlecode.com/svn/branches/farewell...@6280 \
   https://google-web-toolkit.googlecode.com/svn/changes/jat/abstractui


http://code.google.com/p/google-web-toolkit/source/detail?r=6281

Added:
  /changes/jat/abstractui


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



[gwt-contrib] [google-web-toolkit] r6282 committed - Set branch-info to match this branch.

2009-10-01 Thread codesite-noreply

Revision: 6282
Author: j...@google.com
Date: Thu Oct  1 11:39:10 2009
Log: Set branch-info to match this branch.

http://code.google.com/p/google-web-toolkit/source/detail?r=6282

Modified:
  /changes/jat/abstractui/branch-info.txt

===
--- /changes/jat/abstractui/branch-info.txt Wed Sep 30 17:53:07 2009
+++ /changes/jat/abstractui/branch-info.txt Thu Oct  1 11:39:10 2009
@@ -1,19 +1,8 @@
-Created from tr...@6101
-
-svn copy -r6226 \
-https://google-web-toolkit.googlecode.com/svn/branches/farewellSwt \
- 
https://google-web-toolkit.googlecode.com/svn/changes/jat/noswt-merge6200
+Created from farewellSwt @6280
+==
+svn copy \
+ 
https://google-web-toolkit.googlecode.com/svn/branches/farewell...@6280 \
+https://google-web-toolkit.googlecode.com/svn/changes/jat/abstractui

  Merged from trunk
  
-svn merge https://google-web-toolkit.googlecode.com/svn/trunk \
--r6101:6142
-svn merge --ignore-ancestry -r6142:6200 \
-https://google-web-toolkit.googlecode.com/svn/trunk
-(via changes/jat/noswt-merge6200)
-svn merge https://google-web-toolkit.googlecode.com/svn/trunk \
-  -r6200:6239 .
-svn merge https://google-web-toolkit.googlecode.com/svn/trunk \
-  -r6239:6249 .
-svn merge https://google-web-toolkit.googlecode.com/svn/trunk \
-  --ignore-ancestry -r6249:6270 .

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



[gwt-contrib] Any plans for supporting Scala ?

2009-10-01 Thread Maxime Lévesque


  Has there ever been discussions about supporting scala ?
What I like most about GWT is that it allows to write rich AJAX client
using a strongly typed language (java), which is pretty unique.
I have come to enjoy Scala very much, being able to write GWT
apps in Scala would be totally awesome.

 I would think that compiling from scala source to javascript would
actually be easyer than from java, scala closures for example
could translate almost directly to javascipt closures.

 I assume that significant part of your java-javascript translater
could be resused, and the fact that scala lives in the JVM would
certainly help.

 What kind of effort would it take ?

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



[gwt-contrib] Re: Restore UiBinder's JRE tests

2009-10-01 Thread fabbott

LGTM.  I'm a bit hesitant about die == UnableToCompleteException in
TreeLogger in general, but have no issues with it here.

(As an example, I'm not sure that's the right exception to throw for an
issue early in starting hosted mode shell,  although it's maybe not
clearly the wrong exception either.)

http://gwt-code-reviews.appspot.com/72805

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



[gwt-contrib] Re: Any plans for supporting Scala ?

2009-10-01 Thread Rob Heittman
I think Lex Spoon knows a thing or two about Scala.  I'm really surprised,
nay shocked, that he hasn't ported GWT to Scala yet, on his lunch break!

j/k  :-)

2009/10/1 Maxime Lévesque maxime.leves...@gmail.com

  What kind of effort would it take ?

 

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



[gwt-contrib] GWT Trunk build broken?

2009-10-01 Thread P.G.Taboada

Since the new Mail Sample was commited I can't do a full build.

Am I missing something?

brgds,

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



[gwt-contrib] Re: GWT Trunk build broken?

2009-10-01 Thread Ray Ryan

Do you need to update your tools dir?

On Thu, Oct 1, 2009 at 3:46 PM, P.G.Taboada pgtabo...@googlemail.com wrote:

 Since the new Mail Sample was commited I can't do a full build.

 Am I missing something?

 brgds,

 Papick G. Taboada
 


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



[gwt-contrib] Re: GWT Trunk build broken?

2009-10-01 Thread P.G.Taboada

Hmm, it is up-to-date...

  [java] Compiling module com.google.gwt.sample.mail.Mail
 [java]Scanning for additional dependencies: file:/java/gwt/
samples/mail/src/com/google/gwt/sample/mail/client/Mail.java
 [java]   Adding '2' new generated units
 [java]  Validating newly compiled units
 [java] Removing units with errors
 [java][ERROR] Errors in 'transient source for
com.google.gwt.sample.mail.client.Mail_BinderImpl'
 [java]   [ERROR] Line 20: The method addNorth
(Widget, double) in the type DockLayoutPanel is not applicable for the
arguments (TopPanel, int, int)
 [java]   [ERROR] Line 21: The method addWest
(Widget, double) in the type DockLayoutPanel is not applicable for the
arguments (Shortcuts, int, int)
 [java]   [ERROR] Line 22: The method addNorth
(Widget, double) in the type DockLayoutPanel is not applicable for the
arguments (MailList, int, int)


The new sample is using the UIBinder and the new DockLayoutPanel. No
java compile error (obviously), but GWT compilation fails.

brgds,

Papick

ps: thanks for the very interesting talk on the google io  :-)


On 2 Okt., 00:47, Ray Ryan rj...@google.com wrote:
 Do you need to update your tools dir?



 On Thu, Oct 1, 2009 at 3:46 PM, P.G.Taboada pgtabo...@googlemail.com wrote:

  Since the new Mail Sample was commited I can't do a full build.

  Am I missing something?

  brgds,

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



[gwt-contrib] [google-web-toolkit] r6283 committed - Checkpoint work on abstracting out develmode UI.

2009-10-01 Thread codesite-noreply

Revision: 6283
Author: j...@google.com
Date: Thu Oct  1 17:01:51 2009
Log: Checkpoint work on abstracting out develmode UI.

http://code.google.com/p/google-web-toolkit/source/detail?r=6283

Added:
  /changes/jat/abstractui/dev/core/src/com/google/gwt/dev/SwingUI.java
Deleted:
   
/changes/jat/abstractui/dev/core/src/com/google/gwt/dev/shell/BrowserWindowController.java
Modified:
  /changes/jat/abstractui/dev/core/src/com/google/gwt/dev/HostedModeBase.java
  /changes/jat/abstractui/dev/oophm/overlay/com/google/gwt/dev/GWTShell.java
   
/changes/jat/abstractui/dev/oophm/overlay/com/google/gwt/dev/HostedMode.java
   
/changes/jat/abstractui/dev/oophm/src/com/google/gwt/dev/OophmHostedModeBase.java
  /changes/jat/abstractui/user/src/com/google/gwt/junit/JUnitShell.java

===
--- /dev/null
+++ /changes/jat/abstractui/dev/core/src/com/google/gwt/dev/SwingUI.java
 
Thu Oct  1 17:01:51 2009
@@ -0,0 +1,243 @@
+/*
+ * Copyright 2009 Google Inc.
+ *
+ * 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 com.google.gwt.dev;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.TreeLogger.Type;
+import com.google.gwt.dev.HostedModeBase.DevelopmentModeUI;
+import com.google.gwt.dev.OophmHostedModeBase.TabPanelCollection;
+import com.google.gwt.dev.WebServerPanel.RestartAction;
+import com.google.gwt.dev.shell.ShellMainWindow;
+import com.google.gwt.dev.util.collect.HashMap;
+
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.File;
+import java.net.URL;
+import java.util.IdentityHashMap;
+import java.util.Map;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JFrame;
+import javax.swing.JTabbedPane;
+import javax.swing.WindowConstants;
+
+/**
+ * Implements the Swing UI for development mode.
+ */
+public class SwingUI extends DevelopmentModeUI {
+
+  private final MapModuleHandle, ModulePanel moduleTabs = new  
IdentityHashMapModuleHandle, ModulePanel();
+  private final MapDevelModeTabKey, ModuleTabPanel tabPanels = new  
HashMapDevelModeTabKey, ModuleTabPanel();
+
+  public class SwingModuleHandle implements ModuleHandle {
+
+public TreeLogger getLogger() {
+  // TODO(jat) Auto-generated method stub
+  return null;
+}
+
+  }
+
+  private final HostedModeBase hostedModeBase;
+  private JFrame frame;
+  private JTabbedPane tabs;
+  private ShellMainWindow mainWnd;
+  private WebServerPanel webServerLog;
+
+  public SwingUI(HostedModeBase hostedModeBase) {
+this.hostedModeBase = hostedModeBase;
+  }
+
+  @Override
+  public void initialize() {
+if (hostedModeBase.isHeadless()) {
+  return;
+}
+ImageIcon gwtIcon = loadImageIcon(icon24.png);
+frame = new JFrame(GWT Development Mode);
+tabs = new JTabbedPane();
+if (hostedModeBase.options.alsoLogToFile()) {
+  hostedModeBase.options.getLogDir().mkdirs();
+}
+mainWnd = new ShellMainWindow(hostedModeBase.options.getLogLevel(),
+hostedModeBase.options.getLogFile(main.log));
+tabs.addTab(Development Mode, gwtIcon, mainWnd, GWT Development  
mode);
+frame.getContentPane().add(tabs);
+frame.setSize(950, 700);
+frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+frame.addWindowListener(new WindowAdapter() {
+  @Override
+  public void windowClosed(WindowEvent e) {
+callback(DONE, null);
+  }
+});
+frame.setIconImage(loadImageIcon(icon16.png).getImage());
+frame.setVisible(true);
+  }
+
+  protected static final String PACKAGE_PATH = SwingUI.class.getPackage(
+  ).getName().replace('.', '/').concat(/shell/);
+
+  /**
+   * Loads an image from the classpath in this package.
+   */
+  static ImageIcon loadImageIcon(String name) {
+return loadImageIcon(name, true);
+  }
+
+  /**
+   * Loads an image from the classpath, optionally prepending this package.
+   *
+   * @param name name of an image file.
+   * @param prependPackage true if {...@link #PACKAGE_PATH} should be  
prepended to
+   *  this name.
+   */
+  static ImageIcon loadImageIcon(String name, boolean prependPackage) {
+ClassLoader cl = OophmHostedModeBase.class.getClassLoader();
+if (prependPackage) {
+  name = PACKAGE_PATH + name;
+}
+
+URL url = (name == null) ? null : cl.getResource(name);
+if (url != null) {
+  ImageIcon image = new ImageIcon(url);
+  return image;
+} else {
+  // 

[gwt-contrib] Re: Add .if.enabled to emma ant targets to avoid confusion

2009-10-01 Thread rjrjr

On 2009/10/01 18:00:03, jlabanca wrote:


LGTM

Thanks

http://gwt-code-reviews.appspot.com/75801

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



[gwt-contrib] Re: Restore UiBinder's JRE tests

2009-10-01 Thread Freeland Abbott
Ah, sorry.  Depending on exactly when you need it, you want the classpath
element of the compile.tests task around line 75, the defined
path test.extraclasspaths around line 35; you might also consider compile
task, circa line 45, though I think you shouldn't need that.  Generally,
searching for classpath in the build.xml should get you to suspicious
areas to think about, but I think those are the key two.

On Thu, Oct 1, 2009 at 5:10 PM, Ray Ryan rj...@google.com wrote:

 Thanks.

 I still need an answer to my actual question, though:

 See the classpath changes to eclipse/user/.classpath? Where do I make
 the same changes to user/build.xml?

 On Thu, Oct 1, 2009 at 12:41 PM,  fabb...@google.com wrote:
  LGTM.  I'm a bit hesitant about die == UnableToCompleteException in
  TreeLogger in general, but have no issues with it here.
 
  (As an example, I'm not sure that's the right exception to throw for an
  issue early in starting hosted mode shell,  although it's maybe not
  clearly the wrong exception either.)
 
  http://gwt-code-reviews.appspot.com/72805
 


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



[gwt-contrib] Re: GWT Trunk build broken?

2009-10-01 Thread John LaBanca
Try doing an ant clean first.
Thanks,
John LaBanca
jlaba...@google.com


On Thu, Oct 1, 2009 at 6:52 PM, P.G.Taboada pgtabo...@googlemail.comwrote:


 Hmm, it is up-to-date...

  [java] Compiling module com.google.gwt.sample.mail.Mail
 [java]Scanning for additional dependencies: file:/java/gwt/
 samples/mail/src/com/google/gwt/sample/mail/client/Mail.java
 [java]   Adding '2' new generated units
 [java]  Validating newly compiled units
 [java] Removing units with errors
 [java][ERROR] Errors in 'transient source for
 com.google.gwt.sample.mail.client.Mail_BinderImpl'
 [java]   [ERROR] Line 20: The method addNorth
 (Widget, double) in the type DockLayoutPanel is not applicable for the
 arguments (TopPanel, int, int)
 [java]   [ERROR] Line 21: The method addWest
 (Widget, double) in the type DockLayoutPanel is not applicable for the
 arguments (Shortcuts, int, int)
 [java]   [ERROR] Line 22: The method addNorth
 (Widget, double) in the type DockLayoutPanel is not applicable for the
 arguments (MailList, int, int)


 The new sample is using the UIBinder and the new DockLayoutPanel. No
 java compile error (obviously), but GWT compilation fails.

 brgds,

 Papick

 ps: thanks for the very interesting talk on the google io  :-)


 On 2 Okt., 00:47, Ray Ryan rj...@google.com wrote:
  Do you need to update your tools dir?
 
 
 
  On Thu, Oct 1, 2009 at 3:46 PM, P.G.Taboada pgtabo...@googlemail.com
 wrote:
 
   Since the new Mail Sample was commited I can't do a full build.
 
   Am I missing something?
 
   brgds,
 
   Papick G. Taboada
 


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