Revision: 7687
Author: gwt.mirror...@gmail.com
Date: Mon Mar  8 13:39:42 2010
Log: Initial code that uses org.json lib on the server side, passes actual request
parameters, plus integration with server side domain objects.

Review at http://gwt-code-reviews.appspot.com/160809

Review by: rj...@google.com
http://code.google.com/p/google-web-toolkit/source/detail?r=7687

Added:
 /trunk/bikeshed/src/com/google/gwt/sample/expenses/shared/MethodName.java
 /trunk/bikeshed/war/WEB-INF/lib/json.jar
Modified:
 /trunk/bikeshed/.classpath
 /trunk/bikeshed/src/com/google/gwt/sample/expenses/client/Expenses.java
 /trunk/bikeshed/src/com/google/gwt/sample/expenses/client/Shell.java
 /trunk/bikeshed/src/com/google/gwt/sample/expenses/client/Shell.ui.xml
 /trunk/bikeshed/src/com/google/gwt/sample/expenses/domain/Storage.java
/trunk/bikeshed/src/com/google/gwt/sample/expenses/server/ExpensesDataServlet.java /trunk/bikeshed/src/com/google/gwt/sample/expenses/shared/EmployeeRequests.java
 /trunk/bikeshed/src/com/google/gwt/valuestore/shared/Path.java
 /trunk/bikeshed/src/com/google/gwt/valuestore/shared/Property.java

=======================================
--- /dev/null
+++ /trunk/bikeshed/src/com/google/gwt/sample/expenses/shared/MethodName.java Mon Mar 8 13:39:42 2010
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.sample.expenses.shared;
+
+/**
+ * Represents the MethodName.
+ */
+public enum MethodName {
+  FIND_ALL_EMPLOYEES,
+  FIND_EMPLOYEE,
+}
=======================================
--- /dev/null   
+++ /trunk/bikeshed/war/WEB-INF/lib/json.jar    Mon Mar  8 13:39:42 2010
Binary file, no diff available.
=======================================
--- /trunk/bikeshed/.classpath  Fri Mar  5 07:05:48 2010
+++ /trunk/bikeshed/.classpath  Mon Mar  8 13:39:42 2010
@@ -7,5 +7,6 @@
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
        <classpathentry kind="lib" path="war/WEB-INF/lib/gwt-servlet.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
+       <classpathentry kind="lib" path="war/WEB-INF/lib/json.jar"/>
        <classpathentry kind="output" path="war/WEB-INF/classes"/>
 </classpath>
=======================================
--- /trunk/bikeshed/src/com/google/gwt/sample/expenses/client/Expenses.java Thu Mar 4 14:11:39 2010 +++ /trunk/bikeshed/src/com/google/gwt/sample/expenses/client/Expenses.java Mon Mar 8 13:39:42 2010
@@ -17,17 +17,10 @@

 import com.google.gwt.core.client.EntryPoint;
 import com.google.gwt.core.client.GWT;
-import com.google.gwt.core.client.JsArray;
 import com.google.gwt.event.dom.client.ChangeEvent;
 import com.google.gwt.event.dom.client.ChangeHandler;
-import com.google.gwt.http.client.Request;
-import com.google.gwt.http.client.RequestBuilder;
-import com.google.gwt.http.client.RequestCallback;
-import com.google.gwt.http.client.RequestException;
-import com.google.gwt.http.client.Response;
 import com.google.gwt.sample.expenses.shared.Employee;
 import com.google.gwt.sample.expenses.shared.ExpenseRequestFactory;
-import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.ui.HasValueList;
 import com.google.gwt.user.client.ui.RootLayoutPanel;
 import com.google.gwt.user.client.ui.TextBox;
@@ -57,37 +50,6 @@

     final Shell shell = new Shell();
     root.add(shell);
-    Command refresh = new Command() {
-      public void execute() {
-        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,
-            "/expenses/data");
-        builder.setCallback(new RequestCallback() {
-
-          public void onError(Request request, Throwable exception) {
-            shell.error.setInnerText(SERVER_ERROR);
-          }
-
- public void onResponseReceived(Request request, Response response) {
-            if (200 == response.getStatusCode()) {
-              String text = response.getText();
- JsArray<ValuesImpl<Employee>> valueArray = ValuesImpl.arrayFromJson(text);
-              shell.setValueList(valueArray);
-            } else {
-              shell.error.setInnerText(SERVER_ERROR + " ("
-                  + response.getStatusText() + ")");
-            }
-          }
-        });
-
-        try {
-          builder.send();
-        } catch (RequestException e) {
- shell.error.setInnerText(SERVER_ERROR + " (" + e.getMessage() + ")");
-        }
-      }
-    };
-    refresh.execute();
-    shell.setRefresh(refresh);

