[jbpm-commits] JBoss JBPM SVN: r3644 - in projects/gwt-console/trunk/war/src: main/java/org/jboss/bpm/console/client/model and 9 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Jan 15 06:05:36 EST 2009


Author: heiko.braun at jboss.com
Date: 2009-01-15 06:05:35 -0500 (Thu, 15 Jan 2009)
New Revision: 3644

Added:
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/View.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessEditor.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessImageComponent.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListView.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceView.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/TokenEditorComponent.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/ProcessReportView.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/ReportEditor.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskEditor.java
Removed:
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionListEditor.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessImageView.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceEditor.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListEditor.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/TokenEditor.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/OverviewReportEditor.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/ProcessReportEditor.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskListEditor.java
Modified:
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Application.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Authentication.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/ConsoleConfig.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Editor.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Header.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/MainView.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Menu.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/MenuSection.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/UIConstants.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/URLBuilder.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Workspace.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/model/DTOParser.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionList.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceDetailForm.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceList.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/TokenForm.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/BirtPanel.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/AssignmentCallback.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/AssignmentFormPanel.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskDetailsFormPanel.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskList.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/ConsoleLog.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/DateRenderer.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/JSONRequest.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/JSONRequestHandler.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/JSONWalk.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/ModelChangeListener.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/ModelListenerRegistry.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/ModelModificationCallback.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/FormWidgets.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/HelpPanel.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/RefreshableComboBox.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/RemoteListView.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/TeaserPanel.java
   projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/rebind/WorkspaceGenerator.java
   projects/gwt-console/trunk/war/src/main/java/org/json/CDL.java
   projects/gwt-console/trunk/war/src/main/java/org/json/Cookie.java
   projects/gwt-console/trunk/war/src/main/java/org/json/CookieList.java
   projects/gwt-console/trunk/war/src/main/java/org/json/HTTP.java
   projects/gwt-console/trunk/war/src/main/java/org/json/HTTPTokener.java
   projects/gwt-console/trunk/war/src/main/java/org/json/JSONArray.java
   projects/gwt-console/trunk/war/src/main/java/org/json/JSONException.java
   projects/gwt-console/trunk/war/src/main/java/org/json/JSONML.java
   projects/gwt-console/trunk/war/src/main/java/org/json/JSONObject.java
   projects/gwt-console/trunk/war/src/main/java/org/json/JSONString.java
   projects/gwt-console/trunk/war/src/main/java/org/json/JSONStringer.java
   projects/gwt-console/trunk/war/src/main/java/org/json/JSONTokener.java
   projects/gwt-console/trunk/war/src/main/java/org/json/JSONWriter.java
   projects/gwt-console/trunk/war/src/main/java/org/json/Test.java
   projects/gwt-console/trunk/war/src/main/java/org/json/XML.java
   projects/gwt-console/trunk/war/src/main/java/org/json/XMLTokener.java
   projects/gwt-console/trunk/war/src/main/resources/org/jboss/bpm/console/workspace.txt
   projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/GwtTestProcessManagement.java
Log:
Break down editors into assciated views. Added menu contribution to editors

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Application.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Application.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Application.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -27,140 +27,142 @@
  */
 public class Application implements EntryPoint
 {
-   private MainView mainView;
-   private Authentication auth;
-   private ConsoleConfig config;
-   private URLBuilder urlBuilder;
+  private MainView mainView;
+  private Authentication auth;
+  private ConsoleConfig config;
+  private URLBuilder urlBuilder;
 
-   public final static String[] KNOWN_ROLES = {"admin", "manager", "user"};
+  public final static String[] KNOWN_ROLES = {"admin", "manager", "user"};
 
-   /**
-    * Note, we defer all application initialization code to
-    * {@link #onModuleLoad2()} so that the UncaughtExceptionHandler
-    * can catch any unexpected exceptions.
-    */
-   public void onModuleLoad() {
+  /**
+   * Note, we defer all application initialization code to
+   * {@link #onModuleLoad2()} so that the UncaughtExceptionHandler
+   * can catch any unexpected exceptions.
+   */
+  public void onModuleLoad()
+  {
 
-      ConsoleLog.setEnabled(true);
+    ConsoleLog.setEnabled(true);
 
-      /* Install an UncaughtExceptionHandler which will
-      * produce <code>FATAL</code> log messages
-      */
-      ConsoleLog.setUncaughtExceptionHandler();
+    /* Install an UncaughtExceptionHandler which will
+    * produce <code>FATAL</code> log messages
+    */
+    ConsoleLog.setUncaughtExceptionHandler();
 
-      /* Use a deferred command so that the UncaughtExceptionHandler
-      * catches any exceptions in onModuleLoad2()
-      */
-      DeferredCommand.addCommand(new Command() {
-         public void execute() {
-            onModuleLoad2();
-         }
-      });
-   }
-
-   /**
-    * This is the entry point method.
+    /* Use a deferred command so that the UncaughtExceptionHandler
+    * catches any exceptions in onModuleLoad2()
     */
-   public void onModuleLoad2()
-   {
-      config = new ConsoleConfig();
-
-      // setup
-
-      if(!GWT.isScript())
+    DeferredCommand.addCommand(new Command()
+    {
+      public void execute()
       {
-         String proxyUrl = GWT.getModuleBaseURL() + "xhp";
-         config.setConsoleServerUrl(proxyUrl);         
+        onModuleLoad2();
       }
+    });
+  }
 
-      ConsoleLog.debug("Console server: " + config.getConsoleServerUrl());
-      ConsoleLog.debug("Report server: " + config.getReportServerUrl());
+  /**
+   * This is the entry point method.
+   */
+  public void onModuleLoad2()
+  {
+    config = new ConsoleConfig();
 
-      urlBuilder = new URLBuilder(config);
+    // setup
 
-      // authentiction
-      
-      forceLogin();
-   }
+    if (!GWT.isScript())
+    {
+      String proxyUrl = GWT.getModuleBaseURL() + "xhp";
+      config.setConsoleServerUrl(proxyUrl);
+    }
 
-   public MainView getConsoleView()
-   {
-      return mainView;
-   }
+    ConsoleLog.debug("Console server: " + config.getConsoleServerUrl());
+    ConsoleLog.debug("Report server: " + config.getReportServerUrl());
 
-   private void forceLogin()
-   {
-      Panel panel = new Panel();
-      panel.setPaddings(20);
-      panel.setStyleName("login-panel-content");
-      panel.setLayout(new VerticalLayout(10));
-      panel.add( new HTML("Welcome, please login.") );
+    urlBuilder = new URLBuilder(config);
 
-      final Window window = new Window();
-      window.setTitle("GWT-Console");
-      window.setClosable(false);
-      window.setResizable(false);
-      window.setWidth(300);
-      window.setHeight(180);
-      window.setLayout(new BorderLayout());
-      window.setCloseAction(Window.CLOSE);
+    // authentiction     
+    forceLogin();
+  }
 
-      final FormPanel loginForm = new FormPanel();
-      loginForm.setBorder(false);
-      loginForm.add(new TextField("Username", "user"));
-      TextField passwordField = new TextField("Password", "pass");
-      passwordField.setPassword(true);
-      loginForm.add(passwordField);
+  public MainView getConsoleView()
+  {
+    return mainView;
+  }
 
-      final Button submitBtn = new Button("Login",
-            new ButtonListenerAdapter()
-            {
-               public void onClick(Button button, EventObject e)
-               {
-                  String user = loginForm.getForm().findField("user").getValueAsString();
-                  String pass = loginForm.getForm().findField("pass").getValueAsString();
+  private void forceLogin()
+  {
+    Panel panel = new Panel();
+    panel.setPaddings(20);
+    panel.setStyleName("login-panel-content");
+    panel.setLayout(new VerticalLayout(10));
+    panel.add(new HTML("Welcome, please login."));
 
-                  String url = urlBuilder.getUserInRoleURL(KNOWN_ROLES);
-                  auth = new Authentication(url);
-                  auth.setCallback(
-                        new Authentication.AuthCallback()
-                        {
+    final Window window = new Window();
+    window.setTitle("GWT-Console");
+    window.setClosable(false);
+    window.setResizable(false);
+    window.setWidth(300);
+    window.setHeight(180);
+    window.setLayout(new BorderLayout());
+    window.setCloseAction(Window.CLOSE);
 
-                           public void onLoginSuccess(Request request, Response response)
-                           {
-                              // clear the form
-                              loginForm.getForm().reset();
+    final FormPanel loginForm = new FormPanel();
+    loginForm.setBorder(false);
+    loginForm.add(new TextField("Username", "user"));
+    TextField passwordField = new TextField("Password", "pass");
+    passwordField.setPassword(true);
+    loginForm.add(passwordField);
 
-                              // display main console
-                              window.close();
+    final Button submitBtn = new Button("Login",
+        new ButtonListenerAdapter()
+        {
+          public void onClick(Button button, EventObject e)
+          {
+            String user = loginForm.getForm().findField("user").getValueAsString();
+            String pass = loginForm.getForm().findField("pass").getValueAsString();
 
-                              // assemble main view
-                              mainView = new MainView(auth, urlBuilder, config);
-                           }
+            String url = urlBuilder.getUserInRoleURL(KNOWN_ROLES);
+            auth = new Authentication(url);
+            auth.setCallback(
+                new Authentication.AuthCallback()
+                {
 
-                           public void onLoginFailed(Request request, Throwable t)
-                           {
-                              // auth failed
-                              ConsoleLog.error("Authentication failed.", t);
-                           }
-                        }
-                  );
+                  public void onLoginSuccess(Request request, Response response)
+                  {
+                    // clear the form
+                    loginForm.getForm().reset();
 
-                  auth.doLogin(user,pass);
+                    // display main console
+                    window.close();
 
-               }
-            });
+                    // assemble main view
+                    mainView = new MainView(auth, urlBuilder, config);
+                  }
 
-      loginForm.addButton(submitBtn);
-      panel.add(loginForm);
+                  public void onLoginFailed(Request request, Throwable t)
+                  {
+                    // auth failed
+                    ConsoleLog.error("Authentication failed.", t);
+                  }
+                }
+            );
 
-      BorderLayoutData centerData = new BorderLayoutData(RegionPosition.CENTER);
-      centerData.setMargins(3, 0, 3, 3);
+            auth.doLogin(user, pass);
 
-      window.add(panel, centerData);
-      // ------------------------------------------
+          }
+        });
 
-      window.show();
-   }
+    loginForm.addButton(submitBtn);
+    panel.add(loginForm);
 
+    BorderLayoutData centerData = new BorderLayoutData(RegionPosition.CENTER);
+    centerData.setMargins(3, 0, 3, 3);
+
+    window.add(panel, centerData);
+    // ------------------------------------------
+
+    window.show();
+  }
+
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Authentication.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Authentication.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Authentication.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -31,126 +31,128 @@
 
 /**
  * Does HTTP Basic Auth and keeps assigned roles
- * (piggy backed on response) and the username that was used. 
- * 
+ * (piggy backed on response) and the username that was used.
+ *
  * @author Heiko.Braun <heiko.braun at jboss.com>
  */
 public class Authentication
 {
-   private String loginUrl;
-   private AuthCallback callback;
-   private List<String> rolesAssigned = new ArrayList<String>();
-   private String username;
+  private String loginUrl;
+  private AuthCallback callback;
+  private List<String> rolesAssigned = new ArrayList<String>();
+  private String username;
 
-   public Authentication(String loginUrl)
-   {
-      this.loginUrl = loginUrl;
-   }
+  public Authentication(String loginUrl)
+  {
+    this.loginUrl = loginUrl;
+  }
 
-   public Authentication(String loginUrl, AuthCallback callback)
-   {
-      this.loginUrl = loginUrl;
-      this.callback = callback;
-   }
+  public Authentication(String loginUrl, AuthCallback callback)
+  {
+    this.loginUrl = loginUrl;
+    this.callback = callback;
+  }
 
-   /**
-    * Login, but leave credentials to GWT.
-    * This will pop up a username/password dialog netive to the browser.
-    */
-   public void doLogin()
-   {
-      doLogin(null,null);
-   }
+  /**
+   * Login, but leave credentials to GWT.
+   * This will pop up a username/password dialog netive to the browser.
+   */
+  public void doLogin()
+  {
+    doLogin(null, null);
+  }
 
-   /**
-    * Login using specific credentials.
-    * This delegates to {@link com.google.gwt.http.client.RequestBuilder#setUser(String)}
-    * and {@link com.google.gwt.http.client.RequestBuilder#setPassword(String)}
-    */
-   public void doLogin(String user, String pass)
-   {
-      
-      RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, loginUrl);
-      this.username = user;
-      // discard password
+  /**
+   * Login using specific credentials.
+   * This delegates to {@link com.google.gwt.http.client.RequestBuilder#setUser(String)}
+   * and {@link com.google.gwt.http.client.RequestBuilder#setPassword(String)}
+   */
+  public void doLogin(String user, String pass)
+  {
 
-      ConsoleLog.debug("Authentication against: " + rb.getUrl());
-      
-      if(user!=null&&pass!=null)
-      {
-         rb.setUser(user);
-         rb.setPassword(pass);
+    RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, loginUrl);
+    this.username = user;
+    // discard password
 
-         if(!GWT.isScript()) // hosted mode only
-         {
-            rb.setHeader("xtest-user", user);
-            rb.setHeader("xtest-pass", pass); // NOTE: This is plaintext, use for testing only
-         }
-      }
+    ConsoleLog.debug("Authentication against: " + rb.getUrl());
 
-      try
+    if (user != null && pass != null)
+    {
+      rb.setUser(user);
+      rb.setPassword(pass);
+
+      if (!GWT.isScript()) // hosted mode only
       {
-         rb.sendRequest(null,
-           new RequestCallback() {
+        rb.setHeader("xtest-user", user);
+        rb.setHeader("xtest-pass", pass); // NOTE: This is plaintext, use for testing only
+      }
+    }
 
-              public void onResponseReceived(Request request, Response response)
+    try
+    {
+      rb.sendRequest(null,
+          new RequestCallback()
+          {
+
+            public void onResponseReceived(Request request, Response response)
+            {
+              // parse roles
+              if (200 == response.getStatusCode())
               {
-                 // parse roles
-                 if(200==response.getStatusCode())
-                 {
-                    rolesAssigned = DTOParser.parseRolesAssigned(response.getText());
-                    if(callback!=null) callback.onLoginSuccess(request, response);
-                 }
-                 else
-                 {
-                     onError(request, new Exception(response.getText()));   
-                 }
+                rolesAssigned = DTOParser.parseRolesAssigned(response.getText());
+                if (callback != null) callback.onLoginSuccess(request, response);
               }
-
-              public void onError(Request request, Throwable t)
-              {                
-                 // auth failed
-                 // Couldn't connect to server (could be timeout, SOP violation, etc.)
-                 if(callback!=null)
-                    callback.onLoginFailed(request, t);
-                 else
-                    throw new RuntimeException("Unknown exception upon login attempt", t);
+              else
+              {
+                onError(request, new Exception(response.getText()));
               }
-           });
-      }
+            }
 
-      catch (RequestException e1)
-      {
-         // Couldn't connect to server
-         throw new RuntimeException("Unknown error upon login attempt", e1);
-      }
-   }
+            public void onError(Request request, Throwable t)
+            {
+              // auth failed
+              // Couldn't connect to server (could be timeout, SOP violation, etc.)
+              if (callback != null)
+                callback.onLoginFailed(request, t);
+              else
+                throw new RuntimeException("Unknown exception upon login attempt", t);
+            }
+          });
+    }
 
+    catch (RequestException e1)
+    {
+      // Couldn't connect to server
+      throw new RuntimeException("Unknown error upon login attempt", e1);
+    }
+  }
 
-   public void setCallback(AuthCallback callback)
-   {
-      this.callback = callback;
-   }
 
-   public native void doLogout() /*-{
+  public void setCallback(AuthCallback callback)
+  {
+    this.callback = callback;
+  }
+
+  public native void doLogout() /*-{
        $wnd.location.reload();
      }-*/;
 
 
-   public interface AuthCallback
-   {
-      void onLoginSuccess(Request request, Response response);
-      void onLoginFailed(Request request, Throwable t);
-   }
+  public interface AuthCallback
+  {
+    void onLoginSuccess(Request request, Response response);
 
+    void onLoginFailed(Request request, Throwable t);
+  }
 
-   public List<String> getRolesAssigned()
-   {
-      return rolesAssigned;
-   }
 
-   public String getUsername()
-   {
-      return username;
-   }
+  public List<String> getRolesAssigned()
+  {
+    return rolesAssigned;
+  }
+
+  public String getUsername()
+  {
+    return username;
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/ConsoleConfig.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/ConsoleConfig.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/ConsoleConfig.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -27,90 +27,89 @@
  * Initialize console config from host page (<code>Application.html</code>) variable:
  * <pre>
  *  var consoleConfig = {
-         consoleServerUrl: "http://localhost:8080/gwt-console-server",
-         reportServerUrl: "http://localhost:8080/report",
-         [...]
-      };
+ * consoleServerUrl: "http://localhost:8080/gwt-console-server",
+ * reportServerUrl: "http://localhost:8080/report",
+ * [...]
+ * };
  * </pre>
  *
- * @see com.google.gwt.i18n.client.Dictionary
- * 
  * @author Heiko.Braun <heiko.braun at jboss.com>
+ * @see com.google.gwt.i18n.client.Dictionary
  */
 public class ConsoleConfig
 {
-   private String consoleServerUrl;
-   private String reportServerUrl;
+  private String consoleServerUrl;
+  private String reportServerUrl;
 
-   private String overviewReportFile;
-   private String definitionReportFile;
-   private String instanceReportFile;
+  private String overviewReportFile;
+  private String definitionReportFile;
+  private String instanceReportFile;
 
 
-   public ConsoleConfig(String consoleServerUrl, String reportServerUrl)
-   {
-      this.consoleServerUrl = consoleServerUrl;
-      this.reportServerUrl = reportServerUrl;
-   }
+  public ConsoleConfig(String consoleServerUrl, String reportServerUrl)
+  {
+    this.consoleServerUrl = consoleServerUrl;
+    this.reportServerUrl = reportServerUrl;
+  }
 
-   public ConsoleConfig()
-   {
-      Dictionary theme = Dictionary.getDictionary("consoleConfig");
-      consoleServerUrl = theme.get("consoleServerUrl");
-      reportServerUrl = theme.get("reportServerUrl");
+  public ConsoleConfig()
+  {
+    Dictionary theme = Dictionary.getDictionary("consoleConfig");
+    consoleServerUrl = theme.get("consoleServerUrl");
+    reportServerUrl = theme.get("reportServerUrl");
 
-      overviewReportFile = theme.get("overviewReportFile");      
-      definitionReportFile = theme.get("definitionReportFile");
-      instanceReportFile = theme.get("instanceReportFile");
-   }
+    overviewReportFile = theme.get("overviewReportFile");
+    definitionReportFile = theme.get("definitionReportFile");
+    instanceReportFile = theme.get("instanceReportFile");
+  }
 
-   public String getConsoleServerUrl()
-   {
-      return consoleServerUrl;
-   }
+  public String getConsoleServerUrl()
+  {
+    return consoleServerUrl;
+  }
 
-   public void setConsoleServerUrl(String consoleServerUrl)
-   {
-      this.consoleServerUrl = consoleServerUrl;
-   }
+  public void setConsoleServerUrl(String consoleServerUrl)
+  {
+    this.consoleServerUrl = consoleServerUrl;
+  }
 
-   public String getReportServerUrl()
-   {
-      return reportServerUrl;
-   }
+  public String getReportServerUrl()
+  {
+    return reportServerUrl;
+  }
 
-   public void setReportServerUrl(String reportServerUrl)
-   {
-      this.reportServerUrl = reportServerUrl;
-   }
+  public void setReportServerUrl(String reportServerUrl)
+  {
+    this.reportServerUrl = reportServerUrl;
+  }
 
-   public String getOverviewReportFile()
-   {
-      return overviewReportFile;
-   }
+  public String getOverviewReportFile()
+  {
+    return overviewReportFile;
+  }
 
-   public void setOverviewReportFile(String overviewReportFile)
-   {
-      this.overviewReportFile = overviewReportFile;
-   }
+  public void setOverviewReportFile(String overviewReportFile)
+  {
+    this.overviewReportFile = overviewReportFile;
+  }
 
-   public String getDefinitionReportFile()
-   {
-      return definitionReportFile;
-   }
+  public String getDefinitionReportFile()
+  {
+    return definitionReportFile;
+  }
 
-   public void setDefinitionReportFile(String definitionReportFile)
-   {
-      this.definitionReportFile = definitionReportFile;
-   }
+  public void setDefinitionReportFile(String definitionReportFile)
+  {
+    this.definitionReportFile = definitionReportFile;
+  }
 
-   public String getInstanceReportFile()
-   {
-      return instanceReportFile;
-   }
+  public String getInstanceReportFile()
+  {
+    return instanceReportFile;
+  }
 
-   public void setInstanceReportFile(String instanceReportFile)
-   {
-      this.instanceReportFile = instanceReportFile;
-   }
+  public void setInstanceReportFile(String instanceReportFile)
+  {
+    this.instanceReportFile = instanceReportFile;
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Editor.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Editor.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Editor.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -22,6 +22,12 @@
 package org.jboss.bpm.console.client;
 
 import com.gwtext.client.widgets.Panel;
+import com.gwtext.client.widgets.TabPanel;
+import com.gwtext.client.widgets.Component;
+import com.gwtext.client.widgets.layout.FitLayout;
+import com.gwtext.client.widgets.layout.BorderLayout;
+import com.gwtext.client.widgets.layout.BorderLayoutData;
+import com.gwtext.client.core.RegionPosition;
 
 /**
  * An editor can be plugged into a {@link org.jboss.bpm.console.client.Workspace}
@@ -30,13 +36,115 @@
  */
 public abstract class Editor extends Panel
 {
-  
+  protected MainView main;
+  private TabPanel tabPanel;
+
   protected Editor(MainView main)
   {
     super();
+    this.main = main;
+    this.setPaddings(10);
+
+    // -------
+    this.tabPanel = new TabPanel();
+    this.tabPanel.setResizeTabs(true);
+    this.tabPanel.setMinTabWidth(115);
+    this.tabPanel.setTabWidth(135);
+    this.tabPanel.setEnableTabScroll(true);
+    this.tabPanel.setAutoScroll(true);
+    this.tabPanel.setPlain(true);
+    this.tabPanel.setActiveTab(0);
+    this.tabPanel.setBorder(false);
+
+    // -------
+
+    Panel panel = new Panel();
+    panel.setBorder(false);
+    panel.setPaddings(10);
+    panel.setLayout(new FitLayout());
+
+    panel.setWidth(UIConstants.EDITOR_WIDTH);
+    panel.setHeight(500);
+
+    // -------
+
+    Panel borderPanel = new Panel();
+    borderPanel.setBorder(false);
+    borderPanel.setLayout(new BorderLayout());
+
+    //add east panel
+    /*Panel eastPanel = new Panel();
+    eastPanel.setHtml("<p>east panel</p>");
+    eastPanel.setTitle("East Side");
+    eastPanel.setCollapsible(true);
+    eastPanel.setWidth(225);
+
+    BorderLayoutData eastData = new BorderLayoutData(RegionPosition.EAST);
+    eastData.setSplit(false);
+    eastData.setMinSize(75);
+    eastData.setMaxSize(100);
+    eastData.setMargins(new Margins(0, 0, 5, 0));
+
+    borderPanel.add(eastPanel, eastData);*/
+
+    // add center panel        
+    borderPanel.add(tabPanel, new BorderLayoutData(RegionPosition.CENTER));
+
+    panel.add(borderPanel);
+
+    this.add(panel);
   }
 
   public abstract String getEditorId();
+
   public abstract String getTitle();
+
   public abstract String getIconCSS();
+
+  public abstract MenuSection provideMenuSection();
+
+  public boolean hasView(String viewId)
+  {
+    boolean b = false;
+    final String tabId = viewId + ".tab";
+
+    Component[] tabs = tabPanel.getItems();
+    for (int i = 0; i < tabs.length; i++)
+    {
+      Component tab = tabs[i];
+      if (tab.getId().equals(tabId))
+      {
+        b = true;
+        break;
+      }
+    }
+
+    return b;
+  }
+
+  public void showView(String viewId)
+  {
+    final String tabId = viewId + ".tab";
+    this.tabPanel.setActiveTab(tabId);
+  }
+
+  public void addView(View view, boolean closable)
+  {
+    view.setId(view.getViewId() + ".tab");
+    view.setClosable(closable);
+    view.setIconCls(view.getIconCSS());
+
+    this.tabPanel.add(view);
+    this.tabPanel.setActiveTab(view.getId());
+
+  }
+
+  class WrapperPanel extends Panel
+  {
+    public WrapperPanel(String id)
+    {
+      super();
+      setId(id);
+    }
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Header.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Header.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Header.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -38,54 +38,55 @@
  */
 public class Header extends Panel
 {
-   private MainView view;
-   
-   public final static String ID = "org.jboss.bpm.headerPanel";
-   
-   public Header(MainView view)
-   {
-      super();
-      this.view = view;
-      this.setId(ID);
+  private MainView view;
 
-      this.setFrame(false);
-      this.setBorder(false);
-      this.setHeader(false);
+  public final static String ID = "org.jboss.bpm.headerPanel";
 
-      //HorizontalLayout layout = new HorizontalLayout(20);
-      //this.setLayout(layout);
+  public Header(MainView view)
+  {
+    super();
+    this.view = view;
+    this.setId(ID);
 
-      this.setHeight(50);
-      this.setBaseCls("bpm-header");
-   }
+    this.setFrame(false);
+    this.setBorder(false);
+    this.setHeader(false);
 
-   public void setUserInfo(String username, List<String> roles)
-   {
-      Panel userInfo = new Panel();
-      userInfo.setBorder(false);
-      userInfo.setHeader(false);
-      userInfo.setFrame(false);
-      userInfo.setStyleName("bpm-header-userinfo");
-      HorizontalLayout layout = new HorizontalLayout(10);
-      userInfo.setLayout(layout);
+    //HorizontalLayout layout = new HorizontalLayout(20);
+    //this.setLayout(layout);
 
-      userInfo.add( new Image("images/icons/05.png") );
-      userInfo.add( new HTML(view.getUsername()));
-      userInfo.add(
-            new Button("Logout",
-                  new ButtonListenerAdapter(){
+    this.setHeight(50);
+    this.setBaseCls("bpm-header");
+  }
 
-                     public void onClick(Button button, EventObject eventObject)
-                     {
-                        view.logout();
-                     }
-                  }
-            )
-      );
+  public void setUserInfo(String username, List<String> roles)
+  {
+    Panel userInfo = new Panel();
+    userInfo.setBorder(false);
+    userInfo.setHeader(false);
+    userInfo.setFrame(false);
+    userInfo.setStyleName("bpm-header-userinfo");
+    HorizontalLayout layout = new HorizontalLayout(10);
+    userInfo.setLayout(layout);
 
-      //this.clear();
-      this.add(userInfo);
-      //this.doLayout();
-      
-   }
+    userInfo.add(new Image("images/icons/05.png"));
+    userInfo.add(new HTML(view.getUsername()));
+    userInfo.add(
+        new Button("Logout",
+            new ButtonListenerAdapter()
+            {
+
+              public void onClick(Button button, EventObject eventObject)
+              {
+                view.logout();
+              }
+            }
+        )
+    );
+
+    //this.clear();
+    this.add(userInfo);
+    //this.doLayout();
+
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/MainView.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/MainView.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/MainView.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -26,16 +26,10 @@
 import com.google.gwt.core.client.GWT;
 import com.gwtext.client.core.Margins;
 import com.gwtext.client.core.RegionPosition;
-import com.gwtext.client.widgets.MessageBox;
-import com.gwtext.client.widgets.MessageBoxConfig;
-import com.gwtext.client.widgets.Panel;
-import com.gwtext.client.widgets.Viewport;
+import com.gwtext.client.widgets.*;
 import com.gwtext.client.widgets.layout.BorderLayout;
 import com.gwtext.client.widgets.layout.BorderLayoutData;
 import com.gwtext.client.widgets.layout.FitLayout;
-import org.jboss.bpm.console.client.process.ProcessDefinitionListEditor;
-import org.jboss.bpm.console.client.report.OverviewReportEditor;
-import org.jboss.bpm.console.client.task.TaskListEditor;
 import org.jboss.bpm.console.client.util.ConsoleLog;
 import org.jboss.bpm.console.client.WorkspaceLauncher;
 
@@ -72,7 +66,7 @@
 
     Panel mainPanel = createMainPanel();
     assembleMainApplication(mainPanel);
-    
+
     viewport = new Viewport(mainPanel);
   }
 
@@ -111,10 +105,10 @@
 
     // ------------------------------------------
 
-    workspace = new Workspace();
-    WorkspaceLauncher launcher = GWT.create(WorkspaceLauncher.class);          
+    workspace = new Workspace(menu);
+    WorkspaceLauncher launcher = GWT.create(WorkspaceLauncher.class);
     launcher.launch(this, workspace);
-    
+
     borderPanel.add(workspace, new BorderLayoutData(RegionPosition.CENTER));
 
     // ------------------------------------------
@@ -125,7 +119,7 @@
   public void addEditor(Editor editor)
   {
     ConsoleLog.debug("Add editor " + editor.getEditorId());
-    workspace.addEditor(editor,  true);
+    workspace.addEditor(editor, true);
   }
 
   public boolean hasEditor(String id)
@@ -147,7 +141,8 @@
   {
     status.setText(message);
 
-    MessageBox.show(new MessageBoxConfig() {
+    MessageBox.show(new MessageBoxConfig()
+    {
       {
         String title = isError ? "Error" : "System Message";
         setTitle(title);

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Menu.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Menu.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Menu.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -21,16 +21,8 @@
  */
 package org.jboss.bpm.console.client;
 
-import com.gwtext.client.core.EventObject;
-import com.gwtext.client.data.Node;
 import com.gwtext.client.widgets.Panel;
 import com.gwtext.client.widgets.layout.AccordionLayout;
-import com.gwtext.client.widgets.tree.TreeNode;
-import com.gwtext.client.widgets.tree.TreePanel;
-import com.gwtext.client.widgets.tree.event.TreeNodeListenerAdapter;
-import org.jboss.bpm.console.client.report.OverviewReportEditor;
-import org.jboss.bpm.console.client.process.ProcessDefinitionListEditor;
-import org.jboss.bpm.console.client.task.TaskListEditor;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -43,182 +35,27 @@
  */
 public class Menu extends Panel
 {
-   private final MainView view;
-   private List<Panel> sections = new ArrayList<Panel>();
+  private final MainView mainView;
+  private List<Panel> sections = new ArrayList<Panel>();
 
-   public Menu(final MainView view)
-   {
-      super();
-      this.view = view;
+  public Menu(final MainView view)
+  {
+    super();
+    this.mainView = view;
 
-      final AccordionLayout accordion = new AccordionLayout(true);
+    final AccordionLayout accordion = new AccordionLayout(true);
 
-      this.setTitle("");
-      this.setCollapsible(true);
-      this.setWidth(200);
-      this.setLayout(accordion);
+    this.setTitle("");
+    this.setCollapsible(true);
+    this.setWidth(200);
+    this.setLayout(accordion);
 
-      MenuSection navPanel = new MenuSection("Process Management", "bpm-process-icon", new ProcessTree());
-      MenuSection taskPanel = new MenuSection("Task Management", "bpm-task-icon", new TaskTree());
-      MenuSection metricPanel = new MenuSection("Metrics and Stats", "bpm-metric-icon", new MetricTree());
-      MenuSection settingsPanel = new MenuSection("Settings", "bpm-settings-icon", new SettingsTree());
+  }
 
-      this.addSection(navPanel);
-      this.addSection(taskPanel);
-      this.addSection(metricPanel);
-      this.addSection(settingsPanel);
-   }
+  public void addSection(MenuSection menuSection)
+  {
+    this.sections.add(menuSection);
+    this.add(menuSection);
+  }
 
-   public void addSection(MenuSection menuSection)
-   {
-      this.sections.add(menuSection);
-      this.add(menuSection);
-   }
-
-   class ProcessTree extends TreePanel
-   {
-
-      public ProcessTree() {
-
-         TreeNode root = new TreeNode("Process Definitions");
-
-         TreeNode definitions = new TreeNode("View definitions");
-         definitions.setExpanded(true);
-         definitions.addListener(
-               new TreeNodeListenerAdapter()
-               {
-                  public void onClick(Node node, EventObject eventObject)
-                  {
-                     if(view.hasEditor(ProcessDefinitionListEditor.ID))
-                     {
-                        view.showEditor(ProcessDefinitionListEditor.ID);
-                     }
-                     else
-                     {
-                        view.addEditor( new ProcessDefinitionListEditor(view) );
-                     }
-
-                  }
-               }
-         );
-         TreeNode upload = new TreeNode("Upload new definitions");
-         upload.setExpanded(true);
-
-         root.appendChild(definitions);
-         root.appendChild(upload);
-
-         setRootVisible(true);
-         setRootNode(root);
-         root.setExpanded(true);
-      }
-   }
-
-   class MetricTree extends TreePanel
-   {
-
-      public MetricTree() {
-
-         TreeNode root = new TreeNode("Process Metrics");
-
-         TreeNode overview = new TreeNode("Process workload");
-         overview.setExpanded(true);
-         overview.addListener(
-               new TreeNodeListenerAdapter()
-               {
-                  public void onClick(Node node, EventObject eventObject)
-                  {
-                     if(view.hasEditor(OverviewReportEditor.ID))
-                     {
-                        view.showEditor(OverviewReportEditor.ID);
-                     }
-                     else
-                     {
-                        view.addEditor( new OverviewReportEditor(view) );
-                     }
-
-                  }
-               }
-         );
-
-         TreeNode export = new TreeNode("Export stats");
-         export.setExpanded(true);
-
-         root.appendChild(overview);
-         root.appendChild(export);
-
-         setRootVisible(true);
-         setRootNode(root);
-         root.setExpanded(true);
-      }
-   }
-
-   class SettingsTree extends TreePanel
-   {
-
-      public SettingsTree()
-      {
-         TreeNode root = new TreeNode("Debug");
-
-         TreeNode overview = new TreeNode("Assigned roles");
-         overview.setExpanded(true);
-         overview.addListener(
-               new TreeNodeListenerAdapter()
-               {
-                  public void onClick(Node node, EventObject eventObject)
-                  {
-                     StringBuffer sb = new StringBuffer();
-                     for(String roleName : view.getRolesAssigned())
-                     {
-                        sb.append("<br> - ").append(roleName);
-                     }
-
-                     view.displayMessage("Assigned roles: " + sb.toString(), false);
-                  }
-               }
-         );
-
-         root.appendChild(overview);
-
-         setRootVisible(true);
-         setRootNode(root);
-         root.setExpanded(true);
-
-      }
-   }
-
-   class TaskTree extends TreePanel
-   {
-
-      public TaskTree()
-      {
-         TreeNode root = new TreeNode("Your tasks");
-
-         TreeNode overview = new TreeNode("Overview");
-         overview.setExpanded(true);
-         overview.addListener(
-               new TreeNodeListenerAdapter()
-               {
-                  public void onClick(Node node, EventObject eventObject)
-                  {
-                     if(view.hasEditor(TaskListEditor.ID))
-                     {
-                        view.showEditor(TaskListEditor.ID);
-                     }
-                     else
-                     {
-                        view.addEditor( new TaskListEditor(view) );
-                     }
-
-                  }
-               }
-         );
-
-         root.appendChild(overview);
-
-         setRootVisible(true);
-         setRootNode(root);
-         root.setExpanded(true);
-
-      }
-   }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/MenuSection.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/MenuSection.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/MenuSection.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -32,16 +32,16 @@
 public class MenuSection extends Panel
 {
 
-   public MenuSection(String title, String iconClass, Component tree)
-   {
-      super();
+  public MenuSection(String title, String iconClass, Component tree)
+  {
+    super();
 
-      setTitle(title);
-      setBorder(false);
-      setHideBorders(true);
-      setIconCls(iconClass);
+    setTitle(title);
+    setBorder(false);
+    setHideBorders(true);
+    setIconCls(iconClass);
 
-      if(tree!=null)
-         add(tree);
-   }
+    if (tree != null)
+      add(tree);
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/UIConstants.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/UIConstants.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/UIConstants.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -26,14 +26,14 @@
  */
 public class UIConstants
 {
-   public static final int OVERALL_WIDTH = 1024;
-   public static final int OVERALL_HEIGHT = 768;
-   public static final int MAIN_MENU_MIN = 175;
-   public static final int MAIN_MENU_MAX = 400;
-   public static final int EDITOR_WIDTH = 680;
-   public static final int TEASER_PANEL_WIDTH  = 200;
-   public static final int EDITOR_PANEL_WIDTH = 450;
+  public static final int OVERALL_WIDTH = 1024;
+  public static final int OVERALL_HEIGHT = 768;
+  public static final int MAIN_MENU_MIN = 175;
+  public static final int MAIN_MENU_MAX = 400;
+  public static final int EDITOR_WIDTH = 680;
+  public static final int TEASER_PANEL_WIDTH = 200;
+  public static final int EDITOR_PANEL_WIDTH = 450;
 
-   public static final String DEFAULT_TRANSITION = "default transition";
-   public static final String DATE_FORMAT = "yyyy-m-j H:i:s";  //08-10-02 13:51:27
+  public static final String DEFAULT_TRANSITION = "default transition";
+  public static final String DATE_FORMAT = "yyyy-m-j H:i:s";  //08-10-02 13:51:27
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/URLBuilder.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/URLBuilder.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/URLBuilder.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -31,149 +31,149 @@
  */
 public class URLBuilder
 {
-   ConsoleConfig config;
+  ConsoleConfig config;
 
-   public URLBuilder(ConsoleConfig config)
-   {
-      this.config = config;
-   }
+  public URLBuilder(ConsoleConfig config)
+  {
+    this.config = config;
+  }
 
-   public String getConsoleServerUrl()
-   {
-      return config.getConsoleServerUrl();
-   }
+  public String getConsoleServerUrl()
+  {
+    return config.getConsoleServerUrl();
+  }
 
-   public String getProcessDefinitionsURL()
-   {
-      return getConsoleServerUrl() + "/rs/process/definitions";
-   }
+  public String getProcessDefinitionsURL()
+  {
+    return getConsoleServerUrl() + "/rs/process/definitions";
+  }
 
-   public String getProcessInstancesURL(long processId)
-   {
-      return getConsoleServerUrl() + "/rs/process/definitions/"+processId+"/instances";
-   }
+  public String getProcessInstancesURL(long processId)
+  {
+    return getConsoleServerUrl() + "/rs/process/definitions/" + processId + "/instances";
+  }
 
-   public String getUserInRoleURL(String[] possibleRoles)
-   {
-      StringBuffer sb = new StringBuffer();
-      for(int i=0; i<possibleRoles.length; i++)
-      {
-         sb.append(URL.encode(possibleRoles[i]));
-         if(i<possibleRoles.length-1)
-            sb.append(",");
-      }
-      return getConsoleServerUrl() + "/rs/identity/user/roles?roleCheck="+sb.toString();
-   }
+  public String getUserInRoleURL(String[] possibleRoles)
+  {
+    StringBuffer sb = new StringBuffer();
+    for (int i = 0; i < possibleRoles.length; i++)
+    {
+      sb.append(URL.encode(possibleRoles[i]));
+      if (i < possibleRoles.length - 1)
+        sb.append(",");
+    }
+    return getConsoleServerUrl() + "/rs/identity/user/roles?roleCheck=" + sb.toString();
+  }
 
-   @Deprecated
-   public String getRemoveDefinitionURL(long processId)
-   {
-      return getConsoleServerUrl() + "/rs/process/definitions/" + processId + "/remove";
-   }
+  @Deprecated
+  public String getRemoveDefinitionURL(long processId)
+  {
+    return getConsoleServerUrl() + "/rs/process/definitions/" + processId + "/remove";
+  }
 
-   public String getProcessImageURL(long processId)
-   {
-      return getConsoleServerUrl() + "/rs/jbpm3/definitions/" + processId + "/image";
-   }
+  public String getProcessImageURL(long processId)
+  {
+    return getConsoleServerUrl() + "/rs/jbpm3/definitions/" + processId + "/image";
+  }
 
-   public String getDiagramInfoURL(long processId)
-   {
-      return getConsoleServerUrl() + "/rs/jbpm3/definitions/" + processId + "/diagramInfo";
-   }
+  public String getDiagramInfoURL(long processId)
+  {
+    return getConsoleServerUrl() + "/rs/jbpm3/definitions/" + processId + "/diagramInfo";
+  }
 
-   public String getActiveNodeInfoURL(long instanceId)
-   {
-      return getConsoleServerUrl() + "/rs/jbpm3/instances/" + instanceId + "/activeNodeInfo";
-   }
+  public String getActiveNodeInfoURL(long instanceId)
+  {
+    return getConsoleServerUrl() + "/rs/jbpm3/instances/" + instanceId + "/activeNodeInfo";
+  }
 
-   public String getStateChangeURL(long instanceId, ProcessInstanceRef.STATE state)
-   {
-      return getConsoleServerUrl() + "/rs/process/instances/" + instanceId + "/state/"+state;
-   }
+  public String getStateChangeURL(long instanceId, ProcessInstanceRef.STATE state)
+  {
+    return getConsoleServerUrl() + "/rs/process/instances/" + instanceId + "/state/" + state;
+  }
 
-   public String getStartNewInstanceURL(long processId)
-   {
-      return getConsoleServerUrl() + "/rs/process/definitions/"+processId+"/instances/new";
-   }
+  public String getStartNewInstanceURL(long processId)
+  {
+    return getConsoleServerUrl() + "/rs/process/definitions/" + processId + "/instances/new";
+  }
 
-   public String getUploadDefinitionURL()
-   {
-      return getConsoleServerUrl() + "/rs/jbpm3/definitions/new";
-   }
+  public String getUploadDefinitionURL()
+  {
+    return getConsoleServerUrl() + "/rs/jbpm3/definitions/new";
+  }
 
-   public String getTaskListByActorURL(String actor)
-   {
-      return getConsoleServerUrl() + "/rs/tasks/actor/"+URL.encode(actor);
-   }
+  public String getTaskListByActorURL(String actor)
+  {
+    return getConsoleServerUrl() + "/rs/tasks/actor/" + URL.encode(actor);
+  }
 
-   public String getTaskFormDefURL(long processId, long taskId)
-   {
-      return getConsoleServerUrl() + "/rs/tasks/forms/"+processId+"/"+taskId;
-   }
+  public String getTaskFormDefURL(long processId, long taskId)
+  {
+    return getConsoleServerUrl() + "/rs/tasks/forms/" + processId + "/" + taskId;
+  }
 
-   public String getTaskEndURL(long id)
-   {
-      return getConsoleServerUrl() + "/rs/tasks/"+id+"/close/transition/default";
-   }
+  public String getTaskEndURL(long id)
+  {
+    return getConsoleServerUrl() + "/rs/tasks/" + id + "/close/transition/default";
+  }
 
-   public String getTaskEndURL(long id, String signalName)
-   {      
-      return getConsoleServerUrl() + "/rs/tasks/"+id+"/close/transition?signal=" + URL.encode(signalName);
-   }
+  public String getTaskEndURL(long id, String signalName)
+  {
+    return getConsoleServerUrl() + "/rs/tasks/" + id + "/close/transition?signal=" + URL.encode(signalName);
+  }
 
-   public String getTaskAssignmentURL(long id, String actor)
-   {
-      String actualActor = actor == null ? "" : "/"+actor;
-      return getConsoleServerUrl() + "/rs/tasks/"+id+"/assignment"+URL.encode(actualActor);
-   }
+  public String getTaskAssignmentURL(long id, String actor)
+  {
+    String actualActor = actor == null ? "" : "/" + actor;
+    return getConsoleServerUrl() + "/rs/tasks/" + id + "/assignment" + URL.encode(actualActor);
+  }
 
-   public String getTokenSignalUrl(TokenReference tok)
-   {
-      return getConsoleServerUrl() + "/rs/jbpm3/tokens/"+tok.getId()+"/transition/default";
-   }
+  public String getTokenSignalUrl(TokenReference tok)
+  {
+    return getConsoleServerUrl() + "/rs/jbpm3/tokens/" + tok.getId() + "/transition/default";
+  }
 
-   public String getTokenSignalUrl(TokenReference tok, String signal)
-   {
-      String encodedSignal = URL.encode(signal);
-      return getConsoleServerUrl() + "/rs/jbpm3/tokens/"+tok.getId()+"/transition?signal="+encodedSignal;
-   }
+  public String getTokenSignalUrl(TokenReference tok, String signal)
+  {
+    String encodedSignal = URL.encode(signal);
+    return getConsoleServerUrl() + "/rs/jbpm3/tokens/" + tok.getId() + "/transition?signal=" + encodedSignal;
+  }
 
-   public String getAvailableActorsUrl(String actorId)
-   {
-      return getConsoleServerUrl() + "/rs/identity/user/"+actorId+"/actors";
-   }
+  public String getAvailableActorsUrl(String actorId)
+  {
+    return getConsoleServerUrl() + "/rs/identity/user/" + actorId + "/actors";
+  }
 
-   public String getProcessDefinitionByNameURL(String name)
-   {
-      return getConsoleServerUrl() + "/rs/process/definitions/"+name;
-   }
+  public String getProcessDefinitionByNameURL(String name)
+  {
+    return getConsoleServerUrl() + "/rs/process/definitions/" + name;
+  }
 
-   public String getDeployTestHarnessUrl()
-   {
-      return getConsoleServerUrl()+ "/rs/test/deploy/harness";
-   }
+  public String getDeployTestHarnessUrl()
+  {
+    return getConsoleServerUrl() + "/rs/test/deploy/harness";
+  }
 
-   public String getUndeployTestHarnessUrl()
-   {
-      return getConsoleServerUrl()+ "/rs/test/undeploy/harness";
-   }
+  public String getUndeployTestHarnessUrl()
+  {
+    return getConsoleServerUrl() + "/rs/test/undeploy/harness";
+  }
 
-   public String getOverviewReportUrl()
-   {
-      String name = URL.encode(config.getOverviewReportFile());
-      String url = config.getReportServerUrl() + "/rs/report/view/" + name;
-      if(!GWT.isScript())
-         url += "?id=birt";
-      return url;
-   }
+  public String getOverviewReportUrl()
+  {
+    String name = URL.encode(config.getOverviewReportFile());
+    String url = config.getReportServerUrl() + "/rs/report/view/" + name;
+    if (!GWT.isScript())
+      url += "?id=birt";
+    return url;
+  }
 
-   public String getDefinitionReportUrl(String name)
-   {
-      String reportName = URL.encode(name);
-      String reportFileName = URL.encode(config.getDefinitionReportFile());
-      String url = config.getReportServerUrl() + "/rs/report/view/" + reportFileName + "?name=" + reportName;
-      if(!GWT.isScript())
-         url += "&id=birt";
-      return url;
-   }
+  public String getDefinitionReportUrl(String name)
+  {
+    String reportName = URL.encode(name);
+    String reportFileName = URL.encode(config.getDefinitionReportFile());
+    String url = config.getReportServerUrl() + "/rs/report/view/" + reportFileName + "?name=" + reportName;
+    if (!GWT.isScript())
+      url += "&id=birt";
+    return url;
+  }
 }

Added: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/View.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/View.java	                        (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/View.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.bpm.console.client;
+
+import com.gwtext.client.widgets.Panel;
+
+/**
+ * View's are {@link org.jboss.bpm.console.client.Editor} components
+ *
+ * @author Heiko.Braun <heiko.braun at jboss.com>
+ */
+public abstract class View extends Panel
+{
+
+  protected MainView mainMenu;
+
+  protected View(MainView main)
+  {
+    super();
+    this.mainMenu = main;
+  }
+
+  public abstract String getViewId();
+
+  public abstract String getIconCSS();
+}

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Workspace.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Workspace.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/Workspace.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -24,81 +24,87 @@
 import com.gwtext.client.widgets.Component;
 import com.gwtext.client.widgets.Panel;
 import com.gwtext.client.widgets.TabPanel;
-import org.jboss.bpm.console.client.Editor;
 
 /**
  * Maintains {@link org.jboss.bpm.console.client.Workspace}'s
- * 
+ *
  * @author Heiko.Braun <heiko.braun at jboss.com>
  */
 public class Workspace extends TabPanel
 {
-   protected MainView view;
+  protected MainView view;
+  private Menu menu;
+  
+  public Workspace(Menu menu)
+  {
+    super();
+    this.menu = menu;
 
-   public Workspace()
-   {
-      super();
+    this.setResizeTabs(true);
+    this.setMinTabWidth(115);
+    this.setTabWidth(135);
+    this.setEnableTabScroll(true);
+    this.setAutoScroll(true);
+    this.setActiveTab(0);
+  }
 
-      this.setResizeTabs(true);
-      this.setMinTabWidth(115);
-      this.setTabWidth(135);
-      this.setEnableTabScroll(true);
-      this.setAutoScroll(true);      
-      this.setActiveTab(0);      
-   }
+  private Panel createTab(Editor editor, boolean closeable)
+  {
+    Panel tab = new WrapperPanel(editor.getId() + ".tab");
+    tab.setTitle(editor.getTitle());
+    tab.setIconCls(editor.getIconCSS());
+    tab.setClosable(closeable);
+    tab.setAutoScroll(true);
+    tab.setBorder(false);
+    tab.setFrame(false);
+    tab.setHideBorders(true);
+    return tab;
+  }
 
-   private Panel addTab(Editor editor, boolean closeable) {
-      Panel tab = new WrapperPanel(editor.getId()+".tab");
-      tab.setAutoScroll(true);
-      tab.setTitle(editor.getTitle());
-      tab.setClosable(closeable);
-      tab.setBorder(false);
-      tab.setFrame(false);
-      tab.setHideBorders(true);
-      tab.setIconCls(editor.getIconCSS());
-      this.add(tab);
-      return tab;
-   }
+  public void addEditor(Editor editor, boolean closeable)
+  {
+    // Menu
+    menu.addSection(editor.provideMenuSection());
 
-   public void addEditor(Editor editor, boolean closeable)
-   {
-      Panel tab = addTab(editor, closeable);
-      tab.add(editor);
-      this.setActiveTab(tab.getId());
-   }
+    // Editor pane
+    Panel tab = createTab(editor, closeable);
+    tab.add(editor);
+    this.add(tab);
+    this.setActiveTab(tab.getId());
+    this.doLayout();
+  }
 
-   public boolean hasEditor(String id)
-   {
-      boolean b = false;
-      final String tabId = id +".tab";
+  public boolean hasEditor(String id)
+  {
+    boolean b = false;
+    final String tabId = id + ".tab";
 
-      Component[] tabs = this.getItems();
-      for(int i=0; i<tabs.length; i++)
+    Component[] tabs = this.getItems();
+    for (int i = 0; i < tabs.length; i++)
+    {
+      Component tab = tabs[i];
+      if (tab.getId().equals(tabId))
       {
-         Component tab = tabs[i];
-         if(tab.getId().equals(tabId))
-         {
-            b=true;
-            break;
-         }
+        b = true;
+        break;
       }
+    }
 
-      return b;
-   }     
+    return b;
+  }
 
-   public void showTab(String id)
-   {
-      final String tabId = id+".tab";
-      this.setActiveTab(tabId);   
-   }
+  public void showTab(String id)
+  {
+    final String tabId = id + ".tab";
+    this.setActiveTab(tabId);
+  }
 
-   class WrapperPanel extends Panel
-   {
-
-      public WrapperPanel(String id)
-      {
-         super();
-         setId(id);
-      }
-   }
+  class WrapperPanel extends Panel
+  {
+    public WrapperPanel(String id)
+    {
+      super();
+      setId(id);
+    }
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/model/DTOParser.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/model/DTOParser.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/model/DTOParser.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -35,246 +35,247 @@
 
 /**
  * TODO: run integrated (gwt-console-server) test
+ *
  * @author Heiko.Braun <heiko.braun at jboss.com>
  */
 public class DTOParser
 {
-   public static ProcessDefinitionRef parseProcessDefinition(String json)
-   {
-      JSONValue root = JSONParser.parse(json);
-      long id = JSONWalk.on(root).next("processId").asLong();
-      String version = JSONWalk.on(root).next("version").asString();
-      String name = JSONWalk.on(root).next("name").asString();
+  public static ProcessDefinitionRef parseProcessDefinition(String json)
+  {
+    JSONValue root = JSONParser.parse(json);
+    long id = JSONWalk.on(root).next("processId").asLong();
+    String version = JSONWalk.on(root).next("version").asString();
+    String name = JSONWalk.on(root).next("name").asString();
 
-      return new ProcessDefinitionRef(id, name, version);
-   }
-   public static List<String> parseRolesAssigned(String json)
-   {
-      // parse roles
-      List<String> roles = new ArrayList<String>();
+    return new ProcessDefinitionRef(id, name, version);
+  }
 
-      // {"roles":[{"isAssigned":true,"role":"admin"},{"isAssigned":true,"role":"user"}]}
+  public static List<String> parseRolesAssigned(String json)
+  {
+    // parse roles
+    List<String> roles = new ArrayList<String>();
 
-      JSONValue root = JSONParser.parse(json);
-      JSONArray array = JSONWalk.on(root).next("roles").asArray();
+    // {"roles":[{"isAssigned":true,"role":"admin"},{"isAssigned":true,"role":"user"}]}
 
-      for (int i = 0; i < array.size(); ++i)
+    JSONValue root = JSONParser.parse(json);
+    JSONArray array = JSONWalk.on(root).next("roles").asArray();
+
+    for (int i = 0; i < array.size(); ++i)
+    {
+      JSONObject item = array.get(i).isObject();
+      boolean assigned = JSONWalk.on(item).next("assigned").asBool();
+      String roleName = JSONWalk.on(item).next("role").asString();
+
+      if (assigned)
       {
-         JSONObject item = array.get(i).isObject();
-         boolean assigned = JSONWalk.on(item).next("assigned").asBool();
-         String roleName = JSONWalk.on(item).next("role").asString();
-
-         if(assigned)
-         {
-            roles.add(roleName);
-         }
+        roles.add(roleName);
       }
+    }
 
-      return roles;
-   }
+    return roles;
+  }
 
-   public static List<TaskRef> parseTaskReferenceList(String json)
-   {
-      List<TaskRef> results = new ArrayList<TaskRef>();
+  public static List<TaskRef> parseTaskReferenceList(String json)
+  {
+    List<TaskRef> results = new ArrayList<TaskRef>();
 
-      // {"tasks":[{"id":14,"name":"manager evaluation","isSignalling":true,
-      // "isBlocking":false,"tokenId":6,"processInstanceId":4,"actor":"manager",
-      // "transitionNames":["reject","approve"]}]}
+    // {"tasks":[{"id":14,"name":"manager evaluation","isSignalling":true,
+    // "isBlocking":false,"tokenId":6,"processInstanceId":4,"actor":"manager",
+    // "transitionNames":["reject","approve"]}]}
 
-      JSONValue root = JSONParser.parse(json);
-      JSONArray array = JSONWalk.on(root).next("tasks").asArray();
+    JSONValue root = JSONParser.parse(json);
+    JSONArray array = JSONWalk.on(root).next("tasks").asArray();
 
-      for (int i = 0; i < array.size(); ++i)
-      {
-         JSONObject item = array.get(i).isObject();
-         TaskRef ref = parseTaskReference(item);
-         results.add(ref);
-      }
+    for (int i = 0; i < array.size(); ++i)
+    {
+      JSONObject item = array.get(i).isObject();
+      TaskRef ref = parseTaskReference(item);
+      results.add(ref);
+    }
 
-      return results;
-   }
+    return results;
+  }
 
-   public static TaskRef parseTaskReference(JSONObject item)
-   {
-      
-      long id = JSONWalk.on(item).next("id").asLong();
-      long tokenId = JSONWalk.on(item).next("tokenId").asLong();
-      long instanceId = JSONWalk.on(item).next("processInstanceId").asLong();
-      long processId = JSONWalk.on(item).next("processId").asLong();
-      String name = JSONWalk.on(item).next("name").asString();
-      String actor = JSONWalk.on(item).next("actor").asString();
-      boolean isBlocking = JSONWalk.on(item).next("isBlocking").asBool();
-      boolean isSignalling = JSONWalk.on(item).next("isSignalling").asBool();
+  public static TaskRef parseTaskReference(JSONObject item)
+  {
 
-      TaskRef ref = new TaskRef(
-            id, tokenId, instanceId,
-            processId,
-            name, actor,
-            isSignalling, isBlocking
-      );
+    long id = JSONWalk.on(item).next("id").asLong();
+    long tokenId = JSONWalk.on(item).next("tokenId").asLong();
+    long instanceId = JSONWalk.on(item).next("processInstanceId").asLong();
+    long processId = JSONWalk.on(item).next("processId").asLong();
+    String name = JSONWalk.on(item).next("name").asString();
+    String actor = JSONWalk.on(item).next("actor").asString();
+    boolean isBlocking = JSONWalk.on(item).next("isBlocking").asBool();
+    boolean isSignalling = JSONWalk.on(item).next("isSignalling").asBool();
 
+    TaskRef ref = new TaskRef(
+        id, tokenId, instanceId,
+        processId,
+        name, actor,
+        isSignalling, isBlocking
+    );
 
-      // pooled actors
-      JSONArray pooledActors = JSONWalk.on(item).next("pooledActors").asArray();
-      for (int k = 0; k < pooledActors.size(); ++k)
+    // pooled actors
+    JSONArray pooledActors = JSONWalk.on(item).next("pooledActors").asArray();
+    for (int k = 0; k < pooledActors.size(); ++k)
+    {
+      JSONValue jsonValue = pooledActors.get(k);
+      JSONString t = jsonValue.isString();
+      ref.addPooledActor(t.stringValue());
+    }
+
+    if (isSignalling)
+    {
+      JSONArray arr = JSONWalk.on(item).next("transitionNames").asArray();
+      for (int k = 0; k < arr.size(); ++k)
       {
-         JSONValue jsonValue = pooledActors.get(k);
-         JSONString t = jsonValue.isString();
-         ref.addPooledActor(t.stringValue());
+        JSONValue jsonValue = arr.get(k);
+        if (jsonValue.toString().equals("null"))
+        {
+          ConsoleLog.debug("FIXME JBPM-1828: Null value on transitionNames:" + arr.toString());
+          continue; // TODO: JBPM-1828
+        }
+        JSONString t = jsonValue.isString();
+        ref.getTransitionNames().add(t.stringValue());
       }
 
-      if(isSignalling)
-      {
-         JSONArray arr = JSONWalk.on(item).next("transitionNames").asArray();
-         for (int k = 0; k < arr.size(); ++k)
-         {
-            JSONValue jsonValue = arr.get(k);
-            if(jsonValue.toString().equals("null"))
-            {
-               ConsoleLog.debug("FIXME JBPM-1828: Null value on transitionNames:" +arr.toString());
-               continue; // TODO: JBPM-1828
-            }
-            JSONString t = jsonValue.isString();
-            ref.getTransitionNames().add(t.stringValue());
-         }
+    }
 
-      }
+    return ref;
+  }
 
-      return ref;
-   }
+  public static Map<String, String> parseFormMapping(String json)
+  {
+    //[{"name":"update erp","value":"form.raise.erp-update.xhtml"}]
 
-   public static Map<String,String> parseFormMapping(String json)
-   {
-      //[{"name":"update erp","value":"form.raise.erp-update.xhtml"}]
+    throw new RuntimeException("Not implemented");
 
-      throw new RuntimeException("Not implemented");
+  }
 
-   }
+  public static FormDef parseFormDef(String json)
+  {
+    return parseFormDef(JSONParser.parse(json));
+  }
 
-   public static FormDef parseFormDef(String json)
-   {
-      return parseFormDef(JSONParser.parse(json));
-   }
+  public static FormDef parseFormDef(JSONValue root)
+  {
+    // {"formName":"taskform-15",
+    // "fields":[
+    //    {"varname":"amount","label":"FirstName","required":true,"inputType":"TEXT",
+    //    "dataTypeClass":"java.lang.String","defaults":[]}
+    // ]}
 
-   public static FormDef parseFormDef(JSONValue root)
-   {
-      // {"formName":"taskform-15",
-      // "fields":[
-      //    {"varname":"amount","label":"FirstName","required":true,"inputType":"TEXT",
-      //    "dataTypeClass":"java.lang.String","defaults":[]}
-      // ]}
+    String formName = JSONWalk.on(root).next("formName").asString();
+    FormDef formDef = new FormDef(formName);
 
-      String formName = JSONWalk.on(root).next("formName").asString();
-      FormDef formDef = new FormDef(formName);
+    JSONArray array = JSONWalk.on(root).next("fields").asArray();
+    for (int i = 0; i < array.size(); i++)
+    {
+      JSONObject item = array.get(i).isObject();
 
-      JSONArray array = JSONWalk.on(root).next("fields").asArray();
-      for(int i=0; i<array.size(); i++)
-      {
-         JSONObject item = array.get(i).isObject();
+      // fieldDefs
+      String label = JSONWalk.on(item).next("label").asString();
+      String varName = JSONWalk.on(item).next("varname").asString();
+      boolean required = JSONWalk.on(item).next("required").asBool();
+      FieldDef.InputType inputType = FieldDef.InputType.valueOf(
+          JSONWalk.on(item).next("inputType").asString()
+      );
 
-         // fieldDefs
-         String label = JSONWalk.on(item).next("label").asString();
-         String varName = JSONWalk.on(item).next("varname").asString();
-         boolean required = JSONWalk.on(item).next("required").asBool();
-         FieldDef.InputType inputType = FieldDef.InputType.valueOf(
-               JSONWalk.on(item).next("inputType").asString()
-         );
+      String dataType = JSONWalk.on(item).next("dataTypeClass").asString();
 
-         String dataType = JSONWalk.on(item).next("dataTypeClass").asString();
+      // TODO: Parse defaults
 
-         // TODO: Parse defaults
+      formDef.getFields().add(
+          new FieldDef(label, varName, inputType, dataType, required)
+      );
+    }
 
-         formDef.getFields().add(
-               new FieldDef(label, varName, inputType, dataType,required)
-         );
-      }
+    return formDef;
+  }
 
-      return formDef;
-   }
+  public static ProcessInstanceRef parseProcessInstance(JSONObject root)
+  {
+    ConsoleLog.debug("parse " + root);
 
-   public static ProcessInstanceRef parseProcessInstance(JSONObject root)
-   {
-      ConsoleLog.debug("parse " + root);
+    long id = JSONWalk.on(root).next("instanceId").asLong();
+    long parentId = JSONWalk.on(root).next("parentId").asLong();
+    Date start = JSONWalk.on(root).next("startDate").asDate();
 
-      long id = JSONWalk.on(root).next("instanceId").asLong();
-      long parentId = JSONWalk.on(root).next("parentId").asLong();
-      Date start = JSONWalk.on(root).next("startDate").asDate();
+    JSONWalk.JSONWrapper endDateJSON = JSONWalk.on(root).next("endDate");
+    Date end = null;
+    if (endDateJSON != null)
+      end = endDateJSON.asDate();
 
-      JSONWalk.JSONWrapper endDateJSON = JSONWalk.on(root).next("endDate");
-      Date end = null;
-      if(endDateJSON!=null)
-         end = endDateJSON.asDate();
+    boolean suspended = JSONWalk.on(root).next("suspended").asBool();
 
-      boolean suspended = JSONWalk.on(root).next("suspended").asBool();
+    ProcessInstanceRef processInstance = new ProcessInstanceRef(
+        id, parentId,
+        start, end,
+        suspended
+    );
 
-      ProcessInstanceRef processInstance = new ProcessInstanceRef(
-            id, parentId,
-            start, end,
-            suspended
-      );
+    // tokens
+    JSONObject tokJso = JSONWalk.on(root).next("rootToken").asObject();
+    TokenReference rootToken = parseTokenReference(tokJso);
+    processInstance.setRootToken(rootToken);
+    return processInstance;
+  }
 
-      // tokens
-      JSONObject tokJso = JSONWalk.on(root).next("rootToken").asObject();
-      TokenReference rootToken = parseTokenReference(tokJso);
-      processInstance.setRootToken(rootToken);
-      return processInstance;
-   }
+  public static TokenReference parseTokenReference(JSONObject jso)
+  {
+    long rootTokenId = JSONWalk.on(jso).next("id").asLong();
+    String name = JSONWalk.on(jso).next("name").asString();
+    String nodeName = JSONWalk.on(jso).next("currentNodeName").asString();
 
-   public static TokenReference parseTokenReference(JSONObject jso)
-   {
-      long rootTokenId = JSONWalk.on(jso).next("id").asLong();
-      String name = JSONWalk.on(jso).next("name").asString();
-      String nodeName = JSONWalk.on(jso).next("currentNodeName").asString();
+    TokenReference rt = new TokenReference(rootTokenId, name, nodeName);
 
-      TokenReference rt = new TokenReference(rootTokenId, name, nodeName);
+    boolean canBeSignaled = JSONWalk.on(jso).next("canBeSignaled").asBool();
+    rt.setCanBeSignaled(canBeSignaled);
 
-      boolean canBeSignaled = JSONWalk.on(jso).next("canBeSignaled").asBool();
-      rt.setCanBeSignaled(canBeSignaled);
-      
-      JSONArray signals = JSONWalk.on(jso).next("availableSignals").asArray();
-      for(int i=0; i<signals.size(); i++)
+    JSONArray signals = JSONWalk.on(jso).next("availableSignals").asArray();
+    for (int i = 0; i < signals.size(); i++)
+    {
+      JSONValue jsonValue = signals.get(i);
+      if (jsonValue.toString().equals("null"))
       {
-         JSONValue jsonValue = signals.get(i);
-         if(jsonValue.toString().equals("null"))
-         {
-            ConsoleLog.debug("FIXME JBPM-1828: Null value on availableSignals:" +signals.toString());
-            continue; // TODO: JBPM-1828
-         }
-         JSONString item = jsonValue.isString();
-         rt.getAvailableSignals().add(item.stringValue());
+        ConsoleLog.debug("FIXME JBPM-1828: Null value on availableSignals:" + signals.toString());
+        continue; // TODO: JBPM-1828
       }
+      JSONString item = jsonValue.isString();
+      rt.getAvailableSignals().add(item.stringValue());
+    }
 
-      JSONArray childArr = JSONWalk.on(jso).next("children").asArray();
-      for(int i=0; i<childArr.size(); i++)
-      {
-         JSONObject item = childArr.get(i).isObject();
-         rt.getChildren().add(parseTokenReference(item));   
-      }
+    JSONArray childArr = JSONWalk.on(jso).next("children").asArray();
+    for (int i = 0; i < childArr.size(); i++)
+    {
+      JSONObject item = childArr.get(i).isObject();
+      rt.getChildren().add(parseTokenReference(item));
+    }
 
-      return rt;
-   }
+    return rt;
+  }
 
-   public static List<String> parseStringArray(JSONValue jso)
-   {
-      List<String> result = new ArrayList<String>();
+  public static List<String> parseStringArray(JSONValue jso)
+  {
+    List<String> result = new ArrayList<String>();
 
-      JSONArray jsonArray = jso.isArray();
+    JSONArray jsonArray = jso.isArray();
 
-      if(null==jsonArray)
-         throw new IllegalArgumentException("Not an array: " +jso);
-      
-      for(int i=0; i<jsonArray.size(); i++)
+    if (null == jsonArray)
+      throw new IllegalArgumentException("Not an array: " + jso);
+
+    for (int i = 0; i < jsonArray.size(); i++)
+    {
+      JSONValue jsonValue = jsonArray.get(i);
+      if (jsonValue.toString().equals("null"))
       {
-         JSONValue jsonValue = jsonArray.get(i);
-         if(jsonValue.toString().equals("null"))
-         {
-            ConsoleLog.debug("FIXME JBPM-1828: Null value on string array:" +jsonArray.toString());
-            continue; // TODO: JBPM-1828
-         }
-         JSONString item = jsonValue.isString();
-         result.add(item.stringValue());
+        ConsoleLog.debug("FIXME JBPM-1828: Null value on string array:" + jsonArray.toString());
+        continue; // TODO: JBPM-1828
       }
+      JSONString item = jsonValue.isString();
+      result.add(item.stringValue());
+    }
 
-      return result;
-   }
+    return result;
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionList.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionList.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionList.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -25,12 +25,14 @@
 import com.gwtext.client.data.*;
 import com.gwtext.client.widgets.MessageBox;
 import com.gwtext.client.widgets.MessageBoxConfig;
+import com.gwtext.client.widgets.ComponentMgr;
 import com.gwtext.client.widgets.grid.ColumnConfig;
 import com.gwtext.client.widgets.grid.ColumnModel;
 import com.gwtext.client.widgets.grid.RowSelectionModel;
 import org.jboss.bpm.console.client.util.ConsoleLog;
 import org.jboss.bpm.console.client.util.ModelModificationCallback;
 import org.jboss.bpm.console.client.MainView;
+import org.jboss.bpm.console.client.Editor;
 import org.jboss.bpm.console.client.model.ProcessDefinitionRef;
 import org.jboss.bpm.console.client.widgets.RemoteListView;
 
@@ -41,149 +43,152 @@
  */
 public class ProcessDefinitionList extends RemoteListView
 {
-   private Map<Integer, ProcessDefinitionRef> row2ProcessMap = new HashMap<Integer, ProcessDefinitionRef>();
+  private Map<Integer, ProcessDefinitionRef> row2ProcessMap = new HashMap<Integer, ProcessDefinitionRef>();
 
-   public ProcessDefinitionList(ModelModificationCallback callback, String titleName, final MainView view)
-   {
-      super(callback, titleName, view, getResourceUrl(view));
-      enableAddBtn(false);
-      final RowSelectionModel sm = new RowSelectionModel(true);
-      setRowSelectionModel(sm);      
-   }
+  public ProcessDefinitionList(ModelModificationCallback callback, String titleName, final MainView view)
+  {
+    super(callback, titleName, view, getResourceUrl(view));
+    enableAddBtn(false);
+    final RowSelectionModel sm = new RowSelectionModel(true);
+    setRowSelectionModel(sm);
+  }
 
-   private static String getResourceUrl(MainView view)
-   {
-      return view.getUrlBuilder().getProcessDefinitionsURL();
-   }
+  private static String getResourceUrl(MainView view)
+  {
+    return view.getUrlBuilder().getProcessDefinitionsURL();
+  }
 
-   protected ColumnModel createColumnModel()
-   {
-      final ColumnModel columnModel = new ColumnModel(
+  protected ColumnModel createColumnModel()
+  {
+    final ColumnModel columnModel = new ColumnModel(
         new ColumnConfig[]
-          {
-            new ColumnConfig("Process ID", "processId", 75, true),
-            new ColumnConfig("Name", "name", 300, true, null, "expand"),
-            new ColumnConfig("Version", "version", 75, true)
-          }
-      );
-      return columnModel;
-   }
+            {
+                new ColumnConfig("Process ID", "processId", 75, true),
+                new ColumnConfig("Name", "name", 300, true, null, "expand"),
+                new ColumnConfig("Version", "version", 75, true)
+            }
+    );
+    return columnModel;
+  }
 
-   protected JsonReader createReader()
-   {
-      final RecordDef recordDef = new RecordDef(
+  protected JsonReader createReader()
+  {
+    final RecordDef recordDef = new RecordDef(
         new FieldDef[]{
-          new IntegerFieldDef("processId"),
-          new StringFieldDef("name"),
-          new StringFieldDef("version")
+            new IntegerFieldDef("processId"),
+            new StringFieldDef("name"),
+            new StringFieldDef("version")
         }
-      );
+    );
 
-      final JsonReader reader = new JsonReader(recordDef);
-      reader.setRoot("definitions");
-      reader.setTotalProperty("totalCount");
-      reader.setId("processId");
-      return reader;
-   }
+    final JsonReader reader = new JsonReader(recordDef);
+    reader.setRoot("definitions");
+    reader.setTotalProperty("totalCount");
+    reader.setId("processId");
+    return reader;
+  }
 
-   public void onExamine(int row)
-   {
-      ProcessDefinitionRef proc = row2ProcessMap.get(row);
-      launchEditor(proc);
-   }
+  public void onExamine(int row)
+  {
+    ProcessDefinitionRef proc = row2ProcessMap.get(row);
+    launchView(proc);
+  }
 
-   public void launchEditor(ProcessDefinitionRef proc)
-   {
-      String editorId = ProcessInstanceListEditor.createWidgetID(proc);
+  public void launchView(ProcessDefinitionRef proc)
+  {
+    String editorId = ProcessEditor.ID;
+    Editor editor = (Editor) ComponentMgr.getComponent(editorId);
+    if (editor.hasView(editorId))
+      editor.showView(editorId);
+    else
+      editor.addView(new ProcessInstanceListView(proc, view), true);
+  }
 
-      if(view.hasEditor(editorId))
-         view.showEditor(editorId);
-      else
-         view.addEditor( new ProcessInstanceListEditor(proc, view) );
-   }
+  public void onDelete(final int row)
+  {
+    MessageBox.show(new MessageBoxConfig()
+    {
+      {
+        setTitle("Delete process?");
+        setMsg("Deleting the process will remove all instances as well. " +
+            "Would you like to delete this process?");
+        setButtons(MessageBox.YESNOCANCEL);
+        setCallback(new MessageBox.PromptCallback()
+        {
+          public void execute(String btnID, String text)
+          {
+            if ("yes".equals(btnID))
+            {
+              ProcessDefinitionRef proc = (ProcessDefinitionRef) row2ProcessMap.get(row);
+              String url = view.getUrlBuilder().getRemoveDefinitionURL(proc.getProcessId());
+              RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, url);
 
-   public void onDelete(final int row)
-   {
-      MessageBox.show(new MessageBoxConfig() {
-         {
-            setTitle("Delete process?");
-            setMsg("Deleting the process will remove all instances as well. " +
-              "Would you like to delete this process?");
-            setButtons(MessageBox.YESNOCANCEL);
-            setCallback(new MessageBox.PromptCallback() {
-               public void execute(String btnID, String text)
-               {
-                  if("yes".equals( btnID) )
-                  {
-                     ProcessDefinitionRef proc = (ProcessDefinitionRef)row2ProcessMap.get(row);
-                     String url = view.getUrlBuilder().getRemoveDefinitionURL(proc.getProcessId());
-                     RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, url);
+              try
+              {
+                rb.sendRequest("",
+                    new RequestCallback()
+                    {
 
-                     try
-                     {
-                        rb.sendRequest("",
-                          new RequestCallback() {
+                      public void onResponseReceived(Request request, Response response)
+                      {
+                        modelModificationCallback.onStaleModel();
+                      }
 
-                             public void onResponseReceived(Request request, Response response)
-                             {
-                                modelModificationCallback.onStaleModel();
-                             }
+                      public void onError(Request request, Throwable t)
+                      {
+                        // auth failed
+                        ConsoleLog.error("Failed to remove process definition", t);
+                      }
+                    });
+              }
+              catch (RequestException e1)
+              {
+                ConsoleLog.error("Request failed", e1);
+              }
+            }
+          }
+        });
+      }
+    });
+  }
 
-                             public void onError(Request request, Throwable t)
-                             {
-                                // auth failed
-                                ConsoleLog.error("Failed to remove process definition", t);
-                             }
-                          });
-                     }
-                     catch (RequestException e1)
-                     {
-                        ConsoleLog.error("Request failed", e1);
-                     }
-                  }
-               }
-            });
-         }
-      });
-   }
 
+  public void onAdd()
+  {
 
-   public void onAdd()
-   {
-      
-   }
+  }
 
-   protected void onRecordsLoaded(Record[] records)
-   {
-      row2ProcessMap.clear();
+  protected void onRecordsLoaded(Record[] records)
+  {
+    row2ProcessMap.clear();
 
-      int i = 0;
-      for(Record r : records)
-      {
-         Long id = Long.valueOf(r.getAsString("processId"));
-         ProcessDefinitionRef pd = new ProcessDefinitionRef(
-           id,
-           r.getAsString("name"),
-           r.getAsString("version")
-         );
+    int i = 0;
+    for (Record r : records)
+    {
+      Long id = Long.valueOf(r.getAsString("processId"));
+      ProcessDefinitionRef pd = new ProcessDefinitionRef(
+          id,
+          r.getAsString("name"),
+          r.getAsString("version")
+      );
 
-         row2ProcessMap.put(i, pd);
-         i++;
-      }
+      row2ProcessMap.put(i, pd);
+      i++;
+    }
 
-      ConsoleLog.debug("Loaded " + row2ProcessMap.size() + " process definitions");
-   }
+    ConsoleLog.debug("Loaded " + row2ProcessMap.size() + " process definitions");
+  }
 
-   public List<ProcessDefinitionRef> getAvailableProcessDefinitions()
-   {
-      List<ProcessDefinitionRef> results = new ArrayList<ProcessDefinitionRef>();
-      Iterator<Integer> keys = row2ProcessMap.keySet().iterator();
-      while(keys.hasNext())
-      {
-         results.add(row2ProcessMap.get(keys.next()));
-      }
+  public List<ProcessDefinitionRef> getAvailableProcessDefinitions()
+  {
+    List<ProcessDefinitionRef> results = new ArrayList<ProcessDefinitionRef>();
+    Iterator<Integer> keys = row2ProcessMap.keySet().iterator();
+    while (keys.hasNext())
+    {
+      results.add(row2ProcessMap.get(keys.next()));
+    }
 
-      return results;
-   }
+    return results;
+  }
 }
 

Deleted: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionListEditor.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionListEditor.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionListEditor.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -1,180 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.bpm.console.client.process;
-
-import com.google.gwt.core.client.GWT;
-import com.gwtext.client.core.Connection;
-import com.gwtext.client.core.EventObject;
-import com.gwtext.client.widgets.Button;
-import com.gwtext.client.widgets.MessageBox;
-import com.gwtext.client.widgets.Panel;
-import com.gwtext.client.widgets.event.ButtonListenerAdapter;
-import com.gwtext.client.widgets.form.Form;
-import com.gwtext.client.widgets.form.FormPanel;
-import com.gwtext.client.widgets.form.TextField;
-import com.gwtext.client.widgets.form.event.FormListenerAdapter;
-import org.jboss.bpm.console.client.Editor;
-import org.jboss.bpm.console.client.MainView;
-import org.jboss.bpm.console.client.UIConstants;
-import org.jboss.bpm.console.client.util.ConsoleLog;
-import org.jboss.bpm.console.client.util.ModelListenerRegistry;
-import org.jboss.bpm.console.client.util.ModelModificationCallback;
-
-/**
- * @author Heiko.Braun <heiko.braun at jboss.com>
- */
-public class ProcessDefinitionListEditor extends Editor
-{
-   public final static String ID = "org.jboss.bpm.process.ProcessDefinitionListEditor";
-
-   private ProcessDefinitionList processDefinitionList;
-   private MainView view;
-   private Panel teaserPanel;
-   private ModelListenerRegistry modelListeners = new ModelListenerRegistry();
-
-   public ProcessDefinitionListEditor(final MainView view)
-   {
-      super(view);
-      this.setId(ID);
-      this.view = view;
-
-      this.setWidth(UIConstants.EDITOR_WIDTH);
-
-     
-      // ----------------------------------
-            
-      final ModelModificationCallback modelModificationCallback = new ModelModificationCallback()
-      {
-         public void onStaleModel()
-         {
-            resetEditor();
-         }
-      };
-
-      // ----------------------------------
-
-      processDefinitionList = new ProcessDefinitionList(
-            modelModificationCallback, "Process Definitions", view
-      );
-
-      // ----------------------------------
-
-      Panel outerFormPanel = new Panel();
-      outerFormPanel.setBorder(false);
-      outerFormPanel.setPaddings(10);
-      
-
-      final FormPanel formPanel = new FormPanel();
-      formPanel.setFrame(true);
-      formPanel.setTitle("Upload new process definition");
-      formPanel.setLabelWidth(75);
-      formPanel.setWidth(UIConstants.EDITOR_PANEL_WIDTH);
-     
-      formPanel.setFileUpload(true);
-      final TextField file = new TextField("File", "file");
-      file.setInputType("file");      
-      
-      formPanel.add(file);
-
-      Button uploadButton = new Button("Upload", new ButtonListenerAdapter()
-      {
-         public void onClick(Button button, EventObject e)
-         {
-            formPanel.getForm().submit(
-              view.getUrlBuilder().getUploadDefinitionURL(), null,
-              Connection.POST, "Uploading definition ...", false);
-         }
-      });      
-      formPanel.addButton(uploadButton);
-      
-      formPanel.getForm().addListener(
-        new FormListenerAdapter()
-        {
-
-           public boolean doBeforeAction(Form form)
-           {
-              if(!GWT.isScript())
-              {
-                 MessageBox.alert("Uploads only work on web mode!");
-                 return false;
-              }
-              else if(form.findField("file").getValueAsString().equals(""))
-              {
-                 MessageBox.alert("Please provide a process definition file");
-                 return false;
-              }
-
-              
-              return true;
-           }
-
-           public void onActionComplete(Form form, int i, String string)
-           {
-              processDefinitionList.reloadStore();
-              doLayout();
-              form.reset();
-           }
-
-           public void onActionFailed(Form form, int i, String string)
-           {
-              super.onActionFailed(form, i, string);
-              ConsoleLog.error("Failed to upload process definition: " + string );
-           }
-        }
-      );
-
-      outerFormPanel.add(formPanel);
-      
-      // ----------------------------------
-
-      this.add(processDefinitionList);
-      this.add(outerFormPanel);
-
-   }
-
-
-   public String getEditorId()
-   {
-      return ID;
-   }
-
-   public String getTitle()
-   {
-      return "Processes";
-   }
-
-   public String getIconCSS()
-   {
-      return "bpm-process-icon";
-   }
-
-   public ProcessDefinitionList getProcessDefinitionList()
-   {
-      return processDefinitionList;
-   }
-
-   public void resetEditor()
-   {
-      processDefinitionList.reloadStore();
-      modelListeners.fireResetEvent();
-   }
-}

Copied: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessEditor.java (from rev 3638, projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessDefinitionListEditor.java)
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessEditor.java	                        (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessEditor.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -0,0 +1,242 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.bpm.console.client.process;
+
+import com.google.gwt.core.client.GWT;
+import com.gwtext.client.core.Connection;
+import com.gwtext.client.core.EventObject;
+import com.gwtext.client.widgets.Button;
+import com.gwtext.client.widgets.MessageBox;
+import com.gwtext.client.widgets.Panel;
+import com.gwtext.client.widgets.tree.TreePanel;
+import com.gwtext.client.widgets.tree.TreeNode;
+import com.gwtext.client.widgets.tree.event.TreeNodeListenerAdapter;
+import com.gwtext.client.widgets.event.ButtonListenerAdapter;
+import com.gwtext.client.widgets.form.Form;
+import com.gwtext.client.widgets.form.FormPanel;
+import com.gwtext.client.widgets.form.TextField;
+import com.gwtext.client.widgets.form.event.FormListenerAdapter;
+import com.gwtext.client.data.Node;
+import org.jboss.bpm.console.client.*;
+import org.jboss.bpm.console.client.util.ConsoleLog;
+import org.jboss.bpm.console.client.util.ModelListenerRegistry;
+import org.jboss.bpm.console.client.util.ModelModificationCallback;
+
+/**
+ * @author Heiko.Braun <heiko.braun at jboss.com>
+ */
+public class ProcessEditor extends Editor
+{
+  public final static String ID = "org.jboss.bpm.process.ProcessEditor";
+
+  private ProcessDefinitionList processDefinitionList;
+  private MainView mainView;
+  private ModelListenerRegistry modelListeners = new ModelListenerRegistry();
+
+  public ProcessEditor(final MainView view)
+  {
+    super(view);
+    this.setId(ID);
+    this.mainView = view;
+
+    this.setWidth(UIConstants.EDITOR_WIDTH);
+
+    // ----------------------------------
+
+    final ModelModificationCallback modelModificationCallback = new ModelModificationCallback()
+    {
+      public void onStaleModel()
+      {
+        resetEditor();
+      }
+    };
+
+    // ----------------------------------
+
+    processDefinitionList = new ProcessDefinitionList(
+        modelModificationCallback, "Process Definitions", view
+    );
+
+    // ----------------------------------
+
+    Panel outerFormPanel = new Panel();
+    outerFormPanel.setBorder(false);
+    outerFormPanel.setPaddings(10, 0, 0, 0);
+
+    final FormPanel formPanel = new FormPanel();
+    formPanel.setFrame(true);
+    formPanel.setTitle("Upload new process definition");
+    formPanel.setLabelWidth(75);
+    formPanel.setWidth(UIConstants.EDITOR_PANEL_WIDTH);
+
+    formPanel.setFileUpload(true);
+    final TextField file = new TextField("File", "file");
+    file.setInputType("file");
+
+    formPanel.add(file);
+
+    Button uploadButton = new Button("Upload", new ButtonListenerAdapter()
+    {
+      public void onClick(Button button, EventObject e)
+      {
+        formPanel.getForm().submit(
+            view.getUrlBuilder().getUploadDefinitionURL(), null,
+            Connection.POST, "Uploading definition ...", false);
+      }
+    });
+    formPanel.addButton(uploadButton);
+
+    formPanel.getForm().addListener(
+        new FormListenerAdapter()
+        {
+
+          public boolean doBeforeAction(Form form)
+          {
+            if (!GWT.isScript())
+            {
+              MessageBox.alert("Uploads only work on web mode!");
+              return false;
+            }
+            else if (form.findField("file").getValueAsString().equals(""))
+            {
+              MessageBox.alert("Please provide a process definition file");
+              return false;
+            }
+
+
+            return true;
+          }
+
+          public void onActionComplete(Form form, int i, String string)
+          {
+            processDefinitionList.reloadStore();
+            doLayout();
+            form.reset();
+          }
+
+          public void onActionFailed(Form form, int i, String string)
+          {
+            super.onActionFailed(form, i, string);
+            ConsoleLog.error("Failed to upload process definition: " + string);
+          }
+        }
+    );
+
+    outerFormPanel.add(formPanel);
+
+    // ----------------------------------
+
+    final View defaultView = new View(main)
+    {
+
+      public String getViewId()
+      {
+        return getEditorId() + ".defaultView";
+      }
+
+      public String getIconCSS()
+      {
+        return "";
+      }
+    };
+
+    defaultView.setBorder(false);
+    defaultView.setTitle("Process definitions");
+    defaultView.add(processDefinitionList);
+    defaultView.add(outerFormPanel);
+
+    addView(defaultView, false);
+  }
+
+
+  public String getEditorId()
+  {
+    return ID;
+  }
+
+  public String getTitle()
+  {
+    return "Processes";
+  }
+
+  public String getIconCSS()
+  {
+    return "bpm-process-icon";
+  }
+
+
+  public MenuSection provideMenuSection()
+  {
+     return new MenuSection("Process Management", "bpm-process-icon", new ProcessTree());    
+  }
+
+  public ProcessDefinitionList getProcessDefinitionList()
+  {
+    return processDefinitionList;
+  }
+
+  public void resetEditor()
+  {
+    processDefinitionList.reloadStore();
+    modelListeners.fireResetEvent();
+  }
+
+  class ProcessTree extends TreePanel
+  {
+
+    public ProcessTree()
+    {
+
+      TreeNode root = new TreeNode("Process Definitions");
+
+      TreeNode definitions = new TreeNode("View definitions");
+      definitions.setExpanded(true);
+      definitions.addListener(
+          new TreeNodeListenerAdapter()
+          {
+            public void onClick(Node node, EventObject eventObject)
+            {
+              if (mainView.hasEditor(ProcessEditor.ID))
+              {
+                mainView.showEditor(ProcessEditor.ID);
+              }
+              else
+              {
+                mainView.addEditor(new ProcessEditor(mainView));
+              }
+
+            }
+          }
+      );
+      //TreeNode upload = new TreeNode("Upload new definitions");
+      //upload.setExpanded(true);
+
+      root.appendChild(definitions);
+      //root.appendChild(upload);
+
+      setRootVisible(true);
+      setRootNode(root);
+      root.setExpanded(true);
+    }
+  }
+
+}


Property changes on: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessEditor.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessImageComponent.java (from rev 3630, projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessImageView.java)
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessImageComponent.java	                        (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessImageComponent.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -0,0 +1,159 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.bpm.console.client.process;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.json.client.JSONObject;
+import com.google.gwt.user.client.ui.HTML;
+import com.gwtext.client.widgets.Component;
+import com.gwtext.client.widgets.Panel;
+import com.gwtext.client.widgets.event.PanelListenerAdapter;
+import org.jboss.bpm.console.client.util.ConsoleLog;
+import org.jboss.bpm.console.client.MainView;
+import org.jboss.bpm.console.client.model.ProcessInstanceRef;
+import org.jboss.bpm.console.client.model.jbpm3.ActiveNodeInfo;
+import org.jboss.bpm.console.client.model.jbpm3.DiagramNodeInfo;
+import org.jboss.bpm.console.client.util.JSONRequest;
+import org.jboss.bpm.console.client.util.JSONRequestHandler;
+import org.jboss.bpm.console.client.util.JSONWalk;
+
+/**
+ * Fetches the {@link org.jboss.bpm.console.client.model.jbpm3.ActiveNodeInfo}
+ * and displays the process image.<p>
+ * <p/>
+ * The {@link com.gwtext.client.widgets.event.PanelListenerAdapter#doBeforeRender(com.gwtext.client.widgets.Component)}
+ * callback forces the GET request on the active node info, but has weak error handling and thus can result in 'null'.<br>
+ * <p/>
+ * The {@link com.gwtext.client.widgets.event.PanelListenerAdapter#onRender(com.gwtext.client.widgets.Component)}
+ * callback fetches the process definition image, if available.
+ *
+ * @author Heiko.Braun <heiko.braun at jboss.com>
+ */
+public class ProcessImageComponent extends Panel
+{
+  private ProcessInstanceRef instance;
+  private MainView view;
+  private ActiveNodeInfo activeNodeInfo = null;
+
+  public ProcessImageComponent(final ProcessInstanceRef instance, final MainView view)
+  {
+    super();
+    this.instance = instance;
+    this.view = view;
+
+    this.setHeader(false);
+    this.setBorder(true);
+    this.setFrame(false);
+
+    this.setAutoScroll(true);
+
+    this.addListener(
+        new PanelListenerAdapter()
+        {
+          public boolean doBeforeRender(Component component)
+          {
+            loadActiveNodeInfo();
+            return true;
+          }
+
+
+          public void onRender(Component component)
+          {
+            /*final Image image = new Image("images/processSample.jpg");
+            image.setStyleName("bpm-ProcessImage");
+            add(image);*/
+
+          }
+        }
+    );
+
+  }
+
+  private void loadActiveNodeInfo()
+  {
+    String url = view.getUrlBuilder().getActiveNodeInfoURL(this.instance.getInstanceId());
+    ConsoleLog.debug("Loading activeNodeInfo: " + url);
+
+    JSONRequest.get(url,
+        new JSONRequestHandler()
+        {
+
+          public void onRequestComplete(JavaScriptObject json)
+          {
+
+            //TODO: move to DTO Parser
+            JSONObject root = new JSONObject(json);
+            int diagramWidth = JSONWalk.on(root).next("diagramWidth").asInt();
+            int diagramHeight = JSONWalk.on(root).next("diagramHeight").asInt();
+
+            JSONObject activeNode = JSONWalk.on(root).next("activeNode").asObject();
+
+            int x = JSONWalk.on(activeNode).next("x").asInt();
+            int y = JSONWalk.on(activeNode).next("y").asInt();
+
+            int width = JSONWalk.on(activeNode).next("width").asInt();
+            int height = JSONWalk.on(activeNode).next("height").asInt();
+            String name = JSONWalk.on(activeNode).next("name").asString();
+
+            ActiveNodeInfo activeNodeInfo =
+                new ActiveNodeInfo(
+                    diagramWidth, diagramHeight,
+                    new DiagramNodeInfo(name, x, y, width, height)
+                );
+
+            onActiveNodeInfoLoaded(activeNodeInfo);
+          }
+        }
+    );
+
+  }
+
+  public void onActiveNodeInfoLoaded(ActiveNodeInfo activeNodeInfo)
+  {
+    ConsoleLog.debug("Successfully loaded activeNodeInfo:" + activeNodeInfo.getActiveNode().getName());
+    this.activeNodeInfo = activeNodeInfo;
+
+    DiagramNodeInfo activeNode = activeNodeInfo.getActiveNode();
+    String imageUrl = view.getUrlBuilder().getProcessImageURL(instance.getParentId());
+
+    HTML html = new HTML(
+        "<div id=\"imageContainer\" style=\"position:relative;top:-1;left:-1;height:" + activeNodeInfo.getHeight() + "px;width:" + activeNodeInfo.getWidth() + "px\">" +
+            "<img src=\"" + imageUrl + "\" style=\"position:absolute;top:0;left:0\" />" +
+            "" +
+            "<div class=\"activeNode\" style=\"top:" + (activeNode.getY()) + "px;left:" + activeNode.getX() + "px;width:" + (activeNode.getWidth() - 2) + "px;height:" + (activeNode.getHeight() - 2) + "px\"></div>" +
+            "" +
+            "<div class=\"activeNode-header\" style=\"top:" + (activeNode.getY() - 15) + "px;left:" + activeNode.getX() + "px;width:" + activeNode.getWidth() + "px;height:15px\">" +
+            " <div class=\"activeNode-header-link\"><a href=\"javascript:alert('Not implemented!')\">Running</a></div>" +
+            "</div>" +
+            "</div>"
+    );
+
+    add(html);
+    doLayout();
+
+  }
+
+  public ActiveNodeInfo getActiveNodeInfo()
+  {
+    return activeNodeInfo;
+  }
+}


Property changes on: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessImageComponent.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Deleted: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessImageView.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessImageView.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessImageView.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -1,157 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.bpm.console.client.process;
-
-import com.google.gwt.core.client.JavaScriptObject;
-import com.google.gwt.json.client.JSONObject;
-import com.google.gwt.user.client.ui.HTML;
-import com.gwtext.client.widgets.Component;
-import com.gwtext.client.widgets.Panel;
-import com.gwtext.client.widgets.event.PanelListenerAdapter;
-import org.jboss.bpm.console.client.util.ConsoleLog;
-import org.jboss.bpm.console.client.MainView;
-import org.jboss.bpm.console.client.model.ProcessInstanceRef;
-import org.jboss.bpm.console.client.model.jbpm3.ActiveNodeInfo;
-import org.jboss.bpm.console.client.model.jbpm3.DiagramNodeInfo;
-import org.jboss.bpm.console.client.util.JSONRequest;
-import org.jboss.bpm.console.client.util.JSONRequestHandler;
-import org.jboss.bpm.console.client.util.JSONWalk;
-
-/**
- * Fetches the {@link org.jboss.bpm.console.client.model.jbpm3.ActiveNodeInfo}
- * and displays the process image.<p>
- *
- * The {@link com.gwtext.client.widgets.event.PanelListenerAdapter#doBeforeRender(com.gwtext.client.widgets.Component)}
- * callback forces the GET request on the active node info, but has weak error handling and thus can result in 'null'.<br>
- *
- * The {@link com.gwtext.client.widgets.event.PanelListenerAdapter#onRender(com.gwtext.client.widgets.Component)}
- * callback fetches the process definition image, if available.
- * @author Heiko.Braun <heiko.braun at jboss.com>
- */
-public class ProcessImageView extends Panel
-{
-   private ProcessInstanceRef instance;
-   private MainView view;
-   private ActiveNodeInfo activeNodeInfo = null;
-
-   public ProcessImageView(final ProcessInstanceRef instance, final MainView view)
-   {
-      super();
-      this.instance = instance;
-      this.view = view;
-
-      this.setHeader(false);
-      this.setBorder(true);
-      this.setFrame(false);
-
-      this.setAutoScroll(true);
-
-      this.addListener(
-        new PanelListenerAdapter()
-        {
-           public boolean doBeforeRender(Component component)
-           {
-              loadActiveNodeInfo();
-              return true;
-           }
-
-
-           public void onRender(Component component)
-           {
-              /*final Image image = new Image("images/processSample.jpg");
-              image.setStyleName("bpm-ProcessImage");
-              add(image);*/
-
-           }
-        }
-      );
-
-   }
-
-   private void loadActiveNodeInfo()
-   {
-      String url = view.getUrlBuilder().getActiveNodeInfoURL(this.instance.getInstanceId());
-      ConsoleLog.debug("Loading activeNodeInfo: " + url);
-
-      JSONRequest.get(url,
-        new JSONRequestHandler() {
-
-           public void onRequestComplete(JavaScriptObject json)
-           {
-
-              //TODO: move to DTO Parser
-              JSONObject root = new JSONObject(json);
-              int diagramWidth = JSONWalk.on(root).next("diagramWidth").asInt();
-              int diagramHeight = JSONWalk.on(root).next("diagramHeight").asInt();
-
-              JSONObject activeNode = JSONWalk.on(root).next("activeNode").asObject();
-
-              int x = JSONWalk.on(activeNode).next("x").asInt();
-              int y = JSONWalk.on(activeNode).next("y").asInt();
-
-              int width = JSONWalk.on(activeNode).next("width").asInt();
-              int height = JSONWalk.on(activeNode).next("height").asInt();
-              String name = JSONWalk.on(activeNode).next("name").asString();
-
-              ActiveNodeInfo activeNodeInfo =
-                new ActiveNodeInfo(
-                  diagramWidth, diagramHeight,
-                  new DiagramNodeInfo(name, x, y, width, height)
-                );
-
-              onActiveNodeInfoLoaded(activeNodeInfo);
-           }
-        }
-      );
-
-   }
-
-   public void onActiveNodeInfoLoaded(ActiveNodeInfo activeNodeInfo)
-   {
-      ConsoleLog.debug("Successfully loaded activeNodeInfo:" + activeNodeInfo.getActiveNode().getName());
-      this.activeNodeInfo = activeNodeInfo;
-
-      DiagramNodeInfo activeNode = activeNodeInfo.getActiveNode();
-      String imageUrl = view.getUrlBuilder().getProcessImageURL(instance.getParentId());
-      
-      HTML html = new HTML(
-        "<div id=\"imageContainer\" style=\"position:relative;top:-1;left:-1;height:"+activeNodeInfo.getHeight()+"px;width:"+activeNodeInfo.getWidth()+"px\">" +
-          "<img src=\""+imageUrl+"\" style=\"position:absolute;top:0;left:0\" />" +
-          "" +
-          "<div class=\"activeNode\" style=\"top:"+ (activeNode.getY()) +"px;left:"+activeNode.getX()+"px;width:"+(activeNode.getWidth()-2)+"px;height:"+(activeNode.getHeight()-2)+"px\"></div>" +
-          "" +
-          "<div class=\"activeNode-header\" style=\"top:"+(activeNode.getY()-15)+"px;left:"+activeNode.getX()+"px;width:"+activeNode.getWidth()+"px;height:15px\">" +
-          " <div class=\"activeNode-header-link\"><a href=\"javascript:alert('Not implemented!')\">Running</a></div>" +
-          "</div>" +
-          "</div>"
-      );
-
-      add(html);
-      doLayout();
-
-   }
-
-   public ActiveNodeInfo getActiveNodeInfo()
-   {
-      return activeNodeInfo;
-   }
-}

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceDetailForm.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceDetailForm.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceDetailForm.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -44,147 +44,148 @@
 class ProcessInstanceDetailForm extends Panel implements ModelChangeListener
 {
 
-   private FormPanel detailsForm;
+  private FormPanel detailsForm;
 
-   private ProcessInstanceRef selectedInstance;
+  private ProcessInstanceRef selectedInstance;
 
-   private ModelModificationCallback callback;
+  private ModelModificationCallback callback;
 
-   private MainView mainView;
+  private MainView mainView;
 
-   private Button suspendButton;
-   private Button resumeButton;
+  private Button suspendButton;
+  private Button resumeButton;
 
-   public ProcessInstanceDetailForm(MainView view, ModelModificationCallback callback)
-   {
-      super();
+  public ProcessInstanceDetailForm(MainView view, ModelModificationCallback callback)
+  {
+    super();
 
-      this.mainView = view;
-      this.callback = callback;
+    this.mainView = view;
+    this.callback = callback;
 
-      setTitle("Instance Details");
-      setBorder(false);
-      setFrame(false);
+    setTitle("Instance Details");
+    setBorder(false);
+    setFrame(false);
 
-      // ---------------
+    // ---------------
 
-      detailsForm = FormWidgets.createBaseFormPanel();
+    detailsForm = FormWidgets.createBaseFormPanel();
 
-      // ---------------
+    // ---------------
 
-      TextField idField = new TextField("Id", "instanceId", 230);
-      idField.setReadOnly(true);
-      detailsForm.add(idField);
-      TextField keyField = new TextField("Key", "key", 230);
-      keyField.setReadOnly(true);
-      detailsForm.add(keyField);
-      TextField stateField = new TextField("State", "state", 230);
-      stateField.setReadOnly(true);
-      detailsForm.add(stateField);
-      DateField startDateField = new DateField("Start Date", "startDate", 230);
-      startDateField.setReadOnly(true);
-      detailsForm.add(startDateField);
-      //detailsForm.add(new DateField("End Date", "endDate", 230));
+    TextField idField = new TextField("Id", "instanceId", 230);
+    idField.setReadOnly(true);
+    detailsForm.add(idField);
+    TextField keyField = new TextField("Key", "key", 230);
+    keyField.setReadOnly(true);
+    detailsForm.add(keyField);
+    TextField stateField = new TextField("State", "state", 230);
+    stateField.setReadOnly(true);
+    detailsForm.add(stateField);
+    DateField startDateField = new DateField("Start Date", "startDate", 230);
+    startDateField.setReadOnly(true);
+    detailsForm.add(startDateField);
+    //detailsForm.add(new DateField("End Date", "endDate", 230));
 
-      suspendButton = new Button("Suspend",
-            new ButtonListenerAdapter()
-            {
-               public void onClick(Button button, EventObject eventObject)
-               {
-                  selectedInstance.setState(ProcessInstanceRef.STATE.SUSPENDED);
-                  persistStateChange();
-               }
-            }
-      );
+    suspendButton = new Button("Suspend",
+        new ButtonListenerAdapter()
+        {
+          public void onClick(Button button, EventObject eventObject)
+          {
+            selectedInstance.setState(ProcessInstanceRef.STATE.SUSPENDED);
+            persistStateChange();
+          }
+        }
+    );
 
-      resumeButton = new Button("Resume",
-            new ButtonListenerAdapter()
-            {
+    resumeButton = new Button("Resume",
+        new ButtonListenerAdapter()
+        {
 
-               public void onClick(Button button, EventObject eventObject)
-               {
-                  selectedInstance.setState(ProcessInstanceRef.STATE.RUNNING);
-                  persistStateChange();
-               }
-            }
-      );
+          public void onClick(Button button, EventObject eventObject)
+          {
+            selectedInstance.setState(ProcessInstanceRef.STATE.RUNNING);
+            persistStateChange();
+          }
+        }
+    );
 
-      detailsForm.addButton(suspendButton);
-      detailsForm.addButton(resumeButton);
+    detailsForm.addButton(suspendButton);
+    detailsForm.addButton(resumeButton);
 
-      this.add(detailsForm);
-            
-   }
+    this.add(detailsForm);
 
-   private void persistStateChange()
-      {
-         String url = mainView.getUrlBuilder().getStateChangeURL(
-               selectedInstance.getInstanceId(), selectedInstance.getState()
-         );
+  }
 
-         RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, url);
+  private void persistStateChange()
+  {
+    String url = mainView.getUrlBuilder().getStateChangeURL(
+        selectedInstance.getInstanceId(), selectedInstance.getState()
+    );
 
-         try
-         {
-            rb.sendRequest(null,
-                  new RequestCallback() {
+    RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, url);
 
-                     public void onResponseReceived(Request request, Response response)
-                     {
-                        if(response.getStatusCode()!=200)
-                           ConsoleLog.error("Failed to change state: " +response.getStatusText());
-                        else
-                           callback.onStaleModel();
-                     }
+    try
+    {
+      rb.sendRequest(null,
+          new RequestCallback()
+          {
 
-                     public void onError(Request request, Throwable t)
-                     {
-                        // Unknown error
-                        ConsoleLog.error("Unknown error", t);
-                     }
-                  });
-         }
-         catch (RequestException e1)
-         {
-            ConsoleLog.error("Request failed", e1);
-         }
-      }
+            public void onResponseReceived(Request request, Response response)
+            {
+              if (response.getStatusCode() != 200)
+                ConsoleLog.error("Failed to change state: " + response.getStatusText());
+              else
+                callback.onStaleModel();
+            }
 
+            public void onError(Request request, Throwable t)
+            {
+              // Unknown error
+              ConsoleLog.error("Unknown error", t);
+            }
+          });
+    }
+    catch (RequestException e1)
+    {
+      ConsoleLog.error("Request failed", e1);
+    }
+  }
 
-   public void onModelChange(ModelListenerRegistry parent, Object changeEvent)
-   {
-      // not used
-   }
 
-   public void onRecordChange(ModelListenerRegistry parent, Record record)
-   {
-      selectedInstance = ProcessInstanceList.transform(record);
+  public void onModelChange(ModelListenerRegistry parent, Object changeEvent)
+  {
+    // not used
+  }
 
-      if(selectedInstance.isSuspended())
-      {
-         suspendButton.disable();
-         resumeButton.enable();
-      }
-      else
-      {
-         resumeButton.disable();
-         suspendButton.enable();
-      }
+  public void onRecordChange(ModelListenerRegistry parent, Record record)
+  {
+    selectedInstance = ProcessInstanceList.transform(record);
 
-      detailsForm.getForm().loadRecord(record);
+    if (selectedInstance.isSuspended())
+    {
+      suspendButton.disable();
+      resumeButton.enable();
+    }
+    else
+    {
+      resumeButton.disable();
+      suspendButton.enable();
+    }
 
-      // state not part of the payload
-      detailsForm.getForm().findField("state").setRawValue(
-            selectedInstance.getState().toString()
-      );
+    detailsForm.getForm().loadRecord(record);
 
-      detailsForm.doLayout();
+    // state not part of the payload
+    detailsForm.getForm().findField("state").setRawValue(
+        selectedInstance.getState().toString()
+    );
 
-   }
+    detailsForm.doLayout();
 
-   public void onReset()
-   {
-      selectedInstance = null;
-      detailsForm.getForm().reset();
-   }
+  }
+
+  public void onReset()
+  {
+    selectedInstance = null;
+    detailsForm.getForm().reset();
+  }
 }

Deleted: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceEditor.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceEditor.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceEditor.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -1,123 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.bpm.console.client.process;
-
-import com.gwtext.client.core.EventObject;
-import com.gwtext.client.widgets.*;
-import com.gwtext.client.widgets.event.ButtonListenerAdapter;
-import org.jboss.bpm.console.client.Editor;
-import org.jboss.bpm.console.client.MainView;
-import org.jboss.bpm.console.client.UIConstants;
-import org.jboss.bpm.console.client.model.ProcessDefinitionRef;
-import org.jboss.bpm.console.client.model.ProcessInstanceRef;
-
-/**
- * @author Heiko.Braun <heiko.braun at jboss.com>
- *
- * @see ProcessInstanceList#onExamine(int) 
- */
-public class ProcessInstanceEditor extends Editor
-{
-   public final static String ID = "org.jboss.bpm.process.ProcessInstance";
-
-   private ProcessDefinitionRef processDefinition;
-
-   private ProcessInstanceRef processInstance;
-
-   private MainView view;
-
-   private Panel teaserPanel;
-
-   public ProcessInstanceEditor(final ProcessDefinitionRef proc, final ProcessInstanceRef instance, final MainView view)
-   {
-      super(view);
-      this.setId(ProcessInstanceEditor.ID+"."+instance.getInstanceId());
-
-      this.processDefinition = proc;
-      this.processInstance = instance;
-      this.view = view;
-
-      // ----------------------------------
-
-      this.setPaddings(10);
-      this.setWidth(UIConstants.EDITOR_WIDTH);
-
-      this.setBorder(false);
-      this.setHeader(false);
-
-      // ----------------------------------
-
-      ProcessImageView imageView = new ProcessImageView(instance, view);
-      imageView.setWidth(UIConstants.EDITOR_PANEL_WIDTH);
-
-      Toolbar imageToolbar = new Toolbar();
-      imageToolbar.addFill();
-      ToolbarButton toolbarButton = new ToolbarButton("Enlarge",
-        new ButtonListenerAdapter()
-        {
-           public void onClick(Button button, EventObject e)
-           {
-
-              final Window window = new Window();
-              window.setTitle("Process Graph");
-              window.setClosable(true);
-              window.setWidth(800);
-              window.setHeight(600);
-              window.setPlain(true);              
-              window.setCloseAction(Window.HIDE);
-              window.add(new ProcessImageView(instance, view) );
-              window.show("");
-           }
-        }
-      );
-      toolbarButton.setIconCls("bpm-enlarge-icon");
-      imageToolbar.addButton( toolbarButton );
-      imageView.setBottomToolbar(imageToolbar);
-      
-      PaddedPanel padding = new PaddedPanel(imageView, 5, 5, 0, 5);
-
-      // ----------------------------------
-
-      this.add(padding);      
-   }
-
-   public String getEditorId()
-   {
-      return ID;
-   }
-
-   public String getTitle()
-   {
-      return "#"+processInstance.getInstanceId()+" ("+processDefinition.getName()+")";
-   }
-
-
-   public String getIconCSS()
-   {
-      return "bpm-instance-icon";
-   }
-
-   public static String createWidgetID(ProcessDefinitionRef parent)
-   {
-      return ProcessInstanceEditor.ID+"."+parent.getName()+"."+parent.getVersion();
-   }
-}

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceList.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceList.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceList.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -27,6 +27,7 @@
 import com.gwtext.client.data.*;
 import com.gwtext.client.widgets.MessageBox;
 import com.gwtext.client.widgets.MessageBoxConfig;
+import com.gwtext.client.widgets.ComponentMgr;
 import com.gwtext.client.widgets.grid.ColumnConfig;
 import com.gwtext.client.widgets.grid.ColumnModel;
 import com.gwtext.client.widgets.grid.Renderer;
@@ -34,6 +35,7 @@
 import org.jboss.bpm.console.client.util.ConsoleLog;
 import org.jboss.bpm.console.client.MainView;
 import org.jboss.bpm.console.client.UIConstants;
+import org.jboss.bpm.console.client.Editor;
 import org.jboss.bpm.console.client.util.DateRenderer;
 import org.jboss.bpm.console.client.model.ProcessDefinitionRef;
 import org.jboss.bpm.console.client.model.ProcessInstanceRef;
@@ -50,207 +52,214 @@
 public class ProcessInstanceList extends RemoteListView
 {
 
-   private Map<Integer, ProcessInstanceRef> row2InstanceMap = new HashMap<Integer, ProcessInstanceRef>();
-   private ProcessDefinitionRef parent;
-   
-   public ProcessInstanceList(ModelModificationCallback callback, ProcessDefinitionRef procDef, String titleName, MainView view)
-   {
-      super(callback,titleName, view, getResourceUrl(view, procDef.getProcessId()));
-      this.parent = procDef;
-   }
+  private Map<Integer, ProcessInstanceRef> row2InstanceMap = new HashMap<Integer, ProcessInstanceRef>();
+  private ProcessDefinitionRef parent;
 
-   ProcessDefinitionRef getProcessDefinition()
-   {
-      return parent;
-   }
+  public ProcessInstanceList(ModelModificationCallback callback, ProcessDefinitionRef procDef, String titleName, MainView view)
+  {
+    super(callback, titleName, view, getResourceUrl(view, procDef.getProcessId()));
+    this.parent = procDef;
+  }
 
-   public void onExamine(final int row)
-   {
-      ProcessInstanceRef instance = row2InstanceMap.get(row);
-      String id = ProcessInstanceEditor.ID+"."+instance.getInstanceId();
-      if(view.hasEditor(id))
-         view.showEditor(id);
-      else
-         view.addEditor( new ProcessInstanceEditor(parent, instance, view) );
-   }
+  ProcessDefinitionRef getProcessDefinition()
+  {
+    return parent;
+  }
 
-   public void onDelete(final int row)
-   {
-      MessageBox.show(new MessageBoxConfig() {
-         {
-            setTitle("Delete process instance?");
-            setMsg("Would you like to delete this process instance?");
-            setButtons(MessageBox.YESNOCANCEL);
-            setCallback(new MessageBox.PromptCallback() {
-               public void execute(String btnID, String text)
-               {
-                  if("yes".equals( btnID) )
-                  {
-                     ProcessInstanceRef instance = row2InstanceMap.get(row);
-                     instance.setState(ProcessInstanceRef.STATE.ENDED);
-                     String url = view.getUrlBuilder().getStateChangeURL(instance.getInstanceId(), instance.getState());
-                     RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, url);
+  public void onExamine(final int row)
+  {
+    ProcessInstanceRef instance = row2InstanceMap.get(row);
+    String id = ProcessInstanceView.ID + "." + instance.getInstanceId();
+    Editor editor = (Editor) ComponentMgr.getComponent(ProcessEditor.ID);
+    if (editor.hasView(id))
+      editor.showView(id);
+    else
+      editor.addView(new ProcessInstanceView(parent, instance, view), true);
+  }
 
-                     try
-                     {
-                        rb.sendRequest("",
-                          new RequestCallback() {
+  public void onDelete(final int row)
+  {
+    MessageBox.show(new MessageBoxConfig()
+    {
+      {
+        setTitle("Delete process instance?");
+        setMsg("Would you like to delete this process instance?");
+        setButtons(MessageBox.YESNOCANCEL);
+        setCallback(new MessageBox.PromptCallback()
+        {
+          public void execute(String btnID, String text)
+          {
+            if ("yes".equals(btnID))
+            {
+              ProcessInstanceRef instance = row2InstanceMap.get(row);
+              instance.setState(ProcessInstanceRef.STATE.ENDED);
+              String url = view.getUrlBuilder().getStateChangeURL(instance.getInstanceId(), instance.getState());
+              RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, url);
 
-                             public void onResponseReceived(Request request, Response response)
-                             {
-                                modelModificationCallback.onStaleModel();
-                             }
+              try
+              {
+                rb.sendRequest("",
+                    new RequestCallback()
+                    {
 
-                             public void onError(Request request, Throwable t)
-                             {
-                                // auth failed
-                                ConsoleLog.error("Failed to remove process instance", t);
-                             }
-                          });
-                     }
-                     catch (RequestException e1)
-                     {
-                        ConsoleLog.error("Request failed", e1);
-                     }
-                  }
-               }
-            });
-         }
-      });
-   }
+                      public void onResponseReceived(Request request, Response response)
+                      {
+                        modelModificationCallback.onStaleModel();
+                      }
 
+                      public void onError(Request request, Throwable t)
+                      {
+                        // auth failed
+                        ConsoleLog.error("Failed to remove process instance", t);
+                      }
+                    });
+              }
+              catch (RequestException e1)
+              {
+                ConsoleLog.error("Request failed", e1);
+              }
+            }
+          }
+        });
+      }
+    });
+  }
 
-   public void onAdd()
-   {
-      MessageBox.show(new MessageBoxConfig() {
-         {
-            setTitle("New instance");
-            setMsg("Would you like to start a new instance?");
-            setButtons(MessageBox.YESNOCANCEL);
-            setCallback(new MessageBox.PromptCallback() {
-               public void execute(String btnID, String text)
-               {
-                  if("yes".equals( btnID) )
-                  {
-                     String url = view.getUrlBuilder().getStartNewInstanceURL(parent.getProcessId());
-                     RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, url);
 
-                     try
-                     {
-                        rb.sendRequest("",
-                          new RequestCallback() {
+  public void onAdd()
+  {
+    MessageBox.show(new MessageBoxConfig()
+    {
+      {
+        setTitle("New instance");
+        setMsg("Would you like to start a new instance?");
+        setButtons(MessageBox.YESNOCANCEL);
+        setCallback(new MessageBox.PromptCallback()
+        {
+          public void execute(String btnID, String text)
+          {
+            if ("yes".equals(btnID))
+            {
+              String url = view.getUrlBuilder().getStartNewInstanceURL(parent.getProcessId());
+              RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, url);
 
-                             public void onResponseReceived(Request request, Response response)
-                             {
-                                if(response.getStatusCode()!=200)
-                                {
-                                   ConsoleLog.error("Failed to start new instance: " +response.getStatusText());
-                                }
-                                else
-                                {
-                                 modelModificationCallback.onStaleModel();
-                                 doLayout();
-                                }
-                             }
+              try
+              {
+                rb.sendRequest("",
+                    new RequestCallback()
+                    {
 
-                             public void onError(Request request, Throwable t)
-                             {
-                                // auth failed
-                                ConsoleLog.error("Failed to start new instance", t);
-                             }
-                          });
-                     }
-                     catch (RequestException e1)
-                     {
-                        ConsoleLog.error("Request failed", e1);
-                     }
-                  }
-               }
-            });
-         }
-      });
-   }
+                      public void onResponseReceived(Request request, Response response)
+                      {
+                        if (response.getStatusCode() != 200)
+                        {
+                          ConsoleLog.error("Failed to start new instance: " + response.getStatusText());
+                        }
+                        else
+                        {
+                          modelModificationCallback.onStaleModel();
+                          doLayout();
+                        }
+                      }
 
-   protected void onRecordsLoaded(Record[] records)
-   {
-      int i = 0;
-      for(Record r : records)
-      {
-         ProcessInstanceRef pd = transform(r);
-         row2InstanceMap.put(i, pd);
-         i++;
+                      public void onError(Request request, Throwable t)
+                      {
+                        // auth failed
+                        ConsoleLog.error("Failed to start new instance", t);
+                      }
+                    });
+              }
+              catch (RequestException e1)
+              {
+                ConsoleLog.error("Request failed", e1);
+              }
+            }
+          }
+        });
       }
+    });
+  }
 
-      ConsoleLog.debug("Loaded " + row2InstanceMap.size() + " process instances");
-   }
+  protected void onRecordsLoaded(Record[] records)
+  {
+    int i = 0;
+    for (Record r : records)
+    {
+      ProcessInstanceRef pd = transform(r);
+      row2InstanceMap.put(i, pd);
+      i++;
+    }
 
-   public static ProcessInstanceRef transform(Record r)
-   {
-      ProcessInstanceRef processInstance = null;
-      try
-      {
-         JavaScriptObject js = r.getDataAsJsObject();
-         JSONObject jso = new JSONObject(js);
-         processInstance = DTOParser.parseProcessInstance(jso);
-      }
-      catch (Throwable t)
-      {
-         ConsoleLog.error("Failed to parse process instance", t);
-      } 
-      
-      return processInstance;
-   }
+    ConsoleLog.debug("Loaded " + row2InstanceMap.size() + " process instances");
+  }
 
-   protected ColumnModel createColumnModel()
-   {      
-      final ColumnModel columnModel = new ColumnModel(
+  public static ProcessInstanceRef transform(Record r)
+  {
+    ProcessInstanceRef processInstance = null;
+    try
+    {
+      JavaScriptObject js = r.getDataAsJsObject();
+      JSONObject jso = new JSONObject(js);
+      processInstance = DTOParser.parseProcessInstance(jso);
+    }
+    catch (Throwable t)
+    {
+      ConsoleLog.error("Failed to parse process instance", t);
+    }
+
+    return processInstance;
+  }
+
+  protected ColumnModel createColumnModel()
+  {
+    final ColumnModel columnModel = new ColumnModel(
         new ColumnConfig[]
-          {
-            new ColumnConfig("Instance ID", "instanceId", 75, true),
-            //new ColumnConfig("Process ID", "parentId", 25, true),
-            //new ColumnConfig("Key", "key", 50, true),
-            new ColumnConfig("State", "state", 100, true,
-                  new Renderer()
-                  {
-                     public String render(Object object, CellMetadata cellMetadata, Record record, int i, int i1, Store store)
-                     {
+            {
+                new ColumnConfig("Instance ID", "instanceId", 75, true),
+                //new ColumnConfig("Process ID", "parentId", 25, true),
+                //new ColumnConfig("Key", "key", 50, true),
+                new ColumnConfig("State", "state", 100, true,
+                    new Renderer()
+                    {
+                      public String render(Object object, CellMetadata cellMetadata, Record record, int i, int i1, Store store)
+                      {
                         ProcessInstanceRef tmp = transform(record);
                         return tmp.getState().toString();
-                     }
-                  }
-                  , "expand"),
-            new ColumnConfig("Start Date", "startDate", 125, true, new DateRenderer("startDate")),
-            //new ColumnConfig("End Date", "endDate", 125, true, new DateRenderer("endDate"))
-          }
-      );
+                      }
+                    }
+                    , "expand"),
+                new ColumnConfig("Start Date", "startDate", 125, true, new DateRenderer("startDate")),
+                //new ColumnConfig("End Date", "endDate", 125, true, new DateRenderer("endDate"))
+            }
+    );
 
-      return columnModel;
-   }
+    return columnModel;
+  }
 
-   protected JsonReader createReader()
-   {
-      final RecordDef recordDef = new RecordDef(
+  protected JsonReader createReader()
+  {
+    final RecordDef recordDef = new RecordDef(
         new FieldDef[]{
-          new IntegerFieldDef("instanceId"),
-          new IntegerFieldDef("parentId"),
-          new StringFieldDef("key"),
-          new StringFieldDef("state"),
-          new DateFieldDef("startDate", UIConstants.DATE_FORMAT),
-          new DateFieldDef("endDate", UIConstants.DATE_FORMAT),
-          new BooleanFieldDef("suspended")
+            new IntegerFieldDef("instanceId"),
+            new IntegerFieldDef("parentId"),
+            new StringFieldDef("key"),
+            new StringFieldDef("state"),
+            new DateFieldDef("startDate", UIConstants.DATE_FORMAT),
+            new DateFieldDef("endDate", UIConstants.DATE_FORMAT),
+            new BooleanFieldDef("suspended")
         }
-      );
+    );
 
-      final JsonReader reader = new JsonReader(recordDef);
-      reader.setRoot("instances");
-      reader.setTotalProperty("totalCount");
-      reader.setId("instanceId");
+    final JsonReader reader = new JsonReader(recordDef);
+    reader.setRoot("instances");
+    reader.setTotalProperty("totalCount");
+    reader.setId("instanceId");
 
-      return reader;
-   }
+    return reader;
+  }
 
-   private static String getResourceUrl(MainView view, long parentId)
-   {
-      return view.getUrlBuilder().getProcessInstancesURL(parentId);
-   }
+  private static String getResourceUrl(MainView view, long parentId)
+  {
+    return view.getUrlBuilder().getProcessInstancesURL(parentId);
+  }
 }

Deleted: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListEditor.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListEditor.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListEditor.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -1,181 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.bpm.console.client.process;
-
-import com.gwtext.client.data.Record;
-import com.gwtext.client.widgets.PaddedPanel;
-import com.gwtext.client.widgets.Panel;
-import com.gwtext.client.widgets.TabPanel;
-import com.gwtext.client.widgets.grid.RowSelectionModel;
-import com.gwtext.client.widgets.grid.event.RowSelectionListenerAdapter;
-import org.jboss.bpm.console.client.Editor;
-import org.jboss.bpm.console.client.MainView;
-import org.jboss.bpm.console.client.UIConstants;
-import org.jboss.bpm.console.client.model.ProcessDefinitionRef;
-import org.jboss.bpm.console.client.model.ProcessInstanceRef;
-import org.jboss.bpm.console.client.util.ModelChangeListener;
-import org.jboss.bpm.console.client.util.ModelListenerRegistry;
-import org.jboss.bpm.console.client.util.ModelModificationCallback;
-
-/**
- * @author Heiko.Braun <heiko.braun at jboss.com>
- *
- * @see org.jboss.bpm.console.client.process.ProcessDefinitionList#onExamine(int)
- */
-public class ProcessInstanceListEditor extends Editor
-{
-   public final static String ID = "org.jboss.bpm.process.ProcessInstanceList";
-   
-   private MainView view;
-   private ProcessDefinitionRef parent;
-   private ProcessInstanceList instanceList;
-
-   private Panel tokenEditorPanel;
-   private ProcessInstanceRef selectedInstance;
-
-   private ProcessInstanceDetailForm detailsForm;
-   private TokenEditor currentTokenEditor;
-
-   private TabPanel tabPanel;
-
-   private ModelListenerRegistry modelListeners = new ModelListenerRegistry();
-   private ModelModificationCallback modelModificationCallback;
-
-   public ProcessInstanceListEditor(ProcessDefinitionRef proc, final MainView view)
-   {
-      super(view);
-
-      this.parent = proc;
-      this.view = view;
-      this.setId( ProcessInstanceListEditor.createWidgetID(proc) );
-
-      // --------------------------------------------------
-
-      this.setWidth(UIConstants.EDITOR_WIDTH);
-
-      modelModificationCallback = new ModelModificationCallback()
-      {
-         public void onStaleModel()
-         {
-            resetEditor();
-         }
-      };
-
-      instanceList = new ProcessInstanceList(modelModificationCallback, proc, "Process Instances", view);
-
-      // ---------------
-
-      tabPanel = new TabPanel();
-      tabPanel.setPaddings(10);
-      tabPanel.setPlain(true);
-      tabPanel.setActiveTab(0);
-      tabPanel.setWidth(UIConstants.EDITOR_PANEL_WIDTH);
-
-      PaddedPanel tabPadding = new PaddedPanel(tabPanel, 0,10,0,10);
-
-      // ----------------------------------------
-
-
-      detailsForm = new ProcessInstanceDetailForm(view, modelModificationCallback);
-      modelListeners.addListener( (ModelChangeListener) detailsForm);
-
-      // ----------------
-
-
-      final RowSelectionModel sm = new RowSelectionModel(true);
-      sm.addListener(
-            new RowSelectionListenerAdapter()
-            {
-               public void onRowSelect(RowSelectionModel sm, int rowIndex, Record record)
-               {
-                  selectedInstance = ProcessInstanceList.transform(record);
-
-                  modelListeners.fireRecordChangeEvent(record);
-                  modelListeners.fireModelChangeEvent(selectedInstance);
-
-                  // --------------------
-
-                  // token form update
-                  // TODO: can't this use ModelChangeListener callbacks as well?
-                  tokenEditorPanel.clear();
-                  currentTokenEditor = new TokenEditor(view, selectedInstance, modelModificationCallback);
-                  tokenEditorPanel.add(   // TODO: LRU caching (i.e. last 5)
-                        currentTokenEditor
-                  );
-                  tokenEditorPanel.doLayout();
-               }
-            }
-      );
-      instanceList.setRowSelectionModel(sm);
-
-
-      tokenEditorPanel = new Panel("Tokens");
-      tokenEditorPanel.setIconCls("bpm-tools-icon");
-
-      tabPanel.add( detailsForm );
-      tabPanel.add(tokenEditorPanel);
-
-
-      // ----------------------------------
-
-      this.add(instanceList);
-      this.add(tabPadding);
-
-   }
-
-   public String getEditorId()
-   {
-      return getId();
-   }
-
-   public String getTitle()
-   {
-      return parent.getName()+" (#"+parent.getVersion()+")";
-   }
-
-
-   public String getIconCSS()
-   {
-      return "bpm-instance-icon";
-   }
-
-   void resetEditor()
-   {
-      instanceList.reloadStore();
-      selectedInstance = null;
-
-      modelListeners.fireResetEvent();
-      
-      if(currentTokenEditor!=null)
-         currentTokenEditor.resetEditor();
-
-      tokenEditorPanel.clear();
-      tokenEditorPanel.doLayout();      
-   }
-
-   public static String createWidgetID(ProcessDefinitionRef proc)
-   {
-      return ProcessInstanceListEditor.ID+"."+proc.getName()+"."+proc.getVersion();
-
-   }
-}
-

Copied: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListView.java (from rev 3638, projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListEditor.java)
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListView.java	                        (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListView.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -0,0 +1,181 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.bpm.console.client.process;
+
+import com.gwtext.client.data.Record;
+import com.gwtext.client.widgets.PaddedPanel;
+import com.gwtext.client.widgets.Panel;
+import com.gwtext.client.widgets.TabPanel;
+import com.gwtext.client.widgets.grid.RowSelectionModel;
+import com.gwtext.client.widgets.grid.event.RowSelectionListenerAdapter;
+import org.jboss.bpm.console.client.MainView;
+import org.jboss.bpm.console.client.UIConstants;
+import org.jboss.bpm.console.client.View;
+import org.jboss.bpm.console.client.model.ProcessDefinitionRef;
+import org.jboss.bpm.console.client.model.ProcessInstanceRef;
+import org.jboss.bpm.console.client.util.ModelChangeListener;
+import org.jboss.bpm.console.client.util.ModelListenerRegistry;
+import org.jboss.bpm.console.client.util.ModelModificationCallback;
+
+/**
+ * @author Heiko.Braun <heiko.braun at jboss.com>
+ * @see org.jboss.bpm.console.client.process.ProcessDefinitionList#onExamine(int)
+ */
+public class ProcessInstanceListView extends View
+{
+  public final static String ID = "org.jboss.bpm.process.ProcessInstanceList";
+
+  private MainView view;
+  private ProcessDefinitionRef parent;
+  private ProcessInstanceList instanceList;
+
+  private Panel tokenEditorPanel;
+  private ProcessInstanceRef selectedInstance;
+
+  private ProcessInstanceDetailForm detailsForm;
+  private TokenEditorComponent currentTokenEditor;
+
+  private TabPanel tabPanel;
+
+  private ModelListenerRegistry modelListeners = new ModelListenerRegistry();
+  private ModelModificationCallback modelModificationCallback;
+
+  public ProcessInstanceListView(ProcessDefinitionRef proc, final MainView view)
+  {
+    super(view);
+
+    this.parent = proc;
+    this.view = view;
+    this.setId(createWidgetID(proc));
+
+    this.setTitle(proc.getName() + " Instances");
+
+    // --------------------------------------------------
+
+    this.setWidth(UIConstants.EDITOR_WIDTH);
+
+    modelModificationCallback = new ModelModificationCallback()
+    {
+      public void onStaleModel()
+      {
+        resetEditor();
+      }
+    };
+
+    instanceList = new ProcessInstanceList(modelModificationCallback, proc, "Active", view);
+
+    // ---------------
+
+    tabPanel = new TabPanel();
+    tabPanel.setPaddings(10);
+    tabPanel.setPlain(true);
+    tabPanel.setActiveTab(0);
+    tabPanel.setWidth(UIConstants.EDITOR_PANEL_WIDTH);
+
+    PaddedPanel tabPadding = new PaddedPanel(tabPanel, 10, 0, 0, 0);
+
+    // ----------------------------------------
+
+
+    detailsForm = new ProcessInstanceDetailForm(view, modelModificationCallback);
+    modelListeners.addListener((ModelChangeListener) detailsForm);
+
+    // ----------------
+
+
+    final RowSelectionModel sm = new RowSelectionModel(true);
+    sm.addListener(
+        new RowSelectionListenerAdapter()
+        {
+          public void onRowSelect(RowSelectionModel sm, int rowIndex, Record record)
+          {
+            selectedInstance = ProcessInstanceList.transform(record);
+
+            modelListeners.fireRecordChangeEvent(record);
+            modelListeners.fireModelChangeEvent(selectedInstance);
+
+            // --------------------
+
+            // token form update
+            // TODO: can't this use ModelChangeListener callbacks as well?
+            tokenEditorPanel.clear();
+            currentTokenEditor = new TokenEditorComponent(view, selectedInstance, modelModificationCallback);
+            tokenEditorPanel.add(   // TODO: LRU caching (i.e. last 5)
+                currentTokenEditor
+            );
+            tokenEditorPanel.doLayout();
+          }
+        }
+    );
+    instanceList.setRowSelectionModel(sm);
+
+
+    tokenEditorPanel = new Panel("Tokens");
+    tokenEditorPanel.setIconCls("bpm-tools-icon");
+
+    tabPanel.add(detailsForm);
+    tabPanel.add(tokenEditorPanel);
+
+    // ----------------------------------
+
+    this.add(instanceList);
+    this.add(tabPadding);
+
+  }
+
+  public String getViewId()
+  {
+    return getId();
+  }
+
+  public String getTitle()
+  {
+    return parent.getName() + " (#" + parent.getVersion() + ")";
+  }
+
+
+  public String getIconCSS()
+  {
+    return "bpm-instance-icon";
+  }
+
+  void resetEditor()
+  {
+    instanceList.reloadStore();
+    selectedInstance = null;
+
+    modelListeners.fireResetEvent();
+
+    if (currentTokenEditor != null)
+      currentTokenEditor.resetEditor();
+
+    tokenEditorPanel.clear();
+    tokenEditorPanel.doLayout();
+  }
+
+  public static String createWidgetID(ProcessDefinitionRef proc)
+  {
+    return ID + "." + proc.getName() + "." + proc.getVersion();
+
+  }
+}
+


Property changes on: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceListView.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Copied: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceView.java (from rev 3638, projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceEditor.java)
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceView.java	                        (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceView.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -0,0 +1,122 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.bpm.console.client.process;
+
+import com.gwtext.client.core.EventObject;
+import com.gwtext.client.widgets.*;
+import com.gwtext.client.widgets.event.ButtonListenerAdapter;
+import org.jboss.bpm.console.client.MainView;
+import org.jboss.bpm.console.client.UIConstants;
+import org.jboss.bpm.console.client.View;
+import org.jboss.bpm.console.client.model.ProcessDefinitionRef;
+import org.jboss.bpm.console.client.model.ProcessInstanceRef;
+
+/**
+ * @author Heiko.Braun <heiko.braun at jboss.com>
+ * @see ProcessInstanceList#onExamine(int)
+ */
+public class ProcessInstanceView extends View
+{
+  public final static String ID = "org.jboss.bpm.process.ProcessInstance";
+
+  private ProcessDefinitionRef processDefinition;
+
+  private ProcessInstanceRef processInstance;
+
+  private MainView mainView;
+
+  public ProcessInstanceView(final ProcessDefinitionRef proc, final ProcessInstanceRef instance, final MainView view)
+  {
+    super(view);
+    this.setId(ID + "." + instance.getInstanceId());
+
+    this.processDefinition = proc;
+    this.processInstance = instance;
+    this.mainView = view;
+
+    this.setTitle("# " + instance.getInstanceId());
+
+    // ----------------------------------
+
+    this.setPaddings(10);
+    this.setWidth(UIConstants.EDITOR_WIDTH);
+
+    this.setBorder(false);
+    this.setHeader(false);
+
+    // ----------------------------------
+
+    ProcessImageComponent imageView = new ProcessImageComponent(instance, view);
+    imageView.setWidth(UIConstants.EDITOR_PANEL_WIDTH);
+
+    Toolbar imageToolbar = new Toolbar();
+    imageToolbar.addFill();
+    ToolbarButton toolbarButton = new ToolbarButton("Enlarge",
+        new ButtonListenerAdapter()
+        {
+          public void onClick(Button button, EventObject e)
+          {
+
+            final Window window = new Window();
+            window.setTitle("Process Graph");
+            window.setClosable(true);
+            window.setWidth(800);
+            window.setHeight(600);
+            window.setPlain(true);
+            window.setCloseAction(Window.HIDE);
+            window.add(new ProcessImageComponent(instance, view));
+            window.show("");
+          }
+        }
+    );
+    toolbarButton.setIconCls("bpm-enlarge-icon");
+    imageToolbar.addButton(toolbarButton);
+    imageView.setBottomToolbar(imageToolbar);
+
+    PaddedPanel padding = new PaddedPanel(imageView, 5, 5, 0, 5);
+
+    // ----------------------------------
+
+    this.add(padding);
+  }
+
+  public String getViewId()
+  {
+    return ID + "." + processInstance.getInstanceId();
+  }
+
+  public String getTitle()
+  {
+    return "#" + processInstance.getInstanceId() + " (" + processDefinition.getName() + ")";
+  }
+
+
+  public String getIconCSS()
+  {
+    return "bpm-instance-icon";
+  }
+
+  public static String createWidgetID(ProcessDefinitionRef parent)
+  {
+    return ID + "." + parent.getName() + "." + parent.getVersion();
+  }
+}


Property changes on: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/ProcessInstanceView.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Deleted: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/TokenEditor.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/TokenEditor.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/TokenEditor.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -1,206 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.bpm.console.client.process;
-
-import org.jboss.bpm.console.client.util.ConsoleLog;
-import com.google.gwt.http.client.*;
-import com.gwtext.client.core.EventObject;
-import com.gwtext.client.data.Node;
-import com.gwtext.client.widgets.Panel;
-import com.gwtext.client.widgets.layout.ColumnLayout;
-import com.gwtext.client.widgets.layout.ColumnLayoutData;
-import com.gwtext.client.widgets.tree.TreeNode;
-import com.gwtext.client.widgets.tree.TreePanel;
-import com.gwtext.client.widgets.tree.event.TreeNodeListenerAdapter;
-import org.jboss.bpm.console.client.MainView;
-import org.jboss.bpm.console.client.UIConstants;
-import org.jboss.bpm.console.client.util.ModelModificationCallback;
-import org.jboss.bpm.console.client.model.ProcessInstanceRef;
-import org.jboss.bpm.console.client.model.jbpm3.TokenReference;
-
-/**
- * @author Heiko.Braun <heiko.braun at jboss.com>
- */
-public class TokenEditor extends Panel
-{
-
-   private TokenForm tokenForm;
-   private TokenTree tokenTree;
-   private MainView mainView;
-   private ModelModificationCallback callback;
-
-   public TokenEditor(
-         MainView mainView, final ProcessInstanceRef instance,
-         ModelModificationCallback callback
-   )
-   {
-      super();
-
-      this.mainView = mainView;
-      this.callback = callback;
-
-      this.setHeader(false);
-      this.setBorder(false);
-      this.setFrame(false);
-
-      this.setLayout(new ColumnLayout());
-
-      // ----------------
-
-      tokenTree = new TokenTree(instance.getRootToken(),
-            new TokenSelectionCallback()
-            {
-               public void onSelectedToken(TokenReference tok)
-               {
-                  // update form
-                  tokenForm.display(instance, tok);
-               }
-            }
-      );
-
-      tokenTree.expandAll();
-
-      // ----------------
-
-      tokenForm = new TokenForm(
-            new SignalCallback()
-            {
-
-               public void onSignalToken(TokenReference tok, String signal)
-               {
-                  remoteSignal(tok, signal);
-               }
-            }
-      );
-
-      // ----------------
-
-      this.add(tokenTree, new ColumnLayoutData(0.3));
-      this.add(tokenForm, new ColumnLayoutData(0.7));
-   }
-
-   public void resetEditor()
-   {
-      tokenForm.resetForm();
-   }
-
-   class TokenTree extends TreePanel
-   {
-      private TokenSelectionCallback callback;
-
-      public TokenTree(final TokenReference rootToken,
-                       final TokenSelectionCallback callback)
-      {
-         this.callback = callback;
-
-         this.setBorder(false);
-
-         TreeNode outermost = new TreeNode("Tokens");
-         TreeNode rootNode = buildTreeNode(rootToken);
-         outermost.appendChild(rootNode);
-
-         buildChildNodes(rootNode, rootToken);
-
-         setRootVisible(true);
-         setRootNode(outermost);
-         outermost.setExpanded(true);
-      }
-
-      private void buildChildNodes(TreeNode parent, TokenReference rootToken)
-      {
-         for(final TokenReference childToken : rootToken.getChildren())
-         {
-            TreeNode child = buildTreeNode(childToken);
-            buildChildNodes(child, childToken); // recursive
-            parent.appendChild(child);
-         }
-      }
-
-      private TreeNode buildTreeNode(final TokenReference tok)
-      {
-         TreeNode treeNode = new TreeNode("Token " +tok.getId());
-         treeNode.setExpanded(true);
-         treeNode.addListener(
-               new TreeNodeListenerAdapter()
-               {
-                  public void onClick(Node node, EventObject eventObject)
-                  {
-                     callback.onSelectedToken(tok);
-                  }
-               }
-         );
-
-         if(!tok.canBeSignaled())
-            treeNode.setIcon("images/icons/lock.png");
-         return treeNode;
-      }
-   }
-
-   interface TokenSelectionCallback
-   {
-      void onSelectedToken(TokenReference tok);
-   }
-
-   public interface SignalCallback
-   {
-      void onSignalToken(TokenReference tok, String signal);
-   }
-
-   private void remoteSignal(TokenReference tok, String signal)
-   {
-
-      String url = signal.equals(UIConstants.DEFAULT_TRANSITION) ?
-            mainView.getUrlBuilder().getTokenSignalUrl(tok) :
-            mainView.getUrlBuilder().getTokenSignalUrl(tok, signal);
-
-      RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, url);
-
-      try
-      {
-         rb.sendRequest(null,
-               new RequestCallback() {
-
-                  public void onResponseReceived(Request request, Response response)
-                  {
-                     if(response.getStatusCode()!=200)
-                        ConsoleLog.error("Signaling failed: " +response.getText());
-                     else
-                     {
-                        resetEditor();
-                        callback.onStaleModel();
-                     }
-                  }
-
-                  public void onError(Request request, Throwable t)
-                  {
-                     // Unknown error
-                     ConsoleLog.error("Unknown error", t);
-                  }
-               });
-      }
-      catch (RequestException e1)
-      {
-         ConsoleLog.error("Request failed", e1);
-      }
-   }
-}
-

Copied: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/TokenEditorComponent.java (from rev 3630, projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/TokenEditor.java)
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/TokenEditorComponent.java	                        (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/TokenEditorComponent.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -0,0 +1,207 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.bpm.console.client.process;
+
+import org.jboss.bpm.console.client.util.ConsoleLog;
+import com.google.gwt.http.client.*;
+import com.gwtext.client.core.EventObject;
+import com.gwtext.client.data.Node;
+import com.gwtext.client.widgets.Panel;
+import com.gwtext.client.widgets.layout.ColumnLayout;
+import com.gwtext.client.widgets.layout.ColumnLayoutData;
+import com.gwtext.client.widgets.tree.TreeNode;
+import com.gwtext.client.widgets.tree.TreePanel;
+import com.gwtext.client.widgets.tree.event.TreeNodeListenerAdapter;
+import org.jboss.bpm.console.client.MainView;
+import org.jboss.bpm.console.client.UIConstants;
+import org.jboss.bpm.console.client.util.ModelModificationCallback;
+import org.jboss.bpm.console.client.model.ProcessInstanceRef;
+import org.jboss.bpm.console.client.model.jbpm3.TokenReference;
+
+/**
+ * @author Heiko.Braun <heiko.braun at jboss.com>
+ */
+public class TokenEditorComponent extends Panel
+{
+
+  private TokenForm tokenForm;
+  private TokenTree tokenTree;
+  private MainView mainView;
+  private ModelModificationCallback callback;
+
+  public TokenEditorComponent(
+      MainView mainView, final ProcessInstanceRef instance,
+      ModelModificationCallback callback
+  )
+  {
+    super();
+
+    this.mainView = mainView;
+    this.callback = callback;
+
+    this.setHeader(false);
+    this.setBorder(false);
+    this.setFrame(false);
+
+    this.setLayout(new ColumnLayout());
+
+    // ----------------
+
+    tokenTree = new TokenTree(instance.getRootToken(),
+        new TokenSelectionCallback()
+        {
+          public void onSelectedToken(TokenReference tok)
+          {
+            // update form
+            tokenForm.display(instance, tok);
+          }
+        }
+    );
+
+    tokenTree.expandAll();
+
+    // ----------------
+
+    tokenForm = new TokenForm(
+        new SignalCallback()
+        {
+
+          public void onSignalToken(TokenReference tok, String signal)
+          {
+            remoteSignal(tok, signal);
+          }
+        }
+    );
+
+    // ----------------
+
+    this.add(tokenTree, new ColumnLayoutData(0.3));
+    this.add(tokenForm, new ColumnLayoutData(0.7));
+  }
+
+  public void resetEditor()
+  {
+    tokenForm.resetForm();
+  }
+
+  class TokenTree extends TreePanel
+  {
+    private TokenSelectionCallback callback;
+
+    public TokenTree(final TokenReference rootToken,
+                     final TokenSelectionCallback callback)
+    {
+      this.callback = callback;
+
+      this.setBorder(false);
+
+      TreeNode outermost = new TreeNode("Tokens");
+      TreeNode rootNode = buildTreeNode(rootToken);
+      outermost.appendChild(rootNode);
+
+      buildChildNodes(rootNode, rootToken);
+
+      setRootVisible(true);
+      setRootNode(outermost);
+      outermost.setExpanded(true);
+    }
+
+    private void buildChildNodes(TreeNode parent, TokenReference rootToken)
+    {
+      for (final TokenReference childToken : rootToken.getChildren())
+      {
+        TreeNode child = buildTreeNode(childToken);
+        buildChildNodes(child, childToken); // recursive
+        parent.appendChild(child);
+      }
+    }
+
+    private TreeNode buildTreeNode(final TokenReference tok)
+    {
+      TreeNode treeNode = new TreeNode("Token " + tok.getId());
+      treeNode.setExpanded(true);
+      treeNode.addListener(
+          new TreeNodeListenerAdapter()
+          {
+            public void onClick(Node node, EventObject eventObject)
+            {
+              callback.onSelectedToken(tok);
+            }
+          }
+      );
+
+      if (!tok.canBeSignaled())
+        treeNode.setIcon("images/icons/lock.png");
+      return treeNode;
+    }
+  }
+
+  interface TokenSelectionCallback
+  {
+    void onSelectedToken(TokenReference tok);
+  }
+
+  public interface SignalCallback
+  {
+    void onSignalToken(TokenReference tok, String signal);
+  }
+
+  private void remoteSignal(TokenReference tok, String signal)
+  {
+
+    String url = signal.equals(UIConstants.DEFAULT_TRANSITION) ?
+        mainView.getUrlBuilder().getTokenSignalUrl(tok) :
+        mainView.getUrlBuilder().getTokenSignalUrl(tok, signal);
+
+    RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, url);
+
+    try
+    {
+      rb.sendRequest(null,
+          new RequestCallback()
+          {
+
+            public void onResponseReceived(Request request, Response response)
+            {
+              if (response.getStatusCode() != 200)
+                ConsoleLog.error("Signaling failed: " + response.getText());
+              else
+              {
+                resetEditor();
+                callback.onStaleModel();
+              }
+            }
+
+            public void onError(Request request, Throwable t)
+            {
+              // Unknown error
+              ConsoleLog.error("Unknown error", t);
+            }
+          });
+    }
+    catch (RequestException e1)
+    {
+      ConsoleLog.error("Request failed", e1);
+    }
+  }
+}
+

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/TokenForm.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/TokenForm.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/process/TokenForm.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -41,114 +41,113 @@
  */
 public class TokenForm extends Panel
 {
-   private final FormPanel tokenForm;
-   private final Button signalButton;
-   private TokenReference lastSelectedToken;
-   
-   public TokenForm(final TokenEditor.SignalCallback callback)
-   {
-      super();
+  private final FormPanel tokenForm;
+  private final Button signalButton;
+  private TokenReference lastSelectedToken;
 
-      this.setHeader(false);
-      this.setBorder(false);
-      this.setFrame(false);
+  public TokenForm(final TokenEditorComponent.SignalCallback callback)
+  {
+    super();
 
-      tokenForm = new FormPanel();
-      tokenForm.setLabelAlign(Position.LEFT);
-      tokenForm.setWidth(UIConstants.EDITOR_PANEL_WIDTH);
-      tokenForm.setHeader(false);
-      tokenForm.setFrame(false);
-      tokenForm.setBorder(false);
-      tokenForm.setPaddings(5, 5, 5, 0);
-      tokenForm.setLabelWidth(50);
+    this.setHeader(false);
+    this.setBorder(false);
+    this.setFrame(false);
 
-      // ----------
+    tokenForm = new FormPanel();
+    tokenForm.setLabelAlign(Position.LEFT);
+    tokenForm.setWidth(UIConstants.EDITOR_PANEL_WIDTH);
+    tokenForm.setHeader(false);
+    tokenForm.setFrame(false);
+    tokenForm.setBorder(false);
+    tokenForm.setPaddings(5, 5, 5, 0);
+    tokenForm.setLabelWidth(50);
 
-      TextField idField = new TextField("Id", "id", 230);
-      idField.setReadOnly(true);
-      tokenForm.add(idField);
+    // ----------
 
-      //tokenForm.add(new TextField("Token Name", "name", 230));
-      TextField nameField = new TextField("Node Name", "nodeName", 230);
-      nameField.setReadOnly(true);
-      tokenForm.add(nameField);
+    TextField idField = new TextField("Id", "id", 230);
+    idField.setReadOnly(true);
+    tokenForm.add(idField);
 
+    //tokenForm.add(new TextField("Token Name", "name", 230));
+    TextField nameField = new TextField("Node Name", "nodeName", 230);
+    nameField.setReadOnly(true);
+    tokenForm.add(nameField);
 
-      // ----------
-      RefreshableComboBox cb = new RefreshableComboBox("signal", "Signal");
-      tokenForm.add(cb);
+    // ----------
+    RefreshableComboBox cb = new RefreshableComboBox("signal", "Signal");
+    tokenForm.add(cb);
 
-      final ButtonListenerAdapter listenerAdapter = new ButtonListenerAdapter()
+    final ButtonListenerAdapter listenerAdapter = new ButtonListenerAdapter()
+    {
+      public void onClick(Button button, EventObject eventObject)
       {
-         public void onClick(Button button, EventObject eventObject)
-         {
-            ComboBox cb = (ComboBox)tokenForm.getForm().findField("signal");
-                        
-            String signalValue = cb.getValueAsString();
-            if(signalValue.equals(""))
-               MessageBox.alert("Please select a signal");
-            else
-               callback.onSignalToken(lastSelectedToken, signalValue);
-         }
+        ComboBox cb = (ComboBox) tokenForm.getForm().findField("signal");
 
-      };
-      signalButton = new Button("Signal", listenerAdapter);
+        String signalValue = cb.getValueAsString();
+        if (signalValue.equals(""))
+          MessageBox.alert("Please select a signal");
+        else
+          callback.onSignalToken(lastSelectedToken, signalValue);
+      }
 
+    };
+    signalButton = new Button("Signal", listenerAdapter);
 
-      tokenForm.addButton(signalButton);
 
-      // -------------------
+    tokenForm.addButton(signalButton);
 
-      this.add(tokenForm);
+    // -------------------
 
-   }
+    this.add(tokenForm);
 
-   /**
-    * display the root token
-    */
-   void display(ProcessInstanceRef processInstance)
-   {
-      display(processInstance, processInstance.getRootToken());
-   }
+  }
 
-   /**
-    * display a particular token
-    */
-   void display(final ProcessInstanceRef processInstance, final TokenReference tok)
-   {
-      Form form = tokenForm.getForm();
+  /**
+   * display the root token
+   */
+  void display(ProcessInstanceRef processInstance)
+  {
+    display(processInstance, processInstance.getRootToken());
+  }
 
-      if(form.findField("id")!=null) // TODO: the fields are not initialized on first callback?
-      {
-         form.findField("id").setRawValue(tok.getId()+"");
-         form.findField("nodeName").setRawValue(tok.getCurrentNodeName());
+  /**
+   * display a particular token
+   */
+  void display(final ProcessInstanceRef processInstance, final TokenReference tok)
+  {
+    Form form = tokenForm.getForm();
 
-         // display combo box
-         RefreshableComboBox cb = (RefreshableComboBox)form.findField("signal");
-         cb.reset();
-         cb.display( tok.getAvailableSignals());
-         
-         // suspended instances cannot be signaled
-         if(processInstance.isSuspended() || !tok.canBeSignaled())
-         {
-            signalButton.disable();
-            cb.disable();
-         }
-         else
-         {
-            signalButton.enable();
-            cb.enable();
-         }
+    if (form.findField("id") != null) // TODO: the fields are not initialized on first callback?
+    {
+      form.findField("id").setRawValue(tok.getId() + "");
+      form.findField("nodeName").setRawValue(tok.getCurrentNodeName());
+
+      // display combo box
+      RefreshableComboBox cb = (RefreshableComboBox) form.findField("signal");
+      cb.reset();
+      cb.display(tok.getAvailableSignals());
+
+      // suspended instances cannot be signaled
+      if (processInstance.isSuspended() || !tok.canBeSignaled())
+      {
+        signalButton.disable();
+        cb.disable();
       }
+      else
+      {
+        signalButton.enable();
+        cb.enable();
+      }
+    }
 
-      // -----------
+    // -----------
 
 
-      lastSelectedToken = tok;
-   }
-   
-   public void resetForm()
-   {      
-      tokenForm.getForm().reset();
-   }
+    lastSelectedToken = tok;
+  }
+
+  public void resetForm()
+  {
+    tokenForm.getForm().reset();
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/BirtPanel.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/BirtPanel.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/BirtPanel.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -29,23 +29,23 @@
  */
 public class BirtPanel extends Panel
 {
-   private Frame frame;
+  private Frame frame;
 
-   public BirtPanel()
-   {
-      setHeader(false);
-      setWidth(660);
-      setHeight(450);
+  public BirtPanel()
+  {
+    setHeader(false);
+    setWidth(660);
+    setHeight(450);
 
-      frame = new Frame();
-      frame.setWidth("660");
-      frame.setHeight("448");
-      
-      add(frame);
-   }
+    frame = new Frame();
+    frame.setWidth("660");
+    frame.setHeight("448");
 
-   public void setUrl(String url)
-   {
-      frame.setUrl(url);   
-   }
+    add(frame);
+  }
+
+  public void setUrl(String url)
+  {
+    frame.setUrl(url);
+  }
 }

Deleted: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/OverviewReportEditor.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/OverviewReportEditor.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/OverviewReportEditor.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -1,183 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.bpm.console.client.report;
-
-import com.gwtext.client.core.EventObject;
-import com.gwtext.client.data.*;
-import com.gwtext.client.widgets.Button;
-import com.gwtext.client.widgets.Component;
-import com.gwtext.client.widgets.Panel;
-import com.gwtext.client.widgets.MessageBox;
-import com.gwtext.client.widgets.event.ButtonListenerAdapter;
-import com.gwtext.client.widgets.event.PanelListenerAdapter;
-import com.gwtext.client.widgets.form.ComboBox;
-import com.gwtext.client.widgets.form.Label;
-import com.gwtext.client.widgets.layout.HorizontalLayout;
-import com.gwtext.client.widgets.layout.VerticalLayout;
-import com.gwtext.client.widgets.menu.Separator;
-import org.jboss.bpm.console.client.Editor;
-import org.jboss.bpm.console.client.MainView;
-import org.jboss.bpm.console.client.util.ConsoleLog;
-
-/**
- * @author Heiko.Braun <heiko.braun at jboss.com>
- */
-public class OverviewReportEditor extends Editor
-{
-   public final static String ID = "org.jboss.bpm.metric.ProcessMetricOverview";
-   private MainView view;
-
-   public OverviewReportEditor(final MainView view)
-   {
-      super(view);
-      this.view = view;
-      this.setId(ID);
-      this.setPaddings(10);
-
-      // -------------------------------------
-      this.setLayout(new VerticalLayout(10) );
-
-      this.addListener(
-            new PanelListenerAdapter()
-            {
-               public void onRender(Component component)
-               {
-                  Panel panel = new Panel("Metric overview");
-                  panel.setPaddings(10);
-
-                  final String reportUrl= view.getUrlBuilder().getOverviewReportUrl();
-                  ConsoleLog.debug("Report resource:" + reportUrl);
-
-                  final ComboBox comboBox = buildProcessSelection();
-
-                  final BirtPanel birtPanel = new BirtPanel();
-                  birtPanel.setUrl(reportUrl);
-
-                  // --
-
-                  Button refreshBtn = new Button("Refresh", new ButtonListenerAdapter()
-                  {
-
-                     public void onClick(Button button, EventObject eventObject)
-                     {
-                        birtPanel.setUrl(reportUrl);
-                     }
-                  });
-
-                  Button viewBtn = new Button("Examine", new ButtonListenerAdapter()
-                  {
-
-                     public void onClick(Button button, EventObject eventObject)
-                     {
-                        String rawValue = comboBox.getRawValue();
-                        if(rawValue==null || rawValue.equals(""))
-                           MessageBox.alert("Please enter a process definition name!");
-                        else
-                           onExamine(rawValue);
-                     }
-                  });
-
-                  // --
-
-                  Panel toolsPanel  = new Panel();
-                  toolsPanel.setLayout( new HorizontalLayout(10) );
-                  Label label = new Label("Process definition");
-                  label.setStyleName("bpm-label");
-                  toolsPanel.add(label);
-                  toolsPanel.add(comboBox);
-                  toolsPanel.add( viewBtn );
-                  toolsPanel.add( new Separator() );
-                  toolsPanel.add( refreshBtn );
-
-                  panel.add(toolsPanel);
-                  panel.add(birtPanel);
-
-                  add(panel);
-               }
-            }
-      );
-   }
-
-
-   private void onExamine(String definitionName)
-   {
-      String editorId = ProcessReportEditor.createWidgetID(definitionName);
-
-      if(view.hasEditor(editorId))
-         view.showEditor(editorId);
-      else
-         view.addEditor( new ProcessReportEditor(definitionName, view) );
-   }
-
-   private ComboBox buildProcessSelection()
-   {
-
-      final RecordDef recordDef = new RecordDef(
-        new FieldDef[]{
-          new IntegerFieldDef("processId"),
-          new StringFieldDef("name"),
-          new StringFieldDef("version")
-        }
-      );
-
-      final JsonReader reader = new JsonReader(recordDef);
-      reader.setRoot("definitions");
-      reader.setTotalProperty("totalCount");
-      reader.setId("processId");
-
-      DataProxy dataProxy = new ScriptTagProxy(
-            view.getUrlBuilder().getProcessDefinitionsURL(), 1000*10);
-
-      final Store store = new Store(dataProxy, reader, false);
-      store.load();
-
-      ComboBox cb = new ComboBox();
-      cb.setMinChars(1);
-      cb.setFieldLabel("Process definition");
-      cb.setStore(store);
-      cb.setDisplayField("name");
-      cb.setMode(ComboBox.LOCAL);
-      cb.setTriggerAction(ComboBox.ALL);
-      cb.setEmptyText("Please enter a name");
-      cb.setLoadingText("Searching...");
-      cb.setTypeAhead(true);
-      cb.setSelectOnFocus(true);
-      cb.setWidth(180);
-
-      return cb;
-   }
-
-   public String getEditorId()
-   {
-      return ID;
-   }
-
-   public String getTitle()
-   {
-      return "Metrics and Stats";
-   }
-
-   public String getIconCSS()
-   {
-      return "bpm-report-icon";
-   }
-}

Deleted: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/ProcessReportEditor.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/ProcessReportEditor.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/ProcessReportEditor.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -1,181 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.bpm.console.client.report;
-
-import org.jboss.bpm.console.client.MainView;
-import org.jboss.bpm.console.client.Editor;
-import org.jboss.bpm.console.client.UIConstants;
-import org.jboss.bpm.console.client.util.ConsoleLog;
-import com.gwtext.client.widgets.layout.VerticalLayout;
-import com.gwtext.client.widgets.layout.HorizontalLayout;
-import com.gwtext.client.widgets.event.PanelListenerAdapter;
-import com.gwtext.client.widgets.event.ButtonListenerAdapter;
-import com.gwtext.client.widgets.Component;
-import com.gwtext.client.widgets.Button;
-import com.gwtext.client.widgets.MessageBox;
-import com.gwtext.client.widgets.Panel;
-import com.gwtext.client.widgets.menu.Separator;
-import com.gwtext.client.widgets.form.ComboBox;
-import com.gwtext.client.widgets.form.Label;
-import com.gwtext.client.core.EventObject;
-import com.gwtext.client.data.*;
-
-/**
- * @author Heiko.Braun <heiko.braun at jboss.com>
- */
-public class ProcessReportEditor extends Editor
-{
-  public final static String ID = "org.jboss.bpm.metric.ProcessMetric";
-  private String definitionName;
-  private MainView view;
-
-  public ProcessReportEditor(final String definitionName, final MainView view)
-  {
-    super(view);
-    this.definitionName = definitionName;
-    this.view = view;
-    this.setId( createWidgetID(definitionName) );
-
-    this.setPaddings(10);
-
-    // -------------------------------------
-    this.setLayout(new VerticalLayout(10) );
-
-    this.addListener(
-        new PanelListenerAdapter()
-        {
-
-          public void onRender(Component component)
-          {
-
-            final String reportUrl= view.getUrlBuilder().getDefinitionReportUrl(definitionName);
-            ConsoleLog.debug("Report resource:" + reportUrl);
-
-            final ComboBox comboBox = buildInstanceSelection();
-
-            final BirtPanel birtPanel = new BirtPanel();
-            birtPanel.setUrl(reportUrl);
-
-            // --
-
-            Button refreshBtn = new Button("Refresh", new ButtonListenerAdapter()
-            {
-
-              public void onClick(Button button, EventObject eventObject)
-              {
-                birtPanel.setUrl(reportUrl);
-              }
-            });
-
-            Button viewBtn = new Button("Examine", new ButtonListenerAdapter()
-            {
-
-              public void onClick(Button button, EventObject eventObject)
-              {
-                String rawValue = comboBox.getRawValue();
-                if(rawValue==null || rawValue.equals(""))
-                  MessageBox.alert("Please enter a process instance ID!");
-                else
-                  MessageBox.alert("Not implemented");
-              }
-            });
-
-            // --
-
-            Panel p  = new Panel();
-            p.setLayout( new HorizontalLayout(10) );
-            Label label = new Label("Instance ID");
-            label.setStyleName("bpm-label");
-            p.add(label);
-            p.add(comboBox);
-            p.add( viewBtn );
-            p.add( new Separator() );
-            p.add( refreshBtn );
-
-            add(p);
-            add(birtPanel);
-          }
-        }
-    );
-  }
-
-  private ComboBox buildInstanceSelection()
-  {
-
-    final RecordDef recordDef = new RecordDef(
-        new FieldDef[]{
-            new IntegerFieldDef("instanceId"),
-            new IntegerFieldDef("parentId"),
-            new StringFieldDef("key"),
-            new StringFieldDef("state"),
-            new DateFieldDef("startDate", UIConstants.DATE_FORMAT),
-            new DateFieldDef("endDate", UIConstants.DATE_FORMAT),
-            new BooleanFieldDef("suspended")
-        }
-    );
-
-    final JsonReader reader = new JsonReader(recordDef);
-    reader.setRoot("instances");
-    reader.setTotalProperty("totalCount");
-    reader.setId("instanceId");
-
-    DataProxy dataProxy = new ScriptTagProxy(
-        view.getUrlBuilder().getProcessDefinitionsURL(), 1000*10);
-
-    final Store store = new Store(dataProxy, reader, false);
-    store.load();
-
-    ComboBox cb = new ComboBox();
-    cb.setMinChars(1);
-    cb.setFieldLabel("Instance ID");
-    cb.setStore(store);
-    cb.setDisplayField("ID");
-    cb.setMode(ComboBox.LOCAL);
-    cb.setTriggerAction(ComboBox.ALL);
-    cb.setEmptyText("Please enter an ID");
-    cb.setLoadingText("Searching...");
-    cb.setTypeAhead(true);
-    cb.setSelectOnFocus(true);
-    cb.setWidth(180);
-
-    return cb;
-  }
-  public String getEditorId()
-  {
-    return createWidgetID(definitionName);
-  }
-
-  public String getTitle()
-  {
-    return definitionName +" Metrics";
-  }
-
-  public String getIconCSS()
-  {
-    return "bpm-report-icon";
-  }
-
-  public static String createWidgetID(String definitionName)
-  {
-    return ID+"."+definitionName;
-  }
-}

Copied: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/ProcessReportView.java (from rev 3636, projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/ProcessReportEditor.java)
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/ProcessReportView.java	                        (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/ProcessReportView.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -0,0 +1,182 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.bpm.console.client.report;
+
+import org.jboss.bpm.console.client.MainView;
+import org.jboss.bpm.console.client.UIConstants;
+import org.jboss.bpm.console.client.View;
+import org.jboss.bpm.console.client.util.ConsoleLog;
+import com.gwtext.client.widgets.layout.VerticalLayout;
+import com.gwtext.client.widgets.layout.HorizontalLayout;
+import com.gwtext.client.widgets.event.PanelListenerAdapter;
+import com.gwtext.client.widgets.event.ButtonListenerAdapter;
+import com.gwtext.client.widgets.Component;
+import com.gwtext.client.widgets.Button;
+import com.gwtext.client.widgets.MessageBox;
+import com.gwtext.client.widgets.Panel;
+import com.gwtext.client.widgets.menu.Separator;
+import com.gwtext.client.widgets.form.ComboBox;
+import com.gwtext.client.widgets.form.Label;
+import com.gwtext.client.core.EventObject;
+import com.gwtext.client.data.*;
+
+/**
+ * @author Heiko.Braun <heiko.braun at jboss.com>
+ */
+public class ProcessReportView extends View
+{
+  public final static String ID = "org.jboss.bpm.metric.ProcessMetric";
+  private String definitionName;
+  private MainView mainView;
+
+  public ProcessReportView(final String definitionName, final MainView view)
+  {
+    super(view);
+    this.definitionName = definitionName;
+    this.mainView = view;
+    this.setId(createWidgetID(definitionName));
+    this.setTitle(definitionName + " Report");
+    this.setPaddings(10);
+
+    // -------------------------------------
+    this.setLayout(new VerticalLayout(10));
+
+    this.addListener(
+        new PanelListenerAdapter()
+        {
+
+          public void onRender(Component component)
+          {
+
+            final String reportUrl = view.getUrlBuilder().getDefinitionReportUrl(definitionName);
+            ConsoleLog.debug("Report resource:" + reportUrl);
+
+            final ComboBox comboBox = buildInstanceSelection();
+
+            final BirtPanel birtPanel = new BirtPanel();
+            birtPanel.setUrl(reportUrl);
+
+            // --
+
+            Button refreshBtn = new Button("Refresh", new ButtonListenerAdapter()
+            {
+
+              public void onClick(Button button, EventObject eventObject)
+              {
+                birtPanel.setUrl(reportUrl);
+              }
+            });
+
+            Button viewBtn = new Button("Examine", new ButtonListenerAdapter()
+            {
+
+              public void onClick(Button button, EventObject eventObject)
+              {
+                String rawValue = comboBox.getRawValue();
+                if (rawValue == null || rawValue.equals(""))
+                  MessageBox.alert("Please enter a process instance ID!");
+                else
+                  MessageBox.alert("Not implemented");
+              }
+            });
+
+            // --
+
+            Panel p = new Panel();
+            p.setLayout(new HorizontalLayout(10));
+            Label label = new Label("Instance ID");
+            label.setStyleName("bpm-label");
+            p.add(label);
+            p.add(comboBox);
+            p.add(viewBtn);
+            p.add(new Separator());
+            p.add(refreshBtn);
+
+            add(p);
+            add(birtPanel);
+          }
+        }
+    );
+  }
+
+  private ComboBox buildInstanceSelection()
+  {
+
+    final RecordDef recordDef = new RecordDef(
+        new FieldDef[]{
+            new IntegerFieldDef("instanceId"),
+            new IntegerFieldDef("parentId"),
+            new StringFieldDef("key"),
+            new StringFieldDef("state"),
+            new DateFieldDef("startDate", UIConstants.DATE_FORMAT),
+            new DateFieldDef("endDate", UIConstants.DATE_FORMAT),
+            new BooleanFieldDef("suspended")
+        }
+    );
+
+    final JsonReader reader = new JsonReader(recordDef);
+    reader.setRoot("instances");
+    reader.setTotalProperty("totalCount");
+    reader.setId("instanceId");
+
+    DataProxy dataProxy = new ScriptTagProxy(
+        mainView.getUrlBuilder().getProcessDefinitionsURL(), 1000 * 10);
+
+    final Store store = new Store(dataProxy, reader, false);
+    store.load();
+
+    ComboBox cb = new ComboBox();
+    cb.setMinChars(1);
+    cb.setFieldLabel("Instance ID");
+    cb.setStore(store);
+    cb.setDisplayField("ID");
+    cb.setMode(ComboBox.LOCAL);
+    cb.setTriggerAction(ComboBox.ALL);
+    cb.setEmptyText("Please enter an ID");
+    cb.setLoadingText("Searching...");
+    cb.setTypeAhead(true);
+    cb.setSelectOnFocus(true);
+    cb.setWidth(180);
+
+    return cb;
+  }
+
+  public String getViewId()
+  {
+    return createWidgetID(definitionName);
+  }
+
+  public String getTitle()
+  {
+    return definitionName + " Report";
+  }
+
+  public String getIconCSS()
+  {
+    return "bpm-report-icon";
+  }
+
+  public static String createWidgetID(String definitionName)
+  {
+    return ID + "." + definitionName;
+  }
+}

Copied: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/ReportEditor.java (from rev 3636, projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/OverviewReportEditor.java)
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/ReportEditor.java	                        (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/report/ReportEditor.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -0,0 +1,247 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.bpm.console.client.report;
+
+import com.gwtext.client.core.EventObject;
+import com.gwtext.client.data.*;
+import com.gwtext.client.widgets.*;
+import com.gwtext.client.widgets.tree.TreePanel;
+import com.gwtext.client.widgets.tree.TreeNode;
+import com.gwtext.client.widgets.tree.event.TreeNodeListenerAdapter;
+import com.gwtext.client.widgets.event.ButtonListenerAdapter;
+import com.gwtext.client.widgets.event.PanelListenerAdapter;
+import com.gwtext.client.widgets.form.ComboBox;
+import com.gwtext.client.widgets.form.Label;
+import com.gwtext.client.widgets.layout.HorizontalLayout;
+import com.gwtext.client.widgets.layout.VerticalLayout;
+import com.gwtext.client.widgets.menu.Separator;
+import org.jboss.bpm.console.client.Editor;
+import org.jboss.bpm.console.client.MainView;
+import org.jboss.bpm.console.client.MenuSection;
+import org.jboss.bpm.console.client.View;
+import org.jboss.bpm.console.client.util.ConsoleLog;
+
+/**
+ * @author Heiko.Braun <heiko.braun at jboss.com>
+ */
+public class ReportEditor extends Editor
+{
+  public final static String ID = "org.jboss.bpm.metric.ProcessMetricOverview";
+  private MainView mainView;
+
+  public ReportEditor(final MainView view)
+  {
+    super(view);
+    this.mainView = view;
+    this.setId(ID);
+    this.setPaddings(10);
+
+    // -------------------------------------
+    this.setLayout(new VerticalLayout(10));
+
+    this.addListener(
+        new PanelListenerAdapter()
+        {
+          public void onRender(Component component)
+          {
+            
+            final String reportUrl = view.getUrlBuilder().getOverviewReportUrl();
+            ConsoleLog.debug("Report resource:" + reportUrl);
+
+            final ComboBox comboBox = buildProcessSelection();
+
+            final BirtPanel birtPanel = new BirtPanel();
+            birtPanel.setUrl(reportUrl);
+
+            // --
+
+            Button refreshBtn = new Button("Refresh", new ButtonListenerAdapter()
+            {
+
+              public void onClick(Button button, EventObject eventObject)
+              {
+                birtPanel.setUrl(reportUrl);
+              }
+            });
+
+            Button viewBtn = new Button("Examine", new ButtonListenerAdapter()
+            {
+
+              public void onClick(Button button, EventObject eventObject)
+              {
+                String rawValue = comboBox.getRawValue();
+                if (rawValue == null || rawValue.equals(""))
+                  MessageBox.alert("Please enter a process definition name!");
+                else
+                  onExamine(rawValue);
+              }
+            });
+
+            // --
+
+            Panel toolsPanel = new Panel();
+            toolsPanel.setLayout(new HorizontalLayout(10));
+            Label label = new Label("Process definition");
+            label.setStyleName("bpm-label");
+            toolsPanel.add(label);
+            toolsPanel.add(comboBox);
+            toolsPanel.add(viewBtn);
+            toolsPanel.add(new Separator());
+            toolsPanel.add(refreshBtn);
+
+            final View defaultView = new View(main)
+            {
+
+              public String getViewId()
+              {
+                return getEditorId() + ".defaultView";
+              }
+
+              public String getIconCSS()
+              {
+                return "";
+              }
+            };
+
+            defaultView.setBorder(false);
+            defaultView.setTitle("Metric Overview");
+
+
+            defaultView.add(toolsPanel);
+            defaultView.add(birtPanel);
+
+            addView(defaultView, false);
+          }
+        }
+    );
+  }
+
+
+  private void onExamine(String definitionName)
+  {
+    String viewId = ProcessReportView.createWidgetID(definitionName);
+    Editor editor = (Editor) ComponentMgr.getComponent(ReportEditor.ID);
+
+    if (editor.hasView(viewId))
+      editor.showView(viewId);
+    else
+      editor.addView(new ProcessReportView(definitionName, mainView), true);
+  }
+
+  private ComboBox buildProcessSelection()
+  {
+
+    final RecordDef recordDef = new RecordDef(
+        new FieldDef[]{
+            new IntegerFieldDef("processId"),
+            new StringFieldDef("name"),
+            new StringFieldDef("version")
+        }
+    );
+
+    final JsonReader reader = new JsonReader(recordDef);
+    reader.setRoot("definitions");
+    reader.setTotalProperty("totalCount");
+    reader.setId("processId");
+
+    DataProxy dataProxy = new ScriptTagProxy(
+        mainView.getUrlBuilder().getProcessDefinitionsURL(), 1000 * 10);
+
+    final Store store = new Store(dataProxy, reader, false);
+    store.load();
+
+    ComboBox cb = new ComboBox();
+    cb.setMinChars(1);
+    cb.setFieldLabel("Process definition");
+    cb.setStore(store);
+    cb.setDisplayField("name");
+    cb.setMode(ComboBox.LOCAL);
+    cb.setTriggerAction(ComboBox.ALL);
+    cb.setEmptyText("Please enter a name");
+    cb.setLoadingText("Searching...");
+    cb.setTypeAhead(true);
+    cb.setSelectOnFocus(true);
+    cb.setWidth(180);
+
+    return cb;
+  }
+
+  public String getEditorId()
+  {
+    return ID;
+  }
+
+  public String getTitle()
+  {
+    return "Metrics and Stats";
+  }
+
+  public String getIconCSS()
+  {
+    return "bpm-report-icon";
+  }
+
+  public MenuSection provideMenuSection()
+  {
+    return new MenuSection("Metrics and Stats", "bpm-metric-icon", new MetricTree());
+  }
+
+  class MetricTree extends TreePanel
+  {
+
+    public MetricTree()
+    {
+
+      TreeNode root = new TreeNode("Process Metrics");
+
+      TreeNode overview = new TreeNode("Process workload");
+      overview.setExpanded(true);
+      overview.addListener(
+          new TreeNodeListenerAdapter()
+          {
+            public void onClick(Node node, EventObject eventObject)
+            {
+              if (mainView.hasEditor(ReportEditor.ID))
+              {
+                mainView.showEditor(ReportEditor.ID);
+              }
+              else
+              {
+                mainView.addEditor(new ReportEditor(mainView));
+              }
+
+            }
+          }
+      );
+
+      TreeNode export = new TreeNode("Export stats");
+      export.setExpanded(true);
+
+      root.appendChild(overview);
+      root.appendChild(export);
+
+      setRootVisible(true);
+      setRootNode(root);
+      root.setExpanded(true);
+    }
+  }
+}

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/AssignmentCallback.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/AssignmentCallback.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/AssignmentCallback.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -26,7 +26,7 @@
  */
 interface AssignmentCallback
 {
-   void onAssignmentDone();
+  void onAssignmentDone();
 
-   void onTaskEnd(); 
+  void onTaskEnd();
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/AssignmentFormPanel.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/AssignmentFormPanel.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/AssignmentFormPanel.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -49,188 +49,190 @@
  */
 class AssignmentFormPanel extends Panel implements ModelChangeListener
 {
-   private FormPanel formPanel;
+  private FormPanel formPanel;
 
-   private MainView mainView;
-   private AssignmentCallback callback;
+  private MainView mainView;
+  private AssignmentCallback callback;
 
-   private List<String> availableActors;
-   private TaskRef selectedInstance;
+  private List<String> availableActors;
+  private TaskRef selectedInstance;
 
-   public AssignmentFormPanel(MainView mainView, AssignmentCallback callback)
-   {
-      super();
-      this.mainView = mainView;
-      this.callback = callback;
+  public AssignmentFormPanel(MainView mainView, AssignmentCallback callback)
+  {
+    super();
+    this.mainView = mainView;
+    this.callback = callback;
 
-      setTitle("Reassign Task");
-      setBorder(false);
-      setFrame(false);
-      setIconCls("bpm-tools-icon");
+    setTitle("Reassign Task");
+    setBorder(false);
+    setFrame(false);
+    setIconCls("bpm-tools-icon");
 
-      // ---------------
+    // ---------------
 
-      formPanel = FormWidgets.createBaseFormPanel();
-      RefreshableComboBox cb = new RefreshableComboBox("actorId", "Actor");
-      formPanel.add(cb);
+    formPanel = FormWidgets.createBaseFormPanel();
+    RefreshableComboBox cb = new RefreshableComboBox("actorId", "Actor");
+    formPanel.add(cb);
 
-      final Button assignBtn = new Button("Delegate",
-            new ButtonListenerAdapter()
-            {
+    final Button assignBtn = new Button("Delegate",
+        new ButtonListenerAdapter()
+        {
 
-               public void onClick(Button button, EventObject eventObject)
-               {
-                  Form form = formPanel.getForm();
-                  RefreshableComboBox cb = (RefreshableComboBox)form.findField("actorId");
-                  String rawValue = cb.getRawValue();
+          public void onClick(Button button, EventObject eventObject)
+          {
+            Form form = formPanel.getForm();
+            RefreshableComboBox cb = (RefreshableComboBox) form.findField("actorId");
+            String rawValue = cb.getRawValue();
 
-                  if(null==rawValue || rawValue.equals(""))
-                  {
-                     MessageBox.alert("Please select an actor.");
-                     return;
-                  }
+            if (null == rawValue || rawValue.equals(""))
+            {
+              MessageBox.alert("Please select an actor.");
+              return;
+            }
 
-                  if(null==selectedInstance)
-                     throw new IllegalArgumentException("Task selection cannot be null");
+            if (null == selectedInstance)
+              throw new IllegalArgumentException("Task selection cannot be null");
 
-                  reassignTask(selectedInstance.getId(), rawValue);  
-               }
-            }
-      );
+            reassignTask(selectedInstance.getId(), rawValue);
+          }
+        }
+    );
 
-      formPanel.add(assignBtn);
-      this.add(formPanel);
+    formPanel.add(assignBtn);
+    this.add(formPanel);
 
-      // ---------------
-      this.addListener(
-            new PanelListenerAdapter()
-            {
-               public void onAfterLayout(Container container)
-               {
-                  refreshComboBox();
-               }
-            }
-      );
+    // ---------------
+    this.addListener(
+        new PanelListenerAdapter()
+        {
+          public void onAfterLayout(Container container)
+          {
+            refreshComboBox();
+          }
+        }
+    );
 
-   }
+  }
 
 
-   public void onModelChange(ModelListenerRegistry parent, Object changeEvent)
-   {      
-      selectedInstance= (TaskRef)changeEvent;
-      availableActors = null;
+  public void onModelChange(ModelListenerRegistry parent, Object changeEvent)
+  {
+    selectedInstance = (TaskRef) changeEvent;
+    availableActors = null;
 
-      boolean hasPooledActors = selectedInstance.getPooledActors().size()>0;
-      if(hasPooledActors)
-      {
-         // has pooled actors -> can be asigned to pooled actors only
-         availableActors = selectedInstance.getPooledActors();
-      }
-      else if(!hasPooledActors &&
-            TaskRef.STATE.ASSIGNED ==selectedInstance.getCurrentState())
-      {
-         // no pooled actors but an assigned actor
-         loadActors();
-      }
-      else
-      {
-         // no pooled actors and no assignee
-         // should be covered by assignment handler
-         throw new IllegalStateException(selectedInstance + " has no pooled actors and no assignee");
-      }
+    boolean hasPooledActors = selectedInstance.getPooledActors().size() > 0;
+    if (hasPooledActors)
+    {
+      // has pooled actors -> can be asigned to pooled actors only
+      availableActors = selectedInstance.getPooledActors();
+    }
+    else if (!hasPooledActors &&
+        TaskRef.STATE.ASSIGNED == selectedInstance.getCurrentState())
+    {
+      // no pooled actors but an assigned actor
+      loadActors();
+    }
+    else
+    {
+      // no pooled actors and no assignee
+      // should be covered by assignment handler
+      throw new IllegalStateException(selectedInstance + " has no pooled actors and no assignee");
+    }
 
-      // finally refresh the combobox
-      refreshComboBox();
-   }
+    // finally refresh the combobox
+    refreshComboBox();
+  }
 
 
-   public void onRecordChange(ModelListenerRegistry parent, Record record)
-   {
-      // ignore
-   }
+  public void onRecordChange(ModelListenerRegistry parent, Record record)
+  {
+    // ignore
+  }
 
-   private void loadActors()
-   {
-      String url = mainView.getUrlBuilder().getAvailableActorsUrl(mainView.getUsername());
-      RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, url );
+  private void loadActors()
+  {
+    String url = mainView.getUrlBuilder().getAvailableActorsUrl(mainView.getUsername());
+    RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, url);
 
-      try
-      {
-         rb.sendRequest(null,
-               new RequestCallback() {
+    try
+    {
+      rb.sendRequest(null,
+          new RequestCallback()
+          {
 
-                  public void onResponseReceived(Request request, Response response)
-                  {
-                     if(200 != response.getStatusCode())
-                        ConsoleLog.error("Failed to retrieve groups: " + response.getStatusText());
+            public void onResponseReceived(Request request, Response response)
+            {
+              if (200 != response.getStatusCode())
+                ConsoleLog.error("Failed to retrieve groups: " + response.getStatusText());
 
-                     JSONValue value = JSONParser.parse(response.getText());
+              JSONValue value = JSONParser.parse(response.getText());
 
-                     availableActors = DTOParser.parseStringArray(value);                                             
-                  }
+              availableActors = DTOParser.parseStringArray(value);
+            }
 
-                  public void onError(Request request, Throwable t)
-                  {
-                     // Unknown error
-                     ConsoleLog.error("Unknown error", t);
-                  }
-               });
-      }
-      catch (RequestException e1)
-      {
-         ConsoleLog.error("Request failed" ,e1);
-      }
-   }
+            public void onError(Request request, Throwable t)
+            {
+              // Unknown error
+              ConsoleLog.error("Unknown error", t);
+            }
+          });
+    }
+    catch (RequestException e1)
+    {
+      ConsoleLog.error("Request failed", e1);
+    }
+  }
 
-   private void refreshComboBox()
-   {
-      if(null== availableActors)
-         throw new IllegalArgumentException("available actors cannot be null");
+  private void refreshComboBox()
+  {
+    if (null == availableActors)
+      throw new IllegalArgumentException("available actors cannot be null");
 
-      if(isRendered())
-      {
-         Form form = formPanel.getForm();
-         RefreshableComboBox cb = (RefreshableComboBox)form.findField("actorId");
-         cb.display(availableActors);
-      }
-   }
+    if (isRendered())
+    {
+      Form form = formPanel.getForm();
+      RefreshableComboBox cb = (RefreshableComboBox) form.findField("actorId");
+      cb.display(availableActors);
+    }
+  }
 
-   private void reassignTask(long taskId, String actor)
-   {
-      RequestBuilder rb = new RequestBuilder(RequestBuilder.POST,
-            mainView.getUrlBuilder().getTaskAssignmentURL(taskId, actor)
-      );
+  private void reassignTask(long taskId, String actor)
+  {
+    RequestBuilder rb = new RequestBuilder(RequestBuilder.POST,
+        mainView.getUrlBuilder().getTaskAssignmentURL(taskId, actor)
+    );
 
-      try
-      {
-         rb.sendRequest("",
-               new RequestCallback() {
+    try
+    {
+      rb.sendRequest("",
+          new RequestCallback()
+          {
 
-                  public void onResponseReceived(Request request, Response response)
-                  {
-                     if(200 != response.getStatusCode())
-                        ConsoleLog.error("Failed to reassign task: " + response.getStatusText());
+            public void onResponseReceived(Request request, Response response)
+            {
+              if (200 != response.getStatusCode())
+                ConsoleLog.error("Failed to reassign task: " + response.getStatusText());
 
-                     selectedInstance = null;
-                     callback.onAssignmentDone();
-                  }
+              selectedInstance = null;
+              callback.onAssignmentDone();
+            }
 
-                  public void onError(Request request, Throwable t)
-                  {
-                     // Unknown error
-                     ConsoleLog.error("Unknown error", t);
-                  }
-               });
-      }
-      catch (RequestException e1)
-      {
-         ConsoleLog.error("Request failed" ,e1);
-      }
-   }
+            public void onError(Request request, Throwable t)
+            {
+              // Unknown error
+              ConsoleLog.error("Unknown error", t);
+            }
+          });
+    }
+    catch (RequestException e1)
+    {
+      ConsoleLog.error("Request failed", e1);
+    }
+  }
 
-   public void onReset()
-   {
-      Form form = formPanel.getForm();      
-      form.reset();
-   }
+  public void onReset()
+  {
+    Form form = formPanel.getForm();
+    form.reset();
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskDetailsFormPanel.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskDetailsFormPanel.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskDetailsFormPanel.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -47,229 +47,231 @@
 class TaskDetailsFormPanel extends Panel implements ModelChangeListener
 {
 
-   private FormPanel formPanel;
-   private TaskRef selectedInstance;
-   private MainView mainView;
+  private FormPanel formPanel;
+  private TaskRef selectedInstance;
+  private MainView mainView;
 
-   private Button startBtn;
-   private Button stopBtn;
-   private Button endBtn;
+  private Button startBtn;
+  private Button stopBtn;
+  private Button endBtn;
 
-   private AssignmentCallback callback;
-   
-   public TaskDetailsFormPanel(final MainView mainView, AssignmentCallback callback)
-   {
-      super();
-      this.mainView = mainView;
-      this.callback = callback;
+  private AssignmentCallback callback;
 
-      setTitle("Task Details");
-      setBorder(false);
-      setFrame(false);
+  public TaskDetailsFormPanel(final MainView mainView, AssignmentCallback callback)
+  {
+    super();
+    this.mainView = mainView;
+    this.callback = callback;
 
-      // ---------------
+    setTitle("Task Details");
+    setBorder(false);
+    setFrame(false);
 
-      formPanel = FormWidgets.createBaseFormPanel();
+    // ---------------
 
-      //the field names must match the data field values from the Store
-      TextField idField = new TextField("Id", "id", 230);
-      idField.setReadOnly(true);
-      formPanel.add(idField);
+    formPanel = FormWidgets.createBaseFormPanel();
 
-      TextField nameField = new TextField("Name", "name", 230);
-      nameField.setReadOnly(true);
-      formPanel.add(nameField);
+    //the field names must match the data field values from the Store
+    TextField idField = new TextField("Id", "id", 230);
+    idField.setReadOnly(true);
+    formPanel.add(idField);
 
-      TextField actorField = new TextField("Actor", "actor", 230);
-      actorField.setReadOnly(true);
-      formPanel.add(actorField);
+    TextField nameField = new TextField("Name", "name", 230);
+    nameField.setReadOnly(true);
+    formPanel.add(nameField);
 
-      TextField stateField = new TextField("State", "currentState", 230);
-      stateField.setReadOnly(true);
-      formPanel.add(stateField);
+    TextField actorField = new TextField("Actor", "actor", 230);
+    actorField.setReadOnly(true);
+    formPanel.add(actorField);
 
-      // ----------
-      RefreshableComboBox cb = new RefreshableComboBox("signal", "Signal");
-      formPanel.add(cb);
+    TextField stateField = new TextField("State", "currentState", 230);
+    stateField.setReadOnly(true);
+    formPanel.add(stateField);
 
-      startBtn = new Button("Claim",
-            new ButtonListenerAdapter()
+    // ----------
+    RefreshableComboBox cb = new RefreshableComboBox("signal", "Signal");
+    formPanel.add(cb);
+
+    startBtn = new Button("Claim",
+        new ButtonListenerAdapter()
+        {
+
+          public void onClick(Button button, EventObject eventObject)
+          {
+            if (null == selectedInstance)
             {
-
-               public void onClick(Button button, EventObject eventObject)
-               {
-                  if(null==selectedInstance)
-                  {
-                     MessageBox.alert("Please select a task.");
-                     return;
-                  }
-                  selectedInstance.setActor(mainView.getUsername());
-                  reassignTask();
-               }
+              MessageBox.alert("Please select a task.");
+              return;
             }
-      );
+            selectedInstance.setActor(mainView.getUsername());
+            reassignTask();
+          }
+        }
+    );
 
-      stopBtn = new Button("Release",
-            new ButtonListenerAdapter()
+    stopBtn = new Button("Release",
+        new ButtonListenerAdapter()
+        {
+
+          public void onClick(Button button, EventObject eventObject)
+          {
+            if (null == selectedInstance)
             {
-
-               public void onClick(Button button, EventObject eventObject)
-               {
-                  if(null==selectedInstance)
-                  {
-                     MessageBox.alert("Please select a task.");
-                     return;
-                  }
-                  selectedInstance.setActor(null);
-                  reassignTask();
-               }
+              MessageBox.alert("Please select a task.");
+              return;
             }
-      );
+            selectedInstance.setActor(null);
+            reassignTask();
+          }
+        }
+    );
 
-      endBtn = new Button("Complete",
-            new ButtonListenerAdapter()
+    endBtn = new Button("Complete",
+        new ButtonListenerAdapter()
+        {
+
+          public void onClick(Button button, EventObject eventObject)
+          {
+            if (null == selectedInstance)
             {
+              MessageBox.alert("Please select a task.");
+              return;
+            }
 
-               public void onClick(Button button, EventObject eventObject)
-               {
-                  if(null==selectedInstance)
-                  {
-                     MessageBox.alert("Please select a task.");
-                     return;
-                  }
+            selectedInstance.close();
 
-                  selectedInstance.close();
+            ComboBox cb = (ComboBox) formPanel.getForm().findField("signal");
+            String signalName = cb.getRawValue();
+            if (signalName.equals(""))
+              MessageBox.alert("Please select a signal to end this task");
+            else
+              endTask(signalName);
+          }
+        }
+    );
 
-                  ComboBox cb = (ComboBox) formPanel.getForm().findField("signal");
-                  String signalName = cb.getRawValue();
-                  if(signalName.equals(""))
-                     MessageBox.alert("Please select a signal to end this task");
-                  else
-                     endTask(signalName);
-               }
-            }
-      );
+    formPanel.addButton(startBtn);
+    formPanel.addButton(stopBtn);
+    formPanel.addButton(endBtn);
 
-      formPanel.addButton(startBtn);
-      formPanel.addButton(stopBtn);
-      formPanel.addButton(endBtn);
+    this.add(formPanel);
+  }
 
-      this.add(formPanel);
-   }
+  private void reassignTask()
+  {
+    RequestBuilder rb = new RequestBuilder(RequestBuilder.POST,
+        mainView.getUrlBuilder().getTaskAssignmentURL(
+            selectedInstance.getId(), selectedInstance.getActor()
+        )
+    );
 
-   private void reassignTask()
-   {
-      RequestBuilder rb = new RequestBuilder(RequestBuilder.POST,
-            mainView.getUrlBuilder().getTaskAssignmentURL(
-                  selectedInstance.getId(), selectedInstance.getActor()
-            )
-      );
+    try
+    {
+      rb.sendRequest("",
+          new RequestCallback()
+          {
 
-      try
-      {
-         rb.sendRequest("",
-               new RequestCallback() {
+            public void onResponseReceived(Request request, Response response)
+            {
+              if (200 != response.getStatusCode())
+                ConsoleLog.error("Failed to reassign task: " + response.getStatusText());
 
-                  public void onResponseReceived(Request request, Response response)
-                  {
-                     if(200 != response.getStatusCode())
-                        ConsoleLog.error("Failed to reassign task: " + response.getStatusText());
-                     
-                     selectedInstance = null;
-                     callback.onAssignmentDone();                     
-                  }
+              selectedInstance = null;
+              callback.onAssignmentDone();
+            }
 
-                  public void onError(Request request, Throwable t)
-                  {
-                     // Unknown error
-                     ConsoleLog.error("Unknown error", t);
-                  }
-               });
-      }
-      catch (RequestException e1)
-      {
-         ConsoleLog.error("Request failed" ,e1);
-      }
-   }
+            public void onError(Request request, Throwable t)
+            {
+              // Unknown error
+              ConsoleLog.error("Unknown error", t);
+            }
+          });
+    }
+    catch (RequestException e1)
+    {
+      ConsoleLog.error("Request failed", e1);
+    }
+  }
 
-   private void endTask(String signalName)
-   {
-      String taskCloseURL = signalName.equals(UIConstants.DEFAULT_TRANSITION) ?
-            mainView.getUrlBuilder().getTaskEndURL(selectedInstance.getId()) :
-            mainView.getUrlBuilder().getTaskEndURL(selectedInstance.getId(), signalName);
+  private void endTask(String signalName)
+  {
+    String taskCloseURL = signalName.equals(UIConstants.DEFAULT_TRANSITION) ?
+        mainView.getUrlBuilder().getTaskEndURL(selectedInstance.getId()) :
+        mainView.getUrlBuilder().getTaskEndURL(selectedInstance.getId(), signalName);
 
-      RequestBuilder rb = new RequestBuilder(RequestBuilder.POST,taskCloseURL);
+    RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, taskCloseURL);
 
-      try
-      {
-         rb.sendRequest("",
-               new RequestCallback() {
+    try
+    {
+      rb.sendRequest("",
+          new RequestCallback()
+          {
 
-                  public void onResponseReceived(Request request, Response response)
-                  {
-                     if(200 != response.getStatusCode())
-                        ConsoleLog.error("Failed to end task: " + response.getStatusText());
-                     
-                     selectedInstance = null;
-                     callback.onTaskEnd();
-                  }
+            public void onResponseReceived(Request request, Response response)
+            {
+              if (200 != response.getStatusCode())
+                ConsoleLog.error("Failed to end task: " + response.getStatusText());
 
-                  public void onError(Request request, Throwable t)
-                  {
-                     // Unknown error
-                     ConsoleLog.error("Unknown error", t);
-                  }
-               });
-      }
-      catch (RequestException e1)
-      {
-         ConsoleLog.error("Failed to close task", e1);
-      }
-   }
+              selectedInstance = null;
+              callback.onTaskEnd();
+            }
 
+            public void onError(Request request, Throwable t)
+            {
+              // Unknown error
+              ConsoleLog.error("Unknown error", t);
+            }
+          });
+    }
+    catch (RequestException e1)
+    {
+      ConsoleLog.error("Failed to close task", e1);
+    }
+  }
 
-   public void onRecordChange(ModelListenerRegistry parent, Record changeEvent)
-   {      
-      selectedInstance = TaskList.transform(changeEvent);
 
-      Form form = formPanel.getForm();
-      RefreshableComboBox cb = (RefreshableComboBox)form.findField("signal");
+  public void onRecordChange(ModelListenerRegistry parent, Record changeEvent)
+  {
+    selectedInstance = TaskList.transform(changeEvent);
 
-      if(selectedInstance.getPooledActors().isEmpty())
-      {
-         // no group assignment available
-         startBtn.disable();
-         stopBtn.disable();
-      }
-      else if(TaskRef.STATE.ASSIGNED == selectedInstance.getCurrentState())
-      {
-         startBtn.disable();
-         stopBtn.enable();
-         cb.enable();
-         endBtn.enable();
-      }
-      else
-      {
-         startBtn.enable();
-         stopBtn.disable();
-         cb.disable();
-         endBtn.disable();
-      }
+    Form form = formPanel.getForm();
+    RefreshableComboBox cb = (RefreshableComboBox) form.findField("signal");
 
-      cb.display( selectedInstance.getTransitionNames() );
+    if (selectedInstance.getPooledActors().isEmpty())
+    {
+      // no group assignment available
+      startBtn.disable();
+      stopBtn.disable();
+    }
+    else if (TaskRef.STATE.ASSIGNED == selectedInstance.getCurrentState())
+    {
+      startBtn.disable();
+      stopBtn.enable();
+      cb.enable();
+      endBtn.enable();
+    }
+    else
+    {
+      startBtn.enable();
+      stopBtn.disable();
+      cb.disable();
+      endBtn.disable();
+    }
 
-      formPanel.getForm().loadRecord(changeEvent);
-      formPanel.doLayout();
-   }
+    cb.display(selectedInstance.getTransitionNames());
 
+    formPanel.getForm().loadRecord(changeEvent);
+    formPanel.doLayout();
+  }
 
-   public void onModelChange(ModelListenerRegistry parent, Object changeEvent)
-   {
-      // ignore
-   }
 
-   public void onReset()
-   {
-      formPanel.getForm().reset();
-   }
+  public void onModelChange(ModelListenerRegistry parent, Object changeEvent)
+  {
+    // ignore
+  }
+
+  public void onReset()
+  {
+    formPanel.getForm().reset();
+  }
 }

Copied: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskEditor.java (from rev 3636, projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskListEditor.java)
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskEditor.java	                        (rev 0)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskEditor.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -0,0 +1,241 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.bpm.console.client.task;
+
+import com.gwtext.client.core.EventObject;
+import com.gwtext.client.data.Node;
+import com.gwtext.client.data.Record;
+import com.gwtext.client.widgets.Component;
+import com.gwtext.client.widgets.PaddedPanel;
+import com.gwtext.client.widgets.Panel;
+import com.gwtext.client.widgets.TabPanel;
+import com.gwtext.client.widgets.event.PanelListenerAdapter;
+import com.gwtext.client.widgets.grid.RowSelectionModel;
+import com.gwtext.client.widgets.grid.event.RowSelectionListenerAdapter;
+import com.gwtext.client.widgets.layout.ColumnLayout;
+import com.gwtext.client.widgets.tree.TreeNode;
+import com.gwtext.client.widgets.tree.TreePanel;
+import com.gwtext.client.widgets.tree.event.TreeNodeListenerAdapter;
+import org.jboss.bpm.console.client.*;
+import org.jboss.bpm.console.client.model.TaskRef;
+import org.jboss.bpm.console.client.util.ModelChangeListener;
+import org.jboss.bpm.console.client.util.ModelListenerRegistry;
+import org.jboss.bpm.console.client.util.ModelModificationCallback;
+
+/**
+ * @author Heiko.Braun <heiko.braun at jboss.com>
+ */
+public class TaskEditor extends Editor implements AssignmentCallback
+{
+
+  public final static String ID = "org.jboss.bpm.task.TaskList";
+  private MainView mainView;
+  private TaskList taskList;
+  
+  private boolean initialized;
+  private TabPanel tabPanel;
+
+  private ModelListenerRegistry modelListeners = new ModelListenerRegistry();
+
+  public TaskEditor(MainView mainView)
+  {
+    super(mainView);
+    this.setId(ID);
+    this.mainView = mainView;
+
+    this.setLayout(new ColumnLayout());
+    this.setWidth(UIConstants.EDITOR_WIDTH);
+
+    this.addListener(
+        new PanelListenerAdapter()
+        {
+          public boolean doBeforeRender(Component component)
+          {
+            return beforeRenderCallback();
+          }
+        }
+    );
+
+  }
+
+  public String getEditorId()
+  {
+    return ID;
+  }
+
+  public String getTitle()
+  {
+    return "Tasks";
+  }
+
+  public String getIconCSS()
+  {
+    return "bpm-task-icon";
+  }
+
+
+  public MenuSection provideMenuSection()
+  {
+    return new MenuSection("Task Management", "bpm-task-icon", new TaskTree());
+  }
+
+  /**
+   * TaskList editor requires an authenticated user,
+   * hence the initialization through callback
+   */
+  public boolean beforeRenderCallback()
+  {
+    if (!initialized)
+    {
+            
+      tabPanel = new TabPanel();
+      tabPanel.setPaddings(10);
+      tabPanel.setPlain(true);
+      tabPanel.setActiveTab(0);
+      tabPanel.setWidth(UIConstants.EDITOR_PANEL_WIDTH);
+
+      PaddedPanel tabPadding = new PaddedPanel(tabPanel, 10, 0, 0, 0);
+
+      // ----------------------------------
+
+      ModelModificationCallback modelModificationCallback = new ModelModificationCallback()
+      {
+
+        public void onStaleModel()
+        {
+          resetEditor();
+        }
+      };
+
+      taskList = new TaskList(modelModificationCallback, "Task overview", mainView);
+      final RowSelectionModel sm = new RowSelectionModel(true);
+      sm.addListener(
+          new RowSelectionListenerAdapter()
+          {
+            public void onRowSelect(RowSelectionModel sm, int rowIndex, Record record)
+            {
+              TaskRef taskRef = TaskList.transform(record);
+              modelListeners.fireRecordChangeEvent(record);
+              modelListeners.fireModelChangeEvent(taskRef);
+            }
+          }
+      );
+      taskList.setRowSelectionModel(sm);
+
+
+      // ----------------------------------
+
+      Panel detailsPanel = new TaskDetailsFormPanel(mainView, this);
+      Panel assignmentPanel = new AssignmentFormPanel(mainView, this);
+
+      modelListeners.addListener((ModelChangeListener) detailsPanel);
+      modelListeners.addListener((ModelChangeListener) assignmentPanel);
+
+      tabPanel.add(detailsPanel);
+      tabPanel.add(assignmentPanel);
+
+      // -------
+
+      final View defaultView = new View(main)
+      {
+
+        public String getViewId()
+        {
+          return getEditorId() + ".defaultView";
+        }
+
+        public String getIconCSS()
+        {
+          return "";
+        }
+      };
+
+      defaultView.setBorder(false);
+      defaultView.setTitle("Task list");
+
+      defaultView.add(taskList);
+      defaultView.add(tabPadding);
+
+      // -------
+      
+      addView(defaultView, false);
+
+      doLayout();
+      
+      initialized = true;
+    }
+
+    return true;
+  }
+
+  private void resetEditor()
+  {
+    taskList.reloadStore();
+    modelListeners.fireResetEvent();
+  }
+
+  public void onAssignmentDone()
+  {
+    resetEditor();
+  }
+
+  public void onTaskEnd()
+  {
+    resetEditor();
+  }
+
+  class TaskTree extends TreePanel
+  {
+
+    public TaskTree()
+    {
+      TreeNode root = new TreeNode("Your tasks");
+
+      TreeNode overview = new TreeNode("Overview");
+      overview.setExpanded(true);
+      overview.addListener(
+          new TreeNodeListenerAdapter()
+          {
+            public void onClick(Node node, EventObject eventObject)
+            {
+              if (mainView.hasEditor(ID))
+              {
+                mainView.showEditor(ID);
+              }
+              else
+              {
+                mainView.addEditor(new TaskEditor(mainView));
+              }
+
+            }
+          }
+      );
+
+      root.appendChild(overview);
+
+      setRootVisible(true);
+      setRootNode(root);
+      root.setExpanded(true);
+
+    }
+  }
+}

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskList.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskList.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskList.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -42,240 +42,242 @@
 import java.util.HashMap;
 import java.util.Map;
 
-/** 
+/**
  * @author Heiko.Braun <heiko.braun at jboss.com>
  */
 public class TaskList extends Panel
 {
-   private Map<Integer, TaskRef> row2taskref = new HashMap<Integer, TaskRef>();
-   private MainView mainView;
-   private GridPanel grid;
-   private GroupingStore store;
-   private String title;
-   private RowSelectionModel rowSelectionModel;
-   public static final int PAGE_SIZE = 15;
-   private int selectedRowIndex = -1;
+  private Map<Integer, TaskRef> row2taskref = new HashMap<Integer, TaskRef>();
+  private MainView mainView;
+  private GridPanel grid;
+  private GroupingStore store;
+  private String title;
+  private RowSelectionModel rowSelectionModel;
+  public static final int PAGE_SIZE = 15;
+  private int selectedRowIndex = -1;
 
-   private ModelModificationCallback modelModificationCallback;
+  private ModelModificationCallback modelModificationCallback;
 
-   public TaskList(ModelModificationCallback callback, String titleName, final MainView view)
-   {
-      this.mainView = view;
-      this.title = titleName;
-      this.modelModificationCallback = callback;
+  public TaskList(ModelModificationCallback callback, String titleName, final MainView view)
+  {
+    this.mainView = view;
+    //this.title = titleName;
+    this.modelModificationCallback = callback;
 
-      this.setPaddings(10);
-      this.setHeader(false);
-      this.setBorder(false);
-      this.setFrame(false);
-      this.setIconCls("bpm-task-icon");
+    this.setPaddings(10, 0,0,0);
+    this.setHeader(false);
+    this.setBorder(false);
+    this.setFrame(false);
+    this.setIconCls("bpm-task-icon");
 
-      String resourceUrl = view.getUrlBuilder().getTaskListByActorURL(view.getUsername());
-      DataProxy dataProxy = new ScriptTagProxy(resourceUrl, 1000*10);
+    String resourceUrl = view.getUrlBuilder().getTaskListByActorURL(view.getUsername());
+    DataProxy dataProxy = new ScriptTagProxy(resourceUrl, 1000 * 10);
 
-      final Reader reader = createReader();
+    final Reader reader = createReader();
 
-      store = new GroupingStore();
-      store.setReader(reader);
-      store.setDataProxy(dataProxy);
-      store.setSortInfo(new SortState("id", SortDir.ASC));
-      store.setGroupField("currentState");
-      store.addStoreListener( new ListViewStoreListener(this) );
+    store = new GroupingStore();
+    store.setReader(reader);
+    store.setDataProxy(dataProxy);
+    store.setSortInfo(new SortState("id", SortDir.ASC));
+    store.setGroupField("currentState");
+    store.addStoreListener(new ListViewStoreListener(this));
 
-      // PanelListener will lazy load store data.
-      // Store.onLoad() callback will populate the grid
-      // and add it to the container panel.
-      this.addListener(
-            new PanelListenerAdapter()
-            {
-               public boolean doBeforeRender(Component component)
-               {
-                  modelModificationCallback.onStaleModel();
-                  return true;
-               }
-            }
-      );
-   }
+    // PanelListener will lazy load store data.
+    // Store.onLoad() callback will populate the grid
+    // and add it to the container panel.
+    this.addListener(
+        new PanelListenerAdapter()
+        {
+          public boolean doBeforeRender(Component component)
+          {
+            modelModificationCallback.onStaleModel();
+            return true;
+          }
+        }
+    );
+  }
 
-   protected void onRecordsLoaded(Record[] records)
-   {
-      try
+  protected void onRecordsLoaded(Record[] records)
+  {
+    try
+    {
+      int i = 0;
+      for (Record r : records)
       {
-         int i=0;
-         for(Record r : records)
-         {
-            TaskRef ref = transform(r);
-            row2taskref.put(i, ref);
-            i++;
-         }
+        TaskRef ref = transform(r);
+        row2taskref.put(i, ref);
+        i++;
       }
-      catch (Throwable e)
-      {
-         ConsoleLog.error("Failed to parse task ref", e);
-      }
+    }
+    catch (Throwable e)
+    {
+      ConsoleLog.error("Failed to parse task ref", e);
+    }
 
-      ConsoleLog.debug("Loaded " + row2taskref.size() + " tasks");
-   }
+    ConsoleLog.debug("Loaded " + row2taskref.size() + " tasks");
+  }
 
-   public static TaskRef transform(Record r)
-   {
-      JavaScriptObject js = r.getDataAsJsObject();
-      JSONObject jso = new JSONObject(js);
-      TaskRef ref = DTOParser.parseTaskReference(jso);
-      return ref;
-   }
+  public static TaskRef transform(Record r)
+  {
+    JavaScriptObject js = r.getDataAsJsObject();
+    JSONObject jso = new JSONObject(js);
+    TaskRef ref = DTOParser.parseTaskReference(jso);
+    return ref;
+  }
 
-   private ColumnModel createColumnModel()
-   {
-      final ColumnModel columnModel = new ColumnModel(
-            new ColumnConfig[]
-                  {
-                        new ColumnConfig("ID", "id", 35, true),
-                        new ColumnConfig("Task Name", "name", 290, true, null, "expand"),
-                        new ColumnConfig("Assigned to", "actor", 75, true),
-                        new ColumnConfig("State", "currentState", 50, true)
-                  }
-      );
-      return columnModel;
-   }
-
-   private JsonReader createReader()
-   {
-      final RecordDef recordDef = new RecordDef(
-            new FieldDef[]{
-                  new IntegerFieldDef("id"),
-                  new StringFieldDef("name"),
-                  new StringFieldDef("actor"),
-                  new StringFieldDef("currentState")
+  private ColumnModel createColumnModel()
+  {
+    final ColumnModel columnModel = new ColumnModel(
+        new ColumnConfig[]
+            {
+                new ColumnConfig("ID", "id", 35, true),
+                new ColumnConfig("Task Name", "name", 290, true, null, "expand"),
+                new ColumnConfig("Assigned to", "actor", 75, true),
+                new ColumnConfig("State", "currentState", 50, true)
             }
-      );
+    );
+    return columnModel;
+  }
 
-      final JsonReader reader = new JsonReader(recordDef);
-      reader.setRoot("tasks");
-      reader.setTotalProperty("totalCount");
-      reader.setId("id");
-      return reader;
-   }
+  private JsonReader createReader()
+  {
+    final RecordDef recordDef = new RecordDef(
+        new FieldDef[]{
+            new IntegerFieldDef("id"),
+            new StringFieldDef("name"),
+            new StringFieldDef("actor"),
+            new StringFieldDef("currentState")
+        }
+    );
 
-   private class ListViewStoreListener extends StoreListenerAdapter
-   {
+    final JsonReader reader = new JsonReader(recordDef);
+    reader.setRoot("tasks");
+    reader.setTotalProperty("totalCount");
+    reader.setId("id");
+    return reader;
+  }
 
-      Panel containerPanel;
+  private class ListViewStoreListener extends StoreListenerAdapter
+  {
 
-      public ListViewStoreListener(Panel containerPanel)
-      {
-         this.containerPanel = containerPanel;
-      }
+    Panel containerPanel;
 
-      /**
-       * load callback will push records to implementation
-       * and (!) add the grid to the container panel.
-       */
-      public void onLoad(Store store, Record[] records)
-      {
+    public ListViewStoreListener(Panel containerPanel)
+    {
+      this.containerPanel = containerPanel;
+    }
 
-         onRecordsLoaded(records);
+    /**
+     * load callback will push records to implementation
+     * and (!) add the grid to the container panel.
+     */
+    public void onLoad(Store store, Record[] records)
+    {
 
-         grid = assembleGrid();
+      onRecordsLoaded(records);
 
-         containerPanel.clear();
-         containerPanel.add(grid);
-         containerPanel.doLayout();
-      }
+      grid = assembleGrid();
 
-      public void onLoadException(Throwable throwable)
-      {
-         ConsoleLog.error("Failed to load remote data", throwable);
-      }
+      containerPanel.clear();
+      containerPanel.add(grid);
+      containerPanel.doLayout();
+    }
 
-   }
+    public void onLoadException(Throwable throwable)
+    {
+      ConsoleLog.error("Failed to load remote data", throwable);
+    }
 
-   private GridPanel assembleGrid()
-   {
-      final ColumnModel columnModel = createColumnModel();
+  }
 
-      GridPanel grid = new GridPanel();
-      grid.setStore(store);
-      grid.setColumnModel(columnModel);
-      grid.setFrame(true);
-      grid.setStripeRows(true);
-      grid.setAutoExpandColumn("name");
-      grid.setTitle(title);
+  private GridPanel assembleGrid()
+  {
+    final ColumnModel columnModel = createColumnModel();
 
-      GroupingView gridView = new GroupingView();
-      gridView.setForceFit(true);
-      gridView.setGroupTextTpl("{text} ({[values.rs.length]} {[values.rs.length > 1 ?  \"Items\" : \"Item\"]})");
+    GridPanel grid = new GridPanel();
+    grid.setStore(store);
+    grid.setColumnModel(columnModel);
+    grid.setFrame(true);
+    grid.setBorder(false);
+    grid.setStripeRows(true);
+    grid.setAutoExpandColumn("name");
+    //grid.setTitle(title);
 
-      if(rowSelectionModel!=null)
+    GroupingView gridView = new GroupingView();
+    gridView.setForceFit(true);
+    gridView.setGroupTextTpl("{text} ({[values.rs.length]} {[values.rs.length > 1 ?  \"Items\" : \"Item\"]})");
+
+    if (rowSelectionModel != null)
+    {
+      grid.setSelectionModel(rowSelectionModel);
+      grid.doOnRender(new Function()
       {
-         grid.setSelectionModel(rowSelectionModel);
-         grid.doOnRender(new Function() {
-            public void execute()
-            {
-               if(-1==selectedRowIndex)
-                  rowSelectionModel.selectFirstRow();
-               else
-                  rowSelectionModel.selectRow(selectedRowIndex);
-            }
-         }, 10);
-      }
-      grid.setView(gridView);
-      grid.setFrame(true);
-      grid.setWidth(UIConstants.EDITOR_PANEL_WIDTH);
-      grid.setHeight(250);
-      grid.setEnableHdMenu(false);
+        public void execute()
+        {
+          if (-1 == selectedRowIndex)
+            rowSelectionModel.selectFirstRow();
+          else
+            rowSelectionModel.selectRow(selectedRowIndex);
+        }
+      }, 10);
+    }
+    grid.setView(gridView);
+    grid.setFrame(true);
+    grid.setWidth(UIConstants.EDITOR_PANEL_WIDTH);
+    grid.setHeight(250);
+    grid.setEnableHdMenu(false);
 
-      grid.setBottomToolbar(createToolbar(store));
+    grid.setBottomToolbar(createToolbar(store));
 
-      return grid;
-   }
+    return grid;
+  }
 
-   private PagingToolbar createToolbar(final Store store)
-   {
-      PagingToolbar pagingToolbar = new PagingToolbar(store);
-      pagingToolbar.setPageSize(PAGE_SIZE);
-      pagingToolbar.setDisplayInfo(true);
-      pagingToolbar.setDisplayMsg("{0} - {1} of {2}");
+  private PagingToolbar createToolbar(final Store store)
+  {
+    PagingToolbar pagingToolbar = new PagingToolbar(store);
+    pagingToolbar.setPageSize(PAGE_SIZE);
+    pagingToolbar.setDisplayInfo(true);
+    pagingToolbar.setDisplayMsg("{0} - {1} of {2}");
 
-      pagingToolbar.addSeparator();
-      pagingToolbar.addSpacer();
-      
-      return pagingToolbar;
-   }
+    pagingToolbar.addSeparator();
+    pagingToolbar.addSpacer();
 
+    return pagingToolbar;
+  }
 
-   public void reloadStore()
-   {
-      ConsoleLog.debug("Reload " + this.getId());
-      store.load(0, PAGE_SIZE);
-   }
 
-   public GridPanel getGrid()
-   {
-      return grid;
-   }
+  public void reloadStore()
+  {
+    ConsoleLog.debug("Reload " + this.getId());
+    store.load(0, PAGE_SIZE);
+  }
 
-   public void setRowSelectionModel(RowSelectionModel model)
-   {
-      this.rowSelectionModel = model;
-   }
+  public GridPanel getGrid()
+  {
+    return grid;
+  }
 
-   public class ListViewCellListener implements GridCellListener
-   {
-      public void onCellClick(GridPanel grid, int rowIndex, int colindex, EventObject e)
-      {
-         selectedRowIndex = rowIndex;
-      }
+  public void setRowSelectionModel(RowSelectionModel model)
+  {
+    this.rowSelectionModel = model;
+  }
 
+  public class ListViewCellListener implements GridCellListener
+  {
+    public void onCellClick(GridPanel grid, int rowIndex, int colindex, EventObject e)
+    {
+      selectedRowIndex = rowIndex;
+    }
 
-      public void onCellContextMenu(GridPanel gridPanel, int i, int i1, EventObject eventObject)
-      {
 
-      }
+    public void onCellContextMenu(GridPanel gridPanel, int i, int i1, EventObject eventObject)
+    {
 
-      public void onCellDblClick(GridPanel gridPanel, int i, int i1, EventObject eventObject)
-      {
+    }
 
-      }
-   }
+    public void onCellDblClick(GridPanel gridPanel, int i, int i1, EventObject eventObject)
+    {
+
+    }
+  }
 }

Deleted: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskListEditor.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskListEditor.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/task/TaskListEditor.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -1,191 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.bpm.console.client.task;
-
-import com.gwtext.client.data.Record;
-import com.gwtext.client.widgets.Component;
-import com.gwtext.client.widgets.PaddedPanel;
-import com.gwtext.client.widgets.Panel;
-import com.gwtext.client.widgets.TabPanel;
-import com.gwtext.client.widgets.event.PanelListenerAdapter;
-import com.gwtext.client.widgets.grid.RowSelectionModel;
-import com.gwtext.client.widgets.grid.event.RowSelectionListenerAdapter;
-import com.gwtext.client.widgets.layout.ColumnLayout;
-import com.gwtext.client.widgets.layout.ColumnLayoutData;
-import org.jboss.bpm.console.client.Editor;
-import org.jboss.bpm.console.client.MainView;
-import org.jboss.bpm.console.client.UIConstants;
-import org.jboss.bpm.console.client.model.TaskRef;
-import org.jboss.bpm.console.client.util.ModelChangeListener;
-import org.jboss.bpm.console.client.util.ModelListenerRegistry;
-import org.jboss.bpm.console.client.widgets.TeaserPanel;
-import org.jboss.bpm.console.client.util.ModelModificationCallback;
-
-/**
- * @author Heiko.Braun <heiko.braun at jboss.com>
- */
-public class TaskListEditor extends Editor implements AssignmentCallback
-{
-
-   public final static String ID = "org.jboss.bpm.task.TaskList";
-   private MainView mainView;
-   private TaskList taskList;
-   private Panel teaserPanel;
-   private boolean initialized;
-   private TabPanel tabPanel;
-
-   private ModelListenerRegistry modelListeners =new ModelListenerRegistry();
-
-   public TaskListEditor(MainView mainView)
-   {
-      super(mainView);
-      this.setId(ID);
-      this.mainView = mainView;
-
-      this.setLayout( new ColumnLayout() );
-      this.setWidth(UIConstants.EDITOR_WIDTH);
-
-      this.addListener(
-            new PanelListenerAdapter()
-            {
-               public boolean doBeforeRender(Component component)
-               {
-                  return beforeRenderCallback();
-               }
-            }
-      );
-
-   }
-
-   public String getEditorId()
-   {
-      return ID;
-   }
-
-   public String getTitle()
-   {
-      return "Tasks";
-   }
-
-   public String getIconCSS()
-   {
-      return "bpm-task-icon";
-   }
-
-   /**
-    * TaskList editor requires an authenticated user,
-    * hence the initialization through callback
-    */
-   public boolean beforeRenderCallback()
-   {
-      if(!initialized)
-      {
-         final Panel leftHand = new Panel();
-         leftHand.setFrame(false);
-         leftHand.setHeader(false);
-         leftHand.setBorder(false);
-
-         // ----------------------------------
-
-         tabPanel = new TabPanel();
-         tabPanel.setPaddings(10);
-         tabPanel.setPlain(true);
-         tabPanel.setActiveTab(0);
-         tabPanel.setWidth(UIConstants.EDITOR_PANEL_WIDTH);
-
-         PaddedPanel tabPadding = new PaddedPanel(tabPanel, 0,10,0,10);
-
-         // ----------------------------------
-
-         ModelModificationCallback modelModificationCallback = new ModelModificationCallback()
-         {
-
-            public void onStaleModel()
-            {
-               resetEditor();
-            }
-         };
-         
-         taskList = new TaskList(modelModificationCallback, "Task overview", mainView);
-         final RowSelectionModel sm = new RowSelectionModel(true);
-         sm.addListener(
-               new RowSelectionListenerAdapter()
-               {
-                  public void onRowSelect(RowSelectionModel sm, int rowIndex, Record record)
-                  {
-                     TaskRef taskRef = TaskList.transform(record);
-                     modelListeners.fireRecordChangeEvent(record);
-                     modelListeners.fireModelChangeEvent(taskRef);
-                  }
-               }
-         );
-         taskList.setRowSelectionModel(sm);
-         leftHand.add(taskList);
-
-         // ----------------------------------
-
-         Panel detailsPanel = new TaskDetailsFormPanel(mainView, this);
-         Panel assignmentPanel = new AssignmentFormPanel(mainView, this);
-
-         modelListeners.addListener((ModelChangeListener)detailsPanel);
-         modelListeners.addListener((ModelChangeListener)assignmentPanel);
-
-         tabPanel.add( detailsPanel );
-         tabPanel.add( assignmentPanel );
-
-         // ----------------------------------
-
-         leftHand.add(tabPadding);
-
-         // ----------------------------------
-
-         teaserPanel = new TeaserPanel();
-
-         // ----------------------------------
-
-         this.add(leftHand, new ColumnLayoutData(0.7) );
-         this.add(teaserPanel , new ColumnLayoutData(0.3) );
-
-         doLayout();
-
-         initialized = true;
-      }
-
-      return true;
-   }
-
-   private void resetEditor()
-   {
-      taskList.reloadStore();
-      modelListeners.fireResetEvent();
-   }
-
-   public void onAssignmentDone()
-   {
-      resetEditor();
-   }
-
-   public void onTaskEnd()
-   {
-      resetEditor();
-   }
-}

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/ConsoleLog.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/ConsoleLog.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/ConsoleLog.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -25,47 +25,47 @@
  * The maven gwt:test mojo treats any output to stderr as
  * a test failure. gwt-log does dump some information there,
  * hence we need to proxy log invocation and be able to disable them at all.
- * <p>
+ * <p/>
  * If you want to test the application, make sure to lauch it using
  * {@link org.jboss.bpm.console.client.Application#onModuleLoad2()}.
- *  
+ *
  * @author Heiko.Braun <heiko.braun at jboss.com>
  */
 public class ConsoleLog
 {
-   private static boolean enabled = false;
+  private static boolean enabled = false;
 
-   public static void debug(String msg)
-   {
-      if(enabled)
-         com.allen_sauer.gwt.log.client.Log.debug(msg);
-   }
+  public static void debug(String msg)
+  {
+    if (enabled)
+      com.allen_sauer.gwt.log.client.Log.debug(msg);
+  }
 
-   public static void error(String msg)
-   {
-      if(enabled)
-         com.allen_sauer.gwt.log.client.Log.error(msg);
-   }
+  public static void error(String msg)
+  {
+    if (enabled)
+      com.allen_sauer.gwt.log.client.Log.error(msg);
+  }
 
-   public static void error(String msg, Throwable t)
-   {
-      if(enabled)
-         com.allen_sauer.gwt.log.client.Log.error(msg, t);
-   }
+  public static void error(String msg, Throwable t)
+  {
+    if (enabled)
+      com.allen_sauer.gwt.log.client.Log.error(msg, t);
+  }
 
-   public static void setUncaughtExceptionHandler()
-   {
-      if(enabled)
-         com.allen_sauer.gwt.log.client.Log.setUncaughtExceptionHandler();
-   }
+  public static void setUncaughtExceptionHandler()
+  {
+    if (enabled)
+      com.allen_sauer.gwt.log.client.Log.setUncaughtExceptionHandler();
+  }
 
-   public static boolean isEnabled()
-   {
-      return enabled;
-   }
+  public static boolean isEnabled()
+  {
+    return enabled;
+  }
 
-   public static void setEnabled(boolean enabled)
-   {
-      ConsoleLog.enabled = enabled;
-   }
+  public static void setEnabled(boolean enabled)
+  {
+    ConsoleLog.enabled = enabled;
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/DateRenderer.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/DateRenderer.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/DateRenderer.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -32,30 +32,30 @@
 
 /**
  * Renders a Date according to {@link org.jboss.bpm.console.client.model.util.SimpleDateFormat#DEFAULT_FORMAT}
- * 
+ *
  * @author Heiko.Braun <heiko.braun at jboss.com>
  */
 public class DateRenderer implements Renderer
 {
-   private String fieldName;
-   
-   public DateRenderer(String fieldName)
-   {
-      this.fieldName = fieldName;
-   }
+  private String fieldName;
 
-   /**
-    * Returns an empty string (field is null) or a formatted date (field is set).
-    */
-   public String render(Object value, CellMetadata cellMetadata, Record record,
-                        int rowIndex, int colNum, Store store)
-   {
-      String s = "";
-      SimpleDateFormat df = new SimpleDateFormat();
-      Date d = record.getAsDate(fieldName);
-      if(d!=null)
-         s = df.format(d);
+  public DateRenderer(String fieldName)
+  {
+    this.fieldName = fieldName;
+  }
 
-      return s;
-   }
+  /**
+   * Returns an empty string (field is null) or a formatted date (field is set).
+   */
+  public String render(Object value, CellMetadata cellMetadata, Record record,
+                       int rowIndex, int colNum, Store store)
+  {
+    String s = "";
+    SimpleDateFormat df = new SimpleDateFormat();
+    Date d = record.getAsDate(fieldName);
+    if (d != null)
+      s = df.format(d);
+
+    return s;
+  }
 }
\ No newline at end of file

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/JSONRequest.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/JSONRequest.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/JSONRequest.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -24,29 +24,31 @@
 /**
  * Request helper, to bypass SOP restrictions.<br>
  * Can only be used to retrieve Json data, wrapped in a script tag.
+ *
  * @author Heiko.Braun <heiko.braun at jboss.com>
  */
-public class JSONRequest {
-   public static void get(String url, JSONRequestHandler handler)
-   {
-      String callbackName = "JSONCallback"+handler.hashCode();
-      get( url+"?callback="+callbackName, callbackName, handler );
-   }
+public class JSONRequest
+{
+  public static void get(String url, JSONRequestHandler handler)
+  {
+    String callbackName = "JSONCallback" + handler.hashCode();
+    get(url + "?callback=" + callbackName, callbackName, handler);
+  }
 
-   public static void get(String url, String callbackName, JSONRequestHandler handler )
-   {
-      createCallbackFunction( handler, callbackName );
-      addScript(url);
-   }
+  public static void get(String url, String callbackName, JSONRequestHandler handler)
+  {
+    createCallbackFunction(handler, callbackName);
+    addScript(url);
+  }
 
-   public static native void addScript(String url) /*-{
+  public static native void addScript(String url) /*-{
     var scr = document.createElement("script");
     scr.setAttribute("language", "JavaScript");
     scr.setAttribute("src", url);
     document.getElementsByTagName("body")[0].appendChild(scr);
   }-*/;
 
-   private native static void createCallbackFunction( JSONRequestHandler obj, String callbackName)/*-{
+  private native static void createCallbackFunction(JSONRequestHandler obj, String callbackName)/*-{
     tmpcallback = function(j) {
       obj. at org.jboss.bpm.console.client.util.JSONRequestHandler::onRequestComplete(Lcom/google/gwt/core/client/JavaScriptObject;)(j);
     };

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/JSONRequestHandler.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/JSONRequestHandler.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/JSONRequestHandler.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -28,5 +28,5 @@
  */
 public interface JSONRequestHandler
 {
-   void onRequestComplete(JavaScriptObject json);
+  void onRequestComplete(JavaScriptObject json);
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/JSONWalk.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/JSONWalk.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/JSONWalk.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -36,158 +36,158 @@
  */
 public class JSONWalk
 {
-   private JSONValue root;
+  private JSONValue root;
 
 
-   private JSONWalk(JSONValue root)
-   {
-      this.root = root;
-   }
+  private JSONWalk(JSONValue root)
+  {
+    this.root = root;
+  }
 
-   public static JSONWalk on(JSONValue root)
-   {
-      return new JSONWalk(root);  
-   }
+  public static JSONWalk on(JSONValue root)
+  {
+    return new JSONWalk(root);
+  }
 
-   public JSONWrapper next(String name)
-   {
-      if(null==root || root.isObject()==null) return null;
-      JSONObject rootObject = root.isObject();
-      
-      JSONWrapper match = null;
-      Set<String> keySet = rootObject.keySet();
+  public JSONWrapper next(String name)
+  {
+    if (null == root || root.isObject() == null) return null;
+    JSONObject rootObject = root.isObject();
 
-      Iterator it = keySet.iterator();
-      while(it.hasNext())
+    JSONWrapper match = null;
+    Set<String> keySet = rootObject.keySet();
+
+    Iterator it = keySet.iterator();
+    while (it.hasNext())
+    {
+      String s = (String) it.next();
+      JSONValue child = rootObject.get(s);
+      if (name.equals(s))
       {
-         String s = (String)it.next();
-         JSONValue child = rootObject.get(s);
-         if(name.equals(s))
-         {
-            match = new JSONWrapper(child);
-            break;
-         }         
-         else
-         {
-            match = JSONWalk.on(child).next(name);            
-         }
+        match = new JSONWrapper(child);
+        break;
       }
+      else
+      {
+        match = JSONWalk.on(child).next(name);
+      }
+    }
 
-      return match;
-   }
+    return match;
+  }
 
-   public class JSONWrapper
-   {
+  public class JSONWrapper
+  {
 
-      private JSONValue value;
+    private JSONValue value;
 
-      public JSONWrapper(JSONValue value)
+    public JSONWrapper(JSONValue value)
+    {
+      this.value = value;
+    }
+
+    public int asInt()
+    {
+      if (value.isNumber() != null)
       {
-         this.value = value;
+        return new Double(value.isNumber().getValue()).intValue();
       }
+      else
+      {
+        throw new IllegalArgumentException("Not a number: " + value);
+      }
+    }
 
-      public int asInt()
+    public long asLong()
+    {
+      if (value.isNumber() != null)
       {
-         if(value.isNumber()!=null)
-         {
-            return new Double(value.isNumber().getValue()).intValue();
-         }
-         else
-         {
-            throw new IllegalArgumentException("Not a number: " + value);
-         }
+        return new Double(value.isNumber().getValue()).longValue();
       }
+      else
+      {
+        throw new IllegalArgumentException("Not a number: " + value);
+      }
+    }
 
-      public long asLong()
+    public double asDouble()
+    {
+      if (value.isNumber() != null)
       {
-         if(value.isNumber()!=null)
-         {
-            return new Double(value.isNumber().getValue()).longValue();
-         }
-         else
-         {
-            throw new IllegalArgumentException("Not a number: " + value);
-         }
+        return value.isNumber().getValue();
       }
+      else
+      {
+        throw new IllegalArgumentException("Not a number: " + value);
+      }
+    }
 
-      public double asDouble()
+    public String asString()
+    {
+      if (value.isString() != null)
       {
-         if(value.isNumber()!=null)
-         {
-            return value.isNumber().getValue();
-         }
-         else
-         {
-            throw new IllegalArgumentException("Not a number: " + value);
-         }
+        return value.isString().stringValue();
       }
+      else
+      {
+        throw new IllegalArgumentException("Not a string: " + value);
+      }
+    }
 
-      public String asString()
+    public boolean asBool()
+    {
+      if (value.isBoolean() != null)
       {
-         if(value.isString()!=null)
-         {
-            return value.isString().stringValue();
-         }
-         else
-         {
-            throw new IllegalArgumentException("Not a string: " + value);
-         }
+        return value.isBoolean().booleanValue();
       }
+      else
+      {
+        throw new IllegalArgumentException("Not a boolean: " + value);
+      }
+    }
 
-      public boolean asBool()
+    public Date asDate()
+    {
+      if (value.isString() != null)
       {
-         if(value.isBoolean()!=null)
-         {
-            return value.isBoolean().booleanValue();
-         }
-         else
-         {
-            throw new IllegalArgumentException("Not a boolean: " + value);
-         }
+        SimpleDateFormat df = new SimpleDateFormat();
+        return df.parse(value.isString().stringValue());
       }
+      else
+      {
+        throw new IllegalArgumentException("Not a date string: " + value);
+      }
+    }
 
-      public Date asDate()
-           {
-              if(value.isString()!=null)
-              {
-                 SimpleDateFormat df = new SimpleDateFormat();
-                 return df.parse(value.isString().stringValue());                 
-              }
-              else
-              {
-                 throw new IllegalArgumentException("Not a date string: " + value);
-              }
-           }
 
-
-      public JSONArray asArray()
+    public JSONArray asArray()
+    {
+      if (value.isArray() != null)
       {
-         if(value.isArray()!=null)
-         {
-            return value.isArray();
-         }
-         else
-         {
-            throw new IllegalArgumentException("Not a number: " + value);
-         }
+        return value.isArray();
       }
+      else
+      {
+        throw new IllegalArgumentException("Not a number: " + value);
+      }
+    }
 
-      public JSONObject asObject()
+    public JSONObject asObject()
+    {
+      if (value.isObject() != null)
       {
-         if(value.isObject()!=null)
-         {
-            return value.isObject();
-         }
-         else
-         {
-            throw new IllegalArgumentException("Not an object: " + value);
-         }
+        return value.isObject();
       }
+      else
+      {
+        throw new IllegalArgumentException("Not an object: " + value);
+      }
+    }
 
 
-      public String toString() throws JSONException
-      {
-         return value.toString();
-      }
-   }
+    public String toString() throws JSONException
+    {
+      return value.toString();
+    }
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/ModelChangeListener.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/ModelChangeListener.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/ModelChangeListener.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -25,11 +25,14 @@
 
 /**
  * Get's notified when model change events are fire on {@link ModelListenerRegistry}
+ *
  * @author Heiko.Braun <heiko.braun at jboss.com>
  */
 public interface ModelChangeListener
 {
-   void onModelChange(ModelListenerRegistry parent, Object changeEvent);
-   void onRecordChange(ModelListenerRegistry parent, Record record);
-   void onReset();
+  void onModelChange(ModelListenerRegistry parent, Object changeEvent);
+
+  void onRecordChange(ModelListenerRegistry parent, Record record);
+
+  void onReset();
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/ModelListenerRegistry.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/ModelListenerRegistry.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/ModelListenerRegistry.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -28,39 +28,39 @@
 
 /**
  * Utility to propagate model change events to {@link ModelChangeListener}
- * 
+ *
  * @author Heiko.Braun <heiko.braun at jboss.com>
  */
 public class ModelListenerRegistry
 {
-   private List<ModelChangeListener> listeners = new ArrayList<ModelChangeListener>();
-   
-   public void addListener(ModelChangeListener listener)
-   {
-      this.listeners.add(listener);
-   }
+  private List<ModelChangeListener> listeners = new ArrayList<ModelChangeListener>();
 
-   public void fireRecordChangeEvent(Record record)
-   {
-      for(ModelChangeListener l : listeners)
-      {
-         l.onRecordChange(this, record);
-      }
-   }
+  public void addListener(ModelChangeListener listener)
+  {
+    this.listeners.add(listener);
+  }
 
-   public void fireModelChangeEvent(Object event)
-   {
-      for(ModelChangeListener l : listeners)
-      {
-         l.onModelChange(this, event);
-      }
-   }
+  public void fireRecordChangeEvent(Record record)
+  {
+    for (ModelChangeListener l : listeners)
+    {
+      l.onRecordChange(this, record);
+    }
+  }
 
-   public void fireResetEvent()
-   {
-      for(ModelChangeListener l : listeners)
-      {
-         l.onReset();
-      }
-   }
+  public void fireModelChangeEvent(Object event)
+  {
+    for (ModelChangeListener l : listeners)
+    {
+      l.onModelChange(this, event);
+    }
+  }
+
+  public void fireResetEvent()
+  {
+    for (ModelChangeListener l : listeners)
+    {
+      l.onReset();
+    }
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/ModelModificationCallback.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/ModelModificationCallback.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/util/ModelModificationCallback.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -28,5 +28,5 @@
  */
 public interface ModelModificationCallback
 {
-   void onStaleModel();
+  void onStaleModel();
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/FormWidgets.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/FormWidgets.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/FormWidgets.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -27,23 +27,23 @@
 
 /**
  * Helps construction common form elements.
- * 
+ *
  * @author Heiko.Braun <heiko.braun at jboss.com>
  */
 public class FormWidgets
 {
-   public static FormPanel createBaseFormPanel()
-   {
-      final FormPanel formPanel = new FormPanel();
-      formPanel.setLabelAlign(Position.LEFT);
-      formPanel.setWidth(UIConstants.EDITOR_PANEL_WIDTH);
-      formPanel.setHeader(false);
-      formPanel.setFrame(false);
-      formPanel.setBorder(false);
-      formPanel.setPaddings(5, 5, 5, 0);
-      formPanel.setLabelWidth(120);
-      return formPanel;
-   }
+  public static FormPanel createBaseFormPanel()
+  {
+    final FormPanel formPanel = new FormPanel();
+    formPanel.setLabelAlign(Position.LEFT);
+    formPanel.setWidth(UIConstants.EDITOR_PANEL_WIDTH);
+    formPanel.setHeader(false);
+    formPanel.setFrame(false);
+    formPanel.setBorder(false);
+    formPanel.setPaddings(5, 5, 5, 0);
+    formPanel.setLabelWidth(120);
+    return formPanel;
+  }
 
-   
+
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/HelpPanel.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/HelpPanel.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/HelpPanel.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -30,31 +30,31 @@
  */
 public class HelpPanel extends Panel
 {
-   private int width, height;
+  private int width, height;
 
-   public HelpPanel(int width, int height, String title)
-   {
-      super();
-      setTitle(title);
-      setWidth(width);
-      setHeight(height);
-      setIconCls("bpm-help-icon");
+  public HelpPanel(int width, int height, String title)
+  {
+    super();
+    setTitle(title);
+    setWidth(width);
+    setHeight(height);
+    setIconCls("bpm-help-icon");
 
-      this.width = width;
-      this.height = height;
-   }
+    this.width = width;
+    this.height = height;
+  }
 
-   public void setContent(String content)
-   {
-      Panel wrapper = new Panel();
-      wrapper.setBaseCls("bpm-help-panel");      
-      wrapper.setFrame(false);
-      wrapper.setHideBorders(true);
-      wrapper.setPaddings(5);
-      wrapper.add(new HTML(content));
-      wrapper.setLayout(new FitLayout());
-      wrapper.setWidth(width);
-      wrapper.setHeight(height);
-      this.add(wrapper);
-   }
+  public void setContent(String content)
+  {
+    Panel wrapper = new Panel();
+    wrapper.setBaseCls("bpm-help-panel");
+    wrapper.setFrame(false);
+    wrapper.setHideBorders(true);
+    wrapper.setPaddings(5);
+    wrapper.add(new HTML(content));
+    wrapper.setLayout(new FitLayout());
+    wrapper.setWidth(width);
+    wrapper.setHeight(height);
+    this.add(wrapper);
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/RefreshableComboBox.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/RefreshableComboBox.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/RefreshableComboBox.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -35,56 +35,56 @@
 public class RefreshableComboBox extends ComboBox
 {
 
-   private final Reader reader;
+  private final Reader reader;
 
-   public RefreshableComboBox(String fieldName, String label)
-   {
-      super();
-      this.reader = new ArrayReader(new RecordDef(
-            new FieldDef[]{
-                  new StringFieldDef(fieldName)
-            }
-      ));
+  public RefreshableComboBox(String fieldName, String label)
+  {
+    super();
+    this.reader = new ArrayReader(new RecordDef(
+        new FieldDef[]{
+            new StringFieldDef(fieldName)
+        }
+    ));
 
-      MemoryProxy dataProxy = createMemoryProxy(new ArrayList<String>());
-      Store store = new Store(dataProxy, reader);
-      store.load();
+    MemoryProxy dataProxy = createMemoryProxy(new ArrayList<String>());
+    Store store = new Store(dataProxy, reader);
+    store.load();
 
-      setFieldLabel(label);
-      setHiddenName(fieldName);
-      setStore(store);
-      setDisplayField(fieldName);
-      setMode(ComboBox.LOCAL);
-      setTriggerAction(ComboBox.ALL);
-      setEmptyText("");
-      setSelectOnFocus(true);
-      setWidth(190);
-      setEditable(false);
-   }
+    setFieldLabel(label);
+    setHiddenName(fieldName);
+    setStore(store);
+    setDisplayField(fieldName);
+    setMode(ComboBox.LOCAL);
+    setTriggerAction(ComboBox.ALL);
+    setEmptyText("");
+    setSelectOnFocus(true);
+    setWidth(190);
+    setEditable(false);
+  }
 
-   private MemoryProxy createMemoryProxy(List<String> items)
-   {
-      if(items.isEmpty())
-         items.add(UIConstants.DEFAULT_TRANSITION);
+  private MemoryProxy createMemoryProxy(List<String> items)
+  {
+    if (items.isEmpty())
+      items.add(UIConstants.DEFAULT_TRANSITION);
 
-      Object[][] objs = new Object[items.size()][];
-      int i=0;
-      for(String s : items)
-      {
-         objs[i] = new Object[]{s};
-         i++;
-      }
+    Object[][] objs = new Object[items.size()][];
+    int i = 0;
+    for (String s : items)
+    {
+      objs[i] = new Object[]{s};
+      i++;
+    }
 
-      return new MemoryProxy(objs);
-   }
+    return new MemoryProxy(objs);
+  }
 
-   public void display(List<String> items)
-   {
-      super.reset();
-      
-      MemoryProxy dataProxy = createMemoryProxy(items);
-      Store store = new Store(dataProxy, reader);
-      store.load();
-      super.setStore(store);
-   }
+  public void display(List<String> items)
+  {
+    super.reset();
+
+    MemoryProxy dataProxy = createMemoryProxy(items);
+    Store store = new Store(dataProxy, reader);
+    store.load();
+    super.setStore(store);
+  }
 }
\ No newline at end of file

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/RemoteListView.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/RemoteListView.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/RemoteListView.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -40,277 +40,281 @@
 /**
  * A {@link com.gwtext.client.widgets.grid.GridPanel} view that will pull data
  * from a remote REST/Json resource.
- * <p>
+ * <p/>
  * The view will be lazily initialized by calling {@link com.gwtext.client.data.Store#load()}
  * in {@link com.gwtext.client.widgets.event.PanelListenerAdapter#doBeforeRender(com.gwtext.client.widgets.Component)}
- * and subsequently add the grid to the container panel upon {@link com.gwtext.client.data.event.StoreListenerAdapter#onLoad(com.gwtext.client.data.Store, com.gwtext.client.data.Record[])}
+ * and subsequently add the grid to the container panel upon {@link com.gwtext.client.data.event.StoreListenerAdapter#onLoad(com.gwtext.client.data.Store,com.gwtext.client.data.Record[])}
  *
  * @author Heiko.Braun <heiko.braun at jboss.com>
  */
 public abstract class RemoteListView extends Panel
 {
-   protected int selectedRowIndex = -1;
-   protected MainView view;
-   public static final int PAGE_SIZE = 25;
-   private GridPanel grid;
-   protected String title;
+  protected int selectedRowIndex = -1;
+  protected MainView view;
+  public static final int PAGE_SIZE = 25;
+  private GridPanel grid;
+  protected String title;
 
-   protected Store store;   
+  protected Store store;
 
-   private ToolbarButton addButton;
-   private ToolbarButton deleteButton;
+  private ToolbarButton addButton;
+  private ToolbarButton deleteButton;
 
-   boolean addBtnEnabled = true;
-   boolean deleteBtnEnabled = true;
+  boolean addBtnEnabled = true;
+  boolean deleteBtnEnabled = true;
 
-   private RowSelectionModel rowSelectionModel;
+  private RowSelectionModel rowSelectionModel;
 
-   protected String resourceUrl;
+  protected String resourceUrl;
 
-   protected ModelModificationCallback modelModificationCallback;
+  protected ModelModificationCallback modelModificationCallback;
 
-   public RemoteListView(ModelModificationCallback callback, String titleName, MainView view, String resourceUrl)
-   {
-      super();
+  public RemoteListView(ModelModificationCallback callback, String titleName, MainView view, String resourceUrl)
+  {
+    super();
 
-      this.modelModificationCallback = callback;
-      this.title = titleName;
-      this.view = view;
-      this.resourceUrl = resourceUrl;
-      this.setId( getId() + "("+titleName+")");
+    this.modelModificationCallback = callback;
+    //this.title = titleName;
+    this.view = view;
+    this.resourceUrl = resourceUrl;
+    this.setId(getId() + "(" + titleName + ")");
 
-      // ----------------------------------------
+    // ----------------------------------------
 
-      this.setPaddings(10);
-      this.setHeader(false);
-      this.setBorder(false);
-      this.setFrame(false);
+    this.setPaddings(10, 0, 0, 0);
+    this.setHeader(false);    
+    this.setBorder(false);
+    this.setFrame(false);
 
-      // ----------------------------------------
+    // ----------------------------------------
 
-      final JsonReader reader = createReader();
-      DataProxy dataProxy = new ScriptTagProxy(resourceUrl, 1000*10);
+    final JsonReader reader = createReader();
+    DataProxy dataProxy = new ScriptTagProxy(resourceUrl, 1000 * 10);
 
-      store = new Store(dataProxy, reader, false); // boolean==remoteSort, add's GET parameters
-      store.addStoreListener( new ListViewStoreListener(this) );
+    store = new Store(dataProxy, reader, false); // boolean==remoteSort, add's GET parameters
+    store.addStoreListener(new ListViewStoreListener(this));
 
-      // PanelListener will lazy load store data.
-      // Store.onLoad() callback will populate the grid
-      // and add it to the container panel.      
-      this.addListener( new PanelListenerAdapter()
+    // PanelListener will lazy load store data.
+    // Store.onLoad() callback will populate the grid
+    // and add it to the container panel.
+    this.addListener(new PanelListenerAdapter()
+    {
+      public boolean doBeforeRender(Component component)
       {
-         public boolean doBeforeRender(Component component)
-         {
-            modelModificationCallback.onStaleModel();
-            return true;
-         }
+        modelModificationCallback.onStaleModel();
+        return true;
       }
-      );
+    }
+    );
 
-   }
+  }
 
-   protected void enableAddBtn(boolean isEnabled)
-   {
-      this.addBtnEnabled = isEnabled;
-   }
+  protected void enableAddBtn(boolean isEnabled)
+  {
+    this.addBtnEnabled = isEnabled;
+  }
 
-   protected void enableDeleteBtn(boolean isEnabled)
-   {
-      this.deleteBtnEnabled = isEnabled;
-   }
+  protected void enableDeleteBtn(boolean isEnabled)
+  {
+    this.deleteBtnEnabled = isEnabled;
+  }
 
-   protected GridPanel createGridPanel(String titleName)
-   {
-      GridPanel grid = new GridPanel();
+  protected GridPanel createGridPanel(String titleName)
+  {
+    GridPanel grid = new GridPanel();
 
-      grid.setTitle(titleName);
-      grid.setFrame(true);
-      grid.setWidth(UIConstants.EDITOR_PANEL_WIDTH);
-      grid.stripeRows(true);
-      grid.setLoadMask(true);
+    grid.setTitle(titleName);
+    grid.setFrame(true);
+    grid.setBorder(false);
+    grid.setWidth(UIConstants.EDITOR_PANEL_WIDTH);
+    grid.stripeRows(true);
+    grid.setLoadMask(true);
 
-      if(rowSelectionModel!=null)
+    if (rowSelectionModel != null)
+    {
+      grid.setSelectionModel(rowSelectionModel);
+      grid.doOnRender(new Function()
       {
-         grid.setSelectionModel(rowSelectionModel);
-         grid.doOnRender(new Function() {
-            public void execute() {
-               if(-1==selectedRowIndex)
-               {
-                  rowSelectionModel.selectFirstRow();
-                  selectedRowIndex = 0;
-               }
-               else
-               {
-                  rowSelectionModel.selectRow(selectedRowIndex);
-               }
-            }
-         }, 10);
-      }
-      grid.addGridCellListener( new ListViewCellListener() );
+        public void execute()
+        {
+          if (-1 == selectedRowIndex)
+          {
+            rowSelectionModel.selectFirstRow();
+            selectedRowIndex = 0;
+          }
+          else
+          {
+            rowSelectionModel.selectRow(selectedRowIndex);
+          }
+        }
+      }, 10);
+    }
+    grid.addGridCellListener(new ListViewCellListener());
 
-      return grid;
-   }
+    return grid;
+  }
 
-   private PagingToolbar createToolbar(final Store store)
-   {
-      PagingToolbar pagingToolbar = new PagingToolbar(store);
-      pagingToolbar.setPageSize(PAGE_SIZE);
-      pagingToolbar.setDisplayInfo(true);
-      pagingToolbar.setDisplayMsg("{0} - {1} of {2}");
-      //pagingToolbar.setEmptyMsg("No entities to display");
+  private PagingToolbar createToolbar(final Store store)
+  {
+    PagingToolbar pagingToolbar = new PagingToolbar(store);
+    pagingToolbar.setPageSize(PAGE_SIZE);
+    pagingToolbar.setDisplayInfo(true);
+    pagingToolbar.setDisplayMsg("{0} - {1} of {2}");
+    //pagingToolbar.setEmptyMsg("No entities to display");
 
-      pagingToolbar.addSeparator();
-      pagingToolbar.addSpacer();
+    pagingToolbar.addSeparator();
+    pagingToolbar.addSpacer();
 
-      ToolbarButton examineButton = new ToolbarButton("Examine", new ButtonListenerAdapter()
+    ToolbarButton examineButton = new ToolbarButton("Examine", new ButtonListenerAdapter()
+    {
+      public void onClick(Button button, EventObject e)
       {
-         public void onClick(Button button, EventObject e)
-         {
-            if (-1 == selectedRowIndex)
-               MessageBox.alert("Please select a process.");
-            else
-               onExamine(selectedRowIndex);
-         }
-      });
-      //examineButton.setIcon("images/icons/examine.png");
-      examineButton.setTooltip("Examine");
-      pagingToolbar.addButton(examineButton);
+        if (-1 == selectedRowIndex)
+          MessageBox.alert("Please select a process.");
+        else
+          onExamine(selectedRowIndex);
+      }
+    });
+    //examineButton.setIcon("images/icons/examine.png");
+    examineButton.setTooltip("Examine");
+    pagingToolbar.addButton(examineButton);
 
-      if(addBtnEnabled)
+    if (addBtnEnabled)
+    {
+      addButton = new ToolbarButton("Add", new ButtonListenerAdapter()
       {
-         addButton = new ToolbarButton("Add", new ButtonListenerAdapter()
-         {
-            public void onClick(Button button, EventObject e)
-            {
-               onAdd();
-            }
-         });
-         //addButton.setIcon("images/icons/add.png");
-         addButton.setTooltip("Add");
-         pagingToolbar.addButton( addButton );
-      }
+        public void onClick(Button button, EventObject e)
+        {
+          onAdd();
+        }
+      });
+      //addButton.setIcon("images/icons/add.png");
+      addButton.setTooltip("Add");
+      pagingToolbar.addButton(addButton);
+    }
 
-      if(deleteBtnEnabled)
+    if (deleteBtnEnabled)
+    {
+      deleteButton = new ToolbarButton("Remove", new ButtonListenerAdapter()
       {
-         deleteButton = new ToolbarButton("Remove", new ButtonListenerAdapter()
-         {
-            public void onClick(Button button, EventObject e)
-            {
-               if (-1 == selectedRowIndex)
-               {
-                  MessageBox.alert("Please select a process.");
-               } else
-               {
-                  onDelete(selectedRowIndex);
-               }
-            }
-         });
-         //deleteButton.setIcon("images/icons/remove.png");
-         deleteButton.setTooltip("Remove");
-         pagingToolbar.addButton(deleteButton);
-      }
+        public void onClick(Button button, EventObject e)
+        {
+          if (-1 == selectedRowIndex)
+          {
+            MessageBox.alert("Please select a process.");
+          }
+          else
+          {
+            onDelete(selectedRowIndex);
+          }
+        }
+      });
+      //deleteButton.setIcon("images/icons/remove.png");
+      deleteButton.setTooltip("Remove");
+      pagingToolbar.addButton(deleteButton);
+    }
 
-      return pagingToolbar;
-   }
+    return pagingToolbar;
+  }
 
-   public abstract void onAdd();
+  public abstract void onAdd();
 
-   public abstract void onExamine(final int row);
+  public abstract void onExamine(final int row);
 
-   public abstract void onDelete(final int row);
+  public abstract void onDelete(final int row);
 
-   protected abstract void onRecordsLoaded(Record[] records);
+  protected abstract void onRecordsLoaded(Record[] records);
 
-   protected abstract ColumnModel createColumnModel();
+  protected abstract ColumnModel createColumnModel();
 
-   protected abstract JsonReader createReader();
+  protected abstract JsonReader createReader();
 
-   private class ListViewStoreListener extends StoreListenerAdapter
-   {
+  private class ListViewStoreListener extends StoreListenerAdapter
+  {
 
-      Panel containerPanel;
+    Panel containerPanel;
 
-      public ListViewStoreListener(Panel containerPanel)
-      {
-         this.containerPanel = containerPanel;
-      }
+    public ListViewStoreListener(Panel containerPanel)
+    {
+      this.containerPanel = containerPanel;
+    }
 
-      /**
-       * load callback will push records to implementation
-       * and (!) add the grid to the container panel.
-       */
-      public void onLoad(Store store, Record[] records)
-      {
+    /**
+     * load callback will push records to implementation
+     * and (!) add the grid to the container panel.
+     */
+    public void onLoad(Store store, Record[] records)
+    {
 
-         
-         onRecordsLoaded(records);
 
-         grid = assembleGrid();
+      onRecordsLoaded(records);
 
-         containerPanel.clear();
-         containerPanel.add(grid);
-         containerPanel.doLayout();
-      }
+      grid = assembleGrid();
 
-      public void onLoadException(Throwable throwable)
-      {
-         ConsoleLog.error("Failed to load remote data", throwable);
-      }
+      containerPanel.clear();
+      containerPanel.add(grid);
+      containerPanel.doLayout();
+    }
 
-   }
+    public void onLoadException(Throwable throwable)
+    {
+      ConsoleLog.error("Failed to load remote data", throwable);
+    }
 
-   private GridPanel assembleGrid()
-   {
-      GridPanel grid = createGridPanel(title);
+  }
 
-      final ColumnModel columnModel = createColumnModel();
-      grid.setColumnModel(columnModel);
-      grid.setAutoExpandColumn("expand");
+  private GridPanel assembleGrid()
+  {
+    GridPanel grid = createGridPanel(title);
 
-      grid.setStore(store);
-      
-      PagingToolbar pagingToolbar = createToolbar(store);
-      grid.setBottomToolbar(pagingToolbar);
+    final ColumnModel columnModel = createColumnModel();
+    grid.setColumnModel(columnModel);
+    grid.setAutoExpandColumn("expand");
 
-      if(rowSelectionModel!=null)
-         grid.setSelectionModel(rowSelectionModel);
-      
-      return grid;
+    grid.setStore(store);
 
-   }
+    PagingToolbar pagingToolbar = createToolbar(store);
+    grid.setBottomToolbar(pagingToolbar);
 
-   public class ListViewCellListener implements GridCellListener
-   {
-      public void onCellClick(GridPanel grid, int rowIndex, int colindex, EventObject e)
-      {
-         selectedRowIndex = rowIndex;
-      }
+    if (rowSelectionModel != null)
+      grid.setSelectionModel(rowSelectionModel);
 
-      public void onCellContextMenu(GridPanel gridPanel, int i, int i1, EventObject eventObject)
-      {
+    return grid;
 
-      }
+  }
 
-      public void onCellDblClick(GridPanel gridPanel, int i, int i1, EventObject eventObject)
-      {
+  public class ListViewCellListener implements GridCellListener
+  {
+    public void onCellClick(GridPanel grid, int rowIndex, int colindex, EventObject e)
+    {
+      selectedRowIndex = rowIndex;
+    }
 
-      }
-   }
+    public void onCellContextMenu(GridPanel gridPanel, int i, int i1, EventObject eventObject)
+    {
 
-   public GridPanel getGrid()
-   {
-      return grid;
-   }
+    }
 
-   public void reloadStore()
-   {
-      ConsoleLog.debug("Reload " + this.getId());
-      store.load(0,PAGE_SIZE);
-      
-   }
+    public void onCellDblClick(GridPanel gridPanel, int i, int i1, EventObject eventObject)
+    {
 
-   public void setRowSelectionModel(RowSelectionModel rowSelectionModel)
-   {
-      this.rowSelectionModel = rowSelectionModel;
-   }
+    }
+  }
+
+  public GridPanel getGrid()
+  {
+    return grid;
+  }
+
+  public void reloadStore()
+  {
+    ConsoleLog.debug("Reload " + this.getId());
+    store.load(0, PAGE_SIZE);
+
+  }
+
+  public void setRowSelectionModel(RowSelectionModel rowSelectionModel)
+  {
+    this.rowSelectionModel = rowSelectionModel;
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/TeaserPanel.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/TeaserPanel.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/client/widgets/TeaserPanel.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -30,14 +30,14 @@
 public class TeaserPanel extends Panel
 {
 
-   public TeaserPanel()
-   {
-      super();
+  public TeaserPanel()
+  {
+    super();
 
-      setPaddings(10,0,0,5);
-      setLayout(new VerticalLayout(20));
-      setHideBorders(true);
-      setFrame(false);
-      setBorder(false);
-   }
+    setPaddings(10, 0, 0, 5);
+    setLayout(new VerticalLayout(20));
+    setHideBorders(true);
+    setFrame(false);
+    setBorder(false);
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/rebind/WorkspaceGenerator.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/rebind/WorkspaceGenerator.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/jboss/bpm/console/rebind/WorkspaceGenerator.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -38,11 +38,17 @@
 public class WorkspaceGenerator extends Generator
 {
 
-  /** Simple name of class to be generated */
+  /**
+   * Simple name of class to be generated
+   */
   private String className = null;
-  /** Package name of class to be generated */
+  /**
+   * Package name of class to be generated
+   */
   private String packageName = null;
-  /** Fully qualified class name passed into GWT.create() */
+  /**
+   * Fully qualified class name passed into GWT.create()
+   */
   private String typeName = null;
 
   public String generate(TreeLogger logger, GeneratorContext context, String typeName)
@@ -51,7 +57,8 @@
     this.typeName = typeName;
     TypeOracle typeOracle = context.getTypeOracle();
 
-    try {
+    try
+    {
       // get classType and save instance variables
       JClassType classType = typeOracle.getType(typeName);
       packageName = classType.getPackage().getName();
@@ -60,7 +67,9 @@
       // Generate class source code
       generateClass(logger, context);
 
-    } catch (Exception e) {
+    }
+    catch (Exception e)
+    {
       // record to logger that Map generation threw an exception
       e.printStackTrace(System.out);
       logger.log(TreeLogger.ERROR, "Failed to generate workspace launcher", e);
@@ -72,13 +81,14 @@
 
   /**
    * Generate source code for new class. Class extends
-   <code>HashMap</code>.
+   * <code>HashMap</code>.
    *
-   * @param logger Logger object
+   * @param logger  Logger object
    * @param context Generator context
    */
   private void generateClass(TreeLogger logger, GeneratorContext
-      context) {
+      context)
+  {
 
     // get print writer that receives the source code
     PrintWriter printWriter = null;
@@ -105,7 +115,6 @@
     // Methods
     generateMethods(sourceWriter);
 
-
     // close generated class
     sourceWriter.outdent();
     sourceWriter.println("}");
@@ -124,29 +133,34 @@
         "org/jboss/bpm/console/workspace.txt"
     );
 
-    if(null==in)
+    if (null == in)
       throw new RuntimeException("Cannot find 'org/jboss/bpm/console/workspace.txt'");
 
-    try {
+    try
+    {
       //use buffering, reading one line at a time
       //FileReader always assumes default encoding is OK!
-      BufferedReader input =  new BufferedReader(new InputStreamReader(in));
-      try {
+      BufferedReader input = new BufferedReader(new InputStreamReader(in));
+      try
+      {
         String line = null;
-        while (( line = input.readLine()) != null){
+        while ((line = input.readLine()) != null)
+        {
 
           // ignore comments and empty lines
-          if(line.equals("") || line.startsWith("#"))
+          if (line.equals("") || line.startsWith("#"))
             continue;
-          
-          sourceWriter.println("workspace.addEditor( new "+line+"(main), false );");
+
+          sourceWriter.println("workspace.addEditor( new " + line + "(main), false );");
         }
       }
-      finally {
+      finally
+      {
         input.close();
       }
     }
-    catch (IOException ex){
+    catch (IOException ex)
+    {
       throw new RuntimeException("Error reading 'org/jboss/bpm/console/workspace.txt'");
     }
 

Modified: projects/gwt-console/trunk/war/src/main/java/org/json/CDL.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/CDL.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/CDL.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -29,233 +29,282 @@
  * JSONArray, and to covert a JSONArray into comma delimited text. Comma
  * delimited text is a very popular format for data interchange. It is
  * understood by most database, spreadsheet, and organizer programs.
- * <p>
+ * <p/>
  * Each row of text represents a row in a table or a data record. Each row
  * ends with a NEWLINE character. Each row contains one or more values.
  * Values are separated by commas. A value can contain any character except
  * for comma, unless is is wrapped in single quotes or double quotes.
- * <p>
+ * <p/>
  * The first row usually contains the names of the columns.
- * <p>
+ * <p/>
  * A comma delimited list can be converted into a JSONArray of JSONObjects.
  * The names for the elements in the JSONObjects can be taken from the names
  * in the first row.
+ *
  * @author JSON.org
  * @version 2008-09-18
  */
-public class CDL {
+public class CDL
+{
 
-    /**
-     * Get the next value. The value can be wrapped in quotes. The value can
-     * be empty.
-     * @param x A JSONTokener of the source text.
-     * @return The value string, or null if empty.
-     * @throws JSONException if the quoted string is badly formed.
-     */
-    private static String getValue(JSONTokener x) throws JSONException {
-        char c;
-        do {
-            c = x.next();
-        } while (c == ' ' || c == '\t');
-        switch (c) {
-        case 0:
-            return null;
-        case '"':
-        case '\'':
-            return x.nextString(c);
-        case ',':
-            x.back();
-            return "";
-        default:
-            x.back();
-            return x.nextTo(',');
-        }
+  /**
+   * Get the next value. The value can be wrapped in quotes. The value can
+   * be empty.
+   *
+   * @param x A JSONTokener of the source text.
+   * @return The value string, or null if empty.
+   * @throws JSONException if the quoted string is badly formed.
+   */
+  private static String getValue(JSONTokener x) throws JSONException
+  {
+    char c;
+    do
+    {
+      c = x.next();
     }
+    while (c == ' ' || c == '\t');
+    switch (c)
+    {
+      case 0:
+        return null;
+      case'"':
+      case'\'':
+        return x.nextString(c);
+      case',':
+        x.back();
+        return "";
+      default:
+        x.back();
+        return x.nextTo(',');
+    }
+  }
 
-    /**
-     * Produce a JSONArray of strings from a row of comma delimited values.
-     * @param x A JSONTokener of the source text.
-     * @return A JSONArray of strings.
-     * @throws JSONException
-     */
-    public static JSONArray rowToJSONArray(JSONTokener x) throws JSONException {
-        JSONArray ja = new JSONArray();
-        for (;;) {
-            String value = getValue(x);
-            if (value == null || (ja.length() == 0 && value.length() == 0)) {
-                return null;
-            }
-            ja.put(value);
-            for (;;) {
-                char c = x.next();
-                if (c == ',') {
-                    break;
-                }
-                if (c != ' ') {
-                    if (c == '\n' || c == '\r' || c == 0) {
-                        return ja;
-                    }
-                    throw x.syntaxError("Bad character '" + c + "' (" +
-                            (int)c + ").");
-                }
-            }
+  /**
+   * Produce a JSONArray of strings from a row of comma delimited values.
+   *
+   * @param x A JSONTokener of the source text.
+   * @return A JSONArray of strings.
+   * @throws JSONException
+   */
+  public static JSONArray rowToJSONArray(JSONTokener x) throws JSONException
+  {
+    JSONArray ja = new JSONArray();
+    for (; ;)
+    {
+      String value = getValue(x);
+      if (value == null || (ja.length() == 0 && value.length() == 0))
+      {
+        return null;
+      }
+      ja.put(value);
+      for (; ;)
+      {
+        char c = x.next();
+        if (c == ',')
+        {
+          break;
         }
+        if (c != ' ')
+        {
+          if (c == '\n' || c == '\r' || c == 0)
+          {
+            return ja;
+          }
+          throw x.syntaxError("Bad character '" + c + "' (" +
+              (int) c + ").");
+        }
+      }
     }
+  }
 
-    /**
-     * Produce a JSONObject from a row of comma delimited text, using a
-     * parallel JSONArray of strings to provides the names of the elements.
-     * @param names A JSONArray of names. This is commonly obtained from the
-     *  first row of a comma delimited text file using the rowToJSONArray
-     *  method.
-     * @param x A JSONTokener of the source text.
-     * @return A JSONObject combining the names and values.
-     * @throws JSONException
-     */
-    public static JSONObject rowToJSONObject(JSONArray names, JSONTokener x)
-            throws JSONException {
-        JSONArray ja = rowToJSONArray(x);
-        return ja != null ? ja.toJSONObject(names) :  null;
-    }
+  /**
+   * Produce a JSONObject from a row of comma delimited text, using a
+   * parallel JSONArray of strings to provides the names of the elements.
+   *
+   * @param names A JSONArray of names. This is commonly obtained from the
+   *              first row of a comma delimited text file using the rowToJSONArray
+   *              method.
+   * @param x     A JSONTokener of the source text.
+   * @return A JSONObject combining the names and values.
+   * @throws JSONException
+   */
+  public static JSONObject rowToJSONObject(JSONArray names, JSONTokener x)
+      throws JSONException
+  {
+    JSONArray ja = rowToJSONArray(x);
+    return ja != null ? ja.toJSONObject(names) : null;
+  }
 
-    /**
-     * Produce a JSONArray of JSONObjects from a comma delimited text string,
-     * using the first row as a source of names.
-     * @param string The comma delimited text.
-     * @return A JSONArray of JSONObjects.
-     * @throws JSONException
-     */
-    public static JSONArray toJSONArray(String string) throws JSONException {
-        return toJSONArray(new JSONTokener(string));
-    }
+  /**
+   * Produce a JSONArray of JSONObjects from a comma delimited text string,
+   * using the first row as a source of names.
+   *
+   * @param string The comma delimited text.
+   * @return A JSONArray of JSONObjects.
+   * @throws JSONException
+   */
+  public static JSONArray toJSONArray(String string) throws JSONException
+  {
+    return toJSONArray(new JSONTokener(string));
+  }
 
-    /**
-     * Produce a JSONArray of JSONObjects from a comma delimited text string,
-     * using the first row as a source of names.
-     * @param x The JSONTokener containing the comma delimited text.
-     * @return A JSONArray of JSONObjects.
-     * @throws JSONException
-     */
-    public static JSONArray toJSONArray(JSONTokener x) throws JSONException {
-        return toJSONArray(rowToJSONArray(x), x);
-    }
+  /**
+   * Produce a JSONArray of JSONObjects from a comma delimited text string,
+   * using the first row as a source of names.
+   *
+   * @param x The JSONTokener containing the comma delimited text.
+   * @return A JSONArray of JSONObjects.
+   * @throws JSONException
+   */
+  public static JSONArray toJSONArray(JSONTokener x) throws JSONException
+  {
+    return toJSONArray(rowToJSONArray(x), x);
+  }
 
-    /**
-     * Produce a JSONArray of JSONObjects from a comma delimited text string
-     * using a supplied JSONArray as the source of element names.
-     * @param names A JSONArray of strings.
-     * @param string The comma delimited text.
-     * @return A JSONArray of JSONObjects.
-     * @throws JSONException
-     */
-    public static JSONArray toJSONArray(JSONArray names, String string)
-            throws JSONException {
-        return toJSONArray(names, new JSONTokener(string));
+  /**
+   * Produce a JSONArray of JSONObjects from a comma delimited text string
+   * using a supplied JSONArray as the source of element names.
+   *
+   * @param names  A JSONArray of strings.
+   * @param string The comma delimited text.
+   * @return A JSONArray of JSONObjects.
+   * @throws JSONException
+   */
+  public static JSONArray toJSONArray(JSONArray names, String string)
+      throws JSONException
+  {
+    return toJSONArray(names, new JSONTokener(string));
+  }
+
+  /**
+   * Produce a JSONArray of JSONObjects from a comma delimited text string
+   * using a supplied JSONArray as the source of element names.
+   *
+   * @param names A JSONArray of strings.
+   * @param x     A JSONTokener of the source text.
+   * @return A JSONArray of JSONObjects.
+   * @throws JSONException
+   */
+  public static JSONArray toJSONArray(JSONArray names, JSONTokener x)
+      throws JSONException
+  {
+    if (names == null || names.length() == 0)
+    {
+      return null;
     }
+    JSONArray ja = new JSONArray();
+    for (; ;)
+    {
+      JSONObject jo = rowToJSONObject(names, x);
+      if (jo == null)
+      {
+        break;
+      }
+      ja.put(jo);
+    }
+    if (ja.length() == 0)
+    {
+      return null;
+    }
+    return ja;
+  }
 
-    /**
-     * Produce a JSONArray of JSONObjects from a comma delimited text string
-     * using a supplied JSONArray as the source of element names.
-     * @param names A JSONArray of strings.
-     * @param x A JSONTokener of the source text.
-     * @return A JSONArray of JSONObjects.
-     * @throws JSONException
-     */
-    public static JSONArray toJSONArray(JSONArray names, JSONTokener x)
-            throws JSONException {
-        if (names == null || names.length() == 0) {
-            return null;
+
+  /**
+   * Produce a comma delimited text row from a JSONArray. Values containing
+   * the comma character will be quoted.
+   *
+   * @param ja A JSONArray of strings.
+   * @return A string ending in NEWLINE.
+   */
+  public static String rowToString(JSONArray ja)
+  {
+    StringBuffer sb = new StringBuffer();
+    for (int i = 0; i < ja.length(); i += 1)
+    {
+      if (i > 0)
+      {
+        sb.append(',');
+      }
+      Object o = ja.opt(i);
+      if (o != null)
+      {
+        String s = o.toString();
+        if (s.indexOf(',') >= 0)
+        {
+          if (s.indexOf('"') >= 0)
+          {
+            sb.append('\'');
+            sb.append(s);
+            sb.append('\'');
+          }
+          else
+          {
+            sb.append('"');
+            sb.append(s);
+            sb.append('"');
+          }
         }
-        JSONArray ja = new JSONArray();
-        for (;;) {
-            JSONObject jo = rowToJSONObject(names, x);
-            if (jo == null) {
-                break;
-            }
-            ja.put(jo);
+        else
+        {
+          sb.append(s);
         }
-        if (ja.length() == 0) {
-            return null;
-        }
-        return ja;
+      }
     }
+    sb.append('\n');
+    return sb.toString();
 
+  }
 
-    /**
-     * Produce a comma delimited text row from a JSONArray. Values containing
-     * the comma character will be quoted.
-     * @param ja A JSONArray of strings.
-     * @return A string ending in NEWLINE.
-     */
-    public static String rowToString(JSONArray ja) {
-        StringBuffer sb = new StringBuffer();
-        for (int i = 0; i < ja.length(); i += 1) {
-            if (i > 0) {
-                sb.append(',');
-            }
-            Object o = ja.opt(i);
-            if (o != null) {
-                String s = o.toString();
-                if (s.indexOf(',') >= 0) {
-                    if (s.indexOf('"') >= 0) {
-                        sb.append('\'');
-                        sb.append(s);
-                        sb.append('\'');
-                    } else {
-                        sb.append('"');
-                        sb.append(s);
-                        sb.append('"');
-                    }
-                } else {
-                    sb.append(s);
-                }
-            }
-        }
-        sb.append('\n');
-        return sb.toString();
-
+  /**
+   * Produce a comma delimited text from a JSONArray of JSONObjects. The
+   * first row will be a list of names obtained by inspecting the first
+   * JSONObject.
+   *
+   * @param ja A JSONArray of JSONObjects.
+   * @return A comma delimited text.
+   * @throws JSONException
+   */
+  public static String toString(JSONArray ja) throws JSONException
+  {
+    JSONObject jo = ja.optJSONObject(0);
+    if (jo != null)
+    {
+      JSONArray names = jo.names();
+      if (names != null)
+      {
+        return rowToString(names) + toString(names, ja);
+      }
     }
+    return null;
+  }
 
-    /**
-     * Produce a comma delimited text from a JSONArray of JSONObjects. The
-     * first row will be a list of names obtained by inspecting the first
-     * JSONObject.
-     * @param ja A JSONArray of JSONObjects.
-     * @return A comma delimited text.
-     * @throws JSONException
-     */
-    public static String toString(JSONArray ja) throws JSONException {
-        JSONObject jo = ja.optJSONObject(0);
-        if (jo != null) {
-            JSONArray names = jo.names();
-            if (names != null) {
-                return rowToString(names) + toString(names, ja);
-            }
-        }
-        return null;
+  /**
+   * Produce a comma delimited text from a JSONArray of JSONObjects using
+   * a provided list of names. The list of names is not included in the
+   * output.
+   *
+   * @param names A JSONArray of strings.
+   * @param ja    A JSONArray of JSONObjects.
+   * @return A comma delimited text.
+   * @throws JSONException
+   */
+  public static String toString(JSONArray names, JSONArray ja)
+      throws JSONException
+  {
+    if (names == null || names.length() == 0)
+    {
+      return null;
     }
-
-    /**
-     * Produce a comma delimited text from a JSONArray of JSONObjects using
-     * a provided list of names. The list of names is not included in the
-     * output.
-     * @param names A JSONArray of strings.
-     * @param ja A JSONArray of JSONObjects.
-     * @return A comma delimited text.
-     * @throws JSONException
-     */
-    public static String toString(JSONArray names, JSONArray ja)
-            throws JSONException {
-        if (names == null || names.length() == 0) {
-            return null;
-        }
-        StringBuffer sb = new StringBuffer();
-        for (int i = 0; i < ja.length(); i += 1) {
-            JSONObject jo = ja.optJSONObject(i);
-            if (jo != null) {
-                sb.append(rowToString(jo.toJSONArray(names)));
-            }
-        }
-        return sb.toString();
+    StringBuffer sb = new StringBuffer();
+    for (int i = 0; i < ja.length(); i += 1)
+    {
+      JSONObject jo = ja.optJSONObject(i);
+      if (jo != null)
+      {
+        sb.append(rowToString(jo.toJSONArray(names)));
+      }
     }
+    return sb.toString();
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/json/Cookie.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/Cookie.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/Cookie.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -27,143 +27,173 @@
 /**
  * Convert a web browser cookie specification to a JSONObject and back.
  * JSON and Cookies are both notations for name/value pairs.
+ *
  * @author JSON.org
  * @version 2008-09-18
  */
-public class Cookie {
+public class Cookie
+{
 
-    /**
-     * Produce a copy of a string in which the characters '+', '%', '=', ';'
-     * and control characters are replaced with "%hh". This is a gentle form
-     * of URL encoding, attempting to cause as little distortion to the
-     * string as possible. The characters '=' and ';' are meta characters in
-     * cookies. By convention, they are escaped using the URL-encoding. This is
-     * only a convention, not a standard. Often, cookies are expected to have
-     * encoded values. We encode '=' and ';' because we must. We encode '%' and
-     * '+' because they are meta characters in URL encoding.
-     * @param string The source string.
-     * @return       The escaped result.
-     */
-    public static String escape(String string) {
-        char         c;
-        String       s = string.trim();
-        StringBuffer sb = new StringBuffer();
-        int          len = s.length();
-        for (int i = 0; i < len; i += 1) {
-            c = s.charAt(i);
-            if (c < ' ' || c == '+' || c == '%' || c == '=' || c == ';') {
-                sb.append('%');
-                sb.append(Character.forDigit((char)((c >>> 4) & 0x0f), 16));
-                sb.append(Character.forDigit((char)(c & 0x0f), 16));
-            } else {
-                sb.append(c);
-            }
-        }
-        return sb.toString();
+  /**
+   * Produce a copy of a string in which the characters '+', '%', '=', ';'
+   * and control characters are replaced with "%hh". This is a gentle form
+   * of URL encoding, attempting to cause as little distortion to the
+   * string as possible. The characters '=' and ';' are meta characters in
+   * cookies. By convention, they are escaped using the URL-encoding. This is
+   * only a convention, not a standard. Often, cookies are expected to have
+   * encoded values. We encode '=' and ';' because we must. We encode '%' and
+   * '+' because they are meta characters in URL encoding.
+   *
+   * @param string The source string.
+   * @return The escaped result.
+   */
+  public static String escape(String string)
+  {
+    char c;
+    String s = string.trim();
+    StringBuffer sb = new StringBuffer();
+    int len = s.length();
+    for (int i = 0; i < len; i += 1)
+    {
+      c = s.charAt(i);
+      if (c < ' ' || c == '+' || c == '%' || c == '=' || c == ';')
+      {
+        sb.append('%');
+        sb.append(Character.forDigit((char) ((c >>> 4) & 0x0f), 16));
+        sb.append(Character.forDigit((char) (c & 0x0f), 16));
+      }
+      else
+      {
+        sb.append(c);
+      }
     }
+    return sb.toString();
+  }
 
 
-    /**
-     * Convert a cookie specification string into a JSONObject. The string
-     * will contain a name value pair separated by '='. The name and the value
-     * will be unescaped, possibly converting '+' and '%' sequences. The
-     * cookie properties may follow, separated by ';', also represented as
-     * name=value (except the secure property, which does not have a value).
-     * The name will be stored under the key "name", and the value will be
-     * stored under the key "value". This method does not do checking or
-     * validation of the parameters. It only converts the cookie string into
-     * a JSONObject.
-     * @param string The cookie specification string.
-     * @return A JSONObject containing "name", "value", and possibly other
-     *  members.
-     * @throws JSONException
-     */
-    public static JSONObject toJSONObject(String string) throws JSONException {
-        String         n;
-        JSONObject     o = new JSONObject();
-        Object         v;
-        JSONTokener x = new JSONTokener(string);
-        o.put("name", x.nextTo('='));
-        x.next('=');
-        o.put("value", x.nextTo(';'));
+  /**
+   * Convert a cookie specification string into a JSONObject. The string
+   * will contain a name value pair separated by '='. The name and the value
+   * will be unescaped, possibly converting '+' and '%' sequences. The
+   * cookie properties may follow, separated by ';', also represented as
+   * name=value (except the secure property, which does not have a value).
+   * The name will be stored under the key "name", and the value will be
+   * stored under the key "value". This method does not do checking or
+   * validation of the parameters. It only converts the cookie string into
+   * a JSONObject.
+   *
+   * @param string The cookie specification string.
+   * @return A JSONObject containing "name", "value", and possibly other
+   *         members.
+   * @throws JSONException
+   */
+  public static JSONObject toJSONObject(String string) throws JSONException
+  {
+    String n;
+    JSONObject o = new JSONObject();
+    Object v;
+    JSONTokener x = new JSONTokener(string);
+    o.put("name", x.nextTo('='));
+    x.next('=');
+    o.put("value", x.nextTo(';'));
+    x.next();
+    while (x.more())
+    {
+      n = unescape(x.nextTo("=;"));
+      if (x.next() != '=')
+      {
+        if (n.equals("secure"))
+        {
+          v = Boolean.TRUE;
+        }
+        else
+        {
+          throw x.syntaxError("Missing '=' in cookie parameter.");
+        }
+      }
+      else
+      {
+        v = unescape(x.nextTo(';'));
         x.next();
-        while (x.more()) {
-            n = unescape(x.nextTo("=;"));
-            if (x.next() != '=') {
-                if (n.equals("secure")) {
-                    v = Boolean.TRUE;
-                } else {
-                    throw x.syntaxError("Missing '=' in cookie parameter.");
-                }
-            } else {
-                v = unescape(x.nextTo(';'));
-                x.next();
-            }
-            o.put(n, v);
-        }
-        return o;
+      }
+      o.put(n, v);
     }
+    return o;
+  }
 
 
-    /**
-     * Convert a JSONObject into a cookie specification string. The JSONObject
-     * must contain "name" and "value" members.
-     * If the JSONObject contains "expires", "domain", "path", or "secure"
-     * members, they will be appended to the cookie specification string.
-     * All other members are ignored.
-     * @param o A JSONObject
-     * @return A cookie specification string
-     * @throws JSONException
-     */
-    public static String toString(JSONObject o) throws JSONException {
-        StringBuffer sb = new StringBuffer();
+  /**
+   * Convert a JSONObject into a cookie specification string. The JSONObject
+   * must contain "name" and "value" members.
+   * If the JSONObject contains "expires", "domain", "path", or "secure"
+   * members, they will be appended to the cookie specification string.
+   * All other members are ignored.
+   *
+   * @param o A JSONObject
+   * @return A cookie specification string
+   * @throws JSONException
+   */
+  public static String toString(JSONObject o) throws JSONException
+  {
+    StringBuffer sb = new StringBuffer();
 
-        sb.append(escape(o.getString("name")));
-        sb.append("=");
-        sb.append(escape(o.getString("value")));
-        if (o.has("expires")) {
-            sb.append(";expires=");
-            sb.append(o.getString("expires"));
-        }
-        if (o.has("domain")) {
-            sb.append(";domain=");
-            sb.append(escape(o.getString("domain")));
-        }
-        if (o.has("path")) {
-            sb.append(";path=");
-            sb.append(escape(o.getString("path")));
-        }
-        if (o.optBoolean("secure")) {
-            sb.append(";secure");
-        }
-        return sb.toString();
+    sb.append(escape(o.getString("name")));
+    sb.append("=");
+    sb.append(escape(o.getString("value")));
+    if (o.has("expires"))
+    {
+      sb.append(";expires=");
+      sb.append(o.getString("expires"));
     }
+    if (o.has("domain"))
+    {
+      sb.append(";domain=");
+      sb.append(escape(o.getString("domain")));
+    }
+    if (o.has("path"))
+    {
+      sb.append(";path=");
+      sb.append(escape(o.getString("path")));
+    }
+    if (o.optBoolean("secure"))
+    {
+      sb.append(";secure");
+    }
+    return sb.toString();
+  }
 
-    /**
-     * Convert <code>%</code><i>hh</i> sequences to single characters, and
-     * convert plus to space.
-     * @param s A string that may contain
-     *      <code>+</code>&nbsp;<small>(plus)</small> and
-     *      <code>%</code><i>hh</i> sequences.
-     * @return The unescaped string.
-     */
-    public static String unescape(String s) {
-        int len = s.length();
-        StringBuffer b = new StringBuffer();
-        for (int i = 0; i < len; ++i) {
-            char c = s.charAt(i);
-            if (c == '+') {
-                c = ' ';
-            } else if (c == '%' && i + 2 < len) {
-                int d = JSONTokener.dehexchar(s.charAt(i + 1));
-                int e = JSONTokener.dehexchar(s.charAt(i + 2));
-                if (d >= 0 && e >= 0) {
-                    c = (char)(d * 16 + e);
-                    i += 2;
-                }
-            }
-            b.append(c);
+  /**
+   * Convert <code>%</code><i>hh</i> sequences to single characters, and
+   * convert plus to space.
+   *
+   * @param s A string that may contain
+   *          <code>+</code>&nbsp;<small>(plus)</small> and
+   *          <code>%</code><i>hh</i> sequences.
+   * @return The unescaped string.
+   */
+  public static String unescape(String s)
+  {
+    int len = s.length();
+    StringBuffer b = new StringBuffer();
+    for (int i = 0; i < len; ++i)
+    {
+      char c = s.charAt(i);
+      if (c == '+')
+      {
+        c = ' ';
+      }
+      else if (c == '%' && i + 2 < len)
+      {
+        int d = JSONTokener.dehexchar(s.charAt(i + 1));
+        int e = JSONTokener.dehexchar(s.charAt(i + 2));
+        if (d >= 0 && e >= 0)
+        {
+          c = (char) (d * 16 + e);
+          i += 2;
         }
-        return b.toString();
+      }
+      b.append(c);
     }
+    return b.toString();
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/json/CookieList.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/CookieList.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/CookieList.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -28,63 +28,73 @@
 
 /**
  * Convert a web browser cookie list string to a JSONObject and back.
+ *
  * @author JSON.org
  * @version 2008-09-18
  */
-public class CookieList {
+public class CookieList
+{
 
-    /**
-     * Convert a cookie list into a JSONObject. A cookie list is a sequence
-     * of name/value pairs. The names are separated from the values by '='.
-     * The pairs are separated by ';'. The names and the values
-     * will be unescaped, possibly converting '+' and '%' sequences.
-     *
-     * To add a cookie to a cooklist,
-     * cookielistJSONObject.put(cookieJSONObject.getString("name"),
-     *     cookieJSONObject.getString("value"));
-     * @param string  A cookie list string
-     * @return A JSONObject
-     * @throws JSONException
-     */
-    public static JSONObject toJSONObject(String string) throws JSONException {
-        JSONObject o = new JSONObject();
-        JSONTokener x = new JSONTokener(string);
-        while (x.more()) {
-            String name = Cookie.unescape(x.nextTo('='));
-            x.next('=');
-            o.put(name, Cookie.unescape(x.nextTo(';')));
-            x.next();
-        }
-        return o;
+  /**
+   * Convert a cookie list into a JSONObject. A cookie list is a sequence
+   * of name/value pairs. The names are separated from the values by '='.
+   * The pairs are separated by ';'. The names and the values
+   * will be unescaped, possibly converting '+' and '%' sequences.
+   * <p/>
+   * To add a cookie to a cooklist,
+   * cookielistJSONObject.put(cookieJSONObject.getString("name"),
+   * cookieJSONObject.getString("value"));
+   *
+   * @param string A cookie list string
+   * @return A JSONObject
+   * @throws JSONException
+   */
+  public static JSONObject toJSONObject(String string) throws JSONException
+  {
+    JSONObject o = new JSONObject();
+    JSONTokener x = new JSONTokener(string);
+    while (x.more())
+    {
+      String name = Cookie.unescape(x.nextTo('='));
+      x.next('=');
+      o.put(name, Cookie.unescape(x.nextTo(';')));
+      x.next();
     }
+    return o;
+  }
 
 
-    /**
-     * Convert a JSONObject into a cookie list. A cookie list is a sequence
-     * of name/value pairs. The names are separated from the values by '='.
-     * The pairs are separated by ';'. The characters '%', '+', '=', and ';'
-     * in the names and values are replaced by "%hh".
-     * @param o A JSONObject
-     * @return A cookie list string
-     * @throws JSONException
-     */
-    public static String toString(JSONObject o) throws JSONException {
-        boolean      b = false;
-        Iterator     keys = o.keys();
-        String       s;
-        StringBuffer sb = new StringBuffer();
-        while (keys.hasNext()) {
-            s = keys.next().toString();
-            if (!o.isNull(s)) {
-                if (b) {
-                    sb.append(';');
-                }
-                sb.append(Cookie.escape(s));
-                sb.append("=");
-                sb.append(Cookie.escape(o.getString(s)));
-                b = true;
-            }
+  /**
+   * Convert a JSONObject into a cookie list. A cookie list is a sequence
+   * of name/value pairs. The names are separated from the values by '='.
+   * The pairs are separated by ';'. The characters '%', '+', '=', and ';'
+   * in the names and values are replaced by "%hh".
+   *
+   * @param o A JSONObject
+   * @return A cookie list string
+   * @throws JSONException
+   */
+  public static String toString(JSONObject o) throws JSONException
+  {
+    boolean b = false;
+    Iterator keys = o.keys();
+    String s;
+    StringBuffer sb = new StringBuffer();
+    while (keys.hasNext())
+    {
+      s = keys.next().toString();
+      if (!o.isNull(s))
+      {
+        if (b)
+        {
+          sb.append(';');
         }
-        return sb.toString();
+        sb.append(Cookie.escape(s));
+        sb.append("=");
+        sb.append(Cookie.escape(o.getString(s)));
+        b = true;
+      }
     }
+    return sb.toString();
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/json/HTTP.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/HTTP.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/HTTP.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -28,136 +28,155 @@
 
 /**
  * Convert an HTTP header to a JSONObject and back.
+ *
  * @author JSON.org
  * @version 2008-09-18
  */
-public class HTTP {
+public class HTTP
+{
 
-    /** Carriage return/line feed. */
-    public static final String CRLF = "\r\n";
+  /**
+   * Carriage return/line feed.
+   */
+  public static final String CRLF = "\r\n";
 
-    /**
-     * Convert an HTTP header string into a JSONObject. It can be a request
-     * header or a response header. A request header will contain
-     * <pre>{
-     *    Method: "POST" (for example),
-     *    "Request-URI": "/" (for example),
-     *    "HTTP-Version": "HTTP/1.1" (for example)
-     * }</pre>
-     * A response header will contain
-     * <pre>{
-     *    "HTTP-Version": "HTTP/1.1" (for example),
-     *    "Status-Code": "200" (for example),
-     *    "Reason-Phrase": "OK" (for example)
-     * }</pre>
-     * In addition, the other parameters in the header will be captured, using
-     * the HTTP field names as JSON names, so that <pre>
-     *    Date: Sun, 26 May 2002 18:06:04 GMT
-     *    Cookie: Q=q2=PPEAsg--; B=677gi6ouf29bn&b=2&f=s
-     *    Cache-Control: no-cache</pre>
-     * become
-     * <pre>{...
-     *    Date: "Sun, 26 May 2002 18:06:04 GMT",
-     *    Cookie: "Q=q2=PPEAsg--; B=677gi6ouf29bn&b=2&f=s",
-     *    "Cache-Control": "no-cache",
-     * ...}</pre>
-     * It does no further checking or conversion. It does not parse dates.
-     * It does not do '%' transforms on URLs.
-     * @param string An HTTP header string.
-     * @return A JSONObject containing the elements and attributes
-     * of the XML string.
-     * @throws JSONException
-     */
-    public static JSONObject toJSONObject(String string) throws JSONException {
-        JSONObject     o = new JSONObject();
-        HTTPTokener    x = new HTTPTokener(string);
-        String         t;
+  /**
+   * Convert an HTTP header string into a JSONObject. It can be a request
+   * header or a response header. A request header will contain
+   * <pre>{
+   *    Method: "POST" (for example),
+   *    "Request-URI": "/" (for example),
+   *    "HTTP-Version": "HTTP/1.1" (for example)
+   * }</pre>
+   * A response header will contain
+   * <pre>{
+   *    "HTTP-Version": "HTTP/1.1" (for example),
+   *    "Status-Code": "200" (for example),
+   *    "Reason-Phrase": "OK" (for example)
+   * }</pre>
+   * In addition, the other parameters in the header will be captured, using
+   * the HTTP field names as JSON names, so that <pre>
+   *    Date: Sun, 26 May 2002 18:06:04 GMT
+   *    Cookie: Q=q2=PPEAsg--; B=677gi6ouf29bn&b=2&f=s
+   *    Cache-Control: no-cache</pre>
+   * become
+   * <pre>{...
+   *    Date: "Sun, 26 May 2002 18:06:04 GMT",
+   *    Cookie: "Q=q2=PPEAsg--; B=677gi6ouf29bn&b=2&f=s",
+   *    "Cache-Control": "no-cache",
+   * ...}</pre>
+   * It does no further checking or conversion. It does not parse dates.
+   * It does not do '%' transforms on URLs.
+   *
+   * @param string An HTTP header string.
+   * @return A JSONObject containing the elements and attributes
+   *         of the XML string.
+   * @throws JSONException
+   */
+  public static JSONObject toJSONObject(String string) throws JSONException
+  {
+    JSONObject o = new JSONObject();
+    HTTPTokener x = new HTTPTokener(string);
+    String t;
 
-        t = x.nextToken();
-        if (t.toUpperCase().startsWith("HTTP")) {
+    t = x.nextToken();
+    if (t.toUpperCase().startsWith("HTTP"))
+    {
 
 // Response
 
-            o.put("HTTP-Version", t);
-            o.put("Status-Code", x.nextToken());
-            o.put("Reason-Phrase", x.nextTo('\0'));
-            x.next();
+      o.put("HTTP-Version", t);
+      o.put("Status-Code", x.nextToken());
+      o.put("Reason-Phrase", x.nextTo('\0'));
+      x.next();
 
-        } else {
+    }
+    else
+    {
 
 // Request
 
-            o.put("Method", t);
-            o.put("Request-URI", x.nextToken());
-            o.put("HTTP-Version", x.nextToken());
-        }
+      o.put("Method", t);
+      o.put("Request-URI", x.nextToken());
+      o.put("HTTP-Version", x.nextToken());
+    }
 
 // Fields
 
-        while (x.more()) {
-            String name = x.nextTo(':');
-            x.next(':');
-            o.put(name, x.nextTo('\0'));
-            x.next();
-        }
-        return o;
+    while (x.more())
+    {
+      String name = x.nextTo(':');
+      x.next(':');
+      o.put(name, x.nextTo('\0'));
+      x.next();
     }
+    return o;
+  }
 
 
-    /**
-     * Convert a JSONObject into an HTTP header. A request header must contain
-     * <pre>{
-     *    Method: "POST" (for example),
-     *    "Request-URI": "/" (for example),
-     *    "HTTP-Version": "HTTP/1.1" (for example)
-     * }</pre>
-     * A response header must contain
-     * <pre>{
-     *    "HTTP-Version": "HTTP/1.1" (for example),
-     *    "Status-Code": "200" (for example),
-     *    "Reason-Phrase": "OK" (for example)
-     * }</pre>
-     * Any other members of the JSONObject will be output as HTTP fields.
-     * The result will end with two CRLF pairs.
-     * @param o A JSONObject
-     * @return An HTTP header string.
-     * @throws JSONException if the object does not contain enough
-     *  information.
-     */
-    public static String toString(JSONObject o) throws JSONException {
-        Iterator     keys = o.keys();
-        String       s;
-        StringBuffer sb = new StringBuffer();
-        if (o.has("Status-Code") && o.has("Reason-Phrase")) {
-            sb.append(o.getString("HTTP-Version"));
-            sb.append(' ');
-            sb.append(o.getString("Status-Code"));
-            sb.append(' ');
-            sb.append(o.getString("Reason-Phrase"));
-        } else if (o.has("Method") && o.has("Request-URI")) {
-            sb.append(o.getString("Method"));
-            sb.append(' ');
-            sb.append('"');
-            sb.append(o.getString("Request-URI"));
-            sb.append('"');
-            sb.append(' ');
-            sb.append(o.getString("HTTP-Version"));
-        } else {
-            throw new JSONException("Not enough material for an HTTP header.");
-        }
+  /**
+   * Convert a JSONObject into an HTTP header. A request header must contain
+   * <pre>{
+   *    Method: "POST" (for example),
+   *    "Request-URI": "/" (for example),
+   *    "HTTP-Version": "HTTP/1.1" (for example)
+   * }</pre>
+   * A response header must contain
+   * <pre>{
+   *    "HTTP-Version": "HTTP/1.1" (for example),
+   *    "Status-Code": "200" (for example),
+   *    "Reason-Phrase": "OK" (for example)
+   * }</pre>
+   * Any other members of the JSONObject will be output as HTTP fields.
+   * The result will end with two CRLF pairs.
+   *
+   * @param o A JSONObject
+   * @return An HTTP header string.
+   * @throws JSONException if the object does not contain enough
+   *                       information.
+   */
+  public static String toString(JSONObject o) throws JSONException
+  {
+    Iterator keys = o.keys();
+    String s;
+    StringBuffer sb = new StringBuffer();
+    if (o.has("Status-Code") && o.has("Reason-Phrase"))
+    {
+      sb.append(o.getString("HTTP-Version"));
+      sb.append(' ');
+      sb.append(o.getString("Status-Code"));
+      sb.append(' ');
+      sb.append(o.getString("Reason-Phrase"));
+    }
+    else if (o.has("Method") && o.has("Request-URI"))
+    {
+      sb.append(o.getString("Method"));
+      sb.append(' ');
+      sb.append('"');
+      sb.append(o.getString("Request-URI"));
+      sb.append('"');
+      sb.append(' ');
+      sb.append(o.getString("HTTP-Version"));
+    }
+    else
+    {
+      throw new JSONException("Not enough material for an HTTP header.");
+    }
+    sb.append(CRLF);
+    while (keys.hasNext())
+    {
+      s = keys.next().toString();
+      if (!s.equals("HTTP-Version") && !s.equals("Status-Code") &&
+          !s.equals("Reason-Phrase") && !s.equals("Method") &&
+          !s.equals("Request-URI") && !o.isNull(s))
+      {
+        sb.append(s);
+        sb.append(": ");
+        sb.append(o.getString(s));
         sb.append(CRLF);
-        while (keys.hasNext()) {
-            s = keys.next().toString();
-            if (!s.equals("HTTP-Version")      && !s.equals("Status-Code") &&
-                    !s.equals("Reason-Phrase") && !s.equals("Method") &&
-                    !s.equals("Request-URI")   && !o.isNull(s)) {
-                sb.append(s);
-                sb.append(": ");
-                sb.append(o.getString(s));
-                sb.append(CRLF);
-            }
-        }
-        sb.append(CRLF);
-        return sb.toString();
+      }
     }
+    sb.append(CRLF);
+    return sb.toString();
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/json/HTTPTokener.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/HTTPTokener.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/HTTPTokener.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -27,51 +27,65 @@
 /**
  * The HTTPTokener extends the JSONTokener to provide additional methods
  * for the parsing of HTTP headers.
+ *
  * @author JSON.org
  * @version 2008-09-18
  */
-public class HTTPTokener extends JSONTokener {
+public class HTTPTokener extends JSONTokener
+{
 
-    /**
-     * Construct an XMLTokener from a string.
-     * @param s A source string.
-     */
-    public HTTPTokener(String s) {
-        super(s);
-    }
+  /**
+   * Construct an XMLTokener from a string.
+   *
+   * @param s A source string.
+   */
+  public HTTPTokener(String s)
+  {
+    super(s);
+  }
 
 
-    /**
-     * Get the next token or string. This is used in parsing HTTP headers.
-     * @throws JSONException
-     * @return A String.
-     */
-    public String nextToken() throws JSONException {
-        char c;
-        char q;
-        StringBuffer sb = new StringBuffer();
-        do {
-            c = next();
-        } while (Character.isWhitespace(c));
-        if (c == '"' || c == '\'') {
-            q = c;
-            for (;;) {
-                c = next();
-                if (c < ' ') {
-                    throw syntaxError("Unterminated string.");
-                }
-                if (c == q) {
-                    return sb.toString();
-                }
-                sb.append(c);
-            }
-        } 
-        for (;;) {
-            if (c == 0 || Character.isWhitespace(c)) {
-                return sb.toString();
-            }
-            sb.append(c);
-            c = next();
+  /**
+   * Get the next token or string. This is used in parsing HTTP headers.
+   *
+   * @return A String.
+   * @throws JSONException
+   */
+  public String nextToken() throws JSONException
+  {
+    char c;
+    char q;
+    StringBuffer sb = new StringBuffer();
+    do
+    {
+      c = next();
+    }
+    while (Character.isWhitespace(c));
+    if (c == '"' || c == '\'')
+    {
+      q = c;
+      for (; ;)
+      {
+        c = next();
+        if (c < ' ')
+        {
+          throw syntaxError("Unterminated string.");
         }
+        if (c == q)
+        {
+          return sb.toString();
+        }
+        sb.append(c);
+      }
     }
+    for (; ;)
+    {
+      if (c == 0 || Character.isWhitespace(c))
+      {
+        return sb.toString();
+      }
+      sb.append(c);
+      c = next();
+    }
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/json/JSONArray.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/JSONArray.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/JSONArray.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -41,896 +41,1046 @@
  * <code>Boolean</code>, <code>JSONArray</code>, <code>JSONObject</code>,
  * <code>Number</code>, <code>String</code>, or the
  * <code>JSONObject.NULL object</code>.
- * <p>
+ * <p/>
  * The constructor can convert a JSON text into a Java object. The
  * <code>toString</code> method converts to JSON text.
- * <p>
+ * <p/>
  * A <code>get</code> method returns a value if one can be found, and throws an
  * exception if one cannot be found. An <code>opt</code> method returns a
  * default value instead of throwing an exception, and so is useful for
  * obtaining optional values.
- * <p>
+ * <p/>
  * The generic <code>get()</code> and <code>opt()</code> methods return an
  * object which you can cast or query for type. There are also typed
  * <code>get</code> and <code>opt</code> methods that do type checking and type
  * coersion for you.
- * <p>
+ * <p/>
  * The texts produced by the <code>toString</code> methods strictly conform to
  * JSON syntax rules. The constructors are more forgiving in the texts they will
  * accept:
  * <ul>
  * <li>An extra <code>,</code>&nbsp;<small>(comma)</small> may appear just
- *     before the closing bracket.</li>
+ * before the closing bracket.</li>
  * <li>The <code>null</code> value will be inserted when there
- *     is <code>,</code>&nbsp;<small>(comma)</small> elision.</li>
+ * is <code>,</code>&nbsp;<small>(comma)</small> elision.</li>
  * <li>Strings may be quoted with <code>'</code>&nbsp;<small>(single
- *     quote)</small>.</li>
+ * quote)</small>.</li>
  * <li>Strings do not need to be quoted at all if they do not begin with a quote
- *     or single quote, and if they do not contain leading or trailing spaces,
- *     and if they do not contain any of these characters:
- *     <code>{ } [ ] / \ : , = ; #</code> and if they do not look like numbers
- *     and if they are not the reserved words <code>true</code>,
- *     <code>false</code>, or <code>null</code>.</li>
+ * or single quote, and if they do not contain leading or trailing spaces,
+ * and if they do not contain any of these characters:
+ * <code>{ } [ ] / \ : , = ; #</code> and if they do not look like numbers
+ * and if they are not the reserved words <code>true</code>,
+ * <code>false</code>, or <code>null</code>.</li>
  * <li>Values can be separated by <code>;</code> <small>(semicolon)</small> as
- *     well as by <code>,</code> <small>(comma)</small>.</li>
+ * well as by <code>,</code> <small>(comma)</small>.</li>
  * <li>Numbers may have the <code>0-</code> <small>(octal)</small> or
- *     <code>0x-</code> <small>(hex)</small> prefix.</li>
+ * <code>0x-</code> <small>(hex)</small> prefix.</li>
  * <li>Comments written in the slashshlash, slashstar, and hash conventions
- *     will be ignored.</li>
+ * will be ignored.</li>
  * </ul>
-
+ *
  * @author JSON.org
  * @version 2008-09-18
  */
-public class JSONArray {
+public class JSONArray
+{
 
 
-    /**
-     * The arrayList where the JSONArray's properties are kept.
-     */
-    private ArrayList myArrayList;
+  /**
+   * The arrayList where the JSONArray's properties are kept.
+   */
+  private ArrayList myArrayList;
 
 
-    /**
-     * Construct an empty JSONArray.
-     */
-    public JSONArray() {
-        this.myArrayList = new ArrayList();
+  /**
+   * Construct an empty JSONArray.
+   */
+  public JSONArray()
+  {
+    this.myArrayList = new ArrayList();
+  }
+
+  /**
+   * Construct a JSONArray from a JSONTokener.
+   *
+   * @param x A JSONTokener
+   * @throws JSONException If there is a syntax error.
+   */
+  public JSONArray(JSONTokener x) throws JSONException
+  {
+    this();
+    char c = x.nextClean();
+    char q;
+    if (c == '[')
+    {
+      q = ']';
     }
-
-    /**
-     * Construct a JSONArray from a JSONTokener.
-     * @param x A JSONTokener
-     * @throws JSONException If there is a syntax error.
-     */
-    public JSONArray(JSONTokener x) throws JSONException {
-        this();
-        char c = x.nextClean();
-        char q;
-        if (c == '[') {
-            q = ']';
-        } else if (c == '(') {
-            q = ')';
-        } else {
-            throw x.syntaxError("A JSONArray text must start with '['");
-        }
-        if (x.nextClean() == ']') {
+    else if (c == '(')
+    {
+      q = ')';
+    }
+    else
+    {
+      throw x.syntaxError("A JSONArray text must start with '['");
+    }
+    if (x.nextClean() == ']')
+    {
+      return;
+    }
+    x.back();
+    for (; ;)
+    {
+      if (x.nextClean() == ',')
+      {
+        x.back();
+        this.myArrayList.add(null);
+      }
+      else
+      {
+        x.back();
+        this.myArrayList.add(x.nextValue());
+      }
+      c = x.nextClean();
+      switch (c)
+      {
+        case';':
+        case',':
+          if (x.nextClean() == ']')
+          {
             return;
-        }
-        x.back();
-        for (;;) {
-            if (x.nextClean() == ',') {
-                x.back();
-                this.myArrayList.add(null);
-            } else {
-                x.back();
-                this.myArrayList.add(x.nextValue());
-            }
-            c = x.nextClean();
-            switch (c) {
-            case ';':
-            case ',':
-                if (x.nextClean() == ']') {
-                    return;
-                }
-                x.back();
-                break;
-            case ']':
-            case ')':
-                if (q != c) {
-                    throw x.syntaxError("Expected a '" + new Character(q) + "'");
-                }
-                return;
-            default:
-                throw x.syntaxError("Expected a ',' or ']'");
-            }
-        }
+          }
+          x.back();
+          break;
+        case']':
+        case')':
+          if (q != c)
+          {
+            throw x.syntaxError("Expected a '" + new Character(q) + "'");
+          }
+          return;
+        default:
+          throw x.syntaxError("Expected a ',' or ']'");
+      }
     }
+  }
 
 
-    /**
-     * Construct a JSONArray from a source JSON text.
-     * @param source     A string that begins with
-     * <code>[</code>&nbsp;<small>(left bracket)</small>
-     *  and ends with <code>]</code>&nbsp;<small>(right bracket)</small>.
-     *  @throws JSONException If there is a syntax error.
-     */
-    public JSONArray(String source) throws JSONException {
-        this(new JSONTokener(source));
-    }
+  /**
+   * Construct a JSONArray from a source JSON text.
+   *
+   * @param source A string that begins with
+   *               <code>[</code>&nbsp;<small>(left bracket)</small>
+   *               and ends with <code>]</code>&nbsp;<small>(right bracket)</small>.
+   * @throws JSONException If there is a syntax error.
+   */
+  public JSONArray(String source) throws JSONException
+  {
+    this(new JSONTokener(source));
+  }
 
 
-    /**
-     * Construct a JSONArray from a Collection.
-     * @param collection     A Collection.
-     */
-    public JSONArray(Collection collection) {
-        this.myArrayList = (collection == null) ?
-            new ArrayList() :
-            new ArrayList(collection);
-    }
+  /**
+   * Construct a JSONArray from a Collection.
+   *
+   * @param collection A Collection.
+   */
+  public JSONArray(Collection collection)
+  {
+    this.myArrayList = (collection == null) ?
+        new ArrayList() :
+        new ArrayList(collection);
+  }
 
-    /**
-     * Construct a JSONArray from a collection of beans.
-     * The collection should have Java Beans.
-     * 
-     * @throws JSONException If not an array.
-     */
+  /**
+   * Construct a JSONArray from a collection of beans.
+   * The collection should have Java Beans.
+   *
+   * @throws JSONException If not an array.
+   */
 
-    public JSONArray(Collection collection,boolean includeSuperClass) {
-		this.myArrayList = new ArrayList();
-		if(collection != null) {
-			for (Iterator iter = collection.iterator(); iter.hasNext();) {
-				this.myArrayList.add(new JSONObject(iter.next(),includeSuperClass));	
-			}
-		}
+  public JSONArray(Collection collection, boolean includeSuperClass)
+  {
+    this.myArrayList = new ArrayList();
+    if (collection != null)
+    {
+      for (Iterator iter = collection.iterator(); iter.hasNext();)
+      {
+        this.myArrayList.add(new JSONObject(iter.next(), includeSuperClass));
+      }
     }
+  }
 
-    
-    /**
-     * Construct a JSONArray from an array
-     * @throws JSONException If not an array.
-     */
-    public JSONArray(Object array) throws JSONException {
-        this();
-        if (array.getClass().isArray()) {
-            int length = Array.getLength(array);
-            for (int i = 0; i < length; i += 1) {
-                this.put(Array.get(array, i));
-            }
-        } else {
-            throw new JSONException("JSONArray initial value should be a string or collection or array.");
-        }
-    }
 
-    /**
-     * Construct a JSONArray from an array with a bean.
-     * The array should have Java Beans.
-     * 
-     * @throws JSONException If not an array.
-     */
-    public JSONArray(Object array,boolean includeSuperClass) throws JSONException {
-        this();
-        if (array.getClass().isArray()) {
-            int length = Array.getLength(array);
-            for (int i = 0; i < length; i += 1) {
-                this.put(new JSONObject(Array.get(array, i),includeSuperClass));
-            }
-        } else {
-            throw new JSONException("JSONArray initial value should be a string or collection or array.");
-        }
+  /**
+   * Construct a JSONArray from an array
+   *
+   * @throws JSONException If not an array.
+   */
+  public JSONArray(Object array) throws JSONException
+  {
+    this();
+    if (array.getClass().isArray())
+    {
+      int length = Array.getLength(array);
+      for (int i = 0; i < length; i += 1)
+      {
+        this.put(Array.get(array, i));
+      }
     }
+    else
+    {
+      throw new JSONException("JSONArray initial value should be a string or collection or array.");
+    }
+  }
 
-    
-    
-    /**
-     * Get the object value associated with an index.
-     * @param index
-     *  The index must be between 0 and length() - 1.
-     * @return An object value.
-     * @throws JSONException If there is no value for the index.
-     */
-    public Object get(int index) throws JSONException {
-        Object o = opt(index);
-        if (o == null) {
-            throw new JSONException("JSONArray[" + index + "] not found.");
-        }
-        return o;
+  /**
+   * Construct a JSONArray from an array with a bean.
+   * The array should have Java Beans.
+   *
+   * @throws JSONException If not an array.
+   */
+  public JSONArray(Object array, boolean includeSuperClass) throws JSONException
+  {
+    this();
+    if (array.getClass().isArray())
+    {
+      int length = Array.getLength(array);
+      for (int i = 0; i < length; i += 1)
+      {
+        this.put(new JSONObject(Array.get(array, i), includeSuperClass));
+      }
     }
+    else
+    {
+      throw new JSONException("JSONArray initial value should be a string or collection or array.");
+    }
+  }
 
 
-    /**
-     * Get the boolean value associated with an index.
-     * The string values "true" and "false" are converted to boolean.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      The truth.
-     * @throws JSONException If there is no value for the index or if the
-     *  value is not convertable to boolean.
-     */
-    public boolean getBoolean(int index) throws JSONException {
-        Object o = get(index);
-        if (o.equals(Boolean.FALSE) ||
-                (o instanceof String &&
-                ((String)o).equalsIgnoreCase("false"))) {
-            return false;
-        } else if (o.equals(Boolean.TRUE) ||
-                (o instanceof String &&
-                ((String)o).equalsIgnoreCase("true"))) {
-            return true;
-        }
-        throw new JSONException("JSONArray[" + index + "] is not a Boolean.");
+  /**
+   * Get the object value associated with an index.
+   *
+   * @param index The index must be between 0 and length() - 1.
+   * @return An object value.
+   * @throws JSONException If there is no value for the index.
+   */
+  public Object get(int index) throws JSONException
+  {
+    Object o = opt(index);
+    if (o == null)
+    {
+      throw new JSONException("JSONArray[" + index + "] not found.");
     }
+    return o;
+  }
 
 
-    /**
-     * Get the double value associated with an index.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      The value.
-     * @throws   JSONException If the key is not found or if the value cannot
-     *  be converted to a number.
-     */
-    public double getDouble(int index) throws JSONException {
-        Object o = get(index);
-        try {
-            return o instanceof Number ?
-                ((Number)o).doubleValue() :
-                Double.valueOf((String)o).doubleValue();
-        } catch (Exception e) {
-            throw new JSONException("JSONArray[" + index +
-                "] is not a number.");
-        }
+  /**
+   * Get the boolean value associated with an index.
+   * The string values "true" and "false" are converted to boolean.
+   *
+   * @param index The index must be between 0 and length() - 1.
+   * @return The truth.
+   * @throws JSONException If there is no value for the index or if the
+   *                       value is not convertable to boolean.
+   */
+  public boolean getBoolean(int index) throws JSONException
+  {
+    Object o = get(index);
+    if (o.equals(Boolean.FALSE) ||
+        (o instanceof String &&
+            ((String) o).equalsIgnoreCase("false")))
+    {
+      return false;
     }
+    else if (o.equals(Boolean.TRUE) ||
+        (o instanceof String &&
+            ((String) o).equalsIgnoreCase("true")))
+    {
+      return true;
+    }
+    throw new JSONException("JSONArray[" + index + "] is not a Boolean.");
+  }
 
 
-    /**
-     * Get the int value associated with an index.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      The value.
-     * @throws   JSONException If the key is not found or if the value cannot
-     *  be converted to a number.
-     *  if the value cannot be converted to a number.
-     */
-    public int getInt(int index) throws JSONException {
-        Object o = get(index);
-        return o instanceof Number ?
-                ((Number)o).intValue() : (int)getDouble(index);
+  /**
+   * Get the double value associated with an index.
+   *
+   * @param index The index must be between 0 and length() - 1.
+   * @return The value.
+   * @throws JSONException If the key is not found or if the value cannot
+   *                       be converted to a number.
+   */
+  public double getDouble(int index) throws JSONException
+  {
+    Object o = get(index);
+    try
+    {
+      return o instanceof Number ?
+          ((Number) o).doubleValue() :
+          Double.valueOf((String) o).doubleValue();
     }
+    catch (Exception e)
+    {
+      throw new JSONException("JSONArray[" + index +
+          "] is not a number.");
+    }
+  }
 
 
-    /**
-     * Get the JSONArray associated with an index.
-     * @param index The index must be between 0 and length() - 1.
-     * @return      A JSONArray value.
-     * @throws JSONException If there is no value for the index. or if the
-     * value is not a JSONArray
-     */
-    public JSONArray getJSONArray(int index) throws JSONException {
-        Object o = get(index);
-        if (o instanceof JSONArray) {
-            return (JSONArray)o;
-        }
-        throw new JSONException("JSONArray[" + index +
-                "] is not a JSONArray.");
-    }
+  /**
+   * Get the int value associated with an index.
+   *
+   * @param index The index must be between 0 and length() - 1.
+   * @return The value.
+   * @throws JSONException If the key is not found or if the value cannot
+   *                       be converted to a number.
+   *                       if the value cannot be converted to a number.
+   */
+  public int getInt(int index) throws JSONException
+  {
+    Object o = get(index);
+    return o instanceof Number ?
+        ((Number) o).intValue() : (int) getDouble(index);
+  }
 
 
-    /**
-     * Get the JSONObject associated with an index.
-     * @param index subscript
-     * @return      A JSONObject value.
-     * @throws JSONException If there is no value for the index or if the
-     * value is not a JSONObject
-     */
-    public JSONObject getJSONObject(int index) throws JSONException {
-        Object o = get(index);
-        if (o instanceof JSONObject) {
-            return (JSONObject)o;
-        }
-        throw new JSONException("JSONArray[" + index +
-            "] is not a JSONObject.");
+  /**
+   * Get the JSONArray associated with an index.
+   *
+   * @param index The index must be between 0 and length() - 1.
+   * @return A JSONArray value.
+   * @throws JSONException If there is no value for the index. or if the
+   *                       value is not a JSONArray
+   */
+  public JSONArray getJSONArray(int index) throws JSONException
+  {
+    Object o = get(index);
+    if (o instanceof JSONArray)
+    {
+      return (JSONArray) o;
     }
+    throw new JSONException("JSONArray[" + index +
+        "] is not a JSONArray.");
+  }
 
 
-    /**
-     * Get the long value associated with an index.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      The value.
-     * @throws   JSONException If the key is not found or if the value cannot
-     *  be converted to a number.
-     */
-    public long getLong(int index) throws JSONException {
-        Object o = get(index);
-        return o instanceof Number ?
-                ((Number)o).longValue() : (long)getDouble(index);
+  /**
+   * Get the JSONObject associated with an index.
+   *
+   * @param index subscript
+   * @return A JSONObject value.
+   * @throws JSONException If there is no value for the index or if the
+   *                       value is not a JSONObject
+   */
+  public JSONObject getJSONObject(int index) throws JSONException
+  {
+    Object o = get(index);
+    if (o instanceof JSONObject)
+    {
+      return (JSONObject) o;
     }
+    throw new JSONException("JSONArray[" + index +
+        "] is not a JSONObject.");
+  }
 
 
-    /**
-     * Get the string associated with an index.
-     * @param index The index must be between 0 and length() - 1.
-     * @return      A string value.
-     * @throws JSONException If there is no value for the index.
-     */
-    public String getString(int index) throws JSONException {
-        return get(index).toString();
-    }
+  /**
+   * Get the long value associated with an index.
+   *
+   * @param index The index must be between 0 and length() - 1.
+   * @return The value.
+   * @throws JSONException If the key is not found or if the value cannot
+   *                       be converted to a number.
+   */
+  public long getLong(int index) throws JSONException
+  {
+    Object o = get(index);
+    return o instanceof Number ?
+        ((Number) o).longValue() : (long) getDouble(index);
+  }
 
 
-    /**
-     * Determine if the value is null.
-     * @param index The index must be between 0 and length() - 1.
-     * @return true if the value at the index is null, or if there is no value.
-     */
-    public boolean isNull(int index) {
-        return JSONObject.NULL.equals(opt(index));
-    }
+  /**
+   * Get the string associated with an index.
+   *
+   * @param index The index must be between 0 and length() - 1.
+   * @return A string value.
+   * @throws JSONException If there is no value for the index.
+   */
+  public String getString(int index) throws JSONException
+  {
+    return get(index).toString();
+  }
 
 
-    /**
-     * Make a string from the contents of this JSONArray. The
-     * <code>separator</code> string is inserted between each element.
-     * Warning: This method assumes that the data structure is acyclical.
-     * @param separator A string that will be inserted between the elements.
-     * @return a string.
-     * @throws JSONException If the array contains an invalid number.
-     */
-    public String join(String separator) throws JSONException {
-        int len = length();
-        StringBuffer sb = new StringBuffer();
+  /**
+   * Determine if the value is null.
+   *
+   * @param index The index must be between 0 and length() - 1.
+   * @return true if the value at the index is null, or if there is no value.
+   */
+  public boolean isNull(int index)
+  {
+    return JSONObject.NULL.equals(opt(index));
+  }
 
-        for (int i = 0; i < len; i += 1) {
-            if (i > 0) {
-                sb.append(separator);
-            }
-            sb.append(JSONObject.valueToString(this.myArrayList.get(i)));
-        }
-        return sb.toString();
-    }
 
+  /**
+   * Make a string from the contents of this JSONArray. The
+   * <code>separator</code> string is inserted between each element.
+   * Warning: This method assumes that the data structure is acyclical.
+   *
+   * @param separator A string that will be inserted between the elements.
+   * @return a string.
+   * @throws JSONException If the array contains an invalid number.
+   */
+  public String join(String separator) throws JSONException
+  {
+    int len = length();
+    StringBuffer sb = new StringBuffer();
 
-    /**
-     * Get the number of elements in the JSONArray, included nulls.
-     *
-     * @return The length (or size).
-     */
-    public int length() {
-        return this.myArrayList.size();
+    for (int i = 0; i < len; i += 1)
+    {
+      if (i > 0)
+      {
+        sb.append(separator);
+      }
+      sb.append(JSONObject.valueToString(this.myArrayList.get(i)));
     }
+    return sb.toString();
+  }
 
 
-    /**
-     * Get the optional object value associated with an index.
-     * @param index The index must be between 0 and length() - 1.
-     * @return      An object value, or null if there is no
-     *              object at that index.
-     */
-    public Object opt(int index) {
-        return (index < 0 || index >= length()) ?
-            null : this.myArrayList.get(index);
-    }
+  /**
+   * Get the number of elements in the JSONArray, included nulls.
+   *
+   * @return The length (or size).
+   */
+  public int length()
+  {
+    return this.myArrayList.size();
+  }
 
 
-    /**
-     * Get the optional boolean value associated with an index.
-     * It returns false if there is no value at that index,
-     * or if the value is not Boolean.TRUE or the String "true".
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      The truth.
-     */
-    public boolean optBoolean(int index)  {
-        return optBoolean(index, false);
-    }
+  /**
+   * Get the optional object value associated with an index.
+   *
+   * @param index The index must be between 0 and length() - 1.
+   * @return An object value, or null if there is no
+   *         object at that index.
+   */
+  public Object opt(int index)
+  {
+    return (index < 0 || index >= length()) ?
+        null : this.myArrayList.get(index);
+  }
 
 
-    /**
-     * Get the optional boolean value associated with an index.
-     * It returns the defaultValue if there is no value at that index or if
-     * it is not a Boolean or the String "true" or "false" (case insensitive).
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @param defaultValue     A boolean default.
-     * @return      The truth.
-     */
-    public boolean optBoolean(int index, boolean defaultValue)  {
-        try {
-            return getBoolean(index);
-        } catch (Exception e) {
-            return defaultValue;
-        }
-    }
+  /**
+   * Get the optional boolean value associated with an index.
+   * It returns false if there is no value at that index,
+   * or if the value is not Boolean.TRUE or the String "true".
+   *
+   * @param index The index must be between 0 and length() - 1.
+   * @return The truth.
+   */
+  public boolean optBoolean(int index)
+  {
+    return optBoolean(index, false);
+  }
 
 
-    /**
-     * Get the optional double value associated with an index.
-     * NaN is returned if there is no value for the index,
-     * or if the value is not a number and cannot be converted to a number.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      The value.
-     */
-    public double optDouble(int index) {
-        return optDouble(index, Double.NaN);
+  /**
+   * Get the optional boolean value associated with an index.
+   * It returns the defaultValue if there is no value at that index or if
+   * it is not a Boolean or the String "true" or "false" (case insensitive).
+   *
+   * @param index        The index must be between 0 and length() - 1.
+   * @param defaultValue A boolean default.
+   * @return The truth.
+   */
+  public boolean optBoolean(int index, boolean defaultValue)
+  {
+    try
+    {
+      return getBoolean(index);
     }
+    catch (Exception e)
+    {
+      return defaultValue;
+    }
+  }
 
 
-    /**
-     * Get the optional double value associated with an index.
-     * The defaultValue is returned if there is no value for the index,
-     * or if the value is not a number and cannot be converted to a number.
-     *
-     * @param index subscript
-     * @param defaultValue     The default value.
-     * @return      The value.
-     */
-    public double optDouble(int index, double defaultValue) {
-        try {
-            return getDouble(index);
-        } catch (Exception e) {
-            return defaultValue;
-        }
-    }
+  /**
+   * Get the optional double value associated with an index.
+   * NaN is returned if there is no value for the index,
+   * or if the value is not a number and cannot be converted to a number.
+   *
+   * @param index The index must be between 0 and length() - 1.
+   * @return The value.
+   */
+  public double optDouble(int index)
+  {
+    return optDouble(index, Double.NaN);
+  }
 
 
-    /**
-     * Get the optional int value associated with an index.
-     * Zero is returned if there is no value for the index,
-     * or if the value is not a number and cannot be converted to a number.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      The value.
-     */
-    public int optInt(int index) {
-        return optInt(index, 0);
+  /**
+   * Get the optional double value associated with an index.
+   * The defaultValue is returned if there is no value for the index,
+   * or if the value is not a number and cannot be converted to a number.
+   *
+   * @param index        subscript
+   * @param defaultValue The default value.
+   * @return The value.
+   */
+  public double optDouble(int index, double defaultValue)
+  {
+    try
+    {
+      return getDouble(index);
     }
+    catch (Exception e)
+    {
+      return defaultValue;
+    }
+  }
 
 
-    /**
-     * Get the optional int value associated with an index.
-     * The defaultValue is returned if there is no value for the index,
-     * or if the value is not a number and cannot be converted to a number.
-     * @param index The index must be between 0 and length() - 1.
-     * @param defaultValue     The default value.
-     * @return      The value.
-     */
-    public int optInt(int index, int defaultValue) {
-        try {
-            return getInt(index);
-        } catch (Exception e) {
-            return defaultValue;
-        }
-    }
+  /**
+   * Get the optional int value associated with an index.
+   * Zero is returned if there is no value for the index,
+   * or if the value is not a number and cannot be converted to a number.
+   *
+   * @param index The index must be between 0 and length() - 1.
+   * @return The value.
+   */
+  public int optInt(int index)
+  {
+    return optInt(index, 0);
+  }
 
 
-    /**
-     * Get the optional JSONArray associated with an index.
-     * @param index subscript
-     * @return      A JSONArray value, or null if the index has no value,
-     * or if the value is not a JSONArray.
-     */
-    public JSONArray optJSONArray(int index) {
-        Object o = opt(index);
-        return o instanceof JSONArray ? (JSONArray)o : null;
+  /**
+   * Get the optional int value associated with an index.
+   * The defaultValue is returned if there is no value for the index,
+   * or if the value is not a number and cannot be converted to a number.
+   *
+   * @param index        The index must be between 0 and length() - 1.
+   * @param defaultValue The default value.
+   * @return The value.
+   */
+  public int optInt(int index, int defaultValue)
+  {
+    try
+    {
+      return getInt(index);
     }
+    catch (Exception e)
+    {
+      return defaultValue;
+    }
+  }
 
 
-    /**
-     * Get the optional JSONObject associated with an index.
-     * Null is returned if the key is not found, or null if the index has
-     * no value, or if the value is not a JSONObject.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      A JSONObject value.
-     */
-    public JSONObject optJSONObject(int index) {
-        Object o = opt(index);
-        return o instanceof JSONObject ? (JSONObject)o : null;
-    }
+  /**
+   * Get the optional JSONArray associated with an index.
+   *
+   * @param index subscript
+   * @return A JSONArray value, or null if the index has no value,
+   *         or if the value is not a JSONArray.
+   */
+  public JSONArray optJSONArray(int index)
+  {
+    Object o = opt(index);
+    return o instanceof JSONArray ? (JSONArray) o : null;
+  }
 
 
-    /**
-     * Get the optional long value associated with an index.
-     * Zero is returned if there is no value for the index,
-     * or if the value is not a number and cannot be converted to a number.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      The value.
-     */
-    public long optLong(int index) {
-        return optLong(index, 0);
-    }
+  /**
+   * Get the optional JSONObject associated with an index.
+   * Null is returned if the key is not found, or null if the index has
+   * no value, or if the value is not a JSONObject.
+   *
+   * @param index The index must be between 0 and length() - 1.
+   * @return A JSONObject value.
+   */
+  public JSONObject optJSONObject(int index)
+  {
+    Object o = opt(index);
+    return o instanceof JSONObject ? (JSONObject) o : null;
+  }
 
 
-    /**
-     * Get the optional long value associated with an index.
-     * The defaultValue is returned if there is no value for the index,
-     * or if the value is not a number and cannot be converted to a number.
-     * @param index The index must be between 0 and length() - 1.
-     * @param defaultValue     The default value.
-     * @return      The value.
-     */
-    public long optLong(int index, long defaultValue) {
-        try {
-            return getLong(index);
-        } catch (Exception e) {
-            return defaultValue;
-        }
-    }
+  /**
+   * Get the optional long value associated with an index.
+   * Zero is returned if there is no value for the index,
+   * or if the value is not a number and cannot be converted to a number.
+   *
+   * @param index The index must be between 0 and length() - 1.
+   * @return The value.
+   */
+  public long optLong(int index)
+  {
+    return optLong(index, 0);
+  }
 
 
-    /**
-     * Get the optional string value associated with an index. It returns an
-     * empty string if there is no value at that index. If the value
-     * is not a string and is not null, then it is coverted to a string.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      A String value.
-     */
-    public String optString(int index) {
-        return optString(index, "");
+  /**
+   * Get the optional long value associated with an index.
+   * The defaultValue is returned if there is no value for the index,
+   * or if the value is not a number and cannot be converted to a number.
+   *
+   * @param index        The index must be between 0 and length() - 1.
+   * @param defaultValue The default value.
+   * @return The value.
+   */
+  public long optLong(int index, long defaultValue)
+  {
+    try
+    {
+      return getLong(index);
     }
+    catch (Exception e)
+    {
+      return defaultValue;
+    }
+  }
 
 
-    /**
-     * Get the optional string associated with an index.
-     * The defaultValue is returned if the key is not found.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @param defaultValue     The default value.
-     * @return      A String value.
-     */
-    public String optString(int index, String defaultValue) {
-        Object o = opt(index);
-        return o != null ? o.toString() : defaultValue;
-    }
+  /**
+   * Get the optional string value associated with an index. It returns an
+   * empty string if there is no value at that index. If the value
+   * is not a string and is not null, then it is coverted to a string.
+   *
+   * @param index The index must be between 0 and length() - 1.
+   * @return A String value.
+   */
+  public String optString(int index)
+  {
+    return optString(index, "");
+  }
 
 
-    /**
-     * Append a boolean value. This increases the array's length by one.
-     *
-     * @param value A boolean value.
-     * @return this.
-     */
-    public JSONArray put(boolean value) {
-        put(value ? Boolean.TRUE : Boolean.FALSE);
-        return this;
-    }
+  /**
+   * Get the optional string associated with an index.
+   * The defaultValue is returned if the key is not found.
+   *
+   * @param index        The index must be between 0 and length() - 1.
+   * @param defaultValue The default value.
+   * @return A String value.
+   */
+  public String optString(int index, String defaultValue)
+  {
+    Object o = opt(index);
+    return o != null ? o.toString() : defaultValue;
+  }
 
 
-    /**
-     * Put a value in the JSONArray, where the value will be a
-     * JSONArray which is produced from a Collection.
-     * @param value A Collection value.
-     * @return      this.
-     */
-    public JSONArray put(Collection value) {
-        put(new JSONArray(value));
-        return this;
-    }
+  /**
+   * Append a boolean value. This increases the array's length by one.
+   *
+   * @param value A boolean value.
+   * @return this.
+   */
+  public JSONArray put(boolean value)
+  {
+    put(value ? Boolean.TRUE : Boolean.FALSE);
+    return this;
+  }
 
 
-    /**
-     * Append a double value. This increases the array's length by one.
-     *
-     * @param value A double value.
-     * @throws JSONException if the value is not finite.
-     * @return this.
-     */
-    public JSONArray put(double value) throws JSONException {
-        Double d = new Double(value);
-        JSONObject.testValidity(d);
-        put(d);
-        return this;
-    }
+  /**
+   * Put a value in the JSONArray, where the value will be a
+   * JSONArray which is produced from a Collection.
+   *
+   * @param value A Collection value.
+   * @return this.
+   */
+  public JSONArray put(Collection value)
+  {
+    put(new JSONArray(value));
+    return this;
+  }
 
 
-    /**
-     * Append an int value. This increases the array's length by one.
-     *
-     * @param value An int value.
-     * @return this.
-     */
-    public JSONArray put(int value) {
-        put(new Integer(value));
-        return this;
-    }
+  /**
+   * Append a double value. This increases the array's length by one.
+   *
+   * @param value A double value.
+   * @return this.
+   * @throws JSONException if the value is not finite.
+   */
+  public JSONArray put(double value) throws JSONException
+  {
+    Double d = new Double(value);
+    JSONObject.testValidity(d);
+    put(d);
+    return this;
+  }
 
 
-    /**
-     * Append an long value. This increases the array's length by one.
-     *
-     * @param value A long value.
-     * @return this.
-     */
-    public JSONArray put(long value) {
-        put(new Long(value));
-        return this;
-    }
+  /**
+   * Append an int value. This increases the array's length by one.
+   *
+   * @param value An int value.
+   * @return this.
+   */
+  public JSONArray put(int value)
+  {
+    put(new Integer(value));
+    return this;
+  }
 
 
-    /**
-     * Put a value in the JSONArray, where the value will be a
-     * JSONObject which is produced from a Map.
-     * @param value A Map value.
-     * @return      this.
-     */
-    public JSONArray put(Map value) {
-        put(new JSONObject(value));
-        return this;
-    }
+  /**
+   * Append an long value. This increases the array's length by one.
+   *
+   * @param value A long value.
+   * @return this.
+   */
+  public JSONArray put(long value)
+  {
+    put(new Long(value));
+    return this;
+  }
 
 
-    /**
-     * Append an object value. This increases the array's length by one.
-     * @param value An object value.  The value should be a
-     *  Boolean, Double, Integer, JSONArray, JSONObject, Long, or String, or the
-     *  JSONObject.NULL object.
-     * @return this.
-     */
-    public JSONArray put(Object value) {
-        this.myArrayList.add(value);
-        return this;
-    }
+  /**
+   * Put a value in the JSONArray, where the value will be a
+   * JSONObject which is produced from a Map.
+   *
+   * @param value A Map value.
+   * @return this.
+   */
+  public JSONArray put(Map value)
+  {
+    put(new JSONObject(value));
+    return this;
+  }
 
 
-    /**
-     * Put or replace a boolean value in the JSONArray. If the index is greater
-     * than the length of the JSONArray, then null elements will be added as
-     * necessary to pad it out.
-     * @param index The subscript.
-     * @param value A boolean value.
-     * @return this.
-     * @throws JSONException If the index is negative.
-     */
-    public JSONArray put(int index, boolean value) throws JSONException {
-        put(index, value ? Boolean.TRUE : Boolean.FALSE);
-        return this;
-    }
+  /**
+   * Append an object value. This increases the array's length by one.
+   *
+   * @param value An object value.  The value should be a
+   *              Boolean, Double, Integer, JSONArray, JSONObject, Long, or String, or the
+   *              JSONObject.NULL object.
+   * @return this.
+   */
+  public JSONArray put(Object value)
+  {
+    this.myArrayList.add(value);
+    return this;
+  }
 
 
-    /**
-     * Put a value in the JSONArray, where the value will be a
-     * JSONArray which is produced from a Collection.
-     * @param index The subscript.
-     * @param value A Collection value.
-     * @return      this.
-     * @throws JSONException If the index is negative or if the value is
-     * not finite.
-     */
-    public JSONArray put(int index, Collection value) throws JSONException {
-        put(index, new JSONArray(value));
-        return this;
-    }
+  /**
+   * Put or replace a boolean value in the JSONArray. If the index is greater
+   * than the length of the JSONArray, then null elements will be added as
+   * necessary to pad it out.
+   *
+   * @param index The subscript.
+   * @param value A boolean value.
+   * @return this.
+   * @throws JSONException If the index is negative.
+   */
+  public JSONArray put(int index, boolean value) throws JSONException
+  {
+    put(index, value ? Boolean.TRUE : Boolean.FALSE);
+    return this;
+  }
 
 
-    /**
-     * Put or replace a double value. If the index is greater than the length of
-     *  the JSONArray, then null elements will be added as necessary to pad
-     *  it out.
-     * @param index The subscript.
-     * @param value A double value.
-     * @return this.
-     * @throws JSONException If the index is negative or if the value is
-     * not finite.
-     */
-    public JSONArray put(int index, double value) throws JSONException {
-        put(index, new Double(value));
-        return this;
-    }
+  /**
+   * Put a value in the JSONArray, where the value will be a
+   * JSONArray which is produced from a Collection.
+   *
+   * @param index The subscript.
+   * @param value A Collection value.
+   * @return this.
+   * @throws JSONException If the index is negative or if the value is
+   *                       not finite.
+   */
+  public JSONArray put(int index, Collection value) throws JSONException
+  {
+    put(index, new JSONArray(value));
+    return this;
+  }
 
 
-    /**
-     * Put or replace an int value. If the index is greater than the length of
-     *  the JSONArray, then null elements will be added as necessary to pad
-     *  it out.
-     * @param index The subscript.
-     * @param value An int value.
-     * @return this.
-     * @throws JSONException If the index is negative.
-     */
-    public JSONArray put(int index, int value) throws JSONException {
-        put(index, new Integer(value));
-        return this;
-    }
+  /**
+   * Put or replace a double value. If the index is greater than the length of
+   * the JSONArray, then null elements will be added as necessary to pad
+   * it out.
+   *
+   * @param index The subscript.
+   * @param value A double value.
+   * @return this.
+   * @throws JSONException If the index is negative or if the value is
+   *                       not finite.
+   */
+  public JSONArray put(int index, double value) throws JSONException
+  {
+    put(index, new Double(value));
+    return this;
+  }
 
 
-    /**
-     * Put or replace a long value. If the index is greater than the length of
-     *  the JSONArray, then null elements will be added as necessary to pad
-     *  it out.
-     * @param index The subscript.
-     * @param value A long value.
-     * @return this.
-     * @throws JSONException If the index is negative.
-     */
-    public JSONArray put(int index, long value) throws JSONException {
-        put(index, new Long(value));
-        return this;
-    }
+  /**
+   * Put or replace an int value. If the index is greater than the length of
+   * the JSONArray, then null elements will be added as necessary to pad
+   * it out.
+   *
+   * @param index The subscript.
+   * @param value An int value.
+   * @return this.
+   * @throws JSONException If the index is negative.
+   */
+  public JSONArray put(int index, int value) throws JSONException
+  {
+    put(index, new Integer(value));
+    return this;
+  }
 
 
-    /**
-     * Put a value in the JSONArray, where the value will be a
-     * JSONObject which is produced from a Map.
-     * @param index The subscript.
-     * @param value The Map value.
-     * @return      this.
-     * @throws JSONException If the index is negative or if the the value is
-     *  an invalid number.
-     */
-    public JSONArray put(int index, Map value) throws JSONException {
-        put(index, new JSONObject(value));
-        return this;
-    }
+  /**
+   * Put or replace a long value. If the index is greater than the length of
+   * the JSONArray, then null elements will be added as necessary to pad
+   * it out.
+   *
+   * @param index The subscript.
+   * @param value A long value.
+   * @return this.
+   * @throws JSONException If the index is negative.
+   */
+  public JSONArray put(int index, long value) throws JSONException
+  {
+    put(index, new Long(value));
+    return this;
+  }
 
 
-    /**
-     * Put or replace an object value in the JSONArray. If the index is greater
-     *  than the length of the JSONArray, then null elements will be added as
-     *  necessary to pad it out.
-     * @param index The subscript.
-     * @param value The value to put into the array. The value should be a
-     *  Boolean, Double, Integer, JSONArray, JSONObject, Long, or String, or the
-     *  JSONObject.NULL object.
-     * @return this.
-     * @throws JSONException If the index is negative or if the the value is
-     *  an invalid number.
-     */
-    public JSONArray put(int index, Object value) throws JSONException {
-        JSONObject.testValidity(value);
-        if (index < 0) {
-            throw new JSONException("JSONArray[" + index + "] not found.");
-        }
-        if (index < length()) {
-            this.myArrayList.set(index, value);
-        } else {
-            while (index != length()) {
-                put(JSONObject.NULL);
-            }
-            put(value);
-        }
-        return this;
-    }
+  /**
+   * Put a value in the JSONArray, where the value will be a
+   * JSONObject which is produced from a Map.
+   *
+   * @param index The subscript.
+   * @param value The Map value.
+   * @return this.
+   * @throws JSONException If the index is negative or if the the value is
+   *                       an invalid number.
+   */
+  public JSONArray put(int index, Map value) throws JSONException
+  {
+    put(index, new JSONObject(value));
+    return this;
+  }
 
 
-    /**
-     * Produce a JSONObject by combining a JSONArray of names with the values
-     * of this JSONArray.
-     * @param names A JSONArray containing a list of key strings. These will be
-     * paired with the values.
-     * @return A JSONObject, or null if there are no names or if this JSONArray
-     * has no values.
-     * @throws JSONException If any of the names are null.
-     */
-    public JSONObject toJSONObject(JSONArray names) throws JSONException {
-        if (names == null || names.length() == 0 || length() == 0) {
-            return null;
-        }
-        JSONObject jo = new JSONObject();
-        for (int i = 0; i < names.length(); i += 1) {
-            jo.put(names.getString(i), this.opt(i));
-        }
-        return jo;
+  /**
+   * Put or replace an object value in the JSONArray. If the index is greater
+   * than the length of the JSONArray, then null elements will be added as
+   * necessary to pad it out.
+   *
+   * @param index The subscript.
+   * @param value The value to put into the array. The value should be a
+   *              Boolean, Double, Integer, JSONArray, JSONObject, Long, or String, or the
+   *              JSONObject.NULL object.
+   * @return this.
+   * @throws JSONException If the index is negative or if the the value is
+   *                       an invalid number.
+   */
+  public JSONArray put(int index, Object value) throws JSONException
+  {
+    JSONObject.testValidity(value);
+    if (index < 0)
+    {
+      throw new JSONException("JSONArray[" + index + "] not found.");
     }
+    if (index < length())
+    {
+      this.myArrayList.set(index, value);
+    }
+    else
+    {
+      while (index != length())
+      {
+        put(JSONObject.NULL);
+      }
+      put(value);
+    }
+    return this;
+  }
 
 
-    /**
-     * Make a JSON text of this JSONArray. For compactness, no
-     * unnecessary whitespace is added. If it is not possible to produce a
-     * syntactically correct JSON text then null will be returned instead. This
-     * could occur if the array contains an invalid number.
-     * <p>
-     * Warning: This method assumes that the data structure is acyclical.
-     *
-     * @return a printable, displayable, transmittable
-     *  representation of the array.
-     */
-    public String toString() {
-        try {
-            return '[' + join(",") + ']';
-        } catch (Exception e) {
-            return null;
-        }
+  /**
+   * Produce a JSONObject by combining a JSONArray of names with the values
+   * of this JSONArray.
+   *
+   * @param names A JSONArray containing a list of key strings. These will be
+   *              paired with the values.
+   * @return A JSONObject, or null if there are no names or if this JSONArray
+   *         has no values.
+   * @throws JSONException If any of the names are null.
+   */
+  public JSONObject toJSONObject(JSONArray names) throws JSONException
+  {
+    if (names == null || names.length() == 0 || length() == 0)
+    {
+      return null;
     }
+    JSONObject jo = new JSONObject();
+    for (int i = 0; i < names.length(); i += 1)
+    {
+      jo.put(names.getString(i), this.opt(i));
+    }
+    return jo;
+  }
 
 
-    /**
-     * Make a prettyprinted JSON text of this JSONArray.
-     * Warning: This method assumes that the data structure is acyclical.
-     * @param indentFactor The number of spaces to add to each level of
-     *  indentation.
-     * @return a printable, displayable, transmittable
-     *  representation of the object, beginning
-     *  with <code>[</code>&nbsp;<small>(left bracket)</small> and ending
-     *  with <code>]</code>&nbsp;<small>(right bracket)</small>.
-     * @throws JSONException
-     */
-    public String toString(int indentFactor) throws JSONException {
-        return toString(indentFactor, 0);
+  /**
+   * Make a JSON text of this JSONArray. For compactness, no
+   * unnecessary whitespace is added. If it is not possible to produce a
+   * syntactically correct JSON text then null will be returned instead. This
+   * could occur if the array contains an invalid number.
+   * <p/>
+   * Warning: This method assumes that the data structure is acyclical.
+   *
+   * @return a printable, displayable, transmittable
+   *         representation of the array.
+   */
+  public String toString()
+  {
+    try
+    {
+      return '[' + join(",") + ']';
     }
+    catch (Exception e)
+    {
+      return null;
+    }
+  }
 
 
-    /**
-     * Make a prettyprinted JSON text of this JSONArray.
-     * Warning: This method assumes that the data structure is acyclical.
-     * @param indentFactor The number of spaces to add to each level of
-     *  indentation.
-     * @param indent The indention of the top level.
-     * @return a printable, displayable, transmittable
-     *  representation of the array.
-     * @throws JSONException
-     */
-    String toString(int indentFactor, int indent) throws JSONException {
-        int len = length();
-        if (len == 0) {
-            return "[]";
+  /**
+   * Make a prettyprinted JSON text of this JSONArray.
+   * Warning: This method assumes that the data structure is acyclical.
+   *
+   * @param indentFactor The number of spaces to add to each level of
+   *                     indentation.
+   * @return a printable, displayable, transmittable
+   *         representation of the object, beginning
+   *         with <code>[</code>&nbsp;<small>(left bracket)</small> and ending
+   *         with <code>]</code>&nbsp;<small>(right bracket)</small>.
+   * @throws JSONException
+   */
+  public String toString(int indentFactor) throws JSONException
+  {
+    return toString(indentFactor, 0);
+  }
+
+
+  /**
+   * Make a prettyprinted JSON text of this JSONArray.
+   * Warning: This method assumes that the data structure is acyclical.
+   *
+   * @param indentFactor The number of spaces to add to each level of
+   *                     indentation.
+   * @param indent       The indention of the top level.
+   * @return a printable, displayable, transmittable
+   *         representation of the array.
+   * @throws JSONException
+   */
+  String toString(int indentFactor, int indent) throws JSONException
+  {
+    int len = length();
+    if (len == 0)
+    {
+      return "[]";
+    }
+    int i;
+    StringBuffer sb = new StringBuffer("[");
+    if (len == 1)
+    {
+      sb.append(JSONObject.valueToString(this.myArrayList.get(0),
+          indentFactor, indent));
+    }
+    else
+    {
+      int newindent = indent + indentFactor;
+      sb.append('\n');
+      for (i = 0; i < len; i += 1)
+      {
+        if (i > 0)
+        {
+          sb.append(",\n");
         }
-        int i;
-        StringBuffer sb = new StringBuffer("[");
-        if (len == 1) {
-            sb.append(JSONObject.valueToString(this.myArrayList.get(0),
-                    indentFactor, indent));
-        } else {
-            int newindent = indent + indentFactor;
-            sb.append('\n');
-            for (i = 0; i < len; i += 1) {
-                if (i > 0) {
-                    sb.append(",\n");
-                }
-                for (int j = 0; j < newindent; j += 1) {
-                    sb.append(' ');
-                }
-                sb.append(JSONObject.valueToString(this.myArrayList.get(i),
-                        indentFactor, newindent));
-            }
-            sb.append('\n');
-            for (i = 0; i < indent; i += 1) {
-                sb.append(' ');
-            }
+        for (int j = 0; j < newindent; j += 1)
+        {
+          sb.append(' ');
         }
-        sb.append(']');
-        return sb.toString();
+        sb.append(JSONObject.valueToString(this.myArrayList.get(i),
+            indentFactor, newindent));
+      }
+      sb.append('\n');
+      for (i = 0; i < indent; i += 1)
+      {
+        sb.append(' ');
+      }
     }
+    sb.append(']');
+    return sb.toString();
+  }
 
 
-    /**
-     * Write the contents of the JSONArray as JSON text to a writer.
-     * For compactness, no whitespace is added.
-     * <p>
-     * Warning: This method assumes that the data structure is acyclical.
-     *
-     * @return The writer.
-     * @throws JSONException
-     */
-    public Writer write(Writer writer) throws JSONException {
-        try {
-            boolean b = false;
-            int     len = length();
+  /**
+   * Write the contents of the JSONArray as JSON text to a writer.
+   * For compactness, no whitespace is added.
+   * <p/>
+   * Warning: This method assumes that the data structure is acyclical.
+   *
+   * @return The writer.
+   * @throws JSONException
+   */
+  public Writer write(Writer writer) throws JSONException
+  {
+    try
+    {
+      boolean b = false;
+      int len = length();
 
-            writer.write('[');
+      writer.write('[');
 
-            for (int i = 0; i < len; i += 1) {
-                if (b) {
-                    writer.write(',');
-                }
-                Object v = this.myArrayList.get(i);
-                if (v instanceof JSONObject) {
-                    ((JSONObject)v).write(writer);
-                } else if (v instanceof JSONArray) {
-                    ((JSONArray)v).write(writer);
-                } else {
-                    writer.write(JSONObject.valueToString(v));
-                }
-                b = true;
-            }
-            writer.write(']');
-            return writer;
-        } catch (IOException e) {
-           throw new JSONException(e);
+      for (int i = 0; i < len; i += 1)
+      {
+        if (b)
+        {
+          writer.write(',');
         }
+        Object v = this.myArrayList.get(i);
+        if (v instanceof JSONObject)
+        {
+          ((JSONObject) v).write(writer);
+        }
+        else if (v instanceof JSONArray)
+        {
+          ((JSONArray) v).write(writer);
+        }
+        else
+        {
+          writer.write(JSONObject.valueToString(v));
+        }
+        b = true;
+      }
+      writer.write(']');
+      return writer;
     }
+    catch (IOException e)
+    {
+      throw new JSONException(e);
+    }
+  }
 }
\ No newline at end of file

Modified: projects/gwt-console/trunk/war/src/main/java/org/json/JSONException.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/JSONException.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/JSONException.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -2,26 +2,32 @@
 
 /**
  * The JSONException is thrown by the JSON.org classes then things are amiss.
+ *
  * @author JSON.org
  * @version 2008-09-18
  */
-public class JSONException extends Exception {
-    private Throwable cause;
+public class JSONException extends Exception
+{
+  private Throwable cause;
 
-    /**
-     * Constructs a JSONException with an explanatory message.
-     * @param message Detail about the reason for the exception.
-     */
-    public JSONException(String message) {
-        super(message);
-    }
+  /**
+   * Constructs a JSONException with an explanatory message.
+   *
+   * @param message Detail about the reason for the exception.
+   */
+  public JSONException(String message)
+  {
+    super(message);
+  }
 
-    public JSONException(Throwable t) {
-        super(t.getMessage());
-        this.cause = t;
-    }
+  public JSONException(Throwable t)
+  {
+    super(t.getMessage());
+    this.cause = t;
+  }
 
-    public Throwable getCause() {
-        return this.cause;
-    }
+  public Throwable getCause()
+  {
+    return this.cause;
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/json/JSONML.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/JSONML.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/JSONML.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -28,420 +28,526 @@
 
 
 /**
- * This provides static methods to convert an XML text into a JSONArray or 
- * JSONObject, and to covert a JSONArray or JSONObject into an XML text using 
+ * This provides static methods to convert an XML text into a JSONArray or
+ * JSONObject, and to covert a JSONArray or JSONObject into an XML text using
  * the JsonML transform.
+ *
  * @author JSON.org
  * @version 2008-09-18
  */
-public class JSONML {
-		
-    /**
-     * Parse XML values and store them in a JSONArray.
-     * @param x       The XMLTokener containing the source string.
-     * @param arrayForm true if array form, false if object form.
-     * @param ja      The JSONArray that is containing the current tag or null
-     *     if we are at the outermost level.
-     * @return A JSONArray if the value is the outermost tag, otherwise null.
-     * @throws JSONException
-     */
-    private static Object parse(XMLTokener x, boolean arrayForm, 
-    		JSONArray ja) throws JSONException {
-        String     attribute;
-        char       c;
-        String	   closeTag = null;
-        int        i;
-        JSONArray  newja = null;
-        JSONObject newjo = null;
-        Object     token;
-        String	   tagName = null;
-        
+public class JSONML
+{
+
+  /**
+   * Parse XML values and store them in a JSONArray.
+   *
+   * @param x         The XMLTokener containing the source string.
+   * @param arrayForm true if array form, false if object form.
+   * @param ja        The JSONArray that is containing the current tag or null
+   *                  if we are at the outermost level.
+   * @return A JSONArray if the value is the outermost tag, otherwise null.
+   * @throws JSONException
+   */
+  private static Object parse(XMLTokener x, boolean arrayForm,
+                              JSONArray ja) throws JSONException
+  {
+    String attribute;
+    char c;
+    String closeTag = null;
+    int i;
+    JSONArray newja = null;
+    JSONObject newjo = null;
+    Object token;
+    String tagName = null;
+
 // Test for and skip past these forms:
 //      <!-- ... -->
 //      <![  ... ]]>
 //      <!   ...   >
 //      <?   ...  ?>
-        
-        while (true) {
-        	token = x.nextContent();
-    		if (token == XML.LT) {
-    			token = x.nextToken();
-    			if (token instanceof Character) {
-			        if (token == XML.SLASH) {
 
+    while (true)
+    {
+      token = x.nextContent();
+      if (token == XML.LT)
+      {
+        token = x.nextToken();
+        if (token instanceof Character)
+        {
+          if (token == XML.SLASH)
+          {
+
 // Close tag </
 
-			        	token = x.nextToken();
-			        	if (!(token instanceof String)) {
-			        		throw new JSONException(
-			        				"Expected a closing name instead of '" + 
-			        				token + "'.");
-			        	}
-			            if (x.nextToken() != XML.GT) {
-			                throw x.syntaxError("Misshaped close tag");
-			            }
-			            return token;
-			        } else if (token == XML.BANG) {
-        		
+            token = x.nextToken();
+            if (!(token instanceof String))
+            {
+              throw new JSONException(
+                  "Expected a closing name instead of '" +
+                      token + "'.");
+            }
+            if (x.nextToken() != XML.GT)
+            {
+              throw x.syntaxError("Misshaped close tag");
+            }
+            return token;
+          }
+          else if (token == XML.BANG)
+          {
+
 // <!
-        	
-			            c = x.next();
-			            if (c == '-') {
-			                if (x.next() == '-') {
-			                    x.skipPast("-->");
-			                }
-			                x.back();
-			            } else if (c == '[') {
-			                token = x.nextToken();
-			                if (token.equals("CDATA") && x.next() == '[') {
-			                	if (ja != null) {
-			                		ja.put(x.nextCDATA());
-			                	}
-			                } else {
-			                	throw x.syntaxError("Expected 'CDATA['");
-			                }
-			            } else {
-				            i = 1;
-				            do {
-				                token = x.nextMeta();
-				                if (token == null) {
-				                    throw x.syntaxError("Missing '>' after '<!'.");
-				                } else if (token == XML.LT) {
-				                    i += 1;
-				                } else if (token == XML.GT) {
-				                    i -= 1;
-				                }
-				            } while (i > 0);
-			            }
-			        } else if (token == XML.QUEST) {
 
+            c = x.next();
+            if (c == '-')
+            {
+              if (x.next() == '-')
+              {
+                x.skipPast("-->");
+              }
+              x.back();
+            }
+            else if (c == '[')
+            {
+              token = x.nextToken();
+              if (token.equals("CDATA") && x.next() == '[')
+              {
+                if (ja != null)
+                {
+                  ja.put(x.nextCDATA());
+                }
+              }
+              else
+              {
+                throw x.syntaxError("Expected 'CDATA['");
+              }
+            }
+            else
+            {
+              i = 1;
+              do
+              {
+                token = x.nextMeta();
+                if (token == null)
+                {
+                  throw x.syntaxError("Missing '>' after '<!'.");
+                }
+                else if (token == XML.LT)
+                {
+                  i += 1;
+                }
+                else if (token == XML.GT)
+                {
+                  i -= 1;
+                }
+              }
+              while (i > 0);
+            }
+          }
+          else if (token == XML.QUEST)
+          {
+
 // <?
 
-			        	x.skipPast("?>");
-			        } else {
-			            throw x.syntaxError("Misshaped tag");
-			        }
+            x.skipPast("?>");
+          }
+          else
+          {
+            throw x.syntaxError("Misshaped tag");
+          }
 
 // Open tag <
 
-		        } else {
-		        	if (!(token instanceof String)) {
-			            throw x.syntaxError("Bad tagName '" + token + "'.");		        		
-		        	}
-		        	tagName = (String)token;
-		            newja = new JSONArray();		
-		            newjo = new JSONObject();
-		        	if (arrayForm) {
-			            newja.put(tagName);
-			            if (ja != null) {
-			            	ja.put(newja);
-			            }
-			        } else {
-		        		newjo.put("tagName", tagName);
-		        		if (ja != null) {
-			            	ja.put(newjo);
-			            }
-			        }
-		            token = null;
-		            for (;;) {
-		                if (token == null) {
-		                    token = x.nextToken();
-		                }
-		                if (token == null) {
-		                	throw x.syntaxError("Misshaped tag");
-		                }
-		                if (!(token instanceof String)) {
-		                	break;
-		                }
+        }
+        else
+        {
+          if (!(token instanceof String))
+          {
+            throw x.syntaxError("Bad tagName '" + token + "'.");
+          }
+          tagName = (String) token;
+          newja = new JSONArray();
+          newjo = new JSONObject();
+          if (arrayForm)
+          {
+            newja.put(tagName);
+            if (ja != null)
+            {
+              ja.put(newja);
+            }
+          }
+          else
+          {
+            newjo.put("tagName", tagName);
+            if (ja != null)
+            {
+              ja.put(newjo);
+            }
+          }
+          token = null;
+          for (; ;)
+          {
+            if (token == null)
+            {
+              token = x.nextToken();
+            }
+            if (token == null)
+            {
+              throw x.syntaxError("Misshaped tag");
+            }
+            if (!(token instanceof String))
+            {
+              break;
+            }
 
 //		              attribute = value
 
-	                    attribute = (String)token;
-			        	if (!arrayForm && (attribute == "tagName" || attribute == "childNode")) {
-                            throw x.syntaxError("Reserved attribute.");			        		
-			        	}
-	                    token = x.nextToken();
-	                    if (token == XML.EQ) {
-	                        token = x.nextToken();
-	                        if (!(token instanceof String)) {
-	                            throw x.syntaxError("Missing value");
-	                        }
-	                        newjo.accumulate(attribute, JSONObject.stringToValue((String)token));
-	                        token = null;
-	                    } else {
-	                    	newjo.accumulate(attribute, "");
-	                    }
-		            }
-                    if (arrayForm && newjo.length() > 0) {
-                    	newja.put(newjo);
-                    }
+            attribute = (String) token;
+            if (!arrayForm && (attribute == "tagName" || attribute == "childNode"))
+            {
+              throw x.syntaxError("Reserved attribute.");
+            }
+            token = x.nextToken();
+            if (token == XML.EQ)
+            {
+              token = x.nextToken();
+              if (!(token instanceof String))
+              {
+                throw x.syntaxError("Missing value");
+              }
+              newjo.accumulate(attribute, JSONObject.stringToValue((String) token));
+              token = null;
+            }
+            else
+            {
+              newjo.accumulate(attribute, "");
+            }
+          }
+          if (arrayForm && newjo.length() > 0)
+          {
+            newja.put(newjo);
+          }
 
 // Empty tag <.../>
 
-	                if (token == XML.SLASH) {
-	                    if (x.nextToken() != XML.GT) {
-	                        throw x.syntaxError("Misshaped tag");
-	                    }
-	                    if (ja == null) {
-	                    	return arrayForm ? newja : newjo;
-	                    }
+          if (token == XML.SLASH)
+          {
+            if (x.nextToken() != XML.GT)
+            {
+              throw x.syntaxError("Misshaped tag");
+            }
+            if (ja == null)
+            {
+              return arrayForm ? newja : newjo;
+            }
 
 // Content, between <...> and </...>
 
-	                } else {
-	                	if (token != XML.GT) {
-	                		throw x.syntaxError("Misshaped tag");
-	                	}
-	                	closeTag = (String)parse(x, arrayForm, newja);
-	                	if (closeTag != null) {
-		                	if (!closeTag.equals(tagName)) {
-		                		throw x.syntaxError("Mismatched '" + tagName + 
-		                				"' and '" + closeTag + "'");
-					        }
-		                	tagName = null;
-		            		if (!arrayForm && newja.length() > 0) {
-		            			newjo.put("childNodes", newja);
-		            		}
-		                	if (ja == null) {
-		                		return arrayForm ? newja : newjo;
-		                	}
-	                	}
-                	}
-	            }
-		    } else {
-		    	if (ja != null) {
-		    		ja.put(token instanceof String ? 
-		    				JSONObject.stringToValue((String)token) : token);
-		    	}
-		    }
+          }
+          else
+          {
+            if (token != XML.GT)
+            {
+              throw x.syntaxError("Misshaped tag");
+            }
+            closeTag = (String) parse(x, arrayForm, newja);
+            if (closeTag != null)
+            {
+              if (!closeTag.equals(tagName))
+              {
+                throw x.syntaxError("Mismatched '" + tagName +
+                    "' and '" + closeTag + "'");
+              }
+              tagName = null;
+              if (!arrayForm && newja.length() > 0)
+              {
+                newjo.put("childNodes", newja);
+              }
+              if (ja == null)
+              {
+                return arrayForm ? newja : newjo;
+              }
+            }
+          }
         }
+      }
+      else
+      {
+        if (ja != null)
+        {
+          ja.put(token instanceof String ?
+              JSONObject.stringToValue((String) token) : token);
+        }
+      }
     }
+  }
 
 
-    /**
-     * Convert a well-formed (but not necessarily valid) XML string into a
-     * JSONArray using the JsonML transform. Each XML tag is represented as
-     * a JSONArray in which the first element is the tag name. If the tag has
-     * attributes, then the second element will be JSONObject containing the
-     * name/value pairs. If the tag contains children, then strings and
-     * JSONArrays will represent the child tags.
-     * Comments, prologs, DTDs, and <code>&lt;[ [ ]]></code> are ignored.
-     * @param string The source string.
-     * @return A JSONArray containing the structured data from the XML string.
-     * @throws JSONException
-     */
-    public static JSONArray toJSONArray(String string) throws JSONException {
-    	return toJSONArray(new XMLTokener(string));
-    }
+  /**
+   * Convert a well-formed (but not necessarily valid) XML string into a
+   * JSONArray using the JsonML transform. Each XML tag is represented as
+   * a JSONArray in which the first element is the tag name. If the tag has
+   * attributes, then the second element will be JSONObject containing the
+   * name/value pairs. If the tag contains children, then strings and
+   * JSONArrays will represent the child tags.
+   * Comments, prologs, DTDs, and <code>&lt;[ [ ]]></code> are ignored.
+   *
+   * @param string The source string.
+   * @return A JSONArray containing the structured data from the XML string.
+   * @throws JSONException
+   */
+  public static JSONArray toJSONArray(String string) throws JSONException
+  {
+    return toJSONArray(new XMLTokener(string));
+  }
 
 
-    /**
-     * Convert a well-formed (but not necessarily valid) XML string into a
-     * JSONArray using the JsonML transform. Each XML tag is represented as
-     * a JSONArray in which the first element is the tag name. If the tag has
-     * attributes, then the second element will be JSONObject containing the
-     * name/value pairs. If the tag contains children, then strings and
-     * JSONArrays will represent the child content and tags.
-     * Comments, prologs, DTDs, and <code>&lt;[ [ ]]></code> are ignored.
-     * @param x An XMLTokener.
-     * @return A JSONArray containing the structured data from the XML string.
-     * @throws JSONException
-     */
-    public static JSONArray toJSONArray(XMLTokener x) throws JSONException {
-    	return (JSONArray)parse(x, true, null);
-    }
+  /**
+   * Convert a well-formed (but not necessarily valid) XML string into a
+   * JSONArray using the JsonML transform. Each XML tag is represented as
+   * a JSONArray in which the first element is the tag name. If the tag has
+   * attributes, then the second element will be JSONObject containing the
+   * name/value pairs. If the tag contains children, then strings and
+   * JSONArrays will represent the child content and tags.
+   * Comments, prologs, DTDs, and <code>&lt;[ [ ]]></code> are ignored.
+   *
+   * @param x An XMLTokener.
+   * @return A JSONArray containing the structured data from the XML string.
+   * @throws JSONException
+   */
+  public static JSONArray toJSONArray(XMLTokener x) throws JSONException
+  {
+    return (JSONArray) parse(x, true, null);
+  }
 
 
-    
-    /**
-     * Convert a well-formed (but not necessarily valid) XML string into a
-     * JSONObject using the JsonML transform. Each XML tag is represented as
-     * a JSONObject with a "tagName" property. If the tag has attributes, then 
-     * the attributes will be in the JSONObject as properties. If the tag 
-     * contains children, the object will have a "childNodes" property which 
-     * will be an array of strings and JsonML JSONObjects.
+  /**
+   * Convert a well-formed (but not necessarily valid) XML string into a
+   * JSONObject using the JsonML transform. Each XML tag is represented as
+   * a JSONObject with a "tagName" property. If the tag has attributes, then
+   * the attributes will be in the JSONObject as properties. If the tag
+   * contains children, the object will have a "childNodes" property which
+   * will be an array of strings and JsonML JSONObjects.
+   * <p/>
+   * Comments, prologs, DTDs, and <code>&lt;[ [ ]]></code> are ignored.
+   *
+   * @param x An XMLTokener of the XML source text.
+   * @return A JSONObject containing the structured data from the XML string.
+   * @throws JSONException
+   */
+  public static JSONObject toJSONObject(XMLTokener x) throws JSONException
+  {
+    return (JSONObject) parse(x, false, null);
+  }
 
-     * Comments, prologs, DTDs, and <code>&lt;[ [ ]]></code> are ignored.
-     * @param x An XMLTokener of the XML source text.
-     * @return A JSONObject containing the structured data from the XML string.
-     * @throws JSONException
-     */
-    public static JSONObject toJSONObject(XMLTokener x) throws JSONException {
-       	return (JSONObject)parse(x, false, null);
-    }
-    /**
-     * Convert a well-formed (but not necessarily valid) XML string into a
-     * JSONObject using the JsonML transform. Each XML tag is represented as
-     * a JSONObject with a "tagName" property. If the tag has attributes, then 
-     * the attributes will be in the JSONObject as properties. If the tag 
-     * contains children, the object will have a "childNodes" property which 
-     * will be an array of strings and JsonML JSONObjects.
+  /**
+   * Convert a well-formed (but not necessarily valid) XML string into a
+   * JSONObject using the JsonML transform. Each XML tag is represented as
+   * a JSONObject with a "tagName" property. If the tag has attributes, then
+   * the attributes will be in the JSONObject as properties. If the tag
+   * contains children, the object will have a "childNodes" property which
+   * will be an array of strings and JsonML JSONObjects.
+   * <p/>
+   * Comments, prologs, DTDs, and <code>&lt;[ [ ]]></code> are ignored.
+   *
+   * @param string The XML source text.
+   * @return A JSONObject containing the structured data from the XML string.
+   * @throws JSONException
+   */
+  public static JSONObject toJSONObject(String string) throws JSONException
+  {
+    return toJSONObject(new XMLTokener(string));
+  }
 
-     * Comments, prologs, DTDs, and <code>&lt;[ [ ]]></code> are ignored.
-     * @param string The XML source text.
-     * @return A JSONObject containing the structured data from the XML string.
-     * @throws JSONException
-     */
-    public static JSONObject toJSONObject(String string) throws JSONException {
-    	return toJSONObject(new XMLTokener(string));
-    }
 
+  /**
+   * Reverse the JSONML transformation, making an XML text from a JSONArray.
+   *
+   * @param ja A JSONArray.
+   * @return An XML string.
+   * @throws JSONException
+   */
+  public static String toString(JSONArray ja) throws JSONException
+  {
+    Object e;
+    int i;
+    JSONObject jo;
+    String k;
+    Iterator keys;
+    int length;
+    StringBuffer sb = new StringBuffer();
+    String tagName;
+    String v;
 
-    /**
-     * Reverse the JSONML transformation, making an XML text from a JSONArray.
-     * @param ja A JSONArray.
-     * @return An XML string.
-     * @throws JSONException
-     */
-    public static String toString(JSONArray ja) throws JSONException {
-    	Object		 e;
-    	int			 i;
-    	JSONObject   jo;
-    	String       k;
-	    Iterator     keys;
-	    int			 length;
-    	StringBuffer sb = new StringBuffer();
-	    String       tagName;
-	    String       v;
-	    
 // Emit <tagName	    
-    	
-    	tagName = ja.getString(0);
-		XML.noSpace(tagName);
-		tagName = XML.escape(tagName);
-		sb.append('<');
-		sb.append(tagName);
-		
-		e = ja.opt(1);
-		if (e instanceof JSONObject) {
-			i = 2;
-			jo = (JSONObject)e;
-			
+
+    tagName = ja.getString(0);
+    XML.noSpace(tagName);
+    tagName = XML.escape(tagName);
+    sb.append('<');
+    sb.append(tagName);
+
+    e = ja.opt(1);
+    if (e instanceof JSONObject)
+    {
+      i = 2;
+      jo = (JSONObject) e;
+
 // Emit the attributes
-			
-	        keys = jo.keys();
-	        while (keys.hasNext()) {
-	            k = keys.next().toString();
-            	XML.noSpace(k);
-	            v = jo.optString(k);
-	            if (v != null) {
-		            sb.append(' ');
-		            sb.append(XML.escape(k));
-		            sb.append('=');
-		            sb.append('"');
-		            sb.append(XML.escape(v));
-		            sb.append('"');
-	            }
-	        }  
-		} else {
-			i = 1;
-		}
-	     	
+
+      keys = jo.keys();
+      while (keys.hasNext())
+      {
+        k = keys.next().toString();
+        XML.noSpace(k);
+        v = jo.optString(k);
+        if (v != null)
+        {
+          sb.append(' ');
+          sb.append(XML.escape(k));
+          sb.append('=');
+          sb.append('"');
+          sb.append(XML.escape(v));
+          sb.append('"');
+        }
+      }
+    }
+    else
+    {
+      i = 1;
+    }
+
 //Emit content in body
-	    	
-		length = ja.length();
-		if (i >= length) {
-	        sb.append('/');
-	        sb.append('>');
-		} else {
-	        sb.append('>');
-			do {
-			    e = ja.get(i);
-			    i += 1;
-			    if (e != null) {
-			    	if (e instanceof String) {
-			    		sb.append(XML.escape(e.toString()));
-					} else if (e instanceof JSONObject) {
-						sb.append(toString((JSONObject)e));
-					} else if (e instanceof JSONArray) {
-						sb.append(toString((JSONArray)e));
-					}
-			    }
-			} while (i < length);
-			sb.append('<');
-	        sb.append('/');
-			sb.append(tagName);
-	        sb.append('>');
-	    }
-        return sb.toString();
+
+    length = ja.length();
+    if (i >= length)
+    {
+      sb.append('/');
+      sb.append('>');
     }
-    
-    /**
-     * Reverse the JSONML transformation, making an XML text from a JSONObject.
-     * The JSONObject must contain a "tagName" property. If it has children, 
-     * then it must have a "childNodes" property containing an array of objects. 
-     * The other properties are attributes with string values.
-     * @param jo A JSONObject.
-     * @return An XML string.
-     * @throws JSONException
-     */
-	public static String toString(JSONObject jo) throws JSONException {
-	    StringBuffer sb = new StringBuffer();
-	    Object		 e;
-	    int          i;
-	    JSONArray    ja;
-	    String       k;
-	    Iterator     keys;
-	    int          len;
-	    String       tagName;
-	    String       v;
-	
+    else
+    {
+      sb.append('>');
+      do
+      {
+        e = ja.get(i);
+        i += 1;
+        if (e != null)
+        {
+          if (e instanceof String)
+          {
+            sb.append(XML.escape(e.toString()));
+          }
+          else if (e instanceof JSONObject)
+          {
+            sb.append(toString((JSONObject) e));
+          }
+          else if (e instanceof JSONArray)
+          {
+            sb.append(toString((JSONArray) e));
+          }
+        }
+      }
+      while (i < length);
+      sb.append('<');
+      sb.append('/');
+      sb.append(tagName);
+      sb.append('>');
+    }
+    return sb.toString();
+  }
+
+  /**
+   * Reverse the JSONML transformation, making an XML text from a JSONObject.
+   * The JSONObject must contain a "tagName" property. If it has children,
+   * then it must have a "childNodes" property containing an array of objects.
+   * The other properties are attributes with string values.
+   *
+   * @param jo A JSONObject.
+   * @return An XML string.
+   * @throws JSONException
+   */
+  public static String toString(JSONObject jo) throws JSONException
+  {
+    StringBuffer sb = new StringBuffer();
+    Object e;
+    int i;
+    JSONArray ja;
+    String k;
+    Iterator keys;
+    int len;
+    String tagName;
+    String v;
+
 //Emit <tagName
-	
-		tagName = jo.optString("tagName");
-		if (tagName == null) {
-			return XML.escape(jo.toString());
-		}
-		XML.noSpace(tagName);
-		tagName = XML.escape(tagName);
-		sb.append('<');
-		sb.append(tagName);
-	
+
+    tagName = jo.optString("tagName");
+    if (tagName == null)
+    {
+      return XML.escape(jo.toString());
+    }
+    XML.noSpace(tagName);
+    tagName = XML.escape(tagName);
+    sb.append('<');
+    sb.append(tagName);
+
 //Emit the attributes
-	
-        keys = jo.keys();
-        while (keys.hasNext()) {
-            k = keys.next().toString();
-            if (!k.equals("tagName") && !k.equals("childNodes")) {
-            	XML.noSpace(k);
-	            v = jo.optString(k);
-	            if (v != null) {
-		            sb.append(' ');
-		            sb.append(XML.escape(k));
-		            sb.append('=');
-		            sb.append('"');
-		            sb.append(XML.escape(v));
-		            sb.append('"');
-	            }
-            }
-        }    
-		     	
+
+    keys = jo.keys();
+    while (keys.hasNext())
+    {
+      k = keys.next().toString();
+      if (!k.equals("tagName") && !k.equals("childNodes"))
+      {
+        XML.noSpace(k);
+        v = jo.optString(k);
+        if (v != null)
+        {
+          sb.append(' ');
+          sb.append(XML.escape(k));
+          sb.append('=');
+          sb.append('"');
+          sb.append(XML.escape(v));
+          sb.append('"');
+        }
+      }
+    }
+
 //Emit content in body
-	
-		ja = jo.optJSONArray("childNodes");
-		if (ja == null) {
-	        sb.append('/');
-	        sb.append('>');
-		} else {
-	        sb.append('>');
-			len = ja.length();
-			for (i = 0; i < len; i += 1) {
-			    e = ja.get(i);
-			    if (e != null) {
-			    	if (e instanceof String) {
-			    		sb.append(XML.escape(e.toString()));
-					} else if (e instanceof JSONObject) {
-						sb.append(toString((JSONObject)e));
-					} else if (e instanceof JSONArray) {
-						sb.append(toString((JSONArray)e));
-					}
-			    }
-			}
-			sb.append('<');
-	        sb.append('/');
-			sb.append(tagName);
-	        sb.append('>');
-	    }
-        return sb.toString();
+
+    ja = jo.optJSONArray("childNodes");
+    if (ja == null)
+    {
+      sb.append('/');
+      sb.append('>');
     }
+    else
+    {
+      sb.append('>');
+      len = ja.length();
+      for (i = 0; i < len; i += 1)
+      {
+        e = ja.get(i);
+        if (e != null)
+        {
+          if (e instanceof String)
+          {
+            sb.append(XML.escape(e.toString()));
+          }
+          else if (e instanceof JSONObject)
+          {
+            sb.append(toString((JSONObject) e));
+          }
+          else if (e instanceof JSONArray)
+          {
+            sb.append(toString((JSONArray) e));
+          }
+        }
+      }
+      sb.append('<');
+      sb.append('/');
+      sb.append(tagName);
+      sb.append('>');
+    }
+    return sb.toString();
+    }
 }
\ No newline at end of file

Modified: projects/gwt-console/trunk/war/src/main/java/org/json/JSONObject.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/JSONObject.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/JSONObject.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -51,1500 +51,1782 @@
  * exception if one cannot be found. An <code>opt</code> method returns a
  * default value instead of throwing an exception, and so is useful for
  * obtaining optional values.
- * <p>
+ * <p/>
  * The generic <code>get()</code> and <code>opt()</code> methods return an
  * object, which you can cast or query for type. There are also typed
  * <code>get</code> and <code>opt</code> methods that do type checking and type
  * coercion for you.
- * <p>
+ * <p/>
  * The <code>put</code> methods adds values to an object. For example, <pre>
  *     myString = new JSONObject().put("JSON", "Hello, World!").toString();</pre>
  * produces the string <code>{"JSON": "Hello, World"}</code>.
- * <p>
+ * <p/>
  * The texts produced by the <code>toString</code> methods strictly conform to
  * the JSON syntax rules.
  * The constructors are more forgiving in the texts they will accept:
  * <ul>
  * <li>An extra <code>,</code>&nbsp;<small>(comma)</small> may appear just
- *     before the closing brace.</li>
+ * before the closing brace.</li>
  * <li>Strings may be quoted with <code>'</code>&nbsp;<small>(single
- *     quote)</small>.</li>
+ * quote)</small>.</li>
  * <li>Strings do not need to be quoted at all if they do not begin with a quote
- *     or single quote, and if they do not contain leading or trailing spaces,
- *     and if they do not contain any of these characters:
- *     <code>{ } [ ] / \ : , = ; #</code> and if they do not look like numbers
- *     and if they are not the reserved words <code>true</code>,
- *     <code>false</code>, or <code>null</code>.</li>
+ * or single quote, and if they do not contain leading or trailing spaces,
+ * and if they do not contain any of these characters:
+ * <code>{ } [ ] / \ : , = ; #</code> and if they do not look like numbers
+ * and if they are not the reserved words <code>true</code>,
+ * <code>false</code>, or <code>null</code>.</li>
  * <li>Keys can be followed by <code>=</code> or <code>=></code> as well as
- *     by <code>:</code>.</li>
+ * by <code>:</code>.</li>
  * <li>Values can be followed by <code>;</code> <small>(semicolon)</small> as
- *     well as by <code>,</code> <small>(comma)</small>.</li>
+ * well as by <code>,</code> <small>(comma)</small>.</li>
  * <li>Numbers may have the <code>0-</code> <small>(octal)</small> or
- *     <code>0x-</code> <small>(hex)</small> prefix.</li>
+ * <code>0x-</code> <small>(hex)</small> prefix.</li>
  * </ul>
+ *
  * @author JSON.org
  * @version 2008-09-18
  */
-public class JSONObject {
+public class JSONObject
+{
 
+  /**
+   * JSONObject.NULL is equivalent to the value that JavaScript calls null,
+   * whilst Java's null is equivalent to the value that JavaScript calls
+   * undefined.
+   */
+  private static final class Null
+  {
+
     /**
-     * JSONObject.NULL is equivalent to the value that JavaScript calls null,
-     * whilst Java's null is equivalent to the value that JavaScript calls
-     * undefined.
+     * There is only intended to be a single instance of the NULL object,
+     * so the clone method returns itself.
+     *
+     * @return NULL.
      */
-     private static final class Null {
-
-        /**
-         * There is only intended to be a single instance of the NULL object,
-         * so the clone method returns itself.
-         * @return     NULL.
-         */
-        protected final Object clone() {
-            return this;
-        }
-
-
-        /**
-         * A Null object is equal to the null value and to itself.
-         * @param object    An object to test for nullness.
-         * @return true if the object parameter is the JSONObject.NULL object
-         *  or null.
-         */
-        public boolean equals(Object object) {
-            return object == null || object == this;
-        }
-
-
-        /**
-         * Get the "null" string value.
-         * @return The string "null".
-         */
-        public String toString() {
-            return "null";
-        }
+    protected final Object clone()
+    {
+      return this;
     }
 
 
     /**
-     * The map where the JSONObject's properties are kept.
+     * A Null object is equal to the null value and to itself.
+     *
+     * @param object An object to test for nullness.
+     * @return true if the object parameter is the JSONObject.NULL object
+     *         or null.
      */
-    private Map map;
+    public boolean equals(Object object)
+    {
+      return object == null || object == this;
+    }
 
 
     /**
-     * It is sometimes more convenient and less ambiguous to have a
-     * <code>NULL</code> object than to use Java's <code>null</code> value.
-     * <code>JSONObject.NULL.equals(null)</code> returns <code>true</code>.
-     * <code>JSONObject.NULL.toString()</code> returns <code>"null"</code>.
+     * Get the "null" string value.
+     *
+     * @return The string "null".
      */
-    public static final Object NULL = new Null();
-
-
-    /**
-     * Construct an empty JSONObject.
-     */
-    public JSONObject() {
-        this.map = new HashMap();
+    public String toString()
+    {
+      return "null";
     }
+  }
 
 
-    /**
-     * Construct a JSONObject from a subset of another JSONObject.
-     * An array of strings is used to identify the keys that should be copied.
-     * Missing keys are ignored. 
-     * @param jo A JSONObject.
-     * @param names An array of strings.
-     * @exception JSONException If a value is a non-finite number or if a name is duplicated.
-     */
-    public JSONObject(JSONObject jo, String[] names) throws JSONException {
-        this();
-        for (int i = 0; i < names.length; i += 1) {
-            putOnce(names[i], jo.opt(names[i]));
-        }
-    }
+  /**
+   * The map where the JSONObject's properties are kept.
+   */
+  private Map map;
 
 
-    /**
-     * Construct a JSONObject from a JSONTokener.
-     * @param x A JSONTokener object containing the source string.
-     * @throws JSONException If there is a syntax error in the source string 
-     *  or a duplicated key.
-     */
-    public JSONObject(JSONTokener x) throws JSONException {
-        this();
-        char c;
-        String key;
+  /**
+   * It is sometimes more convenient and less ambiguous to have a
+   * <code>NULL</code> object than to use Java's <code>null</code> value.
+   * <code>JSONObject.NULL.equals(null)</code> returns <code>true</code>.
+   * <code>JSONObject.NULL.toString()</code> returns <code>"null"</code>.
+   */
+  public static final Object NULL = new Null();
 
-        if (x.nextClean() != '{') {
-            throw x.syntaxError("A JSONObject text must begin with '{'");
-        }
-        for (;;) {
-            c = x.nextClean();
-            switch (c) {
-            case 0:
-                throw x.syntaxError("A JSONObject text must end with '}'");
-            case '}':
-                return;
-            default:
-                x.back();
-                key = x.nextValue().toString();
-            }
 
-            /*
-             * The key is followed by ':'. We will also tolerate '=' or '=>'.
-             */
+  /**
+   * Construct an empty JSONObject.
+   */
+  public JSONObject()
+  {
+    this.map = new HashMap();
+  }
 
-            c = x.nextClean();
-            if (c == '=') {
-                if (x.next() != '>') {
-                    x.back();
-                }
-            } else if (c != ':') {
-                throw x.syntaxError("Expected a ':' after a key");
-            }
-            putOnce(key, x.nextValue());
 
-            /*
-             * Pairs are separated by ','. We will also tolerate ';'.
-             */
-
-            switch (x.nextClean()) {
-            case ';':
-            case ',':
-                if (x.nextClean() == '}') {
-                    return;
-                }
-                x.back();
-                break;
-            case '}':
-                return;
-            default:
-                throw x.syntaxError("Expected a ',' or '}'");
-            }
-        }
+  /**
+   * Construct a JSONObject from a subset of another JSONObject.
+   * An array of strings is used to identify the keys that should be copied.
+   * Missing keys are ignored.
+   *
+   * @param jo    A JSONObject.
+   * @param names An array of strings.
+   * @throws JSONException If a value is a non-finite number or if a name is duplicated.
+   */
+  public JSONObject(JSONObject jo, String[] names) throws JSONException
+  {
+    this();
+    for (int i = 0; i < names.length; i += 1)
+    {
+      putOnce(names[i], jo.opt(names[i]));
     }
+  }
 
 
-    /**
-     * Construct a JSONObject from a Map.
-     * 
-     * @param map A map object that can be used to initialize the contents of
-     *  the JSONObject.
-     */
-    public JSONObject(Map map) {
-        this.map = (map == null) ? new HashMap() : map;
-    }
+  /**
+   * Construct a JSONObject from a JSONTokener.
+   *
+   * @param x A JSONTokener object containing the source string.
+   * @throws JSONException If there is a syntax error in the source string
+   *                       or a duplicated key.
+   */
+  public JSONObject(JSONTokener x) throws JSONException
+  {
+    this();
+    char c;
+    String key;
 
-    /**
-     * Construct a JSONObject from a Map.
-     * 
-     * Note: Use this constructor when the map contains <key,bean>.
-     * 
-     * @param map - A map with Key-Bean data.
-     * @param includeSuperClass - Tell whether to include the super class properties.
-     */
-    public JSONObject(Map map, boolean includeSuperClass) {
-       	this.map = new HashMap();
-       	if (map != null){
-            for (Iterator i = map.entrySet().iterator(); i.hasNext(); ) {
-                Map.Entry e = (Map.Entry)i.next();
-                this.map.put(e.getKey(), new JSONObject(e.getValue(), includeSuperClass));
-            }
-       	}
+    if (x.nextClean() != '{')
+    {
+      throw x.syntaxError("A JSONObject text must begin with '{'");
     }
+    for (; ;)
+    {
+      c = x.nextClean();
+      switch (c)
+      {
+        case 0:
+          throw x.syntaxError("A JSONObject text must end with '}'");
+        case'}':
+          return;
+        default:
+          x.back();
+          key = x.nextValue().toString();
+      }
 
-    
-    /**
-     * Construct a JSONObject from an Object using bean getters.
-     * It reflects on all of the public methods of the object.
-     * For each of the methods with no parameters and a name starting
-     * with <code>"get"</code> or <code>"is"</code> followed by an uppercase letter,
-     * the method is invoked, and a key and the value returned from the getter method
-     * are put into the new JSONObject.
-     *
-     * The key is formed by removing the <code>"get"</code> or <code>"is"</code> prefix. If the second remaining
-     * character is not upper case, then the first
-     * character is converted to lower case.
-     *
-     * For example, if an object has a method named <code>"getName"</code>, and
-     * if the result of calling <code>object.getName()</code> is <code>"Larry Fine"</code>,
-     * then the JSONObject will contain <code>"name": "Larry Fine"</code>.
-     *
-     * @param bean An object that has getter methods that should be used
-     * to make a JSONObject.
-     */
-    public JSONObject(Object bean) {
-    	this();
-        populateInternalMap(bean, false);
-    }
-    
-    
-    /**
-     * Construct JSONObject from the given bean. This will also create JSONObject
-     * for all internal object (List, Map, Inner Objects) of the provided bean.
-     * 
-     * -- See Documentation of JSONObject(Object bean) also.
-     * 
-     * @param bean An object that has getter methods that should be used
-     * to make a JSONObject.
-     * @param includeSuperClass - Tell whether to include the super class properties.
-     */
-    public JSONObject(Object bean, boolean includeSuperClass) {
-    	this();
-        populateInternalMap(bean, includeSuperClass);
-    }
-    
-    private void populateInternalMap(Object bean, boolean includeSuperClass){
-    	Class klass = bean.getClass();
-    	
-        //If klass.getSuperClass is System class then includeSuperClass = false;
-    	
-    	if (klass.getClassLoader() == null) {
-    		includeSuperClass = false;
-    	}
-    	
-    	Method[] methods = (includeSuperClass) ? 
-    			klass.getMethods() : klass.getDeclaredMethods();
-        for (int i = 0; i < methods.length; i += 1) {
-            try {
-                Method method = methods[i];
-                String name = method.getName();
-                String key = "";
-                if (name.startsWith("get")) {
-                    key = name.substring(3);
-                } else if (name.startsWith("is")) {
-                    key = name.substring(2);
-                }
-                if (key.length() > 0 &&
-                        Character.isUpperCase(key.charAt(0)) &&
-                        method.getParameterTypes().length == 0) {
-                    if (key.length() == 1) {
-                        key = key.toLowerCase();
-                    } else if (!Character.isUpperCase(key.charAt(1))) {
-                        key = key.substring(0, 1).toLowerCase() +
-                            key.substring(1);
-                    }
-                    
-                    Object result = method.invoke(bean, (Object[])null);
-                    if (result == null){
-                    	map.put(key, NULL);
-                    }else if (result.getClass().isArray()) {
-                    	map.put(key, new JSONArray(result,includeSuperClass));
-                    }else if (result instanceof Collection) { //List or Set
-                    	map.put(key, new JSONArray((Collection)result,includeSuperClass));
-                    }else if (result instanceof Map) {
-                    	map.put(key, new JSONObject((Map)result,includeSuperClass));
-                    }else if (isStandardProperty(result.getClass())) { //Primitives, String and Wrapper
-                    	map.put(key, result);
-                    }else{
-                    	if (result.getClass().getPackage().getName().startsWith("java") || 
-                    			result.getClass().getClassLoader() == null) { 
-                    		map.put(key, result.toString());
-                    	} else { //User defined Objects
-                    		map.put(key, new JSONObject(result,includeSuperClass));
-                    	}
-                    }
-                }
-            } catch (Exception e) {
-            	throw new RuntimeException(e);
-            }
+      /*
+      * The key is followed by ':'. We will also tolerate '=' or '=>'.
+      */
+
+      c = x.nextClean();
+      if (c == '=')
+      {
+        if (x.next() != '>')
+        {
+          x.back();
         }
-    }
-    
-    private boolean isStandardProperty(Class clazz) {
-    	return clazz.isPrimitive()                  ||
-    		clazz.isAssignableFrom(Byte.class)      ||
-    		clazz.isAssignableFrom(Short.class)     ||
-    		clazz.isAssignableFrom(Integer.class)   ||
-    		clazz.isAssignableFrom(Long.class)      ||
-    		clazz.isAssignableFrom(Float.class)     ||
-    		clazz.isAssignableFrom(Double.class)    ||
-    		clazz.isAssignableFrom(Character.class) ||
-    		clazz.isAssignableFrom(String.class)    ||
-    		clazz.isAssignableFrom(Boolean.class);
-    }
+      }
+      else if (c != ':')
+      {
+        throw x.syntaxError("Expected a ':' after a key");
+      }
+      putOnce(key, x.nextValue());
 
- 	/**
-     * Construct a JSONObject from an Object, using reflection to find the
-     * public members. The resulting JSONObject's keys will be the strings
-     * from the names array, and the values will be the field values associated
-     * with those keys in the object. If a key is not found or not visible,
-     * then it will not be copied into the new JSONObject.
-     * @param object An object that has fields that should be used to make a
-     * JSONObject.
-     * @param names An array of strings, the names of the fields to be obtained
-     * from the object.
-     */
-    public JSONObject(Object object, String names[]) {
-        this();
-        Class c = object.getClass();
-        for (int i = 0; i < names.length; i += 1) {
-            String name = names[i];
-        	try {
-                putOpt(name, c.getField(name).get(object));
-        	} catch (Exception e) {
-                /* forget about it */
-            }
-        }    
+      /*
+      * Pairs are separated by ','. We will also tolerate ';'.
+      */
+
+      switch (x.nextClean())
+      {
+        case';':
+        case',':
+          if (x.nextClean() == '}')
+          {
+            return;
+          }
+          x.back();
+          break;
+        case'}':
+          return;
+        default:
+          throw x.syntaxError("Expected a ',' or '}'");
+      }
     }
+  }
 
 
-    /**
-     * Construct a JSONObject from a source JSON text string.
-     * This is the most commonly used JSONObject constructor.
-     * @param source    A string beginning
-     *  with <code>{</code>&nbsp;<small>(left brace)</small> and ending
-     *  with <code>}</code>&nbsp;<small>(right brace)</small>.
-     * @exception JSONException If there is a syntax error in the source 
-     *  string or a duplicated key.
-     */
-    public JSONObject(String source) throws JSONException {
-        this(new JSONTokener(source));
+  /**
+   * Construct a JSONObject from a Map.
+   *
+   * @param map A map object that can be used to initialize the contents of
+   *            the JSONObject.
+   */
+  public JSONObject(Map map)
+  {
+    this.map = (map == null) ? new HashMap() : map;
+  }
+
+  /**
+   * Construct a JSONObject from a Map.
+   * <p/>
+   * Note: Use this constructor when the map contains <key,bean>.
+   *
+   * @param map               - A map with Key-Bean data.
+   * @param includeSuperClass - Tell whether to include the super class properties.
+   */
+  public JSONObject(Map map, boolean includeSuperClass)
+  {
+    this.map = new HashMap();
+    if (map != null)
+    {
+      for (Iterator i = map.entrySet().iterator(); i.hasNext();)
+      {
+        Map.Entry e = (Map.Entry) i.next();
+        this.map.put(e.getKey(), new JSONObject(e.getValue(), includeSuperClass));
+      }
     }
+  }
 
 
-    /**
-     * Accumulate values under a key. It is similar to the put method except
-     * that if there is already an object stored under the key then a
-     * JSONArray is stored under the key to hold all of the accumulated values.
-     * If there is already a JSONArray, then the new value is appended to it.
-     * In contrast, the put method replaces the previous value.
-     * @param key   A key string.
-     * @param value An object to be accumulated under the key.
-     * @return this.
-     * @throws JSONException If the value is an invalid number
-     *  or if the key is null.
-     */
-    public JSONObject accumulate(String key, Object value)
-            throws JSONException {
-        testValidity(value);
-        Object o = opt(key);
-        if (o == null) {
-            put(key, value instanceof JSONArray ?
-                    new JSONArray().put(value) :
-                    value);
-        } else if (o instanceof JSONArray) {
-            ((JSONArray)o).put(value);
-        } else {
-            put(key, new JSONArray().put(o).put(value));
-        }
-        return this;
-    }
+  /**
+   * Construct a JSONObject from an Object using bean getters.
+   * It reflects on all of the public methods of the object.
+   * For each of the methods with no parameters and a name starting
+   * with <code>"get"</code> or <code>"is"</code> followed by an uppercase letter,
+   * the method is invoked, and a key and the value returned from the getter method
+   * are put into the new JSONObject.
+   * <p/>
+   * The key is formed by removing the <code>"get"</code> or <code>"is"</code> prefix. If the second remaining
+   * character is not upper case, then the first
+   * character is converted to lower case.
+   * <p/>
+   * For example, if an object has a method named <code>"getName"</code>, and
+   * if the result of calling <code>object.getName()</code> is <code>"Larry Fine"</code>,
+   * then the JSONObject will contain <code>"name": "Larry Fine"</code>.
+   *
+   * @param bean An object that has getter methods that should be used
+   *             to make a JSONObject.
+   */
+  public JSONObject(Object bean)
+  {
+    this();
+    populateInternalMap(bean, false);
+  }
 
 
-    /**
-     * Append values to the array under a key. If the key does not exist in the
-     * JSONObject, then the key is put in the JSONObject with its value being a
-     * JSONArray containing the value parameter. If the key was already
-     * associated with a JSONArray, then the value parameter is appended to it.
-     * @param key   A key string.
-     * @param value An object to be accumulated under the key.
-     * @return this.
-     * @throws JSONException If the key is null or if the current value
-     *  associated with the key is not a JSONArray.
-     */
-    public JSONObject append(String key, Object value)
-            throws JSONException {
-        testValidity(value);
-        Object o = opt(key);
-        if (o == null) {
-            put(key, new JSONArray().put(value));
-        } else if (o instanceof JSONArray) {
-            put(key, ((JSONArray)o).put(value));
-        } else {
-            throw new JSONException("JSONObject[" + key +
-                    "] is not a JSONArray.");
-        }
-        return this;
+  /**
+   * Construct JSONObject from the given bean. This will also create JSONObject
+   * for all internal object (List, Map, Inner Objects) of the provided bean.
+   * <p/>
+   * -- See Documentation of JSONObject(Object bean) also.
+   *
+   * @param bean              An object that has getter methods that should be used
+   *                          to make a JSONObject.
+   * @param includeSuperClass - Tell whether to include the super class properties.
+   */
+  public JSONObject(Object bean, boolean includeSuperClass)
+  {
+    this();
+    populateInternalMap(bean, includeSuperClass);
+  }
+
+  private void populateInternalMap(Object bean, boolean includeSuperClass)
+  {
+    Class klass = bean.getClass();
+
+    //If klass.getSuperClass is System class then includeSuperClass = false;
+
+    if (klass.getClassLoader() == null)
+    {
+      includeSuperClass = false;
     }
 
-
-    /**
-     * Produce a string from a double. The string "null" will be returned if
-     * the number is not finite.
-     * @param  d A double.
-     * @return A String.
-     */
-    static public String doubleToString(double d) {
-        if (Double.isInfinite(d) || Double.isNaN(d)) {
-            return "null";
+    Method[] methods = (includeSuperClass) ?
+        klass.getMethods() : klass.getDeclaredMethods();
+    for (int i = 0; i < methods.length; i += 1)
+    {
+      try
+      {
+        Method method = methods[i];
+        String name = method.getName();
+        String key = "";
+        if (name.startsWith("get"))
+        {
+          key = name.substring(3);
         }
+        else if (name.startsWith("is"))
+        {
+          key = name.substring(2);
+        }
+        if (key.length() > 0 &&
+            Character.isUpperCase(key.charAt(0)) &&
+            method.getParameterTypes().length == 0)
+        {
+          if (key.length() == 1)
+          {
+            key = key.toLowerCase();
+          }
+          else if (!Character.isUpperCase(key.charAt(1)))
+          {
+            key = key.substring(0, 1).toLowerCase() +
+                key.substring(1);
+          }
 
-// Shave off trailing zeros and decimal point, if possible.
-
-        String s = Double.toString(d);
-        if (s.indexOf('.') > 0 && s.indexOf('e') < 0 && s.indexOf('E') < 0) {
-            while (s.endsWith("0")) {
-                s = s.substring(0, s.length() - 1);
+          Object result = method.invoke(bean, (Object[]) null);
+          if (result == null)
+          {
+            map.put(key, NULL);
+          }
+          else if (result.getClass().isArray())
+          {
+            map.put(key, new JSONArray(result, includeSuperClass));
+          }
+          else if (result instanceof Collection)
+          { //List or Set
+            map.put(key, new JSONArray((Collection) result, includeSuperClass));
+          }
+          else if (result instanceof Map)
+          {
+            map.put(key, new JSONObject((Map) result, includeSuperClass));
+          }
+          else if (isStandardProperty(result.getClass()))
+          { //Primitives, String and Wrapper
+            map.put(key, result);
+          }
+          else
+          {
+            if (result.getClass().getPackage().getName().startsWith("java") ||
+                result.getClass().getClassLoader() == null)
+            {
+              map.put(key, result.toString());
             }
-            if (s.endsWith(".")) {
-                s = s.substring(0, s.length() - 1);
+            else
+            { //User defined Objects
+              map.put(key, new JSONObject(result, includeSuperClass));
             }
+          }
         }
-        return s;
+      }
+      catch (Exception e)
+      {
+        throw new RuntimeException(e);
+      }
     }
+  }
 
+  private boolean isStandardProperty(Class clazz)
+  {
+    return clazz.isPrimitive() ||
+        clazz.isAssignableFrom(Byte.class) ||
+        clazz.isAssignableFrom(Short.class) ||
+        clazz.isAssignableFrom(Integer.class) ||
+        clazz.isAssignableFrom(Long.class) ||
+        clazz.isAssignableFrom(Float.class) ||
+        clazz.isAssignableFrom(Double.class) ||
+        clazz.isAssignableFrom(Character.class) ||
+        clazz.isAssignableFrom(String.class) ||
+        clazz.isAssignableFrom(Boolean.class);
+  }
 
-    /**
-     * Get the value object associated with a key.
-     *
-     * @param key   A key string.
-     * @return      The object associated with the key.
-     * @throws   JSONException if the key is not found.
-     */
-    public Object get(String key) throws JSONException {
-        Object o = opt(key);
-        if (o == null) {
-            throw new JSONException("JSONObject[" + quote(key) +
-                    "] not found.");
-        }
-        return o;
+  /**
+   * Construct a JSONObject from an Object, using reflection to find the
+   * public members. The resulting JSONObject's keys will be the strings
+   * from the names array, and the values will be the field values associated
+   * with those keys in the object. If a key is not found or not visible,
+   * then it will not be copied into the new JSONObject.
+   *
+   * @param object An object that has fields that should be used to make a
+   *               JSONObject.
+   * @param names  An array of strings, the names of the fields to be obtained
+   *               from the object.
+   */
+  public JSONObject(Object object, String names[])
+  {
+    this();
+    Class c = object.getClass();
+    for (int i = 0; i < names.length; i += 1)
+    {
+      String name = names[i];
+      try
+      {
+        putOpt(name, c.getField(name).get(object));
+      }
+      catch (Exception e)
+      {
+        /* forget about it */
+      }
     }
+  }
 
 
-    /**
-     * Get the boolean value associated with a key.
-     *
-     * @param key   A key string.
-     * @return      The truth.
-     * @throws   JSONException
-     *  if the value is not a Boolean or the String "true" or "false".
-     */
-    public boolean getBoolean(String key) throws JSONException {
-        Object o = get(key);
-        if (o.equals(Boolean.FALSE) ||
-                (o instanceof String &&
-                ((String)o).equalsIgnoreCase("false"))) {
-            return false;
-        } else if (o.equals(Boolean.TRUE) ||
-                (o instanceof String &&
-                ((String)o).equalsIgnoreCase("true"))) {
-            return true;
-        }
-        throw new JSONException("JSONObject[" + quote(key) +
-                "] is not a Boolean.");
-    }
+  /**
+   * Construct a JSONObject from a source JSON text string.
+   * This is the most commonly used JSONObject constructor.
+   *
+   * @param source A string beginning
+   *               with <code>{</code>&nbsp;<small>(left brace)</small> and ending
+   *               with <code>}</code>&nbsp;<small>(right brace)</small>.
+   * @throws JSONException If there is a syntax error in the source
+   *                       string or a duplicated key.
+   */
+  public JSONObject(String source) throws JSONException
+  {
+    this(new JSONTokener(source));
+  }
 
 
-    /**
-     * Get the double value associated with a key.
-     * @param key   A key string.
-     * @return      The numeric value.
-     * @throws JSONException if the key is not found or
-     *  if the value is not a Number object and cannot be converted to a number.
-     */
-    public double getDouble(String key) throws JSONException {
-        Object o = get(key);
-        try {
-            return o instanceof Number ?
-                ((Number)o).doubleValue() :
-                Double.valueOf((String)o).doubleValue();
-        } catch (Exception e) {
-            throw new JSONException("JSONObject[" + quote(key) +
-                "] is not a number.");
-        }
+  /**
+   * Accumulate values under a key. It is similar to the put method except
+   * that if there is already an object stored under the key then a
+   * JSONArray is stored under the key to hold all of the accumulated values.
+   * If there is already a JSONArray, then the new value is appended to it.
+   * In contrast, the put method replaces the previous value.
+   *
+   * @param key   A key string.
+   * @param value An object to be accumulated under the key.
+   * @return this.
+   * @throws JSONException If the value is an invalid number
+   *                       or if the key is null.
+   */
+  public JSONObject accumulate(String key, Object value)
+      throws JSONException
+  {
+    testValidity(value);
+    Object o = opt(key);
+    if (o == null)
+    {
+      put(key, value instanceof JSONArray ?
+          new JSONArray().put(value) :
+          value);
     }
+    else if (o instanceof JSONArray)
+    {
+      ((JSONArray) o).put(value);
+    }
+    else
+    {
+      put(key, new JSONArray().put(o).put(value));
+    }
+    return this;
+  }
 
 
-    /**
-     * Get the int value associated with a key. If the number value is too
-     * large for an int, it will be clipped.
-     *
-     * @param key   A key string.
-     * @return      The integer value.
-     * @throws   JSONException if the key is not found or if the value cannot
-     *  be converted to an integer.
-     */
-    public int getInt(String key) throws JSONException {
-        Object o = get(key);
-        return o instanceof Number ?
-                ((Number)o).intValue() : (int)getDouble(key);
+  /**
+   * Append values to the array under a key. If the key does not exist in the
+   * JSONObject, then the key is put in the JSONObject with its value being a
+   * JSONArray containing the value parameter. If the key was already
+   * associated with a JSONArray, then the value parameter is appended to it.
+   *
+   * @param key   A key string.
+   * @param value An object to be accumulated under the key.
+   * @return this.
+   * @throws JSONException If the key is null or if the current value
+   *                       associated with the key is not a JSONArray.
+   */
+  public JSONObject append(String key, Object value)
+      throws JSONException
+  {
+    testValidity(value);
+    Object o = opt(key);
+    if (o == null)
+    {
+      put(key, new JSONArray().put(value));
     }
+    else if (o instanceof JSONArray)
+    {
+      put(key, ((JSONArray) o).put(value));
+    }
+    else
+    {
+      throw new JSONException("JSONObject[" + key +
+          "] is not a JSONArray.");
+    }
+    return this;
+  }
 
 
-    /**
-     * Get the JSONArray value associated with a key.
-     *
-     * @param key   A key string.
-     * @return      A JSONArray which is the value.
-     * @throws   JSONException if the key is not found or
-     *  if the value is not a JSONArray.
-     */
-    public JSONArray getJSONArray(String key) throws JSONException {
-        Object o = get(key);
-        if (o instanceof JSONArray) {
-            return (JSONArray)o;
-        }
-        throw new JSONException("JSONObject[" + quote(key) +
-                "] is not a JSONArray.");
+  /**
+   * Produce a string from a double. The string "null" will be returned if
+   * the number is not finite.
+   *
+   * @param d A double.
+   * @return A String.
+   */
+  static public String doubleToString(double d)
+  {
+    if (Double.isInfinite(d) || Double.isNaN(d))
+    {
+      return "null";
     }
 
+// Shave off trailing zeros and decimal point, if possible.
 
-    /**
-     * Get the JSONObject value associated with a key.
-     *
-     * @param key   A key string.
-     * @return      A JSONObject which is the value.
-     * @throws   JSONException if the key is not found or
-     *  if the value is not a JSONObject.
-     */
-    public JSONObject getJSONObject(String key) throws JSONException {
-        Object o = get(key);
-        if (o instanceof JSONObject) {
-            return (JSONObject)o;
-        }
-        throw new JSONException("JSONObject[" + quote(key) +
-                "] is not a JSONObject.");
+    String s = Double.toString(d);
+    if (s.indexOf('.') > 0 && s.indexOf('e') < 0 && s.indexOf('E') < 0)
+    {
+      while (s.endsWith("0"))
+      {
+        s = s.substring(0, s.length() - 1);
+      }
+      if (s.endsWith("."))
+      {
+        s = s.substring(0, s.length() - 1);
+      }
     }
+    return s;
+  }
 
 
-    /**
-     * Get the long value associated with a key. If the number value is too
-     * long for a long, it will be clipped.
-     *
-     * @param key   A key string.
-     * @return      The long value.
-     * @throws   JSONException if the key is not found or if the value cannot
-     *  be converted to a long.
-     */
-    public long getLong(String key) throws JSONException {
-        Object o = get(key);
-        return o instanceof Number ?
-                ((Number)o).longValue() : (long)getDouble(key);
+  /**
+   * Get the value object associated with a key.
+   *
+   * @param key A key string.
+   * @return The object associated with the key.
+   * @throws JSONException if the key is not found.
+   */
+  public Object get(String key) throws JSONException
+  {
+    Object o = opt(key);
+    if (o == null)
+    {
+      throw new JSONException("JSONObject[" + quote(key) +
+          "] not found.");
     }
+    return o;
+  }
 
 
-    /**
-     * Get an array of field names from a JSONObject.
-     *
-     * @return An array of field names, or null if there are no names.
-     */
-    public static String[] getNames(JSONObject jo) {
-    	int length = jo.length();
-    	if (length == 0) {
-    		return null;
-    	}
-    	Iterator i = jo.keys();
-    	String[] names = new String[length];
-    	int j = 0;
-    	while (i.hasNext()) {
-    		names[j] = (String)i.next();
-    		j += 1;
-    	}
-        return names;
+  /**
+   * Get the boolean value associated with a key.
+   *
+   * @param key A key string.
+   * @return The truth.
+   * @throws JSONException if the value is not a Boolean or the String "true" or "false".
+   */
+  public boolean getBoolean(String key) throws JSONException
+  {
+    Object o = get(key);
+    if (o.equals(Boolean.FALSE) ||
+        (o instanceof String &&
+            ((String) o).equalsIgnoreCase("false")))
+    {
+      return false;
     }
+    else if (o.equals(Boolean.TRUE) ||
+        (o instanceof String &&
+            ((String) o).equalsIgnoreCase("true")))
+    {
+      return true;
+    }
+    throw new JSONException("JSONObject[" + quote(key) +
+        "] is not a Boolean.");
+  }
 
 
-    /**
-     * Get an array of field names from an Object.
-     *
-     * @return An array of field names, or null if there are no names.
-     */
-    public static String[] getNames(Object object) {
-    	if (object == null) {
-    		return null;
-    	}
-    	Class klass = object.getClass();
-    	Field[] fields = klass.getFields();
-    	int length = fields.length;
-    	if (length == 0) {
-    		return null;
-    	}
-    	String[] names = new String[length];
-    	for (int i = 0; i < length; i += 1) {
-    		names[i] = fields[i].getName();
-    	}
-        return names;
+  /**
+   * Get the double value associated with a key.
+   *
+   * @param key A key string.
+   * @return The numeric value.
+   * @throws JSONException if the key is not found or
+   *                       if the value is not a Number object and cannot be converted to a number.
+   */
+  public double getDouble(String key) throws JSONException
+  {
+    Object o = get(key);
+    try
+    {
+      return o instanceof Number ?
+          ((Number) o).doubleValue() :
+          Double.valueOf((String) o).doubleValue();
     }
+    catch (Exception e)
+    {
+      throw new JSONException("JSONObject[" + quote(key) +
+          "] is not a number.");
+    }
+  }
 
 
-    /**
-     * Get the string associated with a key.
-     *
-     * @param key   A key string.
-     * @return      A string which is the value.
-     * @throws   JSONException if the key is not found.
-     */
-    public String getString(String key) throws JSONException {
-        return get(key).toString();
-    }
+  /**
+   * Get the int value associated with a key. If the number value is too
+   * large for an int, it will be clipped.
+   *
+   * @param key A key string.
+   * @return The integer value.
+   * @throws JSONException if the key is not found or if the value cannot
+   *                       be converted to an integer.
+   */
+  public int getInt(String key) throws JSONException
+  {
+    Object o = get(key);
+    return o instanceof Number ?
+        ((Number) o).intValue() : (int) getDouble(key);
+  }
 
 
-    /**
-     * Determine if the JSONObject contains a specific key.
-     * @param key   A key string.
-     * @return      true if the key exists in the JSONObject.
-     */
-    public boolean has(String key) {
-        return this.map.containsKey(key);
+  /**
+   * Get the JSONArray value associated with a key.
+   *
+   * @param key A key string.
+   * @return A JSONArray which is the value.
+   * @throws JSONException if the key is not found or
+   *                       if the value is not a JSONArray.
+   */
+  public JSONArray getJSONArray(String key) throws JSONException
+  {
+    Object o = get(key);
+    if (o instanceof JSONArray)
+    {
+      return (JSONArray) o;
     }
+    throw new JSONException("JSONObject[" + quote(key) +
+        "] is not a JSONArray.");
+  }
 
 
-    /**
-     * Determine if the value associated with the key is null or if there is
-     *  no value.
-     * @param key   A key string.
-     * @return      true if there is no value associated with the key or if
-     *  the value is the JSONObject.NULL object.
-     */
-    public boolean isNull(String key) {
-        return JSONObject.NULL.equals(opt(key));
+  /**
+   * Get the JSONObject value associated with a key.
+   *
+   * @param key A key string.
+   * @return A JSONObject which is the value.
+   * @throws JSONException if the key is not found or
+   *                       if the value is not a JSONObject.
+   */
+  public JSONObject getJSONObject(String key) throws JSONException
+  {
+    Object o = get(key);
+    if (o instanceof JSONObject)
+    {
+      return (JSONObject) o;
     }
+    throw new JSONException("JSONObject[" + quote(key) +
+        "] is not a JSONObject.");
+  }
 
 
-    /**
-     * Get an enumeration of the keys of the JSONObject.
-     *
-     * @return An iterator of the keys.
-     */
-    public Iterator keys() {
-        return this.map.keySet().iterator();
+  /**
+   * Get the long value associated with a key. If the number value is too
+   * long for a long, it will be clipped.
+   *
+   * @param key A key string.
+   * @return The long value.
+   * @throws JSONException if the key is not found or if the value cannot
+   *                       be converted to a long.
+   */
+  public long getLong(String key) throws JSONException
+  {
+    Object o = get(key);
+    return o instanceof Number ?
+        ((Number) o).longValue() : (long) getDouble(key);
+  }
+
+
+  /**
+   * Get an array of field names from a JSONObject.
+   *
+   * @return An array of field names, or null if there are no names.
+   */
+  public static String[] getNames(JSONObject jo)
+  {
+    int length = jo.length();
+    if (length == 0)
+    {
+      return null;
     }
+    Iterator i = jo.keys();
+    String[] names = new String[length];
+    int j = 0;
+    while (i.hasNext())
+    {
+      names[j] = (String) i.next();
+      j += 1;
+    }
+    return names;
+  }
 
 
-    /**
-     * Get the number of keys stored in the JSONObject.
-     *
-     * @return The number of keys in the JSONObject.
-     */
-    public int length() {
-        return this.map.size();
+  /**
+   * Get an array of field names from an Object.
+   *
+   * @return An array of field names, or null if there are no names.
+   */
+  public static String[] getNames(Object object)
+  {
+    if (object == null)
+    {
+      return null;
     }
+    Class klass = object.getClass();
+    Field[] fields = klass.getFields();
+    int length = fields.length;
+    if (length == 0)
+    {
+      return null;
+    }
+    String[] names = new String[length];
+    for (int i = 0; i < length; i += 1)
+    {
+      names[i] = fields[i].getName();
+    }
+    return names;
+  }
 
 
-    /**
-     * Produce a JSONArray containing the names of the elements of this
-     * JSONObject.
-     * @return A JSONArray containing the key strings, or null if the JSONObject
-     * is empty.
-     */
-    public JSONArray names() {
-        JSONArray ja = new JSONArray();
-        Iterator  keys = keys();
-        while (keys.hasNext()) {
-            ja.put(keys.next());
-        }
-        return ja.length() == 0 ? null : ja;
+  /**
+   * Get the string associated with a key.
+   *
+   * @param key A key string.
+   * @return A string which is the value.
+   * @throws JSONException if the key is not found.
+   */
+  public String getString(String key) throws JSONException
+  {
+    return get(key).toString();
+  }
+
+
+  /**
+   * Determine if the JSONObject contains a specific key.
+   *
+   * @param key A key string.
+   * @return true if the key exists in the JSONObject.
+   */
+  public boolean has(String key)
+  {
+    return this.map.containsKey(key);
+  }
+
+
+  /**
+   * Determine if the value associated with the key is null or if there is
+   * no value.
+   *
+   * @param key A key string.
+   * @return true if there is no value associated with the key or if
+   *         the value is the JSONObject.NULL object.
+   */
+  public boolean isNull(String key)
+  {
+    return JSONObject.NULL.equals(opt(key));
+  }
+
+
+  /**
+   * Get an enumeration of the keys of the JSONObject.
+   *
+   * @return An iterator of the keys.
+   */
+  public Iterator keys()
+  {
+    return this.map.keySet().iterator();
+  }
+
+
+  /**
+   * Get the number of keys stored in the JSONObject.
+   *
+   * @return The number of keys in the JSONObject.
+   */
+  public int length()
+  {
+    return this.map.size();
+  }
+
+
+  /**
+   * Produce a JSONArray containing the names of the elements of this
+   * JSONObject.
+   *
+   * @return A JSONArray containing the key strings, or null if the JSONObject
+   *         is empty.
+   */
+  public JSONArray names()
+  {
+    JSONArray ja = new JSONArray();
+    Iterator keys = keys();
+    while (keys.hasNext())
+    {
+      ja.put(keys.next());
     }
+    return ja.length() == 0 ? null : ja;
+  }
 
-    /**
-     * Produce a string from a Number.
-     * @param  n A Number
-     * @return A String.
-     * @throws JSONException If n is a non-finite number.
-     */
-    static public String numberToString(Number n)
-            throws JSONException {
-        if (n == null) {
-            throw new JSONException("Null pointer");
-        }
-        testValidity(n);
+  /**
+   * Produce a string from a Number.
+   *
+   * @param n A Number
+   * @return A String.
+   * @throws JSONException If n is a non-finite number.
+   */
+  static public String numberToString(Number n)
+      throws JSONException
+  {
+    if (n == null)
+    {
+      throw new JSONException("Null pointer");
+    }
+    testValidity(n);
 
 // Shave off trailing zeros and decimal point, if possible.
 
-        String s = n.toString();
-        if (s.indexOf('.') > 0 && s.indexOf('e') < 0 && s.indexOf('E') < 0) {
-            while (s.endsWith("0")) {
-                s = s.substring(0, s.length() - 1);
-            }
-            if (s.endsWith(".")) {
-                s = s.substring(0, s.length() - 1);
-            }
-        }
-        return s;
+    String s = n.toString();
+    if (s.indexOf('.') > 0 && s.indexOf('e') < 0 && s.indexOf('E') < 0)
+    {
+      while (s.endsWith("0"))
+      {
+        s = s.substring(0, s.length() - 1);
+      }
+      if (s.endsWith("."))
+      {
+        s = s.substring(0, s.length() - 1);
+      }
     }
+    return s;
+  }
 
 
-    /**
-     * Get an optional value associated with a key.
-     * @param key   A key string.
-     * @return      An object which is the value, or null if there is no value.
-     */
-    public Object opt(String key) {
-        return key == null ? null : this.map.get(key);
-    }
+  /**
+   * Get an optional value associated with a key.
+   *
+   * @param key A key string.
+   * @return An object which is the value, or null if there is no value.
+   */
+  public Object opt(String key)
+  {
+    return key == null ? null : this.map.get(key);
+  }
 
 
-    /**
-     * Get an optional boolean associated with a key.
-     * It returns false if there is no such key, or if the value is not
-     * Boolean.TRUE or the String "true".
-     *
-     * @param key   A key string.
-     * @return      The truth.
-     */
-    public boolean optBoolean(String key) {
-        return optBoolean(key, false);
-    }
+  /**
+   * Get an optional boolean associated with a key.
+   * It returns false if there is no such key, or if the value is not
+   * Boolean.TRUE or the String "true".
+   *
+   * @param key A key string.
+   * @return The truth.
+   */
+  public boolean optBoolean(String key)
+  {
+    return optBoolean(key, false);
+  }
 
 
-    /**
-     * Get an optional boolean associated with a key.
-     * It returns the defaultValue if there is no such key, or if it is not
-     * a Boolean or the String "true" or "false" (case insensitive).
-     *
-     * @param key              A key string.
-     * @param defaultValue     The default.
-     * @return      The truth.
-     */
-    public boolean optBoolean(String key, boolean defaultValue) {
-        try {
-            return getBoolean(key);
-        } catch (Exception e) {
-            return defaultValue;
-        }
+  /**
+   * Get an optional boolean associated with a key.
+   * It returns the defaultValue if there is no such key, or if it is not
+   * a Boolean or the String "true" or "false" (case insensitive).
+   *
+   * @param key          A key string.
+   * @param defaultValue The default.
+   * @return The truth.
+   */
+  public boolean optBoolean(String key, boolean defaultValue)
+  {
+    try
+    {
+      return getBoolean(key);
     }
+    catch (Exception e)
+    {
+      return defaultValue;
+    }
+  }
 
 
-    /**
-     * Put a key/value pair in the JSONObject, where the value will be a
-     * JSONArray which is produced from a Collection.
-     * @param key   A key string.
-     * @param value A Collection value.
-     * @return      this.
-     * @throws JSONException
-     */
-    public JSONObject put(String key, Collection value) throws JSONException {
-        put(key, new JSONArray(value));
-        return this;
-    }
+  /**
+   * Put a key/value pair in the JSONObject, where the value will be a
+   * JSONArray which is produced from a Collection.
+   *
+   * @param key   A key string.
+   * @param value A Collection value.
+   * @return this.
+   * @throws JSONException
+   */
+  public JSONObject put(String key, Collection value) throws JSONException
+  {
+    put(key, new JSONArray(value));
+    return this;
+  }
 
 
-    /**
-     * Get an optional double associated with a key,
-     * or NaN if there is no such key or if its value is not a number.
-     * If the value is a string, an attempt will be made to evaluate it as
-     * a number.
-     *
-     * @param key   A string which is the key.
-     * @return      An object which is the value.
-     */
-    public double optDouble(String key) {
-        return optDouble(key, Double.NaN);
-    }
+  /**
+   * Get an optional double associated with a key,
+   * or NaN if there is no such key or if its value is not a number.
+   * If the value is a string, an attempt will be made to evaluate it as
+   * a number.
+   *
+   * @param key A string which is the key.
+   * @return An object which is the value.
+   */
+  public double optDouble(String key)
+  {
+    return optDouble(key, Double.NaN);
+  }
 
 
-    /**
-     * Get an optional double associated with a key, or the
-     * defaultValue if there is no such key or if its value is not a number.
-     * If the value is a string, an attempt will be made to evaluate it as
-     * a number.
-     *
-     * @param key   A key string.
-     * @param defaultValue     The default.
-     * @return      An object which is the value.
-     */
-    public double optDouble(String key, double defaultValue) {
-        try {
-            Object o = opt(key);
-            return o instanceof Number ? ((Number)o).doubleValue() :
-                new Double((String)o).doubleValue();
-        } catch (Exception e) {
-            return defaultValue;
-        }
+  /**
+   * Get an optional double associated with a key, or the
+   * defaultValue if there is no such key or if its value is not a number.
+   * If the value is a string, an attempt will be made to evaluate it as
+   * a number.
+   *
+   * @param key          A key string.
+   * @param defaultValue The default.
+   * @return An object which is the value.
+   */
+  public double optDouble(String key, double defaultValue)
+  {
+    try
+    {
+      Object o = opt(key);
+      return o instanceof Number ? ((Number) o).doubleValue() :
+          new Double((String) o).doubleValue();
     }
+    catch (Exception e)
+    {
+      return defaultValue;
+    }
+  }
 
 
-    /**
-     * Get an optional int value associated with a key,
-     * or zero if there is no such key or if the value is not a number.
-     * If the value is a string, an attempt will be made to evaluate it as
-     * a number.
-     *
-     * @param key   A key string.
-     * @return      An object which is the value.
-     */
-    public int optInt(String key) {
-        return optInt(key, 0);
-    }
+  /**
+   * Get an optional int value associated with a key,
+   * or zero if there is no such key or if the value is not a number.
+   * If the value is a string, an attempt will be made to evaluate it as
+   * a number.
+   *
+   * @param key A key string.
+   * @return An object which is the value.
+   */
+  public int optInt(String key)
+  {
+    return optInt(key, 0);
+  }
 
 
-    /**
-     * Get an optional int value associated with a key,
-     * or the default if there is no such key or if the value is not a number.
-     * If the value is a string, an attempt will be made to evaluate it as
-     * a number.
-     *
-     * @param key   A key string.
-     * @param defaultValue     The default.
-     * @return      An object which is the value.
-     */
-    public int optInt(String key, int defaultValue) {
-        try {
-            return getInt(key);
-        } catch (Exception e) {
-            return defaultValue;
-        }
+  /**
+   * Get an optional int value associated with a key,
+   * or the default if there is no such key or if the value is not a number.
+   * If the value is a string, an attempt will be made to evaluate it as
+   * a number.
+   *
+   * @param key          A key string.
+   * @param defaultValue The default.
+   * @return An object which is the value.
+   */
+  public int optInt(String key, int defaultValue)
+  {
+    try
+    {
+      return getInt(key);
     }
+    catch (Exception e)
+    {
+      return defaultValue;
+    }
+  }
 
 
-    /**
-     * Get an optional JSONArray associated with a key.
-     * It returns null if there is no such key, or if its value is not a
-     * JSONArray.
-     *
-     * @param key   A key string.
-     * @return      A JSONArray which is the value.
-     */
-    public JSONArray optJSONArray(String key) {
-        Object o = opt(key);
-        return o instanceof JSONArray ? (JSONArray)o : null;
-    }
+  /**
+   * Get an optional JSONArray associated with a key.
+   * It returns null if there is no such key, or if its value is not a
+   * JSONArray.
+   *
+   * @param key A key string.
+   * @return A JSONArray which is the value.
+   */
+  public JSONArray optJSONArray(String key)
+  {
+    Object o = opt(key);
+    return o instanceof JSONArray ? (JSONArray) o : null;
+  }
 
 
-    /**
-     * Get an optional JSONObject associated with a key.
-     * It returns null if there is no such key, or if its value is not a
-     * JSONObject.
-     *
-     * @param key   A key string.
-     * @return      A JSONObject which is the value.
-     */
-    public JSONObject optJSONObject(String key) {
-        Object o = opt(key);
-        return o instanceof JSONObject ? (JSONObject)o : null;
-    }
+  /**
+   * Get an optional JSONObject associated with a key.
+   * It returns null if there is no such key, or if its value is not a
+   * JSONObject.
+   *
+   * @param key A key string.
+   * @return A JSONObject which is the value.
+   */
+  public JSONObject optJSONObject(String key)
+  {
+    Object o = opt(key);
+    return o instanceof JSONObject ? (JSONObject) o : null;
+  }
 
 
-    /**
-     * Get an optional long value associated with a key,
-     * or zero if there is no such key or if the value is not a number.
-     * If the value is a string, an attempt will be made to evaluate it as
-     * a number.
-     *
-     * @param key   A key string.
-     * @return      An object which is the value.
-     */
-    public long optLong(String key) {
-        return optLong(key, 0);
-    }
+  /**
+   * Get an optional long value associated with a key,
+   * or zero if there is no such key or if the value is not a number.
+   * If the value is a string, an attempt will be made to evaluate it as
+   * a number.
+   *
+   * @param key A key string.
+   * @return An object which is the value.
+   */
+  public long optLong(String key)
+  {
+    return optLong(key, 0);
+  }
 
 
-    /**
-     * Get an optional long value associated with a key,
-     * or the default if there is no such key or if the value is not a number.
-     * If the value is a string, an attempt will be made to evaluate it as
-     * a number.
-     *
-     * @param key   A key string.
-     * @param defaultValue     The default.
-     * @return      An object which is the value.
-     */
-    public long optLong(String key, long defaultValue) {
-        try {
-            return getLong(key);
-        } catch (Exception e) {
-            return defaultValue;
-        }
+  /**
+   * Get an optional long value associated with a key,
+   * or the default if there is no such key or if the value is not a number.
+   * If the value is a string, an attempt will be made to evaluate it as
+   * a number.
+   *
+   * @param key          A key string.
+   * @param defaultValue The default.
+   * @return An object which is the value.
+   */
+  public long optLong(String key, long defaultValue)
+  {
+    try
+    {
+      return getLong(key);
     }
+    catch (Exception e)
+    {
+      return defaultValue;
+    }
+  }
 
 
-    /**
-     * Get an optional string associated with a key.
-     * It returns an empty string if there is no such key. If the value is not
-     * a string and is not null, then it is coverted to a string.
-     *
-     * @param key   A key string.
-     * @return      A string which is the value.
-     */
-    public String optString(String key) {
-        return optString(key, "");
-    }
+  /**
+   * Get an optional string associated with a key.
+   * It returns an empty string if there is no such key. If the value is not
+   * a string and is not null, then it is coverted to a string.
+   *
+   * @param key A key string.
+   * @return A string which is the value.
+   */
+  public String optString(String key)
+  {
+    return optString(key, "");
+  }
 
 
-    /**
-     * Get an optional string associated with a key.
-     * It returns the defaultValue if there is no such key.
-     *
-     * @param key   A key string.
-     * @param defaultValue     The default.
-     * @return      A string which is the value.
-     */
-    public String optString(String key, String defaultValue) {
-        Object o = opt(key);
-        return o != null ? o.toString() : defaultValue;
-    }
+  /**
+   * Get an optional string associated with a key.
+   * It returns the defaultValue if there is no such key.
+   *
+   * @param key          A key string.
+   * @param defaultValue The default.
+   * @return A string which is the value.
+   */
+  public String optString(String key, String defaultValue)
+  {
+    Object o = opt(key);
+    return o != null ? o.toString() : defaultValue;
+  }
 
 
-    /**
-     * Put a key/boolean pair in the JSONObject.
-     *
-     * @param key   A key string.
-     * @param value A boolean which is the value.
-     * @return this.
-     * @throws JSONException If the key is null.
-     */
-    public JSONObject put(String key, boolean value) throws JSONException {
-        put(key, value ? Boolean.TRUE : Boolean.FALSE);
-        return this;
-    }
+  /**
+   * Put a key/boolean pair in the JSONObject.
+   *
+   * @param key   A key string.
+   * @param value A boolean which is the value.
+   * @return this.
+   * @throws JSONException If the key is null.
+   */
+  public JSONObject put(String key, boolean value) throws JSONException
+  {
+    put(key, value ? Boolean.TRUE : Boolean.FALSE);
+    return this;
+  }
 
 
-    /**
-     * Put a key/double pair in the JSONObject.
-     *
-     * @param key   A key string.
-     * @param value A double which is the value.
-     * @return this.
-     * @throws JSONException If the key is null or if the number is invalid.
-     */
-    public JSONObject put(String key, double value) throws JSONException {
-        put(key, new Double(value));
-        return this;
-    }
+  /**
+   * Put a key/double pair in the JSONObject.
+   *
+   * @param key   A key string.
+   * @param value A double which is the value.
+   * @return this.
+   * @throws JSONException If the key is null or if the number is invalid.
+   */
+  public JSONObject put(String key, double value) throws JSONException
+  {
+    put(key, new Double(value));
+    return this;
+  }
 
 
-    /**
-     * Put a key/int pair in the JSONObject.
-     *
-     * @param key   A key string.
-     * @param value An int which is the value.
-     * @return this.
-     * @throws JSONException If the key is null.
-     */
-    public JSONObject put(String key, int value) throws JSONException {
-        put(key, new Integer(value));
-        return this;
-    }
+  /**
+   * Put a key/int pair in the JSONObject.
+   *
+   * @param key   A key string.
+   * @param value An int which is the value.
+   * @return this.
+   * @throws JSONException If the key is null.
+   */
+  public JSONObject put(String key, int value) throws JSONException
+  {
+    put(key, new Integer(value));
+    return this;
+  }
 
 
-    /**
-     * Put a key/long pair in the JSONObject.
-     *
-     * @param key   A key string.
-     * @param value A long which is the value.
-     * @return this.
-     * @throws JSONException If the key is null.
-     */
-    public JSONObject put(String key, long value) throws JSONException {
-        put(key, new Long(value));
-        return this;
-    }
+  /**
+   * Put a key/long pair in the JSONObject.
+   *
+   * @param key   A key string.
+   * @param value A long which is the value.
+   * @return this.
+   * @throws JSONException If the key is null.
+   */
+  public JSONObject put(String key, long value) throws JSONException
+  {
+    put(key, new Long(value));
+    return this;
+  }
 
 
-    /**
-     * Put a key/value pair in the JSONObject, where the value will be a
-     * JSONObject which is produced from a Map.
-     * @param key   A key string.
-     * @param value A Map value.
-     * @return      this.
-     * @throws JSONException
-     */
-    public JSONObject put(String key, Map value) throws JSONException {
-        put(key, new JSONObject(value));
-        return this;
+  /**
+   * Put a key/value pair in the JSONObject, where the value will be a
+   * JSONObject which is produced from a Map.
+   *
+   * @param key   A key string.
+   * @param value A Map value.
+   * @return this.
+   * @throws JSONException
+   */
+  public JSONObject put(String key, Map value) throws JSONException
+  {
+    put(key, new JSONObject(value));
+    return this;
+  }
+
+
+  /**
+   * Put a key/value pair in the JSONObject. If the value is null,
+   * then the key will be removed from the JSONObject if it is present.
+   *
+   * @param key   A key string.
+   * @param value An object which is the value. It should be of one of these
+   *              types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
+   *              or the JSONObject.NULL object.
+   * @return this.
+   * @throws JSONException If the value is non-finite number
+   *                       or if the key is null.
+   */
+  public JSONObject put(String key, Object value) throws JSONException
+  {
+    if (key == null)
+    {
+      throw new JSONException("Null key.");
     }
+    if (value != null)
+    {
+      testValidity(value);
+      this.map.put(key, value);
+    }
+    else
+    {
+      remove(key);
+    }
+    return this;
+  }
 
 
-    /**
-     * Put a key/value pair in the JSONObject. If the value is null,
-     * then the key will be removed from the JSONObject if it is present.
-     * @param key   A key string.
-     * @param value An object which is the value. It should be of one of these
-     *  types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
-     *  or the JSONObject.NULL object.
-     * @return this.
-     * @throws JSONException If the value is non-finite number
-     *  or if the key is null.
-     */
-    public JSONObject put(String key, Object value) throws JSONException {
-        if (key == null) {
-            throw new JSONException("Null key.");
-        }
-        if (value != null) {
-            testValidity(value);
-            this.map.put(key, value);
-        } else {
-            remove(key);
-        }
-        return this;
+  /**
+   * Put a key/value pair in the JSONObject, but only if the key and the
+   * value are both non-null, and only if there is not already a member
+   * with that name.
+   *
+   * @param key
+   * @param value
+   * @return his.
+   * @throws JSONException if the key is a duplicate
+   */
+  public JSONObject putOnce(String key, Object value) throws JSONException
+  {
+    if (key != null && value != null)
+    {
+      if (opt(key) != null)
+      {
+        throw new JSONException("Duplicate key \"" + key + "\"");
+      }
+      put(key, value);
     }
+    return this;
+  }
 
 
-    /**
-     * Put a key/value pair in the JSONObject, but only if the key and the 
-     * value are both non-null, and only if there is not already a member 
-     * with that name.
-     * @param key
-     * @param value
-     * @return his.
-     * @throws JSONException if the key is a duplicate
-     */
-    public JSONObject putOnce(String key, Object value) throws JSONException {
-        if (key != null && value != null) {
-        	if (opt(key) != null) {
-                throw new JSONException("Duplicate key \"" + key + "\"");
-        	}
-            put(key, value);
-        }
-        return this;
+  /**
+   * Put a key/value pair in the JSONObject, but only if the
+   * key and the value are both non-null.
+   *
+   * @param key   A key string.
+   * @param value An object which is the value. It should be of one of these
+   *              types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
+   *              or the JSONObject.NULL object.
+   * @return this.
+   * @throws JSONException If the value is a non-finite number.
+   */
+  public JSONObject putOpt(String key, Object value) throws JSONException
+  {
+    if (key != null && value != null)
+    {
+      put(key, value);
     }
+    return this;
+  }
 
 
-    /**
-     * Put a key/value pair in the JSONObject, but only if the
-     * key and the value are both non-null.
-     * @param key   A key string.
-     * @param value An object which is the value. It should be of one of these
-     *  types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
-     *  or the JSONObject.NULL object.
-     * @return this.
-     * @throws JSONException If the value is a non-finite number.
-     */
-    public JSONObject putOpt(String key, Object value) throws JSONException {
-        if (key != null && value != null) {
-            put(key, value);
-        }
-        return this;
+  /**
+   * Produce a string in double quotes with backslash sequences in all the
+   * right places. A backslash will be inserted within </, allowing JSON
+   * text to be delivered in HTML. In JSON text, a string cannot contain a
+   * control character or an unescaped quote or backslash.
+   *
+   * @param string A String
+   * @return A String correctly formatted for insertion in a JSON text.
+   */
+  public static String quote(String string)
+  {
+    if (string == null || string.length() == 0)
+    {
+      return "\"\"";
     }
-    
-    
-    /**
-     * Produce a string in double quotes with backslash sequences in all the
-     * right places. A backslash will be inserted within </, allowing JSON
-     * text to be delivered in HTML. In JSON text, a string cannot contain a
-     * control character or an unescaped quote or backslash.
-     * @param string A String
-     * @return  A String correctly formatted for insertion in a JSON text.
-     */
-    public static String quote(String string) {
-        if (string == null || string.length() == 0) {
-            return "\"\"";
-        }
 
-        char         b;
-        char         c = 0;
-        int          i;
-        int          len = string.length();
-        StringBuffer sb = new StringBuffer(len + 4);
-        String       t;
+    char b;
+    char c = 0;
+    int i;
+    int len = string.length();
+    StringBuffer sb = new StringBuffer(len + 4);
+    String t;
 
-        sb.append('"');
-        for (i = 0; i < len; i += 1) {
-            b = c;
-            c = string.charAt(i);
-            switch (c) {
-            case '\\':
-            case '"':
-                sb.append('\\');
-                sb.append(c);
-                break;
-            case '/':
-                if (b == '<') {
-                    sb.append('\\');
-                }
-                sb.append(c);
-                break;
-            case '\b':
-                sb.append("\\b");
-                break;
-            case '\t':
-                sb.append("\\t");
-                break;
-            case '\n':
-                sb.append("\\n");
-                break;
-            case '\f':
-                sb.append("\\f");
-                break;
-            case '\r':
-                sb.append("\\r");
-                break;
-            default:
-                if (c < ' ' || (c >= '\u0080' && c < '\u00a0') ||
-                               (c >= '\u2000' && c < '\u2100')) {
-                    t = "000" + Integer.toHexString(c);
-                    sb.append("\\u" + t.substring(t.length() - 4));
-                } else {
-                    sb.append(c);
-                }
-            }
-        }
-        sb.append('"');
-        return sb.toString();
+    sb.append('"');
+    for (i = 0; i < len; i += 1)
+    {
+      b = c;
+      c = string.charAt(i);
+      switch (c)
+      {
+        case'\\':
+        case'"':
+          sb.append('\\');
+          sb.append(c);
+          break;
+        case'/':
+          if (b == '<')
+          {
+            sb.append('\\');
+          }
+          sb.append(c);
+          break;
+        case'\b':
+          sb.append("\\b");
+          break;
+        case'\t':
+          sb.append("\\t");
+          break;
+        case'\n':
+          sb.append("\\n");
+          break;
+        case'\f':
+          sb.append("\\f");
+          break;
+        case'\r':
+          sb.append("\\r");
+          break;
+        default:
+          if (c < ' ' || (c >= '\u0080' && c < '\u00a0') ||
+              (c >= '\u2000' && c < '\u2100'))
+          {
+            t = "000" + Integer.toHexString(c);
+            sb.append("\\u" + t.substring(t.length() - 4));
+          }
+          else
+          {
+            sb.append(c);
+          }
+      }
     }
+    sb.append('"');
+    return sb.toString();
+  }
 
-    /**
-     * Remove a name and its value, if present.
-     * @param key The name to be removed.
-     * @return The value that was associated with the name,
-     * or null if there was no value.
-     */
-    public Object remove(String key) {
-        return this.map.remove(key);
+  /**
+   * Remove a name and its value, if present.
+   *
+   * @param key The name to be removed.
+   * @return The value that was associated with the name,
+   *         or null if there was no value.
+   */
+  public Object remove(String key)
+  {
+    return this.map.remove(key);
+  }
+
+  /**
+   * Get an enumeration of the keys of the JSONObject.
+   * The keys will be sorted alphabetically.
+   *
+   * @return An iterator of the keys.
+   */
+  public Iterator sortedKeys()
+  {
+    return new TreeSet(this.map.keySet()).iterator();
+  }
+
+  /**
+   * Try to convert a string into a number, boolean, or null. If the string
+   * can't be converted, return the string.
+   *
+   * @param s A String.
+   * @return A simple JSON value.
+   */
+  static public Object stringToValue(String s)
+  {
+    if (s.equals(""))
+    {
+      return s;
     }
-   
-    /**
-     * Get an enumeration of the keys of the JSONObject.
-     * The keys will be sorted alphabetically.
-     *
-     * @return An iterator of the keys.
-     */
-    public Iterator sortedKeys() {
-      return new TreeSet(this.map.keySet()).iterator();
+    if (s.equalsIgnoreCase("true"))
+    {
+      return Boolean.TRUE;
     }
+    if (s.equalsIgnoreCase("false"))
+    {
+      return Boolean.FALSE;
+    }
+    if (s.equalsIgnoreCase("null"))
+    {
+      return JSONObject.NULL;
+    }
 
-    /**
-     * Try to convert a string into a number, boolean, or null. If the string
-     * can't be converted, return the string.
-     * @param s A String.
-     * @return A simple JSON value.
-     */
-    static public Object stringToValue(String s) {
-        if (s.equals("")) {
-            return s;
+    /*
+    * If it might be a number, try converting it. We support the 0- and 0x-
+    * conventions. If a number cannot be produced, then the value will just
+    * be a string. Note that the 0-, 0x-, plus, and implied string
+    * conventions are non-standard. A JSON parser is free to accept
+    * non-JSON forms as long as it accepts all correct JSON forms.
+    */
+
+    char b = s.charAt(0);
+    if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+')
+    {
+      if (b == '0')
+      {
+        if (s.length() > 2 &&
+            (s.charAt(1) == 'x' || s.charAt(1) == 'X'))
+        {
+          try
+          {
+            return new Integer(Integer.parseInt(s.substring(2),
+                16));
+          }
+          catch (Exception e)
+          {
+            /* Ignore the error */
+          }
         }
-        if (s.equalsIgnoreCase("true")) {
-            return Boolean.TRUE;
+        else
+        {
+          try
+          {
+            return new Integer(Integer.parseInt(s, 8));
+          }
+          catch (Exception e)
+          {
+            /* Ignore the error */
+          }
         }
-        if (s.equalsIgnoreCase("false")) {
-            return Boolean.FALSE;
+      }
+      try
+      {
+        return new Integer(s);
+      }
+      catch (Exception e)
+      {
+        try
+        {
+          return new Long(s);
         }
-        if (s.equalsIgnoreCase("null")) {
-            return JSONObject.NULL;
+        catch (Exception f)
+        {
+          try
+          {
+            return new Double(s);
+          }
+          catch (Exception g)
+          {
+            /* Ignore the error */
+          }
         }
+      }
+    }
+    return s;
+  }
 
-        /*
-         * If it might be a number, try converting it. We support the 0- and 0x-
-         * conventions. If a number cannot be produced, then the value will just
-         * be a string. Note that the 0-, 0x-, plus, and implied string
-         * conventions are non-standard. A JSON parser is free to accept
-         * non-JSON forms as long as it accepts all correct JSON forms.
-         */
 
-        char b = s.charAt(0);
-        if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+') {
-            if (b == '0') {
-                if (s.length() > 2 &&
-                        (s.charAt(1) == 'x' || s.charAt(1) == 'X')) {
-                    try {
-                        return new Integer(Integer.parseInt(s.substring(2),
-                                16));
-                    } catch (Exception e) {
-                        /* Ignore the error */
-                    }
-                } else {
-                    try {
-                        return new Integer(Integer.parseInt(s, 8));
-                    } catch (Exception e) {
-                        /* Ignore the error */
-                    }
-                }
-            }
-            try {
-                return new Integer(s);
-            } catch (Exception e) {
-                try {
-                    return new Long(s);
-                } catch (Exception f) {
-                    try {
-                        return new Double(s);
-                    }  catch (Exception g) {
-                    	/* Ignore the error */
-                    }
-                }
-            }
+  /**
+   * Throw an exception if the object is an NaN or infinite number.
+   *
+   * @param o The object to test.
+   * @throws JSONException If o is a non-finite number.
+   */
+  static void testValidity(Object o) throws JSONException
+  {
+    if (o != null)
+    {
+      if (o instanceof Double)
+      {
+        if (((Double) o).isInfinite() || ((Double) o).isNaN())
+        {
+          throw new JSONException(
+              "JSON does not allow non-finite numbers.");
         }
-        return s;
-    }
-    
-    
-    /**
-     * Throw an exception if the object is an NaN or infinite number.
-     * @param o The object to test.
-     * @throws JSONException If o is a non-finite number.
-     */
-    static void testValidity(Object o) throws JSONException {
-        if (o != null) {
-            if (o instanceof Double) {
-                if (((Double)o).isInfinite() || ((Double)o).isNaN()) {
-                    throw new JSONException(
-                        "JSON does not allow non-finite numbers.");
-                }
-            } else if (o instanceof Float) {
-                if (((Float)o).isInfinite() || ((Float)o).isNaN()) {
-                    throw new JSONException(
-                        "JSON does not allow non-finite numbers.");
-                }
-            }
+      }
+      else if (o instanceof Float)
+      {
+        if (((Float) o).isInfinite() || ((Float) o).isNaN())
+        {
+          throw new JSONException(
+              "JSON does not allow non-finite numbers.");
         }
+      }
     }
+  }
 
 
-    /**
-     * Produce a JSONArray containing the values of the members of this
-     * JSONObject.
-     * @param names A JSONArray containing a list of key strings. This
-     * determines the sequence of the values in the result.
-     * @return A JSONArray of values.
-     * @throws JSONException If any of the values are non-finite numbers.
-     */
-    public JSONArray toJSONArray(JSONArray names) throws JSONException {
-        if (names == null || names.length() == 0) {
-            return null;
-        }
-        JSONArray ja = new JSONArray();
-        for (int i = 0; i < names.length(); i += 1) {
-            ja.put(this.opt(names.getString(i)));
-        }
-        return ja;
+  /**
+   * Produce a JSONArray containing the values of the members of this
+   * JSONObject.
+   *
+   * @param names A JSONArray containing a list of key strings. This
+   *              determines the sequence of the values in the result.
+   * @return A JSONArray of values.
+   * @throws JSONException If any of the values are non-finite numbers.
+   */
+  public JSONArray toJSONArray(JSONArray names) throws JSONException
+  {
+    if (names == null || names.length() == 0)
+    {
+      return null;
     }
+    JSONArray ja = new JSONArray();
+    for (int i = 0; i < names.length(); i += 1)
+    {
+      ja.put(this.opt(names.getString(i)));
+    }
+    return ja;
+  }
 
-    /**
-     * Make a JSON text of this JSONObject. For compactness, no whitespace
-     * is added. If this would not result in a syntactically correct JSON text,
-     * then null will be returned instead.
-     * <p>
-     * Warning: This method assumes that the data structure is acyclical.
-     *
-     * @return a printable, displayable, portable, transmittable
-     *  representation of the object, beginning
-     *  with <code>{</code>&nbsp;<small>(left brace)</small> and ending
-     *  with <code>}</code>&nbsp;<small>(right brace)</small>.
-     */
-    public String toString() {
-        try {
-            Iterator     keys = keys();
-            StringBuffer sb = new StringBuffer("{");
+  /**
+   * Make a JSON text of this JSONObject. For compactness, no whitespace
+   * is added. If this would not result in a syntactically correct JSON text,
+   * then null will be returned instead.
+   * <p/>
+   * Warning: This method assumes that the data structure is acyclical.
+   *
+   * @return a printable, displayable, portable, transmittable
+   *         representation of the object, beginning
+   *         with <code>{</code>&nbsp;<small>(left brace)</small> and ending
+   *         with <code>}</code>&nbsp;<small>(right brace)</small>.
+   */
+  public String toString()
+  {
+    try
+    {
+      Iterator keys = keys();
+      StringBuffer sb = new StringBuffer("{");
 
-            while (keys.hasNext()) {
-                if (sb.length() > 1) {
-                    sb.append(',');
-                }
-                Object o = keys.next();
-                sb.append(quote(o.toString()));
-                sb.append(':');
-                sb.append(valueToString(this.map.get(o)));
-            }
-            sb.append('}');
-            return sb.toString();
-        } catch (Exception e) {
-            return null;
+      while (keys.hasNext())
+      {
+        if (sb.length() > 1)
+        {
+          sb.append(',');
         }
+        Object o = keys.next();
+        sb.append(quote(o.toString()));
+        sb.append(':');
+        sb.append(valueToString(this.map.get(o)));
+      }
+      sb.append('}');
+      return sb.toString();
     }
+    catch (Exception e)
+    {
+      return null;
+    }
+  }
 
 
-    /**
-     * Make a prettyprinted JSON text of this JSONObject.
-     * <p>
-     * Warning: This method assumes that the data structure is acyclical.
-     * @param indentFactor The number of spaces to add to each level of
-     *  indentation.
-     * @return a printable, displayable, portable, transmittable
-     *  representation of the object, beginning
-     *  with <code>{</code>&nbsp;<small>(left brace)</small> and ending
-     *  with <code>}</code>&nbsp;<small>(right brace)</small>.
-     * @throws JSONException If the object contains an invalid number.
-     */
-    public String toString(int indentFactor) throws JSONException {
-        return toString(indentFactor, 0);
-    }
+  /**
+   * Make a prettyprinted JSON text of this JSONObject.
+   * <p/>
+   * Warning: This method assumes that the data structure is acyclical.
+   *
+   * @param indentFactor The number of spaces to add to each level of
+   *                     indentation.
+   * @return a printable, displayable, portable, transmittable
+   *         representation of the object, beginning
+   *         with <code>{</code>&nbsp;<small>(left brace)</small> and ending
+   *         with <code>}</code>&nbsp;<small>(right brace)</small>.
+   * @throws JSONException If the object contains an invalid number.
+   */
+  public String toString(int indentFactor) throws JSONException
+  {
+    return toString(indentFactor, 0);
+  }
 
 
-    /**
-     * Make a prettyprinted JSON text of this JSONObject.
-     * <p>
-     * Warning: This method assumes that the data structure is acyclical.
-     * @param indentFactor The number of spaces to add to each level of
-     *  indentation.
-     * @param indent The indentation of the top level.
-     * @return a printable, displayable, transmittable
-     *  representation of the object, beginning
-     *  with <code>{</code>&nbsp;<small>(left brace)</small> and ending
-     *  with <code>}</code>&nbsp;<small>(right brace)</small>.
-     * @throws JSONException If the object contains an invalid number.
-     */
-    String toString(int indentFactor, int indent) throws JSONException {
-        int j;
-        int n = length();
-        if (n == 0) {
-            return "{}";
+  /**
+   * Make a prettyprinted JSON text of this JSONObject.
+   * <p/>
+   * Warning: This method assumes that the data structure is acyclical.
+   *
+   * @param indentFactor The number of spaces to add to each level of
+   *                     indentation.
+   * @param indent       The indentation of the top level.
+   * @return a printable, displayable, transmittable
+   *         representation of the object, beginning
+   *         with <code>{</code>&nbsp;<small>(left brace)</small> and ending
+   *         with <code>}</code>&nbsp;<small>(right brace)</small>.
+   * @throws JSONException If the object contains an invalid number.
+   */
+  String toString(int indentFactor, int indent) throws JSONException
+  {
+    int j;
+    int n = length();
+    if (n == 0)
+    {
+      return "{}";
+    }
+    Iterator keys = sortedKeys();
+    StringBuffer sb = new StringBuffer("{");
+    int newindent = indent + indentFactor;
+    Object o;
+    if (n == 1)
+    {
+      o = keys.next();
+      sb.append(quote(o.toString()));
+      sb.append(": ");
+      sb.append(valueToString(this.map.get(o), indentFactor,
+          indent));
+    }
+    else
+    {
+      while (keys.hasNext())
+      {
+        o = keys.next();
+        if (sb.length() > 1)
+        {
+          sb.append(",\n");
         }
-        Iterator     keys = sortedKeys();
-        StringBuffer sb = new StringBuffer("{");
-        int          newindent = indent + indentFactor;
-        Object       o;
-        if (n == 1) {
-            o = keys.next();
-            sb.append(quote(o.toString()));
-            sb.append(": ");
-            sb.append(valueToString(this.map.get(o), indentFactor,
-                    indent));
-        } else {
-            while (keys.hasNext()) {
-                o = keys.next();
-                if (sb.length() > 1) {
-                    sb.append(",\n");
-                } else {
-                    sb.append('\n');
-                }
-                for (j = 0; j < newindent; j += 1) {
-                    sb.append(' ');
-                }
-                sb.append(quote(o.toString()));
-                sb.append(": ");
-                sb.append(valueToString(this.map.get(o), indentFactor,
-                        newindent));
-            }
-            if (sb.length() > 1) {
-                sb.append('\n');
-                for (j = 0; j < indent; j += 1) {
-                    sb.append(' ');
-                }
-            }
+        else
+        {
+          sb.append('\n');
         }
-        sb.append('}');
-        return sb.toString();
+        for (j = 0; j < newindent; j += 1)
+        {
+          sb.append(' ');
+        }
+        sb.append(quote(o.toString()));
+        sb.append(": ");
+        sb.append(valueToString(this.map.get(o), indentFactor,
+            newindent));
+      }
+      if (sb.length() > 1)
+      {
+        sb.append('\n');
+        for (j = 0; j < indent; j += 1)
+        {
+          sb.append(' ');
+        }
+      }
     }
+    sb.append('}');
+    return sb.toString();
+  }
 
 
-    /**
-     * Make a JSON text of an Object value. If the object has an
-     * value.toJSONString() method, then that method will be used to produce
-     * the JSON text. The method is required to produce a strictly
-     * conforming text. If the object does not contain a toJSONString
-     * method (which is the most common case), then a text will be
-     * produced by other means. If the value is an array or Collection,
-     * then a JSONArray will be made from it and its toJSONString method
-     * will be called. If the value is a MAP, then a JSONObject will be made
-     * from it and its toJSONString method will be called. Otherwise, the
-     * value's toString method will be called, and the result will be quoted.
-     *
-     * <p>
-     * Warning: This method assumes that the data structure is acyclical.
-     * @param value The value to be serialized.
-     * @return a printable, displayable, transmittable
-     *  representation of the object, beginning
-     *  with <code>{</code>&nbsp;<small>(left brace)</small> and ending
-     *  with <code>}</code>&nbsp;<small>(right brace)</small>.
-     * @throws JSONException If the value is or contains an invalid number.
-     */
-    static String valueToString(Object value) throws JSONException {
-        if (value == null || value.equals(null)) {
-            return "null";
+  /**
+   * Make a JSON text of an Object value. If the object has an
+   * value.toJSONString() method, then that method will be used to produce
+   * the JSON text. The method is required to produce a strictly
+   * conforming text. If the object does not contain a toJSONString
+   * method (which is the most common case), then a text will be
+   * produced by other means. If the value is an array or Collection,
+   * then a JSONArray will be made from it and its toJSONString method
+   * will be called. If the value is a MAP, then a JSONObject will be made
+   * from it and its toJSONString method will be called. Otherwise, the
+   * value's toString method will be called, and the result will be quoted.
+   * <p/>
+   * <p/>
+   * Warning: This method assumes that the data structure is acyclical.
+   *
+   * @param value The value to be serialized.
+   * @return a printable, displayable, transmittable
+   *         representation of the object, beginning
+   *         with <code>{</code>&nbsp;<small>(left brace)</small> and ending
+   *         with <code>}</code>&nbsp;<small>(right brace)</small>.
+   * @throws JSONException If the value is or contains an invalid number.
+   */
+  static String valueToString(Object value) throws JSONException
+  {
+    if (value == null || value.equals(null))
+    {
+      return "null";
+    }
+    if (value instanceof JSONString)
+    {
+      Object o;
+      try
+      {
+        o = ((JSONString) value).toJSONString();
+      }
+      catch (Exception e)
+      {
+        throw new JSONException(e);
+      }
+      if (o instanceof String)
+      {
+        return (String) o;
+      }
+      throw new JSONException("Bad value from toJSONString: " + o);
+    }
+    if (value instanceof Number)
+    {
+      return numberToString((Number) value);
+    }
+    if (value instanceof Boolean || value instanceof JSONObject ||
+        value instanceof JSONArray)
+    {
+      return value.toString();
+    }
+    if (value instanceof Map)
+    {
+      return new JSONObject((Map) value).toString();
+    }
+    if (value instanceof Collection)
+    {
+      return new JSONArray((Collection) value).toString();
+    }
+    if (value.getClass().isArray())
+    {
+      return new JSONArray(value).toString();
+    }
+    return quote(value.toString());
+  }
+
+
+  /**
+   * Make a prettyprinted JSON text of an object value.
+   * <p/>
+   * Warning: This method assumes that the data structure is acyclical.
+   *
+   * @param value        The value to be serialized.
+   * @param indentFactor The number of spaces to add to each level of
+   *                     indentation.
+   * @param indent       The indentation of the top level.
+   * @return a printable, displayable, transmittable
+   *         representation of the object, beginning
+   *         with <code>{</code>&nbsp;<small>(left brace)</small> and ending
+   *         with <code>}</code>&nbsp;<small>(right brace)</small>.
+   * @throws JSONException If the object contains an invalid number.
+   */
+  static String valueToString(Object value, int indentFactor, int indent)
+      throws JSONException
+  {
+    if (value == null || value.equals(null))
+    {
+      return "null";
+    }
+    try
+    {
+      if (value instanceof JSONString)
+      {
+        Object o = ((JSONString) value).toJSONString();
+        if (o instanceof String)
+        {
+          return (String) o;
         }
-        if (value instanceof JSONString) {
-            Object o;
-            try {
-                o = ((JSONString)value).toJSONString();
-            } catch (Exception e) {
-                throw new JSONException(e);
-            }
-            if (o instanceof String) {
-                return (String)o;
-            }
-            throw new JSONException("Bad value from toJSONString: " + o);
-        }
-        if (value instanceof Number) {
-            return numberToString((Number) value);
-        }
-        if (value instanceof Boolean || value instanceof JSONObject ||
-                value instanceof JSONArray) {
-            return value.toString();
-        }
-        if (value instanceof Map) {
-            return new JSONObject((Map)value).toString();
-        }
-        if (value instanceof Collection) {
-            return new JSONArray((Collection)value).toString();
-        }
-        if (value.getClass().isArray()) {
-            return new JSONArray(value).toString();
-        }
-        return quote(value.toString());
+      }
     }
+    catch (Exception e)
+    {
+      /* forget about it */
+    }
+    if (value instanceof Number)
+    {
+      return numberToString((Number) value);
+    }
+    if (value instanceof Boolean)
+    {
+      return value.toString();
+    }
+    if (value instanceof JSONObject)
+    {
+      return ((JSONObject) value).toString(indentFactor, indent);
+    }
+    if (value instanceof JSONArray)
+    {
+      return ((JSONArray) value).toString(indentFactor, indent);
+    }
+    if (value instanceof Map)
+    {
+      return new JSONObject((Map) value).toString(indentFactor, indent);
+    }
+    if (value instanceof Collection)
+    {
+      return new JSONArray((Collection) value).toString(indentFactor, indent);
+    }
+    if (value.getClass().isArray())
+    {
+      return new JSONArray(value).toString(indentFactor, indent);
+    }
+    return quote(value.toString());
+  }
 
 
-    /**
-     * Make a prettyprinted JSON text of an object value.
-     * <p>
-     * Warning: This method assumes that the data structure is acyclical.
-     * @param value The value to be serialized.
-     * @param indentFactor The number of spaces to add to each level of
-     *  indentation.
-     * @param indent The indentation of the top level.
-     * @return a printable, displayable, transmittable
-     *  representation of the object, beginning
-     *  with <code>{</code>&nbsp;<small>(left brace)</small> and ending
-     *  with <code>}</code>&nbsp;<small>(right brace)</small>.
-     * @throws JSONException If the object contains an invalid number.
-     */
-     static String valueToString(Object value, int indentFactor, int indent)
-            throws JSONException {
-        if (value == null || value.equals(null)) {
-            return "null";
+  /**
+   * Write the contents of the JSONObject as JSON text to a writer.
+   * For compactness, no whitespace is added.
+   * <p/>
+   * Warning: This method assumes that the data structure is acyclical.
+   *
+   * @return The writer.
+   * @throws JSONException
+   */
+  public Writer write(Writer writer) throws JSONException
+  {
+    try
+    {
+      boolean b = false;
+      Iterator keys = keys();
+      writer.write('{');
+
+      while (keys.hasNext())
+      {
+        if (b)
+        {
+          writer.write(',');
         }
-        try {
-            if (value instanceof JSONString) {
-                Object o = ((JSONString)value).toJSONString();
-                if (o instanceof String) {
-                    return (String)o;
-                }
-            }
-        } catch (Exception e) {
-            /* forget about it */
+        Object k = keys.next();
+        writer.write(quote(k.toString()));
+        writer.write(':');
+        Object v = this.map.get(k);
+        if (v instanceof JSONObject)
+        {
+          ((JSONObject) v).write(writer);
         }
-        if (value instanceof Number) {
-            return numberToString((Number) value);
+        else if (v instanceof JSONArray)
+        {
+          ((JSONArray) v).write(writer);
         }
-        if (value instanceof Boolean) {
-            return value.toString();
+        else
+        {
+          writer.write(valueToString(v));
         }
-        if (value instanceof JSONObject) {
-            return ((JSONObject)value).toString(indentFactor, indent);
-        }
-        if (value instanceof JSONArray) {
-            return ((JSONArray)value).toString(indentFactor, indent);
-        }
-        if (value instanceof Map) {
-            return new JSONObject((Map)value).toString(indentFactor, indent);
-        }
-        if (value instanceof Collection) {
-            return new JSONArray((Collection)value).toString(indentFactor, indent);
-        }
-        if (value.getClass().isArray()) {
-            return new JSONArray(value).toString(indentFactor, indent);
-        }
-        return quote(value.toString());
+        b = true;
+      }
+      writer.write('}');
+      return writer;
     }
-
-
-     /**
-      * Write the contents of the JSONObject as JSON text to a writer.
-      * For compactness, no whitespace is added.
-      * <p>
-      * Warning: This method assumes that the data structure is acyclical.
-      *
-      * @return The writer.
-      * @throws JSONException
-      */
-     public Writer write(Writer writer) throws JSONException {
-        try {
-            boolean  b = false;
-            Iterator keys = keys();
-            writer.write('{');
-
-            while (keys.hasNext()) {
-                if (b) {
-                    writer.write(',');
-                }
-                Object k = keys.next();
-                writer.write(quote(k.toString()));
-                writer.write(':');
-                Object v = this.map.get(k);
-                if (v instanceof JSONObject) {
-                    ((JSONObject)v).write(writer);
-                } else if (v instanceof JSONArray) {
-                    ((JSONArray)v).write(writer);
-                } else {
-                    writer.write(valueToString(v));
-                }
-                b = true;
-            }
-            writer.write('}');
-            return writer;
-        } catch (IOException e) {
-            throw new JSONException(e);
-        }
-     }
+    catch (IOException e)
+    {
+      throw new JSONException(e);
+    }
+  }
 }
\ No newline at end of file

Modified: projects/gwt-console/trunk/war/src/main/java/org/json/JSONString.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/JSONString.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/JSONString.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -1,18 +1,20 @@
 package org.json;
+
 /**
- * The <code>JSONString</code> interface allows a <code>toJSONString()</code> 
- * method so that a class can change the behavior of 
+ * The <code>JSONString</code> interface allows a <code>toJSONString()</code>
+ * method so that a class can change the behavior of
  * <code>JSONObject.toString()</code>, <code>JSONArray.toString()</code>,
- * and <code>JSONWriter.value(</code>Object<code>)</code>. The 
- * <code>toJSONString</code> method will be used instead of the default behavior 
+ * and <code>JSONWriter.value(</code>Object<code>)</code>. The
+ * <code>toJSONString</code> method will be used instead of the default behavior
  * of using the Object's <code>toString()</code> method and quoting the result.
  */
-public interface JSONString {
-	/**
-	 * The <code>toJSONString</code> method allows a class to produce its own JSON 
-	 * serialization. 
-	 * 
-	 * @return A strictly syntactically correct JSON text.
-	 */
-	public String toJSONString();
+public interface JSONString
+{
+  /**
+   * The <code>toJSONString</code> method allows a class to produce its own JSON
+   * serialization.
+   *
+   * @return A strictly syntactically correct JSON text.
+   */
+  public String toJSONString();
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/json/JSONStringer.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/JSONStringer.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/JSONStringer.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -31,7 +31,7 @@
  * The texts produced strictly conform to JSON syntax rules. No whitespace is
  * added, so the results are ready for transmission or storage. Each instance of
  * JSONStringer can produce one JSON text.
- * <p>
+ * <p/>
  * A JSONStringer instance provides a <code>value</code> method for appending
  * values to the
  * text, and a <code>key</code>
@@ -47,32 +47,37 @@
  *     .endObject()
  *     .toString();</pre> which produces the string <pre>
  * {"JSON":"Hello, World!"}</pre>
- * <p>
+ * <p/>
  * The first method called must be <code>array</code> or <code>object</code>.
  * There are no methods for adding commas or colons. JSONStringer adds them for
  * you. Objects and arrays can be nested up to 20 levels deep.
- * <p>
+ * <p/>
  * This can sometimes be easier than using a JSONObject to build a string.
+ *
  * @author JSON.org
  * @version 2008-09-18
  */
-public class JSONStringer extends JSONWriter {
-    /**
-     * Make a fresh JSONStringer. It can be used to build one JSON text.
-     */
-    public JSONStringer() {
-        super(new StringWriter());
-    }
+public class JSONStringer extends JSONWriter
+{
+  /**
+   * Make a fresh JSONStringer. It can be used to build one JSON text.
+   */
+  public JSONStringer()
+  {
+    super(new StringWriter());
+  }
 
-    /**
-     * Return the JSON text. This method is used to obtain the product of the
-     * JSONStringer instance. It will return <code>null</code> if there was a
-     * problem in the construction of the JSON text (such as the calls to
-     * <code>array</code> were not properly balanced with calls to
-     * <code>endArray</code>).
-     * @return The JSON text.
-     */
-    public String toString() {
-        return this.mode == 'd' ? this.writer.toString() : null;
-    }
+  /**
+   * Return the JSON text. This method is used to obtain the product of the
+   * JSONStringer instance. It will return <code>null</code> if there was a
+   * problem in the construction of the JSON text (such as the calls to
+   * <code>array</code> were not properly balanced with calls to
+   * <code>endArray</code>).
+   *
+   * @return The JSON text.
+   */
+  public String toString()
+  {
+    return this.mode == 'd' ? this.writer.toString() : null;
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/json/JSONTokener.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/JSONTokener.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/JSONTokener.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -33,390 +33,454 @@
  * A JSONTokener takes a source string and extracts characters and tokens from
  * it. It is used by the JSONObject and JSONArray constructors to parse
  * JSON source strings.
+ *
  * @author JSON.org
  * @version 2008-09-18
  */
-public class JSONTokener {
+public class JSONTokener
+{
 
-    private int index;
-    private Reader reader;
-    private char lastChar;
-    private boolean useLastChar;
+  private int index;
+  private Reader reader;
+  private char lastChar;
+  private boolean useLastChar;
 
 
-    /**
-     * Construct a JSONTokener from a string.
-     *
-     * @param reader     A reader.
-     */
-    public JSONTokener(Reader reader) {
-        this.reader = reader.markSupported() ? 
-        		reader : new BufferedReader(reader);
-        this.useLastChar = false;
-        this.index = 0;
-    }
+  /**
+   * Construct a JSONTokener from a string.
+   *
+   * @param reader A reader.
+   */
+  public JSONTokener(Reader reader)
+  {
+    this.reader = reader.markSupported() ?
+        reader : new BufferedReader(reader);
+    this.useLastChar = false;
+    this.index = 0;
+  }
 
 
-    /**
-     * Construct a JSONTokener from a string.
-     *
-     * @param s     A source string.
-     */
-    public JSONTokener(String s) {
-        this(new StringReader(s));
-    }
+  /**
+   * Construct a JSONTokener from a string.
+   *
+   * @param s A source string.
+   */
+  public JSONTokener(String s)
+  {
+    this(new StringReader(s));
+  }
 
 
-    /**
-     * Back up one character. This provides a sort of lookahead capability,
-     * so that you can test for a digit or letter before attempting to parse
-     * the next number or identifier.
-     */
-    public void back() throws JSONException {
-        if (useLastChar || index <= 0) {
-            throw new JSONException("Stepping back two steps is not supported");
-        }
-        index -= 1;
-        useLastChar = true;
+  /**
+   * Back up one character. This provides a sort of lookahead capability,
+   * so that you can test for a digit or letter before attempting to parse
+   * the next number or identifier.
+   */
+  public void back() throws JSONException
+  {
+    if (useLastChar || index <= 0)
+    {
+      throw new JSONException("Stepping back two steps is not supported");
     }
+    index -= 1;
+    useLastChar = true;
+  }
 
 
-
-    /**
-     * Get the hex value of a character (base16).
-     * @param c A character between '0' and '9' or between 'A' and 'F' or
-     * between 'a' and 'f'.
-     * @return  An int between 0 and 15, or -1 if c was not a hex digit.
-     */
-    public static int dehexchar(char c) {
-        if (c >= '0' && c <= '9') {
-            return c - '0';
-        }
-        if (c >= 'A' && c <= 'F') {
-            return c - ('A' - 10);
-        }
-        if (c >= 'a' && c <= 'f') {
-            return c - ('a' - 10);
-        }
-        return -1;
+  /**
+   * Get the hex value of a character (base16).
+   *
+   * @param c A character between '0' and '9' or between 'A' and 'F' or
+   *          between 'a' and 'f'.
+   * @return An int between 0 and 15, or -1 if c was not a hex digit.
+   */
+  public static int dehexchar(char c)
+  {
+    if (c >= '0' && c <= '9')
+    {
+      return c - '0';
     }
+    if (c >= 'A' && c <= 'F')
+    {
+      return c - ('A' - 10);
+    }
+    if (c >= 'a' && c <= 'f')
+    {
+      return c - ('a' - 10);
+    }
+    return -1;
+  }
 
 
-    /**
-     * Determine if the source string still contains characters that next()
-     * can consume.
-     * @return true if not yet at the end of the source.
-     */
-    public boolean more() throws JSONException {
-        char nextChar = next();
-        if (nextChar == 0) {
-            return false;
-        } 
-        back();
-        return true;
+  /**
+   * Determine if the source string still contains characters that next()
+   * can consume.
+   *
+   * @return true if not yet at the end of the source.
+   */
+  public boolean more() throws JSONException
+  {
+    char nextChar = next();
+    if (nextChar == 0)
+    {
+      return false;
     }
+    back();
+    return true;
+  }
 
 
-    /**
-     * Get the next character in the source string.
-     *
-     * @return The next character, or 0 if past the end of the source string.
-     */
-    public char next() throws JSONException {
-        if (this.useLastChar) {
-        	this.useLastChar = false;
-            if (this.lastChar != 0) {
-            	this.index += 1;
-            }
-            return this.lastChar;
-        } 
-        int c;
-        try {
-            c = this.reader.read();
-        } catch (IOException exc) {
-            throw new JSONException(exc);
-        }
+  /**
+   * Get the next character in the source string.
+   *
+   * @return The next character, or 0 if past the end of the source string.
+   */
+  public char next() throws JSONException
+  {
+    if (this.useLastChar)
+    {
+      this.useLastChar = false;
+      if (this.lastChar != 0)
+      {
+        this.index += 1;
+      }
+      return this.lastChar;
+    }
+    int c;
+    try
+    {
+      c = this.reader.read();
+    }
+    catch (IOException exc)
+    {
+      throw new JSONException(exc);
+    }
 
-        if (c <= 0) { // End of stream
-        	this.lastChar = 0;
-            return 0;
-        } 
-    	this.index += 1;
-    	this.lastChar = (char) c;
-        return this.lastChar;
+    if (c <= 0)
+    { // End of stream
+      this.lastChar = 0;
+      return 0;
     }
+    this.index += 1;
+    this.lastChar = (char) c;
+    return this.lastChar;
+  }
 
 
-    /**
-     * Consume the next character, and check that it matches a specified
-     * character.
-     * @param c The character to match.
-     * @return The character.
-     * @throws JSONException if the character does not match.
-     */
-    public char next(char c) throws JSONException {
-        char n = next();
-        if (n != c) {
-            throw syntaxError("Expected '" + c + "' and instead saw '" +
-                    n + "'");
-        }
-        return n;
+  /**
+   * Consume the next character, and check that it matches a specified
+   * character.
+   *
+   * @param c The character to match.
+   * @return The character.
+   * @throws JSONException if the character does not match.
+   */
+  public char next(char c) throws JSONException
+  {
+    char n = next();
+    if (n != c)
+    {
+      throw syntaxError("Expected '" + c + "' and instead saw '" +
+          n + "'");
     }
+    return n;
+  }
 
 
-    /**
-     * Get the next n characters.
-     *
-     * @param n     The number of characters to take.
-     * @return      A string of n characters.
-     * @throws JSONException
-     *   Substring bounds error if there are not
-     *   n characters remaining in the source string.
-     */
-     public String next(int n) throws JSONException {
-         if (n == 0) {
-             return "";
-         }
+  /**
+   * Get the next n characters.
+   *
+   * @param n The number of characters to take.
+   * @return A string of n characters.
+   * @throws JSONException Substring bounds error if there are not
+   *                       n characters remaining in the source string.
+   */
+  public String next(int n) throws JSONException
+  {
+    if (n == 0)
+    {
+      return "";
+    }
 
-         char[] buffer = new char[n];
-         int pos = 0;
+    char[] buffer = new char[n];
+    int pos = 0;
 
-         if (this.useLastChar) {
-        	 this.useLastChar = false;
-             buffer[0] = this.lastChar;
-             pos = 1;
-         }
+    if (this.useLastChar)
+    {
+      this.useLastChar = false;
+      buffer[0] = this.lastChar;
+      pos = 1;
+    }
 
-         try {
-             int len;
-             while ((pos < n) && ((len = reader.read(buffer, pos, n - pos)) != -1)) {
-                 pos += len;
-             }
-         } catch (IOException exc) {
-             throw new JSONException(exc);
-         }
-         this.index += pos;
+    try
+    {
+      int len;
+      while ((pos < n) && ((len = reader.read(buffer, pos, n - pos)) != -1))
+      {
+        pos += len;
+      }
+    }
+    catch (IOException exc)
+    {
+      throw new JSONException(exc);
+    }
+    this.index += pos;
 
-         if (pos < n) {
-             throw syntaxError("Substring bounds error");
-         }
+    if (pos < n)
+    {
+      throw syntaxError("Substring bounds error");
+    }
 
-         this.lastChar = buffer[n - 1];
-         return new String(buffer);
-     }
+    this.lastChar = buffer[n - 1];
+    return new String(buffer);
+  }
 
 
-    /**
-     * Get the next char in the string, skipping whitespace.
-     * @throws JSONException
-     * @return  A character, or 0 if there are no more characters.
-     */
-    public char nextClean() throws JSONException {
-        for (;;) {
-            char c = next();
-            if (c == 0 || c > ' ') {
-                return c;
-            }
-        }
+  /**
+   * Get the next char in the string, skipping whitespace.
+   *
+   * @return A character, or 0 if there are no more characters.
+   * @throws JSONException
+   */
+  public char nextClean() throws JSONException
+  {
+    for (; ;)
+    {
+      char c = next();
+      if (c == 0 || c > ' ')
+      {
+        return c;
+      }
     }
+  }
 
 
-    /**
-     * Return the characters up to the next close quote character.
-     * Backslash processing is done. The formal JSON format does not
-     * allow strings in single quotes, but an implementation is allowed to
-     * accept them.
-     * @param quote The quoting character, either
-     *      <code>"</code>&nbsp;<small>(double quote)</small> or
-     *      <code>'</code>&nbsp;<small>(single quote)</small>.
-     * @return      A String.
-     * @throws JSONException Unterminated string.
-     */
-    public String nextString(char quote) throws JSONException {
-        char c;
-        StringBuffer sb = new StringBuffer();
-        for (;;) {
-            c = next();
-            switch (c) {
-            case 0:
-            case '\n':
-            case '\r':
-                throw syntaxError("Unterminated string");
-            case '\\':
-                c = next();
-                switch (c) {
-                case 'b':
-                    sb.append('\b');
-                    break;
-                case 't':
-                    sb.append('\t');
-                    break;
-                case 'n':
-                    sb.append('\n');
-                    break;
-                case 'f':
-                    sb.append('\f');
-                    break;
-                case 'r':
-                    sb.append('\r');
-                    break;
-                case 'u':
-                    sb.append((char)Integer.parseInt(next(4), 16));
-                    break;
-                case 'x' :
-                    sb.append((char) Integer.parseInt(next(2), 16));
-                    break;
-                default:
-                    sb.append(c);
-                }
-                break;
+  /**
+   * Return the characters up to the next close quote character.
+   * Backslash processing is done. The formal JSON format does not
+   * allow strings in single quotes, but an implementation is allowed to
+   * accept them.
+   *
+   * @param quote The quoting character, either
+   *              <code>"</code>&nbsp;<small>(double quote)</small> or
+   *              <code>'</code>&nbsp;<small>(single quote)</small>.
+   * @return A String.
+   * @throws JSONException Unterminated string.
+   */
+  public String nextString(char quote) throws JSONException
+  {
+    char c;
+    StringBuffer sb = new StringBuffer();
+    for (; ;)
+    {
+      c = next();
+      switch (c)
+      {
+        case 0:
+        case'\n':
+        case'\r':
+          throw syntaxError("Unterminated string");
+        case'\\':
+          c = next();
+          switch (c)
+          {
+            case'b':
+              sb.append('\b');
+              break;
+            case't':
+              sb.append('\t');
+              break;
+            case'n':
+              sb.append('\n');
+              break;
+            case'f':
+              sb.append('\f');
+              break;
+            case'r':
+              sb.append('\r');
+              break;
+            case'u':
+              sb.append((char) Integer.parseInt(next(4), 16));
+              break;
+            case'x':
+              sb.append((char) Integer.parseInt(next(2), 16));
+              break;
             default:
-                if (c == quote) {
-                    return sb.toString();
-                }
-                sb.append(c);
-            }
-        }
+              sb.append(c);
+          }
+          break;
+        default:
+          if (c == quote)
+          {
+            return sb.toString();
+          }
+          sb.append(c);
+      }
     }
+  }
 
 
-    /**
-     * Get the text up but not including the specified character or the
-     * end of line, whichever comes first.
-     * @param  d A delimiter character.
-     * @return   A string.
-     */
-    public String nextTo(char d) throws JSONException {
-        StringBuffer sb = new StringBuffer();
-        for (;;) {
-            char c = next();
-            if (c == d || c == 0 || c == '\n' || c == '\r') {
-                if (c != 0) {
-                    back();
-                }
-                return sb.toString().trim();
-            }
-            sb.append(c);
+  /**
+   * Get the text up but not including the specified character or the
+   * end of line, whichever comes first.
+   *
+   * @param d A delimiter character.
+   * @return A string.
+   */
+  public String nextTo(char d) throws JSONException
+  {
+    StringBuffer sb = new StringBuffer();
+    for (; ;)
+    {
+      char c = next();
+      if (c == d || c == 0 || c == '\n' || c == '\r')
+      {
+        if (c != 0)
+        {
+          back();
         }
+        return sb.toString().trim();
+      }
+      sb.append(c);
     }
+  }
 
 
-    /**
-     * Get the text up but not including one of the specified delimiter
-     * characters or the end of line, whichever comes first.
-     * @param delimiters A set of delimiter characters.
-     * @return A string, trimmed.
-     */
-    public String nextTo(String delimiters) throws JSONException {
-        char c;
-        StringBuffer sb = new StringBuffer();
-        for (;;) {
-            c = next();
-            if (delimiters.indexOf(c) >= 0 || c == 0 ||
-                    c == '\n' || c == '\r') {
-                if (c != 0) {
-                    back();
-                }
-                return sb.toString().trim();
-            }
-            sb.append(c);
+  /**
+   * Get the text up but not including one of the specified delimiter
+   * characters or the end of line, whichever comes first.
+   *
+   * @param delimiters A set of delimiter characters.
+   * @return A string, trimmed.
+   */
+  public String nextTo(String delimiters) throws JSONException
+  {
+    char c;
+    StringBuffer sb = new StringBuffer();
+    for (; ;)
+    {
+      c = next();
+      if (delimiters.indexOf(c) >= 0 || c == 0 ||
+          c == '\n' || c == '\r')
+      {
+        if (c != 0)
+        {
+          back();
         }
+        return sb.toString().trim();
+      }
+      sb.append(c);
     }
+  }
 
 
-    /**
-     * Get the next value. The value can be a Boolean, Double, Integer,
-     * JSONArray, JSONObject, Long, or String, or the JSONObject.NULL object.
-     * @throws JSONException If syntax error.
-     *
-     * @return An object.
-     */
-    public Object nextValue() throws JSONException {
-        char c = nextClean();
-        String s;
+  /**
+   * Get the next value. The value can be a Boolean, Double, Integer,
+   * JSONArray, JSONObject, Long, or String, or the JSONObject.NULL object.
+   *
+   * @return An object.
+   * @throws JSONException If syntax error.
+   */
+  public Object nextValue() throws JSONException
+  {
+    char c = nextClean();
+    String s;
 
-        switch (c) {
-            case '"':
-            case '\'':
-                return nextString(c);
-            case '{':
-                back();
-                return new JSONObject(this);
-            case '[':
-            case '(':
-                back();
-                return new JSONArray(this);
-        }
+    switch (c)
+    {
+      case'"':
+      case'\'':
+        return nextString(c);
+      case'{':
+        back();
+        return new JSONObject(this);
+      case'[':
+      case'(':
+        back();
+        return new JSONArray(this);
+    }
 
-        /*
-         * Handle unquoted text. This could be the values true, false, or
-         * null, or it can be a number. An implementation (such as this one)
-         * is allowed to also accept non-standard forms.
-         *
-         * Accumulate characters until we reach the end of the text or a
-         * formatting character.
-         */
+    /*
+    * Handle unquoted text. This could be the values true, false, or
+    * null, or it can be a number. An implementation (such as this one)
+    * is allowed to also accept non-standard forms.
+    *
+    * Accumulate characters until we reach the end of the text or a
+    * formatting character.
+    */
 
-        StringBuffer sb = new StringBuffer();
-        while (c >= ' ' && ",:]}/\\\"[{;=#".indexOf(c) < 0) {
-            sb.append(c);
-            c = next();
-        }
-        back();
+    StringBuffer sb = new StringBuffer();
+    while (c >= ' ' && ",:]}/\\\"[{;=#".indexOf(c) < 0)
+    {
+      sb.append(c);
+      c = next();
+    }
+    back();
 
-        s = sb.toString().trim();
-        if (s.equals("")) {
-            throw syntaxError("Missing value");
-        }
-        return JSONObject.stringToValue(s);
+    s = sb.toString().trim();
+    if (s.equals(""))
+    {
+      throw syntaxError("Missing value");
     }
+    return JSONObject.stringToValue(s);
+  }
 
 
-    /**
-     * Skip characters until the next character is the requested character.
-     * If the requested character is not found, no characters are skipped.
-     * @param to A character to skip to.
-     * @return The requested character, or zero if the requested character
-     * is not found.
-     */
-    public char skipTo(char to) throws JSONException {
-        char c;
-        try {
-            int startIndex = this.index;
-            reader.mark(Integer.MAX_VALUE);
-            do {
-                c = next();
-                if (c == 0) {
-                    reader.reset();
-                    this.index = startIndex;
-                    return c;
-                }
-            } while (c != to);
-        } catch (IOException exc) {
-            throw new JSONException(exc);
+  /**
+   * Skip characters until the next character is the requested character.
+   * If the requested character is not found, no characters are skipped.
+   *
+   * @param to A character to skip to.
+   * @return The requested character, or zero if the requested character
+   *         is not found.
+   */
+  public char skipTo(char to) throws JSONException
+  {
+    char c;
+    try
+    {
+      int startIndex = this.index;
+      reader.mark(Integer.MAX_VALUE);
+      do
+      {
+        c = next();
+        if (c == 0)
+        {
+          reader.reset();
+          this.index = startIndex;
+          return c;
         }
-
-        back();
-        return c;
+      }
+      while (c != to);
     }
-
-    /**
-     * Make a JSONException to signal a syntax error.
-     *
-     * @param message The error message.
-     * @return  A JSONException object, suitable for throwing
-     */
-    public JSONException syntaxError(String message) {
-        return new JSONException(message + toString());
+    catch (IOException exc)
+    {
+      throw new JSONException(exc);
     }
 
+    back();
+    return c;
+  }
 
-    /**
-     * Make a printable string of this JSONTokener.
-     *
-     * @return " at character [this.index]"
-     */
-    public String toString() {
-        return " at character " + index;
-    }
+  /**
+   * Make a JSONException to signal a syntax error.
+   *
+   * @param message The error message.
+   * @return A JSONException object, suitable for throwing
+   */
+  public JSONException syntaxError(String message)
+  {
+    return new JSONException(message + toString());
+  }
+
+
+  /**
+   * Make a printable string of this JSONTokener.
+   *
+   * @return " at character [this.index]"
+   */
+  public String toString()
+  {
+    return " at character " + index;
+  }
 }
\ No newline at end of file

Modified: projects/gwt-console/trunk/war/src/main/java/org/json/JSONWriter.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/JSONWriter.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/JSONWriter.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -32,7 +32,7 @@
  * The texts produced strictly conform to JSON syntax rules. No whitespace is
  * added, so the results are ready for transmission or storage. Each instance of
  * JSONWriter can produce one JSON text.
- * <p>
+ * <p/>
  * A JSONWriter instance provides a <code>value</code> method for appending
  * values to the
  * text, and a <code>key</code>
@@ -47,277 +47,329 @@
  *         .value("Hello, World!")
  *     .endObject();</pre> which writes <pre>
  * {"JSON":"Hello, World!"}</pre>
- * <p>
+ * <p/>
  * The first method called must be <code>array</code> or <code>object</code>.
  * There are no methods for adding commas or colons. JSONWriter adds them for
  * you. Objects and arrays can be nested up to 20 levels deep.
- * <p>
+ * <p/>
  * This can sometimes be easier than using a JSONObject to build a string.
+ *
  * @author JSON.org
  * @version 2008-09-18
  */
-public class JSONWriter {
-    private static final int maxdepth = 20;
+public class JSONWriter
+{
+  private static final int maxdepth = 20;
 
-    /**
-     * The comma flag determines if a comma should be output before the next
-     * value.
-     */
-    private boolean comma;
+  /**
+   * The comma flag determines if a comma should be output before the next
+   * value.
+   */
+  private boolean comma;
 
-    /**
-     * The current mode. Values:
-     * 'a' (array),
-     * 'd' (done),
-     * 'i' (initial),
-     * 'k' (key),
-     * 'o' (object).
-     */
-    protected char mode;
+  /**
+   * The current mode. Values:
+   * 'a' (array),
+   * 'd' (done),
+   * 'i' (initial),
+   * 'k' (key),
+   * 'o' (object).
+   */
+  protected char mode;
 
-    /**
-     * The object/array stack.
-     */
-    private JSONObject stack[];
+  /**
+   * The object/array stack.
+   */
+  private JSONObject stack[];
 
-    /**
-     * The stack top index. A value of 0 indicates that the stack is empty.
-     */
-    private int top;
+  /**
+   * The stack top index. A value of 0 indicates that the stack is empty.
+   */
+  private int top;
 
-    /**
-     * The writer that will receive the output.
-     */
-    protected Writer writer;
+  /**
+   * The writer that will receive the output.
+   */
+  protected Writer writer;
 
-    /**
-     * Make a fresh JSONWriter. It can be used to build one JSON text.
-     */
-    public JSONWriter(Writer w) {
-        this.comma = false;
-        this.mode = 'i';
-        this.stack = new JSONObject[maxdepth];
-        this.top = 0;
-        this.writer = w;
-    }
+  /**
+   * Make a fresh JSONWriter. It can be used to build one JSON text.
+   */
+  public JSONWriter(Writer w)
+  {
+    this.comma = false;
+    this.mode = 'i';
+    this.stack = new JSONObject[maxdepth];
+    this.top = 0;
+    this.writer = w;
+  }
 
-    /**
-     * Append a value.
-     * @param s A string value.
-     * @return this
-     * @throws JSONException If the value is out of sequence.
-     */
-    private JSONWriter append(String s) throws JSONException {
-        if (s == null) {
-            throw new JSONException("Null pointer");
-        }
-        if (this.mode == 'o' || this.mode == 'a') {
-            try {
-                if (this.comma && this.mode == 'a') {
-                    this.writer.write(',');
-                }
-                this.writer.write(s);
-            } catch (IOException e) {
-                throw new JSONException(e);
-            }
-            if (this.mode == 'o') {
-                this.mode = 'k';
-            }
-            this.comma = true;
-            return this;
-        }
-        throw new JSONException("Value out of sequence.");
+  /**
+   * Append a value.
+   *
+   * @param s A string value.
+   * @return this
+   * @throws JSONException If the value is out of sequence.
+   */
+  private JSONWriter append(String s) throws JSONException
+  {
+    if (s == null)
+    {
+      throw new JSONException("Null pointer");
     }
-
-    /**
-     * Begin appending a new array. All values until the balancing
-     * <code>endArray</code> will be appended to this array. The
-     * <code>endArray</code> method must be called to mark the array's end.
-     * @return this
-     * @throws JSONException If the nesting is too deep, or if the object is
-     * started in the wrong place (for example as a key or after the end of the
-     * outermost array or object).
-     */
-    public JSONWriter array() throws JSONException {
-        if (this.mode == 'i' || this.mode == 'o' || this.mode == 'a') {
-            this.push(null);
-            this.append("[");
-            this.comma = false;
-            return this;
+    if (this.mode == 'o' || this.mode == 'a')
+    {
+      try
+      {
+        if (this.comma && this.mode == 'a')
+        {
+          this.writer.write(',');
         }
-        throw new JSONException("Misplaced array.");
+        this.writer.write(s);
+      }
+      catch (IOException e)
+      {
+        throw new JSONException(e);
+      }
+      if (this.mode == 'o')
+      {
+        this.mode = 'k';
+      }
+      this.comma = true;
+      return this;
     }
+    throw new JSONException("Value out of sequence.");
+  }
 
-    /**
-     * End something.
-     * @param m Mode
-     * @param c Closing character
-     * @return this
-     * @throws JSONException If unbalanced.
-     */
-    private JSONWriter end(char m, char c) throws JSONException {
-        if (this.mode != m) {
-            throw new JSONException(m == 'o' ? "Misplaced endObject." :
-                "Misplaced endArray.");
-        }
-        this.pop(m);
-        try {
-            this.writer.write(c);
-        } catch (IOException e) {
-            throw new JSONException(e);
-        }
-        this.comma = true;
-        return this;
+  /**
+   * Begin appending a new array. All values until the balancing
+   * <code>endArray</code> will be appended to this array. The
+   * <code>endArray</code> method must be called to mark the array's end.
+   *
+   * @return this
+   * @throws JSONException If the nesting is too deep, or if the object is
+   *                       started in the wrong place (for example as a key or after the end of the
+   *                       outermost array or object).
+   */
+  public JSONWriter array() throws JSONException
+  {
+    if (this.mode == 'i' || this.mode == 'o' || this.mode == 'a')
+    {
+      this.push(null);
+      this.append("[");
+      this.comma = false;
+      return this;
     }
+    throw new JSONException("Misplaced array.");
+  }
 
-    /**
-     * End an array. This method most be called to balance calls to
-     * <code>array</code>.
-     * @return this
-     * @throws JSONException If incorrectly nested.
-     */
-    public JSONWriter endArray() throws JSONException {
-        return this.end('a', ']');
+  /**
+   * End something.
+   *
+   * @param m Mode
+   * @param c Closing character
+   * @return this
+   * @throws JSONException If unbalanced.
+   */
+  private JSONWriter end(char m, char c) throws JSONException
+  {
+    if (this.mode != m)
+    {
+      throw new JSONException(m == 'o' ? "Misplaced endObject." :
+          "Misplaced endArray.");
     }
-
-    /**
-     * End an object. This method most be called to balance calls to
-     * <code>object</code>.
-     * @return this
-     * @throws JSONException If incorrectly nested.
-     */
-    public JSONWriter endObject() throws JSONException {
-        return this.end('k', '}');
+    this.pop(m);
+    try
+    {
+      this.writer.write(c);
     }
-
-    /**
-     * Append a key. The key will be associated with the next value. In an
-     * object, every value must be preceded by a key.
-     * @param s A key string.
-     * @return this
-     * @throws JSONException If the key is out of place. For example, keys
-     *  do not belong in arrays or if the key is null.
-     */
-    public JSONWriter key(String s) throws JSONException {
-        if (s == null) {
-            throw new JSONException("Null key.");
-        }
-        if (this.mode == 'k') {
-            try {
-                if (this.comma) {
-                    this.writer.write(',');
-                }
-                stack[top - 1].putOnce(s, Boolean.TRUE);
-                this.writer.write(JSONObject.quote(s));
-                this.writer.write(':');
-                this.comma = false;
-                this.mode = 'o';
-                return this;
-            } catch (IOException e) {
-                throw new JSONException(e);
-            }
-        }
-        throw new JSONException("Misplaced key.");
+    catch (IOException e)
+    {
+      throw new JSONException(e);
     }
+    this.comma = true;
+    return this;
+  }
 
+  /**
+   * End an array. This method most be called to balance calls to
+   * <code>array</code>.
+   *
+   * @return this
+   * @throws JSONException If incorrectly nested.
+   */
+  public JSONWriter endArray() throws JSONException
+  {
+    return this.end('a', ']');
+  }
 
-    /**
-     * Begin appending a new object. All keys and values until the balancing
-     * <code>endObject</code> will be appended to this object. The
-     * <code>endObject</code> method must be called to mark the object's end.
-     * @return this
-     * @throws JSONException If the nesting is too deep, or if the object is
-     * started in the wrong place (for example as a key or after the end of the
-     * outermost array or object).
-     */
-    public JSONWriter object() throws JSONException {
-        if (this.mode == 'i') {
-            this.mode = 'o';
-        }
-        if (this.mode == 'o' || this.mode == 'a') {
-            this.append("{");
-            this.push(new JSONObject());
-            this.comma = false;
-            return this;
-        }
-        throw new JSONException("Misplaced object.");
+  /**
+   * End an object. This method most be called to balance calls to
+   * <code>object</code>.
+   *
+   * @return this
+   * @throws JSONException If incorrectly nested.
+   */
+  public JSONWriter endObject() throws JSONException
+  {
+    return this.end('k', '}');
+  }
 
+  /**
+   * Append a key. The key will be associated with the next value. In an
+   * object, every value must be preceded by a key.
+   *
+   * @param s A key string.
+   * @return this
+   * @throws JSONException If the key is out of place. For example, keys
+   *                       do not belong in arrays or if the key is null.
+   */
+  public JSONWriter key(String s) throws JSONException
+  {
+    if (s == null)
+    {
+      throw new JSONException("Null key.");
     }
-
-
-    /**
-     * Pop an array or object scope.
-     * @param c The scope to close.
-     * @throws JSONException If nesting is wrong.
-     */
-    private void pop(char c) throws JSONException {
-        if (this.top <= 0) {
-            throw new JSONException("Nesting error.");
+    if (this.mode == 'k')
+    {
+      try
+      {
+        if (this.comma)
+        {
+          this.writer.write(',');
         }
-        char m = this.stack[this.top - 1] == null ? 'a' : 'k';
-        if (m != c) {
-            throw new JSONException("Nesting error.");
-        }
-        this.top -= 1;
-        this.mode = this.top == 0 ? 'd' : this.stack[this.top - 1] == null ? 'a' : 'k';
+        stack[top - 1].putOnce(s, Boolean.TRUE);
+        this.writer.write(JSONObject.quote(s));
+        this.writer.write(':');
+        this.comma = false;
+        this.mode = 'o';
+        return this;
+      }
+      catch (IOException e)
+      {
+        throw new JSONException(e);
+      }
     }
+    throw new JSONException("Misplaced key.");
+  }
 
-    /**
-     * Push an array or object scope.
-     * @param c The scope to open.
-     * @throws JSONException If nesting is too deep.
-     */
-    private void push(JSONObject jo) throws JSONException {
-        if (this.top >= maxdepth) {
-            throw new JSONException("Nesting too deep.");
-        }
-        this.stack[this.top] = jo;
-        this.mode = jo == null ? 'a' : 'k';
-        this.top += 1;
+
+  /**
+   * Begin appending a new object. All keys and values until the balancing
+   * <code>endObject</code> will be appended to this object. The
+   * <code>endObject</code> method must be called to mark the object's end.
+   *
+   * @return this
+   * @throws JSONException If the nesting is too deep, or if the object is
+   *                       started in the wrong place (for example as a key or after the end of the
+   *                       outermost array or object).
+   */
+  public JSONWriter object() throws JSONException
+  {
+    if (this.mode == 'i')
+    {
+      this.mode = 'o';
     }
+    if (this.mode == 'o' || this.mode == 'a')
+    {
+      this.append("{");
+      this.push(new JSONObject());
+      this.comma = false;
+      return this;
+    }
+    throw new JSONException("Misplaced object.");
 
+  }
 
-    /**
-     * Append either the value <code>true</code> or the value
-     * <code>false</code>.
-     * @param b A boolean.
-     * @return this
-     * @throws JSONException
-     */
-    public JSONWriter value(boolean b) throws JSONException {
-        return this.append(b ? "true" : "false");
-    }
 
-    /**
-     * Append a double value.
-     * @param d A double.
-     * @return this
-     * @throws JSONException If the number is not finite.
-     */
-    public JSONWriter value(double d) throws JSONException {
-        return this.value(new Double(d));
+  /**
+   * Pop an array or object scope.
+   *
+   * @param c The scope to close.
+   * @throws JSONException If nesting is wrong.
+   */
+  private void pop(char c) throws JSONException
+  {
+    if (this.top <= 0)
+    {
+      throw new JSONException("Nesting error.");
     }
+    char m = this.stack[this.top - 1] == null ? 'a' : 'k';
+    if (m != c)
+    {
+      throw new JSONException("Nesting error.");
+    }
+    this.top -= 1;
+    this.mode = this.top == 0 ? 'd' : this.stack[this.top - 1] == null ? 'a' : 'k';
+  }
 
-    /**
-     * Append a long value.
-     * @param l A long.
-     * @return this
-     * @throws JSONException
-     */
-    public JSONWriter value(long l) throws JSONException {
-        return this.append(Long.toString(l));
+  /**
+   * Push an array or object scope.
+   *
+   * @param c The scope to open.
+   * @throws JSONException If nesting is too deep.
+   */
+  private void push(JSONObject jo) throws JSONException
+  {
+    if (this.top >= maxdepth)
+    {
+      throw new JSONException("Nesting too deep.");
     }
+    this.stack[this.top] = jo;
+    this.mode = jo == null ? 'a' : 'k';
+    this.top += 1;
+  }
 
 
-    /**
-     * Append an object value.
-     * @param o The object to append. It can be null, or a Boolean, Number,
-     *   String, JSONObject, or JSONArray, or an object with a toJSONString()
-     *   method.
-     * @return this
-     * @throws JSONException If the value is out of sequence.
-     */
-    public JSONWriter value(Object o) throws JSONException {
-        return this.append(JSONObject.valueToString(o));
-    }
+  /**
+   * Append either the value <code>true</code> or the value
+   * <code>false</code>.
+   *
+   * @param b A boolean.
+   * @return this
+   * @throws JSONException
+   */
+  public JSONWriter value(boolean b) throws JSONException
+  {
+    return this.append(b ? "true" : "false");
+  }
+
+  /**
+   * Append a double value.
+   *
+   * @param d A double.
+   * @return this
+   * @throws JSONException If the number is not finite.
+   */
+  public JSONWriter value(double d) throws JSONException
+  {
+    return this.value(new Double(d));
+  }
+
+  /**
+   * Append a long value.
+   *
+   * @param l A long.
+   * @return this
+   * @throws JSONException
+   */
+  public JSONWriter value(long l) throws JSONException
+  {
+    return this.append(Long.toString(l));
+  }
+
+
+  /**
+   * Append an object value.
+   *
+   * @param o The object to append. It can be null, or a Boolean, Number,
+   *          String, JSONObject, or JSONArray, or an object with a toJSONString()
+   *          method.
+   * @return this
+   * @throws JSONException If the value is out of sequence.
+   */
+  public JSONWriter value(Object o) throws JSONException
+  {
+    return this.append(JSONObject.valueToString(o));
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/json/Test.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/Test.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/Test.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -9,611 +9,677 @@
  * Test class. This file is not formally a member of the org.json library.
  * It is just a casual test tool.
  */
-public class Test {
+public class Test
+{
 
-    /**
-     * Entry point.
-     * @param args
-     */
-    public static void main(String args[]) {
-        Iterator it;
-        JSONArray a;
-        JSONObject j;
-        JSONStringer jj;
-        String s;
-        
-/** 
+  /**
+   * Entry point.
+   *
+   * @param args
+   */
+  public static void main(String args[])
+  {
+    Iterator it;
+    JSONArray a;
+    JSONObject j;
+    JSONStringer jj;
+    String s;
+
+/**
  *  Obj is a typical class that implements JSONString. It also
  *  provides some beanie methods that can be used to 
  *  construct a JSONObject. It also demonstrates constructing
  *  a JSONObject with an array of names.
  */
-        class Obj implements JSONString {
-        	public String aString;
-        	public double aNumber;
-        	public boolean aBoolean;
-        	
-            public Obj(String string, double n, boolean b) {
-                this.aString = string;
-                this.aNumber = n;
-                this.aBoolean = b;
-            }
-            
-            public double getNumber() {
-            	return this.aNumber;
-            }
-            
-            public String getString() {
-            	return this.aString;
-            }
-            
-            public boolean isBoolean() {
-            	return this.aBoolean;
-            }
-            
-            public String getBENT() {
-            	return "All uppercase key";
-            }
-            
-            public String getX() {
-            	return "x";
-            }
-            
-            public String toJSONString() {
-            	return "{" + JSONObject.quote(this.aString) + ":" + 
-            	JSONObject.doubleToString(this.aNumber) + "}";
-            }            
-            public String toString() {
-            	return this.getString() + " " + this.getNumber() + " " + 
-            			this.isBoolean() + "." + this.getBENT() + " " + this.getX();
-            }
-        }      
-        
-    	Obj obj = new Obj("A beany object", 42, true);
-        
-        try {     
-            j = XML.toJSONObject("<![CDATA[This is a collection of test patterns and examples for org.json.]]>  Ignore the stuff past the end.  ");
-            System.out.println(j.toString());
+    class Obj implements JSONString
+    {
+      public String aString;
+      public double aNumber;
+      public boolean aBoolean;
 
-            s = "<recipe name=\"bread\" prep_time=\"5 mins\" cook_time=\"3 hours\"> <title>Basic bread</title> <ingredient amount=\"8\" unit=\"dL\">Flour</ingredient> <ingredient amount=\"10\" unit=\"grams\">Yeast</ingredient> <ingredient amount=\"4\" unit=\"dL\" state=\"warm\">Water</ingredient> <ingredient amount=\"1\" unit=\"teaspoon\">Salt</ingredient> <instructions> <step>Mix all ingredients together.</step> <step>Knead thoroughly.</step> <step>Cover with a cloth, and leave for one hour in warm room.</step> <step>Knead again.</step> <step>Place in a bread baking tin.</step> <step>Cover with a cloth, and leave for one hour in warm room.</step> <step>Bake in the oven at 180(degrees)C for 30 minutes.</step> </instructions> </recipe> ";
-            j = XML.toJSONObject(s);
-            System.out.println(j.toString(4));
-            System.out.println();
-            
-            j = JSONML.toJSONObject(s);
-            System.out.println(j.toString());
-            System.out.println(JSONML.toString(j));
-            System.out.println();
-            
-            a = JSONML.toJSONArray(s);
-            System.out.println(a.toString(4));
-            System.out.println(JSONML.toString(a));
-            System.out.println();
-            
-            s = "<div id=\"demo\" class=\"JSONML\"><p>JSONML is a transformation between <b>JSON</b> and <b>XML</b> that preserves ordering of document features.</p><p>JSONML can work with JSON arrays or JSON objects.</p><p>Three<br/>little<br/>words</p></div>";
-            j = JSONML.toJSONObject(s);
-            System.out.println(j.toString(4));
-            System.out.println(JSONML.toString(j));
-            System.out.println();
-            
-            a = JSONML.toJSONArray(s);
-            System.out.println(a.toString(4));
-            System.out.println(JSONML.toString(a));
-            System.out.println();
-            
-            s = "<person created=\"2006-11-11T19:23\" modified=\"2006-12-31T23:59\">\n <firstName>Robert</firstName>\n <lastName>Smith</lastName>\n <address type=\"home\">\n <street>12345 Sixth Ave</street>\n <city>Anytown</city>\n <state>CA</state>\n <postalCode>98765-4321</postalCode>\n </address>\n </person>";
-            j = XML.toJSONObject(s);
-            System.out.println(j.toString(4));
-            
-            j = new JSONObject(obj);
-            System.out.println(j.toString());
-            
-            s = "{ \"entity\": { \"imageURL\": \"\", \"name\": \"IXXXXXXXXXXXXX\", \"id\": 12336, \"ratingCount\": null, \"averageRating\": null } }";
-            j = new JSONObject(s);
-            System.out.println(j.toString(2));
+      public Obj(String string, double n, boolean b)
+      {
+        this.aString = string;
+        this.aNumber = n;
+        this.aBoolean = b;
+      }
 
-            jj = new JSONStringer();
-            s = jj
-	            .object()
-	                .key("single")
-	                .value("MARIE HAA'S")
-	                .key("Johnny")
-	                .value("MARIE HAA\\'S")
-	                .key("foo")
-	                .value("bar")
-	                .key("baz")
-	                .array()
-	                    .object()
-	                        .key("quux")
-	                        .value("Thanks, Josh!")
-	                    .endObject()
-	                .endArray()
-	                .key("obj keys")
-	                .value(JSONObject.getNames(obj))
-	            .endObject()
-            .toString();
-            System.out.println(s);
+      public double getNumber()
+      {
+        return this.aNumber;
+      }
 
-            System.out.println(new JSONStringer()
-                .object()
-                	.key("a")
-                	.array()
-                		.array()
-                			.array()
-                				.value("b")
-                            .endArray()
-                        .endArray()
-                    .endArray()
-                .endObject()
-                .toString());
+      public String getString()
+      {
+        return this.aString;
+      }
 
-            jj = new JSONStringer();
-            jj.array();
-            jj.value(1);
-            jj.array();
-            jj.value(null);
-            jj.array();
-            jj.object();
-            jj.key("empty-array").array().endArray();
-            jj.key("answer").value(42);
-            jj.key("null").value(null);
-            jj.key("false").value(false);
-            jj.key("true").value(true);
-            jj.key("big").value(123456789e+88);
-            jj.key("small").value(123456789e-88);
-            jj.key("empty-object").object().endObject();
-            jj.key("long");
-            jj.value(9223372036854775807L);
-            jj.endObject();
-            jj.value("two");
-            jj.endArray();
-            jj.value(true);
-            jj.endArray();
-            jj.value(98.6);
-            jj.value(-100.0);
-            jj.object();
-            jj.endObject();
-            jj.object();
-            jj.key("one");
-            jj.value(1.00);
-            jj.endObject();
-            jj.value(obj);
-            jj.endArray();
-            System.out.println(jj.toString());
+      public boolean isBoolean()
+      {
+        return this.aBoolean;
+      }
 
-            System.out.println(new JSONArray(jj.toString()).toString(4));
+      public String getBENT()
+      {
+        return "All uppercase key";
+      }
 
-        	int ar[] = {1, 2, 3};
-        	JSONArray ja = new JSONArray(ar);
-        	System.out.println(ja.toString());
-        	
-        	String sa[] = {"aString", "aNumber", "aBoolean"};            
-            j = new JSONObject(obj, sa);
-            j.put("Testing JSONString interface", obj);
-            System.out.println(j.toString(4));          
-            
-            j = new JSONObject("{slashes: '///', closetag: '</script>', backslash:'\\\\', ei: {quotes: '\"\\''},eo: {a: '\"quoted\"', b:\"don't\"}, quotes: [\"'\", '\"']}");
-            System.out.println(j.toString(2));
-            System.out.println(XML.toString(j));
-            System.out.println("");
+      public String getX()
+      {
+        return "x";
+      }
 
-            j = new JSONObject(
-                "{foo: [true, false,9876543210,    0.0, 1.00000001,  1.000000000001, 1.00000000000000001," +
-                " .00000000000000001, 2.00, 0.1, 2e100, -32,[],{}, \"string\"], " +
-                "  to   : null, op : 'Good'," +
-                "ten:10} postfix comment");
-            j.put("String", "98.6");
-            j.put("JSONObject", new JSONObject());
-            j.put("JSONArray", new JSONArray());
-            j.put("int", 57);
-            j.put("double", 123456789012345678901234567890.);
-            j.put("true", true);
-            j.put("false", false);
-            j.put("null", JSONObject.NULL);
-            j.put("bool", "true");
-            j.put("zero", -0.0);
-            j.put("\\u2028", "\u2028");
-            j.put("\\u2029", "\u2029");
-            a = j.getJSONArray("foo");
-            a.put(666);
-            a.put(2001.99);
-            a.put("so \"fine\".");
-            a.put("so <fine>.");
-            a.put(true);
-            a.put(false);
-            a.put(new JSONArray());
-            a.put(new JSONObject());
-            j.put("keys", JSONObject.getNames(j));
-            System.out.println(j.toString(4));
-            System.out.println(XML.toString(j));
+      public String toJSONString()
+      {
+        return "{" + JSONObject.quote(this.aString) + ":" +
+            JSONObject.doubleToString(this.aNumber) + "}";
+      }
 
-            System.out.println("String: " + j.getDouble("String"));
-            System.out.println("  bool: " + j.getBoolean("bool"));
-            System.out.println("    to: " + j.getString("to"));
-            System.out.println("  true: " + j.getString("true"));
-            System.out.println("   foo: " + j.getJSONArray("foo"));
-            System.out.println("    op: " + j.getString("op"));
-            System.out.println("   ten: " + j.getInt("ten"));
-            System.out.println("  oops: " + j.optBoolean("oops"));
+      public String toString()
+      {
+        return this.getString() + " " + this.getNumber() + " " +
+            this.isBoolean() + "." + this.getBENT() + " " + this.getX();
+      }
+    }
 
-            s = "<xml one = 1 two=' \"2\" '><five></five>First \u0009&lt;content&gt;<five></five> This is \"content\". <three>  3  </three>JSON does not preserve the sequencing of elements and contents.<three>  III  </three>  <three>  T H R E E</three><four/>Content text is an implied structure in XML. <six content=\"6\"/>JSON does not have implied structure:<seven>7</seven>everything is explicit.<![CDATA[CDATA blocks<are><supported>!]]></xml>";
-            j = XML.toJSONObject(s);
-            System.out.println(j.toString(2));
-            System.out.println(XML.toString(j));
-            System.out.println("");
-            
-            ja = JSONML.toJSONArray(s);
-            System.out.println(ja.toString(4));
-            System.out.println(JSONML.toString(ja));
-            System.out.println("");
-            
-            s = "<xml do='0'>uno<a re='1' mi='2'>dos<b fa='3'/>tres<c>true</c>quatro</a>cinqo<d>seis<e/></d></xml>";
-            ja = JSONML.toJSONArray(s);
-            System.out.println(ja.toString(4));
-            System.out.println(JSONML.toString(ja));
-            System.out.println("");
+    Obj obj = new Obj("A beany object", 42, true);
 
-            s = "<mapping><empty/>   <class name = \"Customer\">      <field name = \"ID\" type = \"string\">         <bind-xml name=\"ID\" node=\"attribute\"/>      </field>      <field name = \"FirstName\" type = \"FirstName\"/>      <field name = \"MI\" type = \"MI\"/>      <field name = \"LastName\" type = \"LastName\"/>   </class>   <class name = \"FirstName\">      <field name = \"text\">         <bind-xml name = \"text\" node = \"text\"/>      </field>   </class>   <class name = \"MI\">      <field name = \"text\">         <bind-xml name = \"text\" node = \"text\"/>      </field>   </class>   <class name = \"LastName\">      <field name = \"text\">         <bind-xml name = \"text\" node = \"text\"/>      </field>   </class></mapping>";
-            j = XML.toJSONObject(s);
+    try
+    {
+      j = XML.toJSONObject("<![CDATA[This is a collection of test patterns and examples for org.json.]]>  Ignore the stuff past the end.  ");
+      System.out.println(j.toString());
 
-            System.out.println(j.toString(2));
-            System.out.println(XML.toString(j));
-            System.out.println("");
-            ja = JSONML.toJSONArray(s);
-            System.out.println(ja.toString(4));
-            System.out.println(JSONML.toString(ja));
-            System.out.println("");
+      s = "<recipe name=\"bread\" prep_time=\"5 mins\" cook_time=\"3 hours\"> <title>Basic bread</title> <ingredient amount=\"8\" unit=\"dL\">Flour</ingredient> <ingredient amount=\"10\" unit=\"grams\">Yeast</ingredient> <ingredient amount=\"4\" unit=\"dL\" state=\"warm\">Water</ingredient> <ingredient amount=\"1\" unit=\"teaspoon\">Salt</ingredient> <instructions> <step>Mix all ingredients together.</step> <step>Knead thoroughly.</step> <step>Cover with a cloth, and leave for one hour in warm room.</step> <step>Knead again.</step> <step>Place in a bread baking tin.</step> <step>Cover with a cloth, and leave for one hour in warm room.</step> <step>Bake in the oven at 180(degrees)C for 30 minutes.</step> </instructions> </recipe> ";
+      j = XML.toJSONObject(s);
+      System.out.println(j.toString(4));
+      System.out.println();
 
-            j = XML.toJSONObject("<?xml version=\"1.0\" ?><Book Author=\"Anonymous\"><Title>Sample Book</Title><Chapter id=\"1\">This is chapter 1. It is not very long or interesting.</Chapter><Chapter id=\"2\">This is chapter 2. Although it is longer than chapter 1, it is not any more interesting.</Chapter></Book>");
-            System.out.println(j.toString(2));
-            System.out.println(XML.toString(j));
-            System.out.println("");
+      j = JSONML.toJSONObject(s);
+      System.out.println(j.toString());
+      System.out.println(JSONML.toString(j));
+      System.out.println();
 
-            j = XML.toJSONObject("<!DOCTYPE bCard 'http://www.cs.caltech.edu/~adam/schemas/bCard'><bCard><?xml default bCard        firstname = ''        lastname  = '' company   = '' email = '' homepage  = ''?><bCard        firstname = 'Rohit'        lastname  = 'Khare'        company   = 'MCI'        email     = 'khare at mci.net'        homepage  = 'http://pest.w3.org/'/><bCard        firstname = 'Adam'        lastname  = 'Rifkin'        company   = 'Caltech Infospheres Project'        email     = 'adam at cs.caltech.edu'        homepage  = 'http://www.cs.caltech.edu/~adam/'/></bCard>");
-            System.out.println(j.toString(2));
-            System.out.println(XML.toString(j));
-            System.out.println("");
+      a = JSONML.toJSONArray(s);
+      System.out.println(a.toString(4));
+      System.out.println(JSONML.toString(a));
+      System.out.println();
 
-            j = XML.toJSONObject("<?xml version=\"1.0\"?><customer>    <firstName>        <text>Fred</text>    </firstName>    <ID>fbs0001</ID>    <lastName> <text>Scerbo</text>    </lastName>    <MI>        <text>B</text>    </MI></customer>");
-            System.out.println(j.toString(2));
-            System.out.println(XML.toString(j));
-            System.out.println("");
+      s = "<div id=\"demo\" class=\"JSONML\"><p>JSONML is a transformation between <b>JSON</b> and <b>XML</b> that preserves ordering of document features.</p><p>JSONML can work with JSON arrays or JSON objects.</p><p>Three<br/>little<br/>words</p></div>";
+      j = JSONML.toJSONObject(s);
+      System.out.println(j.toString(4));
+      System.out.println(JSONML.toString(j));
+      System.out.println();
 
-            j = XML.toJSONObject("<!ENTITY tp-address PUBLIC '-//ABC University::Special Collections Library//TEXT (titlepage: name and address)//EN' 'tpspcoll.sgm'><list type='simple'><head>Repository Address </head><item>Special Collections Library</item><item>ABC University</item><item>Main Library, 40 Circle Drive</item><item>Ourtown, Pennsylvania</item><item>17654 USA</item></list>");
-            System.out.println(j.toString());
-            System.out.println(XML.toString(j));
-            System.out.println("");
+      a = JSONML.toJSONArray(s);
+      System.out.println(a.toString(4));
+      System.out.println(JSONML.toString(a));
+      System.out.println();
 
-            j = XML.toJSONObject("<test intertag status=ok><empty/>deluxe<blip sweet=true>&amp;&quot;toot&quot;&toot;&#x41;</blip><x>eks</x><w>bonus</w><w>bonus2</w></test>");
-            System.out.println(j.toString(2));
-            System.out.println(XML.toString(j));
-            System.out.println("");
+      s = "<person created=\"2006-11-11T19:23\" modified=\"2006-12-31T23:59\">\n <firstName>Robert</firstName>\n <lastName>Smith</lastName>\n <address type=\"home\">\n <street>12345 Sixth Ave</street>\n <city>Anytown</city>\n <state>CA</state>\n <postalCode>98765-4321</postalCode>\n </address>\n </person>";
+      j = XML.toJSONObject(s);
+      System.out.println(j.toString(4));
 
-            j = HTTP.toJSONObject("GET / HTTP/1.0\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*\nAccept-Language: en-us\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90; T312461; Q312461)\nHost: www.nokko.com\nConnection: keep-alive\nAccept-encoding: gzip, deflate\n");
-            System.out.println(j.toString(2));
-            System.out.println(HTTP.toString(j));
-            System.out.println("");
+      j = new JSONObject(obj);
+      System.out.println(j.toString());
 
-            j = HTTP.toJSONObject("HTTP/1.1 200 Oki Doki\nDate: Sun, 26 May 2002 17:38:52 GMT\nServer: Apache/1.3.23 (Unix) mod_perl/1.26\nKeep-Alive: timeout=15, max=100\nConnection: Keep-Alive\nTransfer-Encoding: chunked\nContent-Type: text/html\n");
-            System.out.println(j.toString(2));
-            System.out.println(HTTP.toString(j));
-            System.out.println("");
+      s = "{ \"entity\": { \"imageURL\": \"\", \"name\": \"IXXXXXXXXXXXXX\", \"id\": 12336, \"ratingCount\": null, \"averageRating\": null } }";
+      j = new JSONObject(s);
+      System.out.println(j.toString(2));
 
-            j = new JSONObject("{nix: null, nux: false, null: 'null', 'Request-URI': '/', Method: 'GET', 'HTTP-Version': 'HTTP/1.0'}");
-            System.out.println(j.toString(2));
-            System.out.println("isNull: " + j.isNull("nix"));
-            System.out.println("   has: " + j.has("nix"));
-            System.out.println(XML.toString(j));
-            System.out.println(HTTP.toString(j));
-            System.out.println("");
+      jj = new JSONStringer();
+      s = jj
+          .object()
+          .key("single")
+          .value("MARIE HAA'S")
+          .key("Johnny")
+          .value("MARIE HAA\\'S")
+          .key("foo")
+          .value("bar")
+          .key("baz")
+          .array()
+          .object()
+          .key("quux")
+          .value("Thanks, Josh!")
+          .endObject()
+          .endArray()
+          .key("obj keys")
+          .value(JSONObject.getNames(obj))
+          .endObject()
+          .toString();
+      System.out.println(s);
 
-            j = XML.toJSONObject("<?xml version='1.0' encoding='UTF-8'?>"+"\n\n"+"<SOAP-ENV:Envelope"+
-              " xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\""+
-              " xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\""+
-              " xmlns:xsd=\"http://www.w3.org/1999/XMLSchema\">"+
-              "<SOAP-ENV:Body><ns1:doGoogleSearch"+
-              " xmlns:ns1=\"urn:GoogleSearch\""+
-              " SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"+
-              "<key xsi:type=\"xsd:string\">GOOGLEKEY</key> <q"+
-              " xsi:type=\"xsd:string\">'+search+'</q> <start"+
-              " xsi:type=\"xsd:int\">0</start> <maxResults"+
-              " xsi:type=\"xsd:int\">10</maxResults> <filter"+
-              " xsi:type=\"xsd:boolean\">true</filter> <restrict"+
-              " xsi:type=\"xsd:string\"></restrict> <safeSearch"+
-              " xsi:type=\"xsd:boolean\">false</safeSearch> <lr"+
-              " xsi:type=\"xsd:string\"></lr> <ie"+
-              " xsi:type=\"xsd:string\">latin1</ie> <oe"+
-              " xsi:type=\"xsd:string\">latin1</oe>"+
-              "</ns1:doGoogleSearch>"+
-              "</SOAP-ENV:Body></SOAP-ENV:Envelope>");
-            System.out.println(j.toString(2));
-            System.out.println(XML.toString(j));
-            System.out.println("");
+      System.out.println(new JSONStringer()
+          .object()
+          .key("a")
+          .array()
+          .array()
+          .array()
+          .value("b")
+          .endArray()
+          .endArray()
+          .endArray()
+          .endObject()
+          .toString());
 
-            j = new JSONObject("{Envelope: {Body: {\"ns1:doGoogleSearch\": {oe: \"latin1\", filter: true, q: \"'+search+'\", key: \"GOOGLEKEY\", maxResults: 10, \"SOAP-ENV:encodingStyle\": \"http://schemas.xmlsoap.org/soap/encoding/\", start: 0, ie: \"latin1\", safeSearch:false, \"xmlns:ns1\": \"urn:GoogleSearch\"}}}}");
-            System.out.println(j.toString(2));
-            System.out.println(XML.toString(j));
-            System.out.println("");
+      jj = new JSONStringer();
+      jj.array();
+      jj.value(1);
+      jj.array();
+      jj.value(null);
+      jj.array();
+      jj.object();
+      jj.key("empty-array").array().endArray();
+      jj.key("answer").value(42);
+      jj.key("null").value(null);
+      jj.key("false").value(false);
+      jj.key("true").value(true);
+      jj.key("big").value(123456789e+88);
+      jj.key("small").value(123456789e-88);
+      jj.key("empty-object").object().endObject();
+      jj.key("long");
+      jj.value(9223372036854775807L);
+      jj.endObject();
+      jj.value("two");
+      jj.endArray();
+      jj.value(true);
+      jj.endArray();
+      jj.value(98.6);
+      jj.value(-100.0);
+      jj.object();
+      jj.endObject();
+      jj.object();
+      jj.key("one");
+      jj.value(1.00);
+      jj.endObject();
+      jj.value(obj);
+      jj.endArray();
+      System.out.println(jj.toString());
 
-            j = CookieList.toJSONObject("  f%oo = b+l=ah  ; o;n%40e = t.wo ");
-            System.out.println(j.toString(2));
-            System.out.println(CookieList.toString(j));
-            System.out.println("");
+      System.out.println(new JSONArray(jj.toString()).toString(4));
 
-            j = Cookie.toJSONObject("f%oo=blah; secure ;expires = April 24, 2002");
-            System.out.println(j.toString(2));
-            System.out.println(Cookie.toString(j));
-            System.out.println("");
+      int ar[] = {1, 2, 3};
+      JSONArray ja = new JSONArray(ar);
+      System.out.println(ja.toString());
 
-            j = new JSONObject("{script: 'It is not allowed in HTML to send a close script tag in a string<script>because it confuses browsers</script>so we insert a backslash before the /'}");
-            System.out.println(j.toString());
-            System.out.println("");
+      String sa[] = {"aString", "aNumber", "aBoolean"};
+      j = new JSONObject(obj, sa);
+      j.put("Testing JSONString interface", obj);
+      System.out.println(j.toString(4));
 
-            JSONTokener jt = new JSONTokener("{op:'test', to:'session', pre:1}{op:'test', to:'session', pre:2}");
-            j = new JSONObject(jt);
-            System.out.println(j.toString());
-            System.out.println("pre: " + j.optInt("pre"));
-            int i = jt.skipTo('{');
-            System.out.println(i);
-            j = new JSONObject(jt);
-            System.out.println(j.toString());
-            System.out.println("");
+      j = new JSONObject("{slashes: '///', closetag: '</script>', backslash:'\\\\', ei: {quotes: '\"\\''},eo: {a: '\"quoted\"', b:\"don't\"}, quotes: [\"'\", '\"']}");
+      System.out.println(j.toString(2));
+      System.out.println(XML.toString(j));
+      System.out.println("");
 
-            a = CDL.toJSONArray("No quotes, 'Single Quotes', \"Double Quotes\"\n1,'2',\"3\"\n,'It is \"good,\"', \"It works.\"\n\n");
+      j = new JSONObject(
+          "{foo: [true, false,9876543210,    0.0, 1.00000001,  1.000000000001, 1.00000000000000001," +
+              " .00000000000000001, 2.00, 0.1, 2e100, -32,[],{}, \"string\"], " +
+              "  to   : null, op : 'Good'," +
+              "ten:10} postfix comment");
+      j.put("String", "98.6");
+      j.put("JSONObject", new JSONObject());
+      j.put("JSONArray", new JSONArray());
+      j.put("int", 57);
+      j.put("double", 123456789012345678901234567890.);
+      j.put("true", true);
+      j.put("false", false);
+      j.put("null", JSONObject.NULL);
+      j.put("bool", "true");
+      j.put("zero", -0.0);
+      j.put("\\u2028", "\u2028");
+      j.put("\\u2029", "\u2029");
+      a = j.getJSONArray("foo");
+      a.put(666);
+      a.put(2001.99);
+      a.put("so \"fine\".");
+      a.put("so <fine>.");
+      a.put(true);
+      a.put(false);
+      a.put(new JSONArray());
+      a.put(new JSONObject());
+      j.put("keys", JSONObject.getNames(j));
+      System.out.println(j.toString(4));
+      System.out.println(XML.toString(j));
 
-            System.out.println(CDL.toString(a));
-            System.out.println("");
-            System.out.println(a.toString(4));
-            System.out.println("");
+      System.out.println("String: " + j.getDouble("String"));
+      System.out.println("  bool: " + j.getBoolean("bool"));
+      System.out.println("    to: " + j.getString("to"));
+      System.out.println("  true: " + j.getString("true"));
+      System.out.println("   foo: " + j.getJSONArray("foo"));
+      System.out.println("    op: " + j.getString("op"));
+      System.out.println("   ten: " + j.getInt("ten"));
+      System.out.println("  oops: " + j.optBoolean("oops"));
 
-            a = new JSONArray(" [\"<escape>\", next is an implied null , , ok,] ");
-            System.out.println(a.toString());
-            System.out.println("");
-            System.out.println(XML.toString(a));
-            System.out.println("");
+      s = "<xml one = 1 two=' \"2\" '><five></five>First \u0009&lt;content&gt;<five></five> This is \"content\". <three>  3  </three>JSON does not preserve the sequencing of elements and contents.<three>  III  </three>  <three>  T H R E E</three><four/>Content text is an implied structure in XML. <six content=\"6\"/>JSON does not have implied structure:<seven>7</seven>everything is explicit.<![CDATA[CDATA blocks<are><supported>!]]></xml>";
+      j = XML.toJSONObject(s);
+      System.out.println(j.toString(2));
+      System.out.println(XML.toString(j));
+      System.out.println("");
 
-            j = new JSONObject("{ fun => with non-standard forms ; forgiving => This package can be used to parse formats that are similar to but not stricting conforming to JSON; why=To make it easier to migrate existing data to JSON,one = [[1.00]]; uno=[[{1=>1}]];'+':+6e66 ;pluses=+++;empty = '' , 'double':0.666,true: TRUE, false: FALSE, null=NULL;[true] = [[!,@;*]]; string=>  o. k. ; \r oct=0666; hex=0x666; dec=666; o=0999; noh=0x0x}");
-            System.out.println(j.toString(4));
-            System.out.println("");
-            if (j.getBoolean("true") && !j.getBoolean("false")) {
-                System.out.println("It's all good");
-            }
+      ja = JSONML.toJSONArray(s);
+      System.out.println(ja.toString(4));
+      System.out.println(JSONML.toString(ja));
+      System.out.println("");
 
-            System.out.println("");
-            j = new JSONObject(j, new String[]{"dec", "oct", "hex", "missing"});
-            System.out.println(j.toString(4));
+      s = "<xml do='0'>uno<a re='1' mi='2'>dos<b fa='3'/>tres<c>true</c>quatro</a>cinqo<d>seis<e/></d></xml>";
+      ja = JSONML.toJSONArray(s);
+      System.out.println(ja.toString(4));
+      System.out.println(JSONML.toString(ja));
+      System.out.println("");
 
-            System.out.println("");
-            System.out.println(new JSONStringer().array().value(a).value(j).endArray());
+      s = "<mapping><empty/>   <class name = \"Customer\">      <field name = \"ID\" type = \"string\">         <bind-xml name=\"ID\" node=\"attribute\"/>      </field>      <field name = \"FirstName\" type = \"FirstName\"/>      <field name = \"MI\" type = \"MI\"/>      <field name = \"LastName\" type = \"LastName\"/>   </class>   <class name = \"FirstName\">      <field name = \"text\">         <bind-xml name = \"text\" node = \"text\"/>      </field>   </class>   <class name = \"MI\">      <field name = \"text\">         <bind-xml name = \"text\" node = \"text\"/>      </field>   </class>   <class name = \"LastName\">      <field name = \"text\">         <bind-xml name = \"text\" node = \"text\"/>      </field>   </class></mapping>";
+      j = XML.toJSONObject(s);
 
-            j = new JSONObject("{string: \"98.6\", long: 2147483648, int: 2147483647, longer: 9223372036854775807, double: 9223372036854775808}");
-            System.out.println(j.toString(4));
+      System.out.println(j.toString(2));
+      System.out.println(XML.toString(j));
+      System.out.println("");
+      ja = JSONML.toJSONArray(s);
+      System.out.println(ja.toString(4));
+      System.out.println(JSONML.toString(ja));
+      System.out.println("");
 
-            System.out.println("\ngetInt");
-            System.out.println("int    " + j.getInt("int"));
-            System.out.println("long   " + j.getInt("long"));
-            System.out.println("longer " + j.getInt("longer"));
-            System.out.println("double " + j.getInt("double"));
-            System.out.println("string " + j.getInt("string"));
+      j = XML.toJSONObject("<?xml version=\"1.0\" ?><Book Author=\"Anonymous\"><Title>Sample Book</Title><Chapter id=\"1\">This is chapter 1. It is not very long or interesting.</Chapter><Chapter id=\"2\">This is chapter 2. Although it is longer than chapter 1, it is not any more interesting.</Chapter></Book>");
+      System.out.println(j.toString(2));
+      System.out.println(XML.toString(j));
+      System.out.println("");
 
-            System.out.println("\ngetLong");
-            System.out.println("int    " + j.getLong("int"));
-            System.out.println("long   " + j.getLong("long"));
-            System.out.println("longer " + j.getLong("longer"));
-            System.out.println("double " + j.getLong("double"));
-            System.out.println("string " + j.getLong("string"));
+      j = XML.toJSONObject("<!DOCTYPE bCard 'http://www.cs.caltech.edu/~adam/schemas/bCard'><bCard><?xml default bCard        firstname = ''        lastname  = '' company   = '' email = '' homepage  = ''?><bCard        firstname = 'Rohit'        lastname  = 'Khare'        company   = 'MCI'        email     = 'khare at mci.net'        homepage  = 'http://pest.w3.org/'/><bCard        firstname = 'Adam'        lastname  = 'Rifkin'        company   = 'Caltech Infospheres Project'        email     = 'adam at cs.caltech.edu'        homepage  = 'http://www.cs.caltech.edu/~adam/'/></bCard>");
+      System.out.println(j.toString(2));
+      System.out.println(XML.toString(j));
+      System.out.println("");
 
-            System.out.println("\ngetDouble");
-            System.out.println("int    " + j.getDouble("int"));
-            System.out.println("long   " + j.getDouble("long"));
-            System.out.println("longer " + j.getDouble("longer"));
-            System.out.println("double " + j.getDouble("double"));
-            System.out.println("string " + j.getDouble("string"));
+      j = XML.toJSONObject("<?xml version=\"1.0\"?><customer>    <firstName>        <text>Fred</text>    </firstName>    <ID>fbs0001</ID>    <lastName> <text>Scerbo</text>    </lastName>    <MI>        <text>B</text>    </MI></customer>");
+      System.out.println(j.toString(2));
+      System.out.println(XML.toString(j));
+      System.out.println("");
 
-            j.put("good sized", 9223372036854775807L);
-            System.out.println(j.toString(4));
+      j = XML.toJSONObject("<!ENTITY tp-address PUBLIC '-//ABC University::Special Collections Library//TEXT (titlepage: name and address)//EN' 'tpspcoll.sgm'><list type='simple'><head>Repository Address </head><item>Special Collections Library</item><item>ABC University</item><item>Main Library, 40 Circle Drive</item><item>Ourtown, Pennsylvania</item><item>17654 USA</item></list>");
+      System.out.println(j.toString());
+      System.out.println(XML.toString(j));
+      System.out.println("");
 
-            a = new JSONArray("[2147483647, 2147483648, 9223372036854775807, 9223372036854775808]");
-            System.out.println(a.toString(4));
+      j = XML.toJSONObject("<test intertag status=ok><empty/>deluxe<blip sweet=true>&amp;&quot;toot&quot;&toot;&#x41;</blip><x>eks</x><w>bonus</w><w>bonus2</w></test>");
+      System.out.println(j.toString(2));
+      System.out.println(XML.toString(j));
+      System.out.println("");
 
-            System.out.println("\nKeys: ");
-            it = j.keys();
-            while (it.hasNext()) {
-                s = (String)it.next();
-                System.out.println(s + ": " + j.getString(s));
-            }
+      j = HTTP.toJSONObject("GET / HTTP/1.0\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*\nAccept-Language: en-us\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90; T312461; Q312461)\nHost: www.nokko.com\nConnection: keep-alive\nAccept-encoding: gzip, deflate\n");
+      System.out.println(j.toString(2));
+      System.out.println(HTTP.toString(j));
+      System.out.println("");
 
+      j = HTTP.toJSONObject("HTTP/1.1 200 Oki Doki\nDate: Sun, 26 May 2002 17:38:52 GMT\nServer: Apache/1.3.23 (Unix) mod_perl/1.26\nKeep-Alive: timeout=15, max=100\nConnection: Keep-Alive\nTransfer-Encoding: chunked\nContent-Type: text/html\n");
+      System.out.println(j.toString(2));
+      System.out.println(HTTP.toString(j));
+      System.out.println("");
 
-            System.out.println("\naccumulate: ");
-            j = new JSONObject();
-            j.accumulate("stooge", "Curly");
-            j.accumulate("stooge", "Larry");
-            j.accumulate("stooge", "Moe");
-            a = j.getJSONArray("stooge");
-            a.put(5, "Shemp");
-            System.out.println(j.toString(4));
+      j = new JSONObject("{nix: null, nux: false, null: 'null', 'Request-URI': '/', Method: 'GET', 'HTTP-Version': 'HTTP/1.0'}");
+      System.out.println(j.toString(2));
+      System.out.println("isNull: " + j.isNull("nix"));
+      System.out.println("   has: " + j.has("nix"));
+      System.out.println(XML.toString(j));
+      System.out.println(HTTP.toString(j));
+      System.out.println("");
 
-            System.out.println("\nwrite:");
-            System.out.println(j.write(new StringWriter()));
+      j = XML.toJSONObject("<?xml version='1.0' encoding='UTF-8'?>" + "\n\n" + "<SOAP-ENV:Envelope" +
+          " xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"" +
+          " xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\"" +
+          " xmlns:xsd=\"http://www.w3.org/1999/XMLSchema\">" +
+          "<SOAP-ENV:Body><ns1:doGoogleSearch" +
+          " xmlns:ns1=\"urn:GoogleSearch\"" +
+          " SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" +
+          "<key xsi:type=\"xsd:string\">GOOGLEKEY</key> <q" +
+          " xsi:type=\"xsd:string\">'+search+'</q> <start" +
+          " xsi:type=\"xsd:int\">0</start> <maxResults" +
+          " xsi:type=\"xsd:int\">10</maxResults> <filter" +
+          " xsi:type=\"xsd:boolean\">true</filter> <restrict" +
+          " xsi:type=\"xsd:string\"></restrict> <safeSearch" +
+          " xsi:type=\"xsd:boolean\">false</safeSearch> <lr" +
+          " xsi:type=\"xsd:string\"></lr> <ie" +
+          " xsi:type=\"xsd:string\">latin1</ie> <oe" +
+          " xsi:type=\"xsd:string\">latin1</oe>" +
+          "</ns1:doGoogleSearch>" +
+          "</SOAP-ENV:Body></SOAP-ENV:Envelope>");
+      System.out.println(j.toString(2));
+      System.out.println(XML.toString(j));
+      System.out.println("");
 
-            s = "<xml empty><a></a><a>1</a><a>22</a><a>333</a></xml>";
-            j = XML.toJSONObject(s);
-            System.out.println(j.toString(4));
-            System.out.println(XML.toString(j));
-            
-            s = "<book><chapter>Content of the first chapter</chapter><chapter>Content of the second chapter      <chapter>Content of the first subchapter</chapter>      <chapter>Content of the second subchapter</chapter></chapter><chapter>Third Chapter</chapter></book>";
-            j = XML.toJSONObject(s);
-            System.out.println(j.toString(4));
-            System.out.println(XML.toString(j));
-            
-            a = JSONML.toJSONArray(s);
-            System.out.println(a.toString(4));
-            System.out.println(JSONML.toString(a));
-            
-            Collection c = null;
-            Map m = null;
-            
-            j = new JSONObject(m);
-            a = new JSONArray(c);
-            j.append("stooge", "Joe DeRita");
-            j.append("stooge", "Shemp");
-            j.accumulate("stooges", "Curly");
-            j.accumulate("stooges", "Larry");
-            j.accumulate("stooges", "Moe");
-            j.accumulate("stoogearray", j.get("stooges"));
-            j.put("map", m);
-            j.put("collection", c);
-            j.put("array", a);
-            a.put(m);
-            a.put(c);
-            System.out.println(j.toString(4));
-            
-            s = "{plist=Apple; AnimalSmells = { pig = piggish; lamb = lambish; worm = wormy; }; AnimalSounds = { pig = oink; lamb = baa; worm = baa;  Lisa = \"Why is the worm talking like a lamb?\" } ; AnimalColors = { pig = pink; lamb = black; worm = pink; } } "; 
-            j = new JSONObject(s);
-            System.out.println(j.toString(4));
-            
-            s = " (\"San Francisco\", \"New York\", \"Seoul\", \"London\", \"Seattle\", \"Shanghai\")";
-            a = new JSONArray(s);
-            System.out.println(a.toString());
-            
-            s = "<a ichi='1' ni='2'><b>The content of b</b> and <c san='3'>The content of c</c><d>do</d><e></e><d>re</d><f/><d>mi</d></a>";
-            j = XML.toJSONObject(s);
+      j = new JSONObject("{Envelope: {Body: {\"ns1:doGoogleSearch\": {oe: \"latin1\", filter: true, q: \"'+search+'\", key: \"GOOGLEKEY\", maxResults: 10, \"SOAP-ENV:encodingStyle\": \"http://schemas.xmlsoap.org/soap/encoding/\", start: 0, ie: \"latin1\", safeSearch:false, \"xmlns:ns1\": \"urn:GoogleSearch\"}}}}");
+      System.out.println(j.toString(2));
+      System.out.println(XML.toString(j));
+      System.out.println("");
 
-            System.out.println(j.toString(2));
-            System.out.println(XML.toString(j));
-            System.out.println("");
-            ja = JSONML.toJSONArray(s);
-            System.out.println(ja.toString(4));
-            System.out.println(JSONML.toString(ja));
-            System.out.println("");
-          
-            
-            System.out.println("\nTesting Exceptions: ");
+      j = CookieList.toJSONObject("  f%oo = b+l=ah  ; o;n%40e = t.wo ");
+      System.out.println(j.toString(2));
+      System.out.println(CookieList.toString(j));
+      System.out.println("");
 
-            System.out.print("Exception: ");
-            try {
-                a = new JSONArray();
-                a.put(Double.NEGATIVE_INFINITY);
-                a.put(Double.NaN);
-                System.out.println(a.toString());
-            } catch (Exception e) {
-                System.out.println(e);
-            }
-            System.out.print("Exception: ");
-            try {
-                System.out.println(j.getDouble("stooge"));
-            } catch (Exception e) {
-                System.out.println(e);
-            }
-            System.out.print("Exception: ");
-            try {
-                System.out.println(j.getDouble("howard"));
-            } catch (Exception e) {
-                System.out.println(e);
-            }
-            System.out.print("Exception: ");
-            try {
-                System.out.println(j.put(null, "howard"));
-            } catch (Exception e) {
-                System.out.println(e);
-            }
-            System.out.print("Exception: ");
-            try {
-                System.out.println(a.getDouble(0));
-            } catch (Exception e) {
-                System.out.println(e);
-            }
-            System.out.print("Exception: ");
-            try {
-                System.out.println(a.get(-1));
-            } catch (Exception e) {
-                System.out.println(e);
-            }
-            System.out.print("Exception: ");
-            try {
-                System.out.println(a.put(Double.NaN));
-            } catch (Exception e) {
-                System.out.println(e);
-            }
-            System.out.print("Exception: ");
-            try {
-            	j = XML.toJSONObject("<a><b>    ");
-            } catch (Exception e) {
-            	System.out.println(e);
-            }            
-            System.out.print("Exception: ");
-            try {
-            	j = XML.toJSONObject("<a></b>    ");
-            } catch (Exception e) {
-            	System.out.println(e);
-            }            
-            System.out.print("Exception: ");
-            try {
-            	j = XML.toJSONObject("<a></a    ");
-            } catch (Exception e) {
-            	System.out.println(e);
-            }
-            System.out.print("Exception: ");
-            try {            	
-            	ja = new JSONArray(new Object());
-            	System.out.println(ja.toString());
-            } catch (Exception e) {
-            	System.out.println(e);
-            }
+      j = Cookie.toJSONObject("f%oo=blah; secure ;expires = April 24, 2002");
+      System.out.println(j.toString(2));
+      System.out.println(Cookie.toString(j));
+      System.out.println("");
 
-            System.out.print("Exception: ");
-            try {            	
-            	s = "[)";
-            	a = new JSONArray(s);
-            	System.out.println(a.toString());
-            } catch (Exception e) {
-            	System.out.println(e);
-            }
+      j = new JSONObject("{script: 'It is not allowed in HTML to send a close script tag in a string<script>because it confuses browsers</script>so we insert a backslash before the /'}");
+      System.out.println(j.toString());
+      System.out.println("");
 
-            System.out.print("Exception: ");
-            try {            	
-                s = "<xml";
-                ja = JSONML.toJSONArray(s);
-                System.out.println(ja.toString(4));
-            } catch (Exception e) {
-            	System.out.println(e);
-            }
+      JSONTokener jt = new JSONTokener("{op:'test', to:'session', pre:1}{op:'test', to:'session', pre:2}");
+      j = new JSONObject(jt);
+      System.out.println(j.toString());
+      System.out.println("pre: " + j.optInt("pre"));
+      int i = jt.skipTo('{');
+      System.out.println(i);
+      j = new JSONObject(jt);
+      System.out.println(j.toString());
+      System.out.println("");
 
-            System.out.print("Exception: ");
-            try {            	
-                s = "<right></wrong>";
-                ja = JSONML.toJSONArray(s);
-                System.out.println(ja.toString(4));
-            } catch (Exception e) {
-            	System.out.println(e);
-            }
+      a = CDL.toJSONArray("No quotes, 'Single Quotes', \"Double Quotes\"\n1,'2',\"3\"\n,'It is \"good,\"', \"It works.\"\n\n");
 
-            System.out.print("Exception: ");
-            try {            	
-                s = "{\"koda\": true, \"koda\": true}";
-                j = new JSONObject(s);
-                System.out.println(j.toString(4));
-            } catch (Exception e) {
-            	System.out.println(e);
-            }
+      System.out.println(CDL.toString(a));
+      System.out.println("");
+      System.out.println(a.toString(4));
+      System.out.println("");
 
-            System.out.print("Exception: ");
-            try {            	
-                jj = new JSONStringer();
-                s = jj
-    	            .object()
-    	                .key("bosanda")
-    	                .value("MARIE HAA'S")
-    	                .key("bosanda")
-    	                .value("MARIE HAA\\'S")
-    	            .endObject()
-    	            .toString();
-                System.out.println(j.toString(4));
-            } catch (Exception e) {
-            	System.out.println(e);
-            }
-        } catch (Exception e) {
-            System.out.println(e.toString());
-        }
+      a = new JSONArray(" [\"<escape>\", next is an implied null , , ok,] ");
+      System.out.println(a.toString());
+      System.out.println("");
+      System.out.println(XML.toString(a));
+      System.out.println("");
+
+      j = new JSONObject("{ fun => with non-standard forms ; forgiving => This package can be used to parse formats that are similar to but not stricting conforming to JSON; why=To make it easier to migrate existing data to JSON,one = [[1.00]]; uno=[[{1=>1}]];'+':+6e66 ;pluses=+++;empty = '' , 'double':0.666,true: TRUE, false: FALSE, null=NULL;[true] = [[!,@;*]]; string=>  o. k. ; \r oct=0666; hex=0x666; dec=666; o=0999; noh=0x0x}");
+      System.out.println(j.toString(4));
+      System.out.println("");
+      if (j.getBoolean("true") && !j.getBoolean("false"))
+      {
+        System.out.println("It's all good");
+      }
+
+      System.out.println("");
+      j = new JSONObject(j, new String[]{"dec", "oct", "hex", "missing"});
+      System.out.println(j.toString(4));
+
+      System.out.println("");
+      System.out.println(new JSONStringer().array().value(a).value(j).endArray());
+
+      j = new JSONObject("{string: \"98.6\", long: 2147483648, int: 2147483647, longer: 9223372036854775807, double: 9223372036854775808}");
+      System.out.println(j.toString(4));
+
+      System.out.println("\ngetInt");
+      System.out.println("int    " + j.getInt("int"));
+      System.out.println("long   " + j.getInt("long"));
+      System.out.println("longer " + j.getInt("longer"));
+      System.out.println("double " + j.getInt("double"));
+      System.out.println("string " + j.getInt("string"));
+
+      System.out.println("\ngetLong");
+      System.out.println("int    " + j.getLong("int"));
+      System.out.println("long   " + j.getLong("long"));
+      System.out.println("longer " + j.getLong("longer"));
+      System.out.println("double " + j.getLong("double"));
+      System.out.println("string " + j.getLong("string"));
+
+      System.out.println("\ngetDouble");
+      System.out.println("int    " + j.getDouble("int"));
+      System.out.println("long   " + j.getDouble("long"));
+      System.out.println("longer " + j.getDouble("longer"));
+      System.out.println("double " + j.getDouble("double"));
+      System.out.println("string " + j.getDouble("string"));
+
+      j.put("good sized", 9223372036854775807L);
+      System.out.println(j.toString(4));
+
+      a = new JSONArray("[2147483647, 2147483648, 9223372036854775807, 9223372036854775808]");
+      System.out.println(a.toString(4));
+
+      System.out.println("\nKeys: ");
+      it = j.keys();
+      while (it.hasNext())
+      {
+        s = (String) it.next();
+        System.out.println(s + ": " + j.getString(s));
+      }
+
+
+      System.out.println("\naccumulate: ");
+      j = new JSONObject();
+      j.accumulate("stooge", "Curly");
+      j.accumulate("stooge", "Larry");
+      j.accumulate("stooge", "Moe");
+      a = j.getJSONArray("stooge");
+      a.put(5, "Shemp");
+      System.out.println(j.toString(4));
+
+      System.out.println("\nwrite:");
+      System.out.println(j.write(new StringWriter()));
+
+      s = "<xml empty><a></a><a>1</a><a>22</a><a>333</a></xml>";
+      j = XML.toJSONObject(s);
+      System.out.println(j.toString(4));
+      System.out.println(XML.toString(j));
+
+      s = "<book><chapter>Content of the first chapter</chapter><chapter>Content of the second chapter      <chapter>Content of the first subchapter</chapter>      <chapter>Content of the second subchapter</chapter></chapter><chapter>Third Chapter</chapter></book>";
+      j = XML.toJSONObject(s);
+      System.out.println(j.toString(4));
+      System.out.println(XML.toString(j));
+
+      a = JSONML.toJSONArray(s);
+      System.out.println(a.toString(4));
+      System.out.println(JSONML.toString(a));
+
+      Collection c = null;
+      Map m = null;
+
+      j = new JSONObject(m);
+      a = new JSONArray(c);
+      j.append("stooge", "Joe DeRita");
+      j.append("stooge", "Shemp");
+      j.accumulate("stooges", "Curly");
+      j.accumulate("stooges", "Larry");
+      j.accumulate("stooges", "Moe");
+      j.accumulate("stoogearray", j.get("stooges"));
+      j.put("map", m);
+      j.put("collection", c);
+      j.put("array", a);
+      a.put(m);
+      a.put(c);
+      System.out.println(j.toString(4));
+
+      s = "{plist=Apple; AnimalSmells = { pig = piggish; lamb = lambish; worm = wormy; }; AnimalSounds = { pig = oink; lamb = baa; worm = baa;  Lisa = \"Why is the worm talking like a lamb?\" } ; AnimalColors = { pig = pink; lamb = black; worm = pink; } } ";
+      j = new JSONObject(s);
+      System.out.println(j.toString(4));
+
+      s = " (\"San Francisco\", \"New York\", \"Seoul\", \"London\", \"Seattle\", \"Shanghai\")";
+      a = new JSONArray(s);
+      System.out.println(a.toString());
+
+      s = "<a ichi='1' ni='2'><b>The content of b</b> and <c san='3'>The content of c</c><d>do</d><e></e><d>re</d><f/><d>mi</d></a>";
+      j = XML.toJSONObject(s);
+
+      System.out.println(j.toString(2));
+      System.out.println(XML.toString(j));
+      System.out.println("");
+      ja = JSONML.toJSONArray(s);
+      System.out.println(ja.toString(4));
+      System.out.println(JSONML.toString(ja));
+      System.out.println("");
+
+
+      System.out.println("\nTesting Exceptions: ");
+
+      System.out.print("Exception: ");
+      try
+      {
+        a = new JSONArray();
+        a.put(Double.NEGATIVE_INFINITY);
+        a.put(Double.NaN);
+        System.out.println(a.toString());
+      }
+      catch (Exception e)
+      {
+        System.out.println(e);
+      }
+      System.out.print("Exception: ");
+      try
+      {
+        System.out.println(j.getDouble("stooge"));
+      }
+      catch (Exception e)
+      {
+        System.out.println(e);
+      }
+      System.out.print("Exception: ");
+      try
+      {
+        System.out.println(j.getDouble("howard"));
+      }
+      catch (Exception e)
+      {
+        System.out.println(e);
+      }
+      System.out.print("Exception: ");
+      try
+      {
+        System.out.println(j.put(null, "howard"));
+      }
+      catch (Exception e)
+      {
+        System.out.println(e);
+      }
+      System.out.print("Exception: ");
+      try
+      {
+        System.out.println(a.getDouble(0));
+      }
+      catch (Exception e)
+      {
+        System.out.println(e);
+      }
+      System.out.print("Exception: ");
+      try
+      {
+        System.out.println(a.get(-1));
+      }
+      catch (Exception e)
+      {
+        System.out.println(e);
+      }
+      System.out.print("Exception: ");
+      try
+      {
+        System.out.println(a.put(Double.NaN));
+      }
+      catch (Exception e)
+      {
+        System.out.println(e);
+      }
+      System.out.print("Exception: ");
+      try
+      {
+        j = XML.toJSONObject("<a><b>    ");
+      }
+      catch (Exception e)
+      {
+        System.out.println(e);
+      }
+      System.out.print("Exception: ");
+      try
+      {
+        j = XML.toJSONObject("<a></b>    ");
+      }
+      catch (Exception e)
+      {
+        System.out.println(e);
+      }
+      System.out.print("Exception: ");
+      try
+      {
+        j = XML.toJSONObject("<a></a    ");
+      }
+      catch (Exception e)
+      {
+        System.out.println(e);
+      }
+      System.out.print("Exception: ");
+      try
+      {
+        ja = new JSONArray(new Object());
+        System.out.println(ja.toString());
+      }
+      catch (Exception e)
+      {
+        System.out.println(e);
+      }
+
+      System.out.print("Exception: ");
+      try
+      {
+        s = "[)";
+        a = new JSONArray(s);
+        System.out.println(a.toString());
+      }
+      catch (Exception e)
+      {
+        System.out.println(e);
+      }
+
+      System.out.print("Exception: ");
+      try
+      {
+        s = "<xml";
+        ja = JSONML.toJSONArray(s);
+        System.out.println(ja.toString(4));
+      }
+      catch (Exception e)
+      {
+        System.out.println(e);
+      }
+
+      System.out.print("Exception: ");
+      try
+      {
+        s = "<right></wrong>";
+        ja = JSONML.toJSONArray(s);
+        System.out.println(ja.toString(4));
+      }
+      catch (Exception e)
+      {
+        System.out.println(e);
+      }
+
+      System.out.print("Exception: ");
+      try
+      {
+        s = "{\"koda\": true, \"koda\": true}";
+        j = new JSONObject(s);
+        System.out.println(j.toString(4));
+      }
+      catch (Exception e)
+      {
+        System.out.println(e);
+      }
+
+      System.out.print("Exception: ");
+      try
+      {
+        jj = new JSONStringer();
+        s = jj
+            .object()
+            .key("bosanda")
+            .value("MARIE HAA'S")
+            .key("bosanda")
+            .value("MARIE HAA\\'S")
+            .endObject()
+            .toString();
+        System.out.println(j.toString(4));
+      }
+      catch (Exception e)
+      {
+        System.out.println(e);
+      }
     }
+    catch (Exception e)
+    {
+      System.out.println(e.toString());
+    }
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/java/org/json/XML.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/XML.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/XML.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -30,108 +30,139 @@
 /**
  * This provides static methods to convert an XML text into a JSONObject,
  * and to covert a JSONObject into an XML text.
+ *
  * @author JSON.org
  * @version 2008-09-18
  */
-public class XML {
+public class XML
+{
 
-    /** The Character '&'. */
-    public static final Character AMP   = new Character('&');
+  /**
+   * The Character '&'.
+   */
+  public static final Character AMP = new Character('&');
 
-    /** The Character '''. */
-    public static final Character APOS  = new Character('\'');
+  /**
+   * The Character '''.
+   */
+  public static final Character APOS = new Character('\'');
 
-    /** The Character '!'. */
-    public static final Character BANG  = new Character('!');
+  /**
+   * The Character '!'.
+   */
+  public static final Character BANG = new Character('!');
 
-    /** The Character '='. */
-    public static final Character EQ    = new Character('=');
+  /**
+   * The Character '='.
+   */
+  public static final Character EQ = new Character('=');
 
-    /** The Character '>'. */
-    public static final Character GT    = new Character('>');
+  /**
+   * The Character '>'.
+   */
+  public static final Character GT = new Character('>');
 
-    /** The Character '<'. */
-    public static final Character LT    = new Character('<');
+  /**
+   * The Character '<'.
+   */
+  public static final Character LT = new Character('<');
 
-    /** The Character '?'. */
-    public static final Character QUEST = new Character('?');
+  /**
+   * The Character '?'.
+   */
+  public static final Character QUEST = new Character('?');
 
-    /** The Character '"'. */
-    public static final Character QUOT  = new Character('"');
+  /**
+   * The Character '"'.
+   */
+  public static final Character QUOT = new Character('"');
 
-    /** The Character '/'. */
-    public static final Character SLASH = new Character('/');
+  /**
+   * The Character '/'.
+   */
+  public static final Character SLASH = new Character('/');
 
-    /**
-     * Replace special characters with XML escapes:
-     * <pre>
-     * &amp; <small>(ampersand)</small> is replaced by &amp;amp;
-     * &lt; <small>(less than)</small> is replaced by &amp;lt;
-     * &gt; <small>(greater than)</small> is replaced by &amp;gt;
-     * &quot; <small>(double quote)</small> is replaced by &amp;quot;
-     * </pre>
-     * @param string The string to be escaped.
-     * @return The escaped string.
-     */
-    public static String escape(String string) {
-        StringBuffer sb = new StringBuffer();
-        for (int i = 0, len = string.length(); i < len; i++) {
-            char c = string.charAt(i);
-            switch (c) {
-            case '&':
-                sb.append("&amp;");
-                break;
-            case '<':
-                sb.append("&lt;");
-                break;
-            case '>':
-                sb.append("&gt;");
-                break;
-            case '"':
-                sb.append("&quot;");
-                break;
-            default:
-                sb.append(c);
-            }
-        }
-        return sb.toString();
+  /**
+   * Replace special characters with XML escapes:
+   * <pre>
+   * &amp; <small>(ampersand)</small> is replaced by &amp;amp;
+   * &lt; <small>(less than)</small> is replaced by &amp;lt;
+   * &gt; <small>(greater than)</small> is replaced by &amp;gt;
+   * &quot; <small>(double quote)</small> is replaced by &amp;quot;
+   * </pre>
+   *
+   * @param string The string to be escaped.
+   * @return The escaped string.
+   */
+  public static String escape(String string)
+  {
+    StringBuffer sb = new StringBuffer();
+    for (int i = 0, len = string.length(); i < len; i++)
+    {
+      char c = string.charAt(i);
+      switch (c)
+      {
+        case'&':
+          sb.append("&amp;");
+          break;
+        case'<':
+          sb.append("&lt;");
+          break;
+        case'>':
+          sb.append("&gt;");
+          break;
+        case'"':
+          sb.append("&quot;");
+          break;
+        default:
+          sb.append(c);
+      }
     }
-    
-    /**
-     * Throw an exception if the string contains whitespace. 
-     * Whitespace is not allowed in tagNames and attributes.
-     * @param string
-     * @throws JSONException
-     */
-    public static void noSpace(String string) throws JSONException {
-    	int i, length = string.length();
-    	if (length == 0) {
-    		throw new JSONException("Empty string.");
-    	}
-    	for (i = 0; i < length; i += 1) {
-		    if (Character.isWhitespace(string.charAt(i))) {
-		    	throw new JSONException("'" + string + 
-		    			"' contains a space character.");
-		    }
-		}
+    return sb.toString();
+  }
+
+  /**
+   * Throw an exception if the string contains whitespace.
+   * Whitespace is not allowed in tagNames and attributes.
+   *
+   * @param string
+   * @throws JSONException
+   */
+  public static void noSpace(String string) throws JSONException
+  {
+    int i, length = string.length();
+    if (length == 0)
+    {
+      throw new JSONException("Empty string.");
     }
+    for (i = 0; i < length; i += 1)
+    {
+      if (Character.isWhitespace(string.charAt(i)))
+      {
+        throw new JSONException("'" + string +
+            "' contains a space character.");
+      }
+    }
+  }
 
-    /**
-     * Scan the content following the named tag, attaching it to the context.
-     * @param x       The XMLTokener containing the source string.
-     * @param context The JSONObject that will include the new material.
-     * @param name    The tag name.
-     * @return true if the close tag is processed.
-     * @throws JSONException
-     */
-    private static boolean parse(XMLTokener x, JSONObject context,
-                                 String name) throws JSONException {
-        char       c;
-        int        i;
-        String     n;
-        JSONObject o = null;
-        String     s;
-        Object     t;
+  /**
+   * Scan the content following the named tag, attaching it to the context.
+   *
+   * @param x       The XMLTokener containing the source string.
+   * @param context The JSONObject that will include the new material.
+   * @param name    The tag name.
+   * @return true if the close tag is processed.
+   * @throws JSONException
+   */
+  private static boolean parse(XMLTokener x, JSONObject context,
+                               String name) throws JSONException
+  {
+    char c;
+    int i;
+    String n;
+    JSONObject o = null;
+    String s;
+    Object t;
 
 // Test for and skip past these forms:
 //      <!-- ... -->
@@ -143,284 +174,371 @@
 //      <=
 //      <<
 
-        t = x.nextToken();
+    t = x.nextToken();
 
 // <!
 
-        if (t == BANG) {
-            c = x.next();
-            if (c == '-') {
-                if (x.next() == '-') {
-                    x.skipPast("-->");
-                    return false;
-                }
-                x.back();
-            } else if (c == '[') {
-                t = x.nextToken();
-                if (t.equals("CDATA")) {
-                    if (x.next() == '[') {
-                        s = x.nextCDATA();
-                        if (s.length() > 0) {
-                            context.accumulate("content", s);
-                        }
-                        return false;
-                    }
-                }
-                throw x.syntaxError("Expected 'CDATA['");
+    if (t == BANG)
+    {
+      c = x.next();
+      if (c == '-')
+      {
+        if (x.next() == '-')
+        {
+          x.skipPast("-->");
+          return false;
+        }
+        x.back();
+      }
+      else if (c == '[')
+      {
+        t = x.nextToken();
+        if (t.equals("CDATA"))
+        {
+          if (x.next() == '[')
+          {
+            s = x.nextCDATA();
+            if (s.length() > 0)
+            {
+              context.accumulate("content", s);
             }
-            i = 1;
-            do {
-                t = x.nextMeta();
-                if (t == null) {
-                    throw x.syntaxError("Missing '>' after '<!'.");
-                } else if (t == LT) {
-                    i += 1;
-                } else if (t == GT) {
-                    i -= 1;
-                }
-            } while (i > 0);
             return false;
-        } else if (t == QUEST) {
+          }
+        }
+        throw x.syntaxError("Expected 'CDATA['");
+      }
+      i = 1;
+      do
+      {
+        t = x.nextMeta();
+        if (t == null)
+        {
+          throw x.syntaxError("Missing '>' after '<!'.");
+        }
+        else if (t == LT)
+        {
+          i += 1;
+        }
+        else if (t == GT)
+        {
+          i -= 1;
+        }
+      }
+      while (i > 0);
+      return false;
+    }
+    else if (t == QUEST)
+    {
 
 // <?
 
-            x.skipPast("?>");
-            return false;
-        } else if (t == SLASH) {
+      x.skipPast("?>");
+      return false;
+    }
+    else if (t == SLASH)
+    {
 
 // Close tag </
 
-        	t = x.nextToken();
-            if (name == null) {
-                throw x.syntaxError("Mismatched close tag" + t);
-            }            
-            if (!t.equals(name)) {
-                throw x.syntaxError("Mismatched " + name + " and " + t);
-            }
-            if (x.nextToken() != GT) {
-                throw x.syntaxError("Misshaped close tag");
-            }
-            return true;
+      t = x.nextToken();
+      if (name == null)
+      {
+        throw x.syntaxError("Mismatched close tag" + t);
+      }
+      if (!t.equals(name))
+      {
+        throw x.syntaxError("Mismatched " + name + " and " + t);
+      }
+      if (x.nextToken() != GT)
+      {
+        throw x.syntaxError("Misshaped close tag");
+      }
+      return true;
 
-        } else if (t instanceof Character) {
-            throw x.syntaxError("Misshaped tag");
+    }
+    else if (t instanceof Character)
+    {
+      throw x.syntaxError("Misshaped tag");
 
 // Open tag <
 
-        } else {
-            n = (String)t;
-            t = null;
-            o = new JSONObject();
-            for (;;) {
-                if (t == null) {
-                    t = x.nextToken();
-                }
+    }
+    else
+    {
+      n = (String) t;
+      t = null;
+      o = new JSONObject();
+      for (; ;)
+      {
+        if (t == null)
+        {
+          t = x.nextToken();
+        }
 
 // attribute = value
 
-                if (t instanceof String) {
-                    s = (String)t;
-                    t = x.nextToken();
-                    if (t == EQ) {
-                        t = x.nextToken();
-                        if (!(t instanceof String)) {
-                            throw x.syntaxError("Missing value");
-                        }
-                        o.accumulate(s, JSONObject.stringToValue((String)t));
-                        t = null;
-                    } else {
-                        o.accumulate(s, "");
-                    }
+        if (t instanceof String)
+        {
+          s = (String) t;
+          t = x.nextToken();
+          if (t == EQ)
+          {
+            t = x.nextToken();
+            if (!(t instanceof String))
+            {
+              throw x.syntaxError("Missing value");
+            }
+            o.accumulate(s, JSONObject.stringToValue((String) t));
+            t = null;
+          }
+          else
+          {
+            o.accumulate(s, "");
+          }
 
 // Empty tag <.../>
 
-                } else if (t == SLASH) {
-                    if (x.nextToken() != GT) {
-                        throw x.syntaxError("Misshaped tag");
-                    }
-                    context.accumulate(n, o);
-                    return false;
+        }
+        else if (t == SLASH)
+        {
+          if (x.nextToken() != GT)
+          {
+            throw x.syntaxError("Misshaped tag");
+          }
+          context.accumulate(n, o);
+          return false;
 
 // Content, between <...> and </...>
 
-                } else if (t == GT) {
-                    for (;;) {
-                        t = x.nextContent();
-                        if (t == null) {
-                            if (n != null) {
-                                throw x.syntaxError("Unclosed tag " + n);
-                            }
-                            return false;
-                        } else if (t instanceof String) {
-                            s = (String)t;
-                            if (s.length() > 0) {
-                                o.accumulate("content", JSONObject.stringToValue(s));
-                            }
+        }
+        else if (t == GT)
+        {
+          for (; ;)
+          {
+            t = x.nextContent();
+            if (t == null)
+            {
+              if (n != null)
+              {
+                throw x.syntaxError("Unclosed tag " + n);
+              }
+              return false;
+            }
+            else if (t instanceof String)
+            {
+              s = (String) t;
+              if (s.length() > 0)
+              {
+                o.accumulate("content", JSONObject.stringToValue(s));
+              }
 
 // Nested element
 
-                        } else if (t == LT) {
-                            if (parse(x, o, n)) {
-                                if (o.length() == 0) {
-                                    context.accumulate(n, "");
-                                } else if (o.length() == 1 &&
-                                       o.opt("content") != null) {
-                                    context.accumulate(n, o.opt("content"));
-                                } else {
-                                    context.accumulate(n, o);
-                                }
-                                return false;
-                            }
-                        }
-                    }
-                } else {
-                    throw x.syntaxError("Misshaped tag");
+            }
+            else if (t == LT)
+            {
+              if (parse(x, o, n))
+              {
+                if (o.length() == 0)
+                {
+                  context.accumulate(n, "");
                 }
+                else if (o.length() == 1 &&
+                    o.opt("content") != null)
+                {
+                  context.accumulate(n, o.opt("content"));
+                }
+                else
+                {
+                  context.accumulate(n, o);
+                }
+                return false;
+              }
             }
+          }
         }
+        else
+        {
+          throw x.syntaxError("Misshaped tag");
+        }
+      }
     }
+  }
 
 
-    /**
-     * Convert a well-formed (but not necessarily valid) XML string into a
-     * JSONObject. Some information may be lost in this transformation
-     * because JSON is a data format and XML is a document format. XML uses
-     * elements, attributes, and content text, while JSON uses unordered
-     * collections of name/value pairs and arrays of values. JSON does not
-     * does not like to distinguish between elements and attributes.
-     * Sequences of similar elements are represented as JSONArrays. Content
-     * text may be placed in a "content" member. Comments, prologs, DTDs, and
-     * <code>&lt;[ [ ]]></code> are ignored.
-     * @param string The source string.
-     * @return A JSONObject containing the structured data from the XML string.
-     * @throws JSONException
-     */
-    public static JSONObject toJSONObject(String string) throws JSONException {
-        JSONObject o = new JSONObject();
-        XMLTokener x = new XMLTokener(string);
-        while (x.more() && x.skipPast("<")) {
-            parse(x, o, null);
-        }
-        return o;
+  /**
+   * Convert a well-formed (but not necessarily valid) XML string into a
+   * JSONObject. Some information may be lost in this transformation
+   * because JSON is a data format and XML is a document format. XML uses
+   * elements, attributes, and content text, while JSON uses unordered
+   * collections of name/value pairs and arrays of values. JSON does not
+   * does not like to distinguish between elements and attributes.
+   * Sequences of similar elements are represented as JSONArrays. Content
+   * text may be placed in a "content" member. Comments, prologs, DTDs, and
+   * <code>&lt;[ [ ]]></code> are ignored.
+   *
+   * @param string The source string.
+   * @return A JSONObject containing the structured data from the XML string.
+   * @throws JSONException
+   */
+  public static JSONObject toJSONObject(String string) throws JSONException
+  {
+    JSONObject o = new JSONObject();
+    XMLTokener x = new XMLTokener(string);
+    while (x.more() && x.skipPast("<"))
+    {
+      parse(x, o, null);
     }
+    return o;
+  }
 
 
-    /**
-     * Convert a JSONObject into a well-formed, element-normal XML string.
-     * @param o A JSONObject.
-     * @return  A string.
-     * @throws  JSONException
-     */
-    public static String toString(Object o) throws JSONException {
-        return toString(o, null);
-    }
+  /**
+   * Convert a JSONObject into a well-formed, element-normal XML string.
+   *
+   * @param o A JSONObject.
+   * @return A string.
+   * @throws JSONException
+   */
+  public static String toString(Object o) throws JSONException
+  {
+    return toString(o, null);
+  }
 
 
-    /**
-     * Convert a JSONObject into a well-formed, element-normal XML string.
-     * @param o A JSONObject.
-     * @param tagName The optional name of the enclosing tag.
-     * @return A string.
-     * @throws JSONException
-     */
-    public static String toString(Object o, String tagName)
-            throws JSONException {
-        StringBuffer b = new StringBuffer();
-        int          i;
-        JSONArray    ja;
-        JSONObject   jo;
-        String       k;
-        Iterator     keys;
-        int          len;
-        String       s;
-        Object       v;
-        if (o instanceof JSONObject) {
+  /**
+   * Convert a JSONObject into a well-formed, element-normal XML string.
+   *
+   * @param o       A JSONObject.
+   * @param tagName The optional name of the enclosing tag.
+   * @return A string.
+   * @throws JSONException
+   */
+  public static String toString(Object o, String tagName)
+      throws JSONException
+  {
+    StringBuffer b = new StringBuffer();
+    int i;
+    JSONArray ja;
+    JSONObject jo;
+    String k;
+    Iterator keys;
+    int len;
+    String s;
+    Object v;
+    if (o instanceof JSONObject)
+    {
 
 // Emit <tagName>
 
-            if (tagName != null) {
-                b.append('<');
-                b.append(tagName);
-                b.append('>');
-            }
+      if (tagName != null)
+      {
+        b.append('<');
+        b.append(tagName);
+        b.append('>');
+      }
 
 // Loop thru the keys.
 
-            jo = (JSONObject)o;
-            keys = jo.keys();
-            while (keys.hasNext()) {
-                k = keys.next().toString();
-                v = jo.opt(k);
-                if (v == null) {
-                	v = "";
-                }
-                if (v instanceof String) {
-                    s = (String)v;
-                } else {
-                    s = null;
-                }
+      jo = (JSONObject) o;
+      keys = jo.keys();
+      while (keys.hasNext())
+      {
+        k = keys.next().toString();
+        v = jo.opt(k);
+        if (v == null)
+        {
+          v = "";
+        }
+        if (v instanceof String)
+        {
+          s = (String) v;
+        }
+        else
+        {
+          s = null;
+        }
 
 // Emit content in body
 
-                if (k.equals("content")) {
-                    if (v instanceof JSONArray) {
-                        ja = (JSONArray)v;
-                        len = ja.length();
-                        for (i = 0; i < len; i += 1) {
-                            if (i > 0) {
-                                b.append('\n');
-                            }
-                            b.append(escape(ja.get(i).toString()));
-                        }
-                    } else {
-                        b.append(escape(v.toString()));
-                    }
+        if (k.equals("content"))
+        {
+          if (v instanceof JSONArray)
+          {
+            ja = (JSONArray) v;
+            len = ja.length();
+            for (i = 0; i < len; i += 1)
+            {
+              if (i > 0)
+              {
+                b.append('\n');
+              }
+              b.append(escape(ja.get(i).toString()));
+            }
+          }
+          else
+          {
+            b.append(escape(v.toString()));
+          }
 
 // Emit an array of similar keys
 
-                } else if (v instanceof JSONArray) {
-                    ja = (JSONArray)v;
-                    len = ja.length();
-                    for (i = 0; i < len; i += 1) {
-                        b.append(toString(ja.get(i), k));
-                    }
-                } else if (v.equals("")) {
-                    b.append('<');
-                    b.append(k);
-                    b.append("/>");
+        }
+        else if (v instanceof JSONArray)
+        {
+          ja = (JSONArray) v;
+          len = ja.length();
+          for (i = 0; i < len; i += 1)
+          {
+            b.append(toString(ja.get(i), k));
+          }
+        }
+        else if (v.equals(""))
+        {
+          b.append('<');
+          b.append(k);
+          b.append("/>");
 
 // Emit a new tag <k>
 
-                } else {
-                    b.append(toString(v, k));
-                }
-            }
-            if (tagName != null) {
+        }
+        else
+        {
+          b.append(toString(v, k));
+        }
+      }
+      if (tagName != null)
+      {
 
 // Emit the </tagname> close tag
 
-                b.append("</");
-                b.append(tagName);
-                b.append('>');
-            }
-            return b.toString();
+        b.append("</");
+        b.append(tagName);
+        b.append('>');
+      }
+      return b.toString();
 
 // XML does not have good support for arrays. If an array appears in a place
 // where XML is lacking, synthesize an <array> element.
 
-        } else if (o instanceof JSONArray) {
-            ja = (JSONArray)o;
-            len = ja.length();
-            for (i = 0; i < len; ++i) {
-                b.append(toString(
-                    ja.opt(i), (tagName == null) ? "array" : tagName));
-            }
-            return b.toString();
-        } else {
-            s = (o == null) ? "null" : escape(o.toString());
-            return (tagName == null) ? "\"" + s + "\"" :
-                (s.length() == 0) ? "<" + tagName + "/>" :
-                "<" + tagName + ">" + s + "</" + tagName + ">";
-        }
     }
+    else if (o instanceof JSONArray)
+    {
+      ja = (JSONArray) o;
+      len = ja.length();
+      for (i = 0; i < len; ++i)
+      {
+        b.append(toString(
+            ja.opt(i), (tagName == null) ? "array" : tagName));
+      }
+      return b.toString();
+    }
+    else
+    {
+      s = (o == null) ? "null" : escape(o.toString());
+      return (tagName == null) ? "\"" + s + "\"" :
+          (s.length() == 0) ? "<" + tagName + "/>" :
+              "<" + tagName + ">" + s + "</" + tagName + ">";
+    }
+  }
 }
\ No newline at end of file

Modified: projects/gwt-console/trunk/war/src/main/java/org/json/XMLTokener.java
===================================================================
--- projects/gwt-console/trunk/war/src/main/java/org/json/XMLTokener.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/java/org/json/XMLTokener.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -27,339 +27,404 @@
 /**
  * The XMLTokener extends the JSONTokener to provide additional methods
  * for the parsing of XML texts.
+ *
  * @author JSON.org
  * @version 2008-09-18
  */
-public class XMLTokener extends JSONTokener {
+public class XMLTokener extends JSONTokener
+{
 
 
-   /** The table of entity values. It initially contains Character values for
-    * amp, apos, gt, lt, quot.
-    */
-   public static final java.util.HashMap entity;
+  /**
+   * The table of entity values. It initially contains Character values for
+   * amp, apos, gt, lt, quot.
+   */
+  public static final java.util.HashMap entity;
 
-   static {
-       entity = new java.util.HashMap(8);
-       entity.put("amp",  XML.AMP);
-       entity.put("apos", XML.APOS);
-       entity.put("gt",   XML.GT);
-       entity.put("lt",   XML.LT);
-       entity.put("quot", XML.QUOT);
-   }
+  static
+  {
+    entity = new java.util.HashMap(8);
+    entity.put("amp", XML.AMP);
+    entity.put("apos", XML.APOS);
+    entity.put("gt", XML.GT);
+    entity.put("lt", XML.LT);
+    entity.put("quot", XML.QUOT);
+  }
 
-    /**
-     * Construct an XMLTokener from a string.
-     * @param s A source string.
-     */
-    public XMLTokener(String s) {
-        super(s);
-    }
+  /**
+   * Construct an XMLTokener from a string.
+   *
+   * @param s A source string.
+   */
+  public XMLTokener(String s)
+  {
+    super(s);
+  }
 
-    /**
-     * Get the text in the CDATA block.
-     * @return The string up to the <code>]]&gt;</code>.
-     * @throws JSONException If the <code>]]&gt;</code> is not found.
-     */
-    public String nextCDATA() throws JSONException {
-        char         c;
-        int          i;
-        StringBuffer sb = new StringBuffer();
-        for (;;) {
-            c = next();
-            if (c == 0) {
-                throw syntaxError("Unclosed CDATA");
-            }
-            sb.append(c);
-            i = sb.length() - 3;
-            if (i >= 0 && sb.charAt(i) == ']' &&
-                          sb.charAt(i + 1) == ']' && sb.charAt(i + 2) == '>') {
-                sb.setLength(i);
-                return sb.toString();
-            }
-        }
+  /**
+   * Get the text in the CDATA block.
+   *
+   * @return The string up to the <code>]]&gt;</code>.
+   * @throws JSONException If the <code>]]&gt;</code> is not found.
+   */
+  public String nextCDATA() throws JSONException
+  {
+    char c;
+    int i;
+    StringBuffer sb = new StringBuffer();
+    for (; ;)
+    {
+      c = next();
+      if (c == 0)
+      {
+        throw syntaxError("Unclosed CDATA");
+      }
+      sb.append(c);
+      i = sb.length() - 3;
+      if (i >= 0 && sb.charAt(i) == ']' &&
+          sb.charAt(i + 1) == ']' && sb.charAt(i + 2) == '>')
+      {
+        sb.setLength(i);
+        return sb.toString();
+      }
     }
+  }
 
 
-    /**
-     * Get the next XML outer token, trimming whitespace. There are two kinds
-     * of tokens: the '<' character which begins a markup tag, and the content
-     * text between markup tags.
-     *
-     * @return  A string, or a '<' Character, or null if there is no more
-     * source text.
-     * @throws JSONException
-     */
-    public Object nextContent() throws JSONException {
-        char         c;
-        StringBuffer sb;
-        do {
-            c = next();
-        } while (Character.isWhitespace(c));
-        if (c == 0) {
-            return null;
-        }
-        if (c == '<') {
-            return XML.LT;
-        }
-        sb = new StringBuffer();
-        for (;;) {
-            if (c == '<' || c == 0) {
-                back();
-                return sb.toString().trim();
-            }
-            if (c == '&') {
-                sb.append(nextEntity(c));
-            } else {
-                sb.append(c);
-            }
-            c = next();
-        }
+  /**
+   * Get the next XML outer token, trimming whitespace. There are two kinds
+   * of tokens: the '<' character which begins a markup tag, and the content
+   * text between markup tags.
+   *
+   * @return A string, or a '<' Character, or null if there is no more
+   *         source text.
+   * @throws JSONException
+   */
+  public Object nextContent() throws JSONException
+  {
+    char c;
+    StringBuffer sb;
+    do
+    {
+      c = next();
     }
+    while (Character.isWhitespace(c));
+    if (c == 0)
+    {
+      return null;
+    }
+    if (c == '<')
+    {
+      return XML.LT;
+    }
+    sb = new StringBuffer();
+    for (; ;)
+    {
+      if (c == '<' || c == 0)
+      {
+        back();
+        return sb.toString().trim();
+      }
+      if (c == '&')
+      {
+        sb.append(nextEntity(c));
+      }
+      else
+      {
+        sb.append(c);
+      }
+      c = next();
+    }
+  }
 
 
-    /**
-     * Return the next entity. These entities are translated to Characters:
-     *     <code>&amp;  &apos;  &gt;  &lt;  &quot;</code>.
-     * @param a An ampersand character.
-     * @return  A Character or an entity String if the entity is not recognized.
-     * @throws JSONException If missing ';' in XML entity.
-     */
-    public Object nextEntity(char a) throws JSONException {
-        StringBuffer sb = new StringBuffer();
-        for (;;) {
-            char c = next();
-            if (Character.isLetterOrDigit(c) || c == '#') {
-                sb.append(Character.toLowerCase(c));
-            } else if (c == ';') {
-                break;
-            } else {
-                throw syntaxError("Missing ';' in XML entity: &" + sb);
-            }
-        }
-        String s = sb.toString();
-        Object e = entity.get(s);
-        return e != null ? e : a + s + ";";
+  /**
+   * Return the next entity. These entities are translated to Characters:
+   * <code>&amp;  &apos;  &gt;  &lt;  &quot;</code>.
+   *
+   * @param a An ampersand character.
+   * @return A Character or an entity String if the entity is not recognized.
+   * @throws JSONException If missing ';' in XML entity.
+   */
+  public Object nextEntity(char a) throws JSONException
+  {
+    StringBuffer sb = new StringBuffer();
+    for (; ;)
+    {
+      char c = next();
+      if (Character.isLetterOrDigit(c) || c == '#')
+      {
+        sb.append(Character.toLowerCase(c));
+      }
+      else if (c == ';')
+      {
+        break;
+      }
+      else
+      {
+        throw syntaxError("Missing ';' in XML entity: &" + sb);
+      }
     }
+    String s = sb.toString();
+    Object e = entity.get(s);
+    return e != null ? e : a + s + ";";
+  }
 
 
-    /**
-     * Returns the next XML meta token. This is used for skipping over <!...>
-     * and <?...?> structures.
-     * @return Syntax characters (<code>< > / = ! ?</code>) are returned as
-     *  Character, and strings and names are returned as Boolean. We don't care
-     *  what the values actually are.
-     * @throws JSONException If a string is not properly closed or if the XML
-     *  is badly structured.
-     */
-    public Object nextMeta() throws JSONException {
-        char c;
-        char q;
-        do {
-            c = next();
-        } while (Character.isWhitespace(c));
-        switch (c) {
-        case 0:
-            throw syntaxError("Misshaped meta tag");
-        case '<':
-            return XML.LT;
-        case '>':
-            return XML.GT;
-        case '/':
-            return XML.SLASH;
-        case '=':
-            return XML.EQ;
-        case '!':
-            return XML.BANG;
-        case '?':
-            return XML.QUEST;
-        case '"':
-        case '\'':
-            q = c;
-            for (;;) {
-                c = next();
-                if (c == 0) {
-                    throw syntaxError("Unterminated string");
-                }
-                if (c == q) {
-                    return Boolean.TRUE;
-                }
-            }
-        default:
-            for (;;) {
-                c = next();
-                if (Character.isWhitespace(c)) {
-                    return Boolean.TRUE;
-                }
-                switch (c) {
-                case 0:
-                case '<':
-                case '>':
-                case '/':
-                case '=':
-                case '!':
-                case '?':
-                case '"':
-                case '\'':
-                    back();
-                    return Boolean.TRUE;
-                }
-            }
+  /**
+   * Returns the next XML meta token. This is used for skipping over <!...>
+   * and <?...?> structures.
+   *
+   * @return Syntax characters (<code>< > / = ! ?</code>) are returned as
+   *         Character, and strings and names are returned as Boolean. We don't care
+   *         what the values actually are.
+   * @throws JSONException If a string is not properly closed or if the XML
+   *                       is badly structured.
+   */
+  public Object nextMeta() throws JSONException
+  {
+    char c;
+    char q;
+    do
+    {
+      c = next();
+    }
+    while (Character.isWhitespace(c));
+    switch (c)
+    {
+      case 0:
+        throw syntaxError("Misshaped meta tag");
+      case'<':
+        return XML.LT;
+      case'>':
+        return XML.GT;
+      case'/':
+        return XML.SLASH;
+      case'=':
+        return XML.EQ;
+      case'!':
+        return XML.BANG;
+      case'?':
+        return XML.QUEST;
+      case'"':
+      case'\'':
+        q = c;
+        for (; ;)
+        {
+          c = next();
+          if (c == 0)
+          {
+            throw syntaxError("Unterminated string");
+          }
+          if (c == q)
+          {
+            return Boolean.TRUE;
+          }
         }
+      default:
+        for (; ;)
+        {
+          c = next();
+          if (Character.isWhitespace(c))
+          {
+            return Boolean.TRUE;
+          }
+          switch (c)
+          {
+            case 0:
+            case'<':
+            case'>':
+            case'/':
+            case'=':
+            case'!':
+            case'?':
+            case'"':
+            case'\'':
+              back();
+              return Boolean.TRUE;
+          }
+        }
     }
+  }
 
 
-    /**
-     * Get the next XML Token. These tokens are found inside of angle
-     * brackets. It may be one of these characters: <code>/ > = ! ?</code> or it
-     * may be a string wrapped in single quotes or double quotes, or it may be a
-     * name.
-     * @return a String or a Character.
-     * @throws JSONException If the XML is not well formed.
-     */
-    public Object nextToken() throws JSONException {
-        char c;
-        char q;
-        StringBuffer sb;
-        do {
-            c = next();
-        } while (Character.isWhitespace(c));
-        switch (c) {
-        case 0:
-            throw syntaxError("Misshaped element");
-        case '<':
-            throw syntaxError("Misplaced '<'");
-        case '>':
-            return XML.GT;
-        case '/':
-            return XML.SLASH;
-        case '=':
-            return XML.EQ;
-        case '!':
-            return XML.BANG;
-        case '?':
-            return XML.QUEST;
+  /**
+   * Get the next XML Token. These tokens are found inside of angle
+   * brackets. It may be one of these characters: <code>/ > = ! ?</code> or it
+   * may be a string wrapped in single quotes or double quotes, or it may be a
+   * name.
+   *
+   * @return a String or a Character.
+   * @throws JSONException If the XML is not well formed.
+   */
+  public Object nextToken() throws JSONException
+  {
+    char c;
+    char q;
+    StringBuffer sb;
+    do
+    {
+      c = next();
+    }
+    while (Character.isWhitespace(c));
+    switch (c)
+    {
+      case 0:
+        throw syntaxError("Misshaped element");
+      case'<':
+        throw syntaxError("Misplaced '<'");
+      case'>':
+        return XML.GT;
+      case'/':
+        return XML.SLASH;
+      case'=':
+        return XML.EQ;
+      case'!':
+        return XML.BANG;
+      case'?':
+        return XML.QUEST;
 
 // Quoted string
 
-        case '"':
-        case '\'':
-            q = c;
-            sb = new StringBuffer();
-            for (;;) {
-                c = next();
-                if (c == 0) {
-                    throw syntaxError("Unterminated string");
-                }
-                if (c == q) {
-                    return sb.toString();
-                }
-                if (c == '&') {
-                    sb.append(nextEntity(c));
-                } else {
-                    sb.append(c);
-                }
-            }
-        default:
+      case'"':
+      case'\'':
+        q = c;
+        sb = new StringBuffer();
+        for (; ;)
+        {
+          c = next();
+          if (c == 0)
+          {
+            throw syntaxError("Unterminated string");
+          }
+          if (c == q)
+          {
+            return sb.toString();
+          }
+          if (c == '&')
+          {
+            sb.append(nextEntity(c));
+          }
+          else
+          {
+            sb.append(c);
+          }
+        }
+      default:
 
 // Name
 
-            sb = new StringBuffer();
-            for (;;) {
-                sb.append(c);
-                c = next();
-                if (Character.isWhitespace(c)) {
-                    return sb.toString();
-                }
-                switch (c) {
-                case 0:
-                	return sb.toString();
-                case '>':
-                case '/':
-                case '=':
-                case '!':
-                case '?':
-                case '[':
-                case ']':
-                    back();
-                    return sb.toString();
-                case '<':
-                case '"':
-                case '\'':
-                    throw syntaxError("Bad character in a name");
-                }
-            }
+        sb = new StringBuffer();
+        for (; ;)
+        {
+          sb.append(c);
+          c = next();
+          if (Character.isWhitespace(c))
+          {
+            return sb.toString();
+          }
+          switch (c)
+          {
+            case 0:
+              return sb.toString();
+            case'>':
+            case'/':
+            case'=':
+            case'!':
+            case'?':
+            case'[':
+            case']':
+              back();
+              return sb.toString();
+            case'<':
+            case'"':
+            case'\'':
+              throw syntaxError("Bad character in a name");
+          }
         }
     }
-    
-    
-    /**
-     * Skip characters until past the requested string.
-     * If it is not found, we are left at the end of the source with a result of false.
-     * @param to A string to skip past.
-     * @throws JSONException
-     */
-    public boolean skipPast(String to) throws JSONException {
-    	boolean b;
-    	char c;
-    	int i;
-    	int j;
-    	int offset = 0;
-    	int n = to.length();
-        char[] circle = new char[n];
-        
-        /*
-         * First fill the circle buffer with as many characters as are in the
-         * to string. If we reach an early end, bail.
+  }
+
+
+  /**
+   * Skip characters until past the requested string.
+   * If it is not found, we are left at the end of the source with a result of false.
+   *
+   * @param to A string to skip past.
+   * @throws JSONException
+   */
+  public boolean skipPast(String to) throws JSONException
+  {
+    boolean b;
+    char c;
+    int i;
+    int j;
+    int offset = 0;
+    int n = to.length();
+    char[] circle = new char[n];
+
+    /*
+    * First fill the circle buffer with as many characters as are in the
+    * to string. If we reach an early end, bail.
+    */
+
+    for (i = 0; i < n; i += 1)
+    {
+      c = next();
+      if (c == 0)
+      {
+        return false;
+      }
+      circle[i] = c;
+    }
+    /*
+         * We will loop, possibly for all of the remaining characters.
          */
-        
-    	for (i = 0; i < n; i += 1) {
-    		c = next();
-    		if (c == 0) {
-    			return false;
-    		}
-    		circle[i] = c;
-    	}
-    	/*
-    	 * We will loop, possibly for all of the remaining characters.
-    	 */
-    	for (;;) {
-    		j = offset;
-    		b = true;
-    		/*
-    		 * Compare the circle buffer with the to string. 
-    		 */
-    		for (i = 0; i < n; i += 1) {
-    			if (circle[j] != to.charAt(i)) {
-    				b = false;
-    				break;
-    			}
-    			j += 1;
-    			if (j >= n) {
-    				j -= n;
-    			}
-    		}
-    		/*
-    		 * If we exit the loop with b intact, then victory is ours.
-    		 */
-    		if (b) {
-    			return true;
-    		}
-    		/*
-    		 * Get the next character. If there isn't one, then defeat is ours.
-    		 */
-    		c = next();
-    		if (c == 0) {
-    			return false;
-    		}
-    		/*
-    		 * Shove the character in the circle buffer and advance the 
-    		 * circle offset. The offset is mod n.
-    		 */
-    		circle[offset] = c;
-    		offset += 1;
-    		if (offset >= n) {
-    			offset -= n;
-    		}
-    	}
+    for (; ;)
+    {
+      j = offset;
+      b = true;
+      /*
+            * Compare the circle buffer with the to string.
+            */
+      for (i = 0; i < n; i += 1)
+      {
+        if (circle[j] != to.charAt(i))
+        {
+          b = false;
+          break;
+        }
+        j += 1;
+        if (j >= n)
+        {
+          j -= n;
+        }
+      }
+      /*
+            * If we exit the loop with b intact, then victory is ours.
+            */
+      if (b)
+      {
+        return true;
+      }
+      /*
+            * Get the next character. If there isn't one, then defeat is ours.
+            */
+      c = next();
+      if (c == 0)
+      {
+        return false;
+      }
+      /*
+            * Shove the character in the circle buffer and advance the
+            * circle offset. The offset is mod n.
+            */
+      circle[offset] = c;
+      offset += 1;
+      if (offset >= n)
+      {
+        offset -= n;
+      }
     }
+  }
 }

Modified: projects/gwt-console/trunk/war/src/main/resources/org/jboss/bpm/console/workspace.txt
===================================================================
--- projects/gwt-console/trunk/war/src/main/resources/org/jboss/bpm/console/workspace.txt	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/main/resources/org/jboss/bpm/console/workspace.txt	2009-01-15 11:05:35 UTC (rev 3644)
@@ -1,3 +1,3 @@
-org.jboss.bpm.console.client.process.ProcessDefinitionListEditor
-org.jboss.bpm.console.client.task.TaskListEditor
-org.jboss.bpm.console.client.report.OverviewReportEditor
\ No newline at end of file
+org.jboss.bpm.console.client.process.ProcessEditor
+org.jboss.bpm.console.client.task.TaskEditor
+org.jboss.bpm.console.client.report.ReportEditor
\ No newline at end of file

Modified: projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/GwtTestProcessManagement.java
===================================================================
--- projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/GwtTestProcessManagement.java	2009-01-15 10:51:26 UTC (rev 3643)
+++ projects/gwt-console/trunk/war/src/test/java/org/jboss/bpm/console/client/GwtTestProcessManagement.java	2009-01-15 11:05:35 UTC (rev 3644)
@@ -28,8 +28,8 @@
 import com.gwtext.client.widgets.ComponentMgr;
 import org.jboss.bpm.console.client.model.ProcessDefinitionRef;
 import org.jboss.bpm.console.client.process.ProcessDefinitionList;
-import org.jboss.bpm.console.client.process.ProcessDefinitionListEditor;
-import org.jboss.bpm.console.client.process.ProcessInstanceListEditor;
+import org.jboss.bpm.console.client.process.ProcessEditor;
+import org.jboss.bpm.console.client.process.ProcessInstanceListView;
 
 import java.util.HashMap;
 import java.util.List;
@@ -44,8 +44,8 @@
    {
       System.out.println("=== testProcessInstanceEditor ===");
 
-      final ProcessDefinitionListEditor editor = (ProcessDefinitionListEditor)
-            ComponentMgr.getComponent(ProcessDefinitionListEditor.ID);
+      final ProcessEditor editor = (ProcessEditor)
+            ComponentMgr.getComponent(ProcessEditor.ID);
       
       Map<String, Object> context = new HashMap<String, Object>();
       context.put("editor", editor);
@@ -126,7 +126,7 @@
 
       public void run()
       {
-         ProcessDefinitionListEditor editor = (ProcessDefinitionListEditor) context.get("editor");
+         ProcessEditor editor = (ProcessEditor) context.get("editor");
          editor.resetEditor();
          ProcessDefinitionList list = editor.getProcessDefinitionList();
          proceedOrFinish();
@@ -148,20 +148,20 @@
 
       public void run()
       {
-         ProcessDefinitionListEditor editor = (ProcessDefinitionListEditor)context.get("editor");
+         ProcessEditor editor = (ProcessEditor)context.get("editor");
          ProcessDefinitionList list = editor.getProcessDefinitionList();
 
          List<ProcessDefinitionRef> processDefinitions = list.getAvailableProcessDefinitions();
          ProcessDefinitionRef testPd = getTestProcessDefinition(processDefinitions);
          assertNotNull("No test definition given: " +processDefinitions, testPd);
 
-         list.launchEditor(testPd);  // will create an instance editor
+         list.launchView(testPd);  // will create an instance editor
 
          // lookup instance editor
-         String editorId = ProcessInstanceListEditor.createWidgetID(testPd);
-         ProcessInstanceListEditor instanceEditor = (ProcessInstanceListEditor)
+         String editorId = ProcessInstanceListView.createWidgetID(testPd);
+         ProcessInstanceListView instanceView = (ProcessInstanceListView)
                ComponentMgr.getComponent(editorId);
-         assertNotNull("Failed to create instance editor for process", instanceEditor);
+         assertNotNull("Failed to create instance editor for process", instanceView);
 
          // todo: start new instance
          System.out.println("FIXME: Implement instance creation test");




More information about the jbpm-commits mailing list