final HasValueList<Values<Employee>> employees = new HasValueList<Values<Employee>>() {

@@ -110,7 +72,7 @@
     };

     requestFactory.employeeRequest().findAllEmployees().forProperty(
- Employee.DISPLAY_NAME).forProperty(Employee.USER_NAME).to(employees).fire(); + Employee.DISPLAY_NAME).forProperty(Employee.USER_NAME).to(shell).fire();

     // TODO(rjrjr) now get details
     final TextBox nameHolder = new TextBox();
=======================================
--- /trunk/bikeshed/src/com/google/gwt/sample/expenses/client/Shell.java Thu Mar 4 14:11:39 2010 +++ /trunk/bikeshed/src/com/google/gwt/sample/expenses/client/Shell.java Mon Mar 8 13:39:42 2010
@@ -16,20 +16,16 @@
 package com.google.gwt.sample.expenses.client;

 import com.google.gwt.core.client.GWT;
-import com.google.gwt.core.client.JsArray;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.NodeList;
 import com.google.gwt.dom.client.TableCellElement;
 import com.google.gwt.dom.client.TableElement;
 import com.google.gwt.dom.client.TableRowElement;
-import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.sample.expenses.shared.Employee;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
-import com.google.gwt.uibinder.client.UiHandler;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.HasValueList;
 import com.google.gwt.user.client.ui.ListBox;
@@ -54,8 +50,6 @@
   @UiField
   TableRowElement header;
   @UiField
-  Button refreshButton;
-  @UiField
   ListBox users;

   private Command refresh;
@@ -69,21 +63,11 @@
     throw new UnsupportedOperationException();
   }

-  /**
-   * @param refresh the refresh to set
-   */
-  public void setRefresh(Command refresh) {
-    this.refresh = refresh;
-  }
-
-  /**
-   * @param valueArray
-   */
-  public void setValueList(JsArray<ValuesImpl<Employee>> newValues) {
+  public void setValueList(List<Values<Employee>> newValues) {
     int r = 1; // skip header
     NodeList<TableRowElement> tableRows = table.getRows();
-    for (int i = 0; i < newValues.length(); i++) {
-      ValuesImpl<Employee> valueRow = newValues.get(i);
+    for (int i = 0; i < newValues.size(); i++) {
+      Values<Employee> valueRow = newValues.get(i);
       if (r < tableRows.getLength()) {
         reuseRow(r, tableRows, valueRow);
       } else {
@@ -105,21 +89,10 @@
       table.removeChild(tableRows.getItem(r));
     }
   }
-
-  public void setValueList(List<Values<Employee>> newValues) {
-    throw new UnsupportedOperationException();
-  }

   public void setValueListSize(int size, boolean exact) {
     throw new UnsupportedOperationException();
   }
-
-  @UiHandler("refreshButton")
-  void onRefreshClick(@SuppressWarnings("unused") ClickEvent event) {
-    if (refresh != null) {
-      refresh.execute();
-    }
-  }

   /**
    * @param r
=======================================
--- /trunk/bikeshed/src/com/google/gwt/sample/expenses/client/Shell.ui.xml Thu Mar 4 12:59:01 2010 +++ /trunk/bikeshed/src/com/google/gwt/sample/expenses/client/Shell.ui.xml Mon Mar 8 13:39:42 2010
@@ -48,7 +48,6 @@
     <g:center>
       <g:HTMLPanel width='100%' height='100%'>
         <h1>Employees</h1>
-        <g:Button ui:field='refreshButton'>Refresh</g:Button>
         <table ui:field='table' class='{style.reports}' width='100%'>
           <col width='0%'></col>
           <col width='100%'></col>
=======================================
--- /trunk/bikeshed/src/com/google/gwt/sample/expenses/domain/Storage.java Thu Mar 4 14:11:39 2010 +++ /trunk/bikeshed/src/com/google/gwt/sample/expenses/domain/Storage.java Mon Mar 8 13:39:42 2010
@@ -25,17 +25,6 @@
  * frameworks do. For goodness sake don't imitate this for production code.
  */
 class Storage {
-
-  static final Storage INSTANCE;
-  static {
-    INSTANCE = new Storage();
-    fill(INSTANCE);
-  }
-
-  public static <E extends Entity> E edit(E v1) {
-    return v1.accept(new CreationVisitor<E>(v1));
-  }
-
   /**
    * @param storage to fill with demo entities
    */
@@ -57,13 +46,38 @@
     e2.setDisplayName("George H. Indigo");
     e2.setSupervisor(e);
     storage.persist(e2);
-  }
+}

   private final Map<Long, Entity> soup = new HashMap<Long, Entity>();
private final Map<String, Long> employeeUserNameIndex = new HashMap<String, Long>();
   private long serial = 0;

-  public synchronized <E extends Entity> E persist(final E delta) {
+  static final Storage INSTANCE;
+  static {
+    INSTANCE = new Storage();
+    fill(INSTANCE);
+  }
+
+  public static <E extends Entity> E edit(E v1) {
+    return v1.accept(new CreationVisitor<E>(v1));
+  }
+
+  @SuppressWarnings("unchecked")
+  // We make runtime checks that return type matches in type
+  synchronized <E extends Entity> E get(final E entity) {
+    Entity previous = soup.get(entity.getId());
+    if (null == previous) {
+      throw new IllegalArgumentException(String.format(
+          "In %s, unknown id %d", entity, entity.getId()));
+    }
+    if (!previous.getClass().equals(entity.getClass())) {
+      throw new IllegalArgumentException(String.format(
+          "Type mismatch, fetched %s for %s", entity, previous));
+    }
+    return (E) previous;
+  }
+
+  synchronized public <E extends Entity> E persist(final E delta) {
     E next = null;
     E previous = null;

@@ -97,7 +111,7 @@
   synchronized List<Employee> findAllEmployees() {
     List<Employee> rtn = new ArrayList<Employee>();
for (Map.Entry<String, Long> entry : employeeUserNameIndex.entrySet()) {
-      rtn.add((Employee) get(entry.getValue()));
+      rtn.add((Employee)get(entry.getValue()));
     }
     return rtn;
   }
@@ -107,22 +121,7 @@
     return (Employee) get(id);
   }

-  @SuppressWarnings("unchecked")
-  // We make runtime checks that return type matches in type
-  synchronized <E extends Entity> E get(final E entity) {
-    Entity previous = soup.get(entity.getId());
-    if (null == previous) {
- throw new IllegalArgumentException(String.format("In %s, unknown id %d",
-          entity, entity.getId()));
-    }
-    if (!previous.getClass().equals(entity.getClass())) {
-      throw new IllegalArgumentException(String.format(
-          "Type mismatch, fetched %s for %s", entity, previous));
-    }
-    return (E) previous;
-  }
-
-  private synchronized Entity get(Long id) {
+  synchronized private Entity get(Long id) {
     return soup.get(id);
   }

@@ -133,8 +132,7 @@
       }

       public Void visit(Employee employee) {
-        if (null == employee.getUserName())
-          return null;
+        if (null == employee.getUserName()) return null;
         if (previous != null) {
           Employee prevEmployee = (Employee) previous;
           if (!prevEmployee.getUserName().equals(next)) {
=======================================
--- /trunk/bikeshed/src/com/google/gwt/sample/expenses/server/ExpensesDataServlet.java Thu Mar 4 12:59:01 2010 +++ /trunk/bikeshed/src/com/google/gwt/sample/expenses/server/ExpensesDataServlet.java Mon Mar 8 13:39:42 2010
@@ -15,6 +15,13 @@
  */
 package com.google.gwt.sample.expenses.server;

+import com.google.gwt.sample.expenses.domain.Employee;
+import com.google.gwt.sample.expenses.shared.MethodName;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
 import java.io.IOException;
 import java.io.PrintWriter;

@@ -33,8 +40,41 @@

     response.setStatus(HttpServletResponse.SC_OK);

+ MethodName methodName = getMethodName(request.getParameter("methodName"));
     PrintWriter writer = response.getWriter();
- writer.print("[ {USER_NAME: 'amitmanjhi', DISPLAY_NAME: 'Amit Manjhi'}, {USER_NAME: 'rjrjr', DISPLAY_NAME: 'Ray Ryan'}, {USER_NAME: 'jgw', DISPLAY_NAME: 'Joel Weber'} ]");
+    switch (methodName) {
+      case FIND_ALL_EMPLOYEES:
+        JSONArray jsonArray = new JSONArray();
+        for (Employee e : Employee.findAllEmployees()) {
+          try {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("USER_NAME", e.getUserName());
+            jsonObject.put("DISPLAY_NAME", e.getDisplayName());
+            jsonArray.put(jsonObject);
+          } catch (JSONException ex) {
+            System.err.println("Unable to create a JSON object " + ex);
+          }
+        }
+        writer.print(jsonArray.toString());
+        break;
+      case FIND_EMPLOYEE:
+        // TODO
+        break;
+    }
     writer.flush();
   }
-}
+
+  /**
+   * @param request
+   * @return
+   */
+  private MethodName getMethodName(String methodString) {
+    for (MethodName method : MethodName.values()) {
+      if (method.name().equals(methodString)) {
+        return method;
+      }
+    }
+ throw new IllegalArgumentException("unknown methodName: " + methodString);
+  }
+
+}
=======================================
--- /trunk/bikeshed/src/com/google/gwt/sample/expenses/shared/EmployeeRequests.java Thu Mar 4 14:11:39 2010 +++ /trunk/bikeshed/src/com/google/gwt/sample/expenses/shared/EmployeeRequests.java Mon Mar 8 13:39:42 2010
@@ -15,25 +15,34 @@
  */
 package com.google.gwt.sample.expenses.shared;

+import com.google.gwt.core.client.JsArray;
+import com.google.gwt.http.client.Request;
+import com.google.gwt.http.client.RequestBuilder;
+import com.google.gwt.http.client.RequestCallback;
+import com.google.gwt.http.client.RequestException;
+import com.google.gwt.http.client.Response;
 import com.google.gwt.requestfactory.shared.Entity;
 import com.google.gwt.requestfactory.shared.EntityListRequest;
+import com.google.gwt.sample.expenses.client.ValuesImpl;
 import com.google.gwt.user.client.ui.HasValueList;
 import com.google.gwt.valuestore.shared.Property;
 import com.google.gwt.valuestore.shared.ValueStore;
 import com.google.gwt.valuestore.shared.Values;

+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;

 /**
- * "Generated" from static methods of {...@link com.google.gwt.sample.expenses.domain.Employee}
+ * "Generated" from static methods of
+ * {...@link com.google.gwt.sample.expenses.domain.Employee}.
  */
 public class EmployeeRequests {

   private final ValueStore values;
-  private int nextFutureId = -1;

private final Map<Object, Entity<?>> futures = new HashMap<Object, Entity<?>>();

@@ -51,9 +60,43 @@
       private HasValueList<Values<Employee>> watcher;

       public void fire() {
-        Employee future = new Employee("" + nextFutureId--, null);
-        futures.put(future.getId(), future);
-        values.subscribe(watcher, future, properties);
+
+ // TODO: need someway to track that this request has been issued so that + // we don't issue another request that arrives while we are waiting for
+        // the response.
+        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,
+ "/expenses/data?methodName=" + MethodName.FIND_ALL_EMPLOYEES.name());
+        builder.setCallback(new RequestCallback() {
+
+          public void onError(Request request, Throwable exception) {
+            // shell.error.setInnerText(SERVER_ERROR);
+          }
+
+ public void onResponseReceived(Request request, Response response) {
+            if (200 == response.getStatusCode()) {
+              String text = response.getText();
+ JsArray<ValuesImpl<Employee>> valueArray = ValuesImpl.arrayFromJson(text); + List<Values<Employee>> valueList = new ArrayList<Values<Employee>>(
+                  valueArray.length());
+              for (int i = 0; i < valueArray.length(); i++) {
+                valueList.add(valueArray.get(i));
+              }
+              watcher.setValueList(valueList);
+            } else {
+              // shell.error.setInnerText(SERVER_ERROR + " ("
+              // + response.getStatusText() + ")");
+            }
+          }
+        });
+
+        try {
+          builder.send();
+        } catch (RequestException e) {
+ // shell.error.setInnerText(SERVER_ERROR + " (" + e.getMessage() +
+          // ")");
+        }
+
+        // values.subscribe(watcher, future, properties);

// TODO(rjrjr) now make the call, and in the callback replace the future
         // with the real id. No no no, no need for the future thing.
=======================================
--- /trunk/bikeshed/src/com/google/gwt/valuestore/shared/Path.java Thu Mar 4 14:11:39 2010 +++ /trunk/bikeshed/src/com/google/gwt/valuestore/shared/Path.java Mon Mar 8 13:39:42 2010
@@ -18,17 +18,17 @@
 import java.util.List;

 /**
- * A path of entity properties.
+ * A path of entity properties.
  *
- * @param <T>
- * @param <V>
+ * @param <T> The type of the property owner at the head of the path.
+ * @param <V> The value type of the last property in the path.
  */
 public class Path<T, V> {
   List<Property<?,?>> getProperties() {
     return null;
   }

-  Property<T,V> getLastProperty() {
+  Property<?,V> getLastProperty() {
     return null;
   }
 }
=======================================
--- /trunk/bikeshed/src/com/google/gwt/valuestore/shared/Property.java Thu Mar 4 14:11:39 2010 +++ /trunk/bikeshed/src/com/google/gwt/valuestore/shared/Property.java Mon Mar 8 13:39:42 2010
@@ -18,14 +18,14 @@
 /**
  * Represents a property of a type managed by {...@link ValueStore}.
  *
- * @param <T>
- * @param <V>
+ * @param <T> type of the property holder
+ * @param <V> type of the property
  */
 public class Property<T, V> {
   private final Class<T> propertyHolderType;
   private final Class<V> valueType;
   private final String name;
-
+
public Property(Class<T> propertyHolderType, Class<V> valueType, String name) {
     this.propertyHolderType = propertyHolderType;
     this.valueType = valueType;
@@ -45,7 +45,7 @@
   public String getName() {
     return name;
   }
-
+
   /**
    * @return the valueClass
    */

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

Reply via email to