Revision: 8482
Author: [email protected]
Date: Wed Aug  4 16:16:12 2010
Log: Add logging to scaffold and expenses apps

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

Review by: [email protected]
http://code.google.com/p/google-web-toolkit/source/detail?r=8482

Modified:
/trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/ExpensesCommon.gwt.xml
 /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/Scaffold.gwt.xml
/trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/ScaffoldCommon.gwt.xml /trunk/user/src/com/google/gwt/requestfactory/client/RequestFactoryLogHandler.java /trunk/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java

=======================================
--- /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/ExpensesCommon.gwt.xml Wed Jun 9 09:35:40 2010 +++ /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/ExpensesCommon.gwt.xml Wed Aug 4 16:16:12 2010
@@ -6,6 +6,7 @@
   <inherits name='com.google.gwt.sample.bikeshed.style.Style'/>
   <inherits name='com.google.gwt.mobile.Mobile'/>
   <inherits name='com.google.gwt.user.cellview.CellView'/>
+  <inherits name='com.google.gwt.logging.Logging'/>

   <source path='client'/>
   <source path='request'/>
@@ -15,4 +16,16 @@
   <!-- Default Locale. -->
   <extend-property name="locale" values="en"/>
   <set-property-fallback name="locale" value="en"/>
+
+  <!-- Logging Configuration -->
+  <set-property name="gwt.logging.enabled" value="TRUE"/>
+  <set-property name="gwt.logging.logLevel" value="INFO"/>
+  <set-property name="gwt.logging.consoleHandler" value="ENABLED" />
+ <set-property name="gwt.logging.developmentModeHandler" value="ENABLED" />
+  <set-property name="gwt.logging.firebugHandler" value="ENABLED" />
+  <set-property name="gwt.logging.hasWidgetsHandler" value="DISABLED" />
+  <set-property name="gwt.logging.popupHandler" value="DISABLED" />
+  <set-property name="gwt.logging.systemHandler" value="ENABLED" />
+  <set-property name="gwt.logging.simpleRemoteHandler" value="DISABLED" />
+
 </module>
=======================================
--- /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/Scaffold.gwt.xml Wed Jul 28 16:39:40 2010 +++ /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/Scaffold.gwt.xml Wed Aug 4 16:16:12 2010
@@ -22,17 +22,4 @@
   <inherits name="com.google.gwt.sample.expenses.gwt.ExpensesCommon" />
<entry-point class="com.google.gwt.sample.expenses.gwt.client.Scaffold" />

-  <!-- Logging Configuration -->
- <!-- Right now, App Engine Dev Mode logging is borken for everything other
-       than the system handler, so only that one is enabled for now
-  <set-property name="gwt.logging.enabled" value="TRUE"/>
-  <set-property name="gwt.logging.logLevel" value="INFO"/>
-  <set-property name="gwt.logging.consoleHandler" value="DISABLED" />
- <set-property name="gwt.logging.developmentModeHandler" value="DISABLED" />
-  <set-property name="gwt.logging.firebugHandler" value="DISABLED" />
-  <set-property name="gwt.logging.hasWidgetsHandler" value="DISABLED" />
-  <set-property name="gwt.logging.popupHandler" value="DISABLED" />
-  <set-property name="gwt.logging.systemHandler" value="ENABLED" />
-  <set-property name="gwt.logging.simpleRemoteHandler" value="DISABLED" />
--->
 </module>
=======================================
--- /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/ScaffoldCommon.gwt.xml Mon Jun 7 12:20:31 2010 +++ /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/ScaffoldCommon.gwt.xml Wed Aug 4 16:16:12 2010
@@ -6,9 +6,22 @@
   <inherits name='com.google.gwt.sample.bikeshed.style.Style'/>
   <inherits name='com.google.gwt.mobile.Mobile'/>
   <inherits name='com.google.gwt.user.cellview.CellView'/>
-
+  <inherits name='com.google.gwt.logging.Logging'/>
+
   <source path='client'/>
   <source path='request'/>
   <source path='place'/>
   <source path='ui'/>
+
+  <!-- Logging Configuration -->
+  <set-property name="gwt.logging.enabled" value="TRUE"/>
+  <set-property name="gwt.logging.logLevel" value="INFO"/>
+  <set-property name="gwt.logging.consoleHandler" value="ENABLED" />
+ <set-property name="gwt.logging.developmentModeHandler" value="ENABLED" />
+  <set-property name="gwt.logging.firebugHandler" value="ENABLED" />
+  <set-property name="gwt.logging.hasWidgetsHandler" value="DISABLED" />
+  <set-property name="gwt.logging.popupHandler" value="DISABLED" />
+  <set-property name="gwt.logging.systemHandler" value="ENABLED" />
+  <set-property name="gwt.logging.simpleRemoteHandler" value="DISABLED" />
+
 </module>
=======================================
--- /trunk/user/src/com/google/gwt/requestfactory/client/RequestFactoryLogHandler.java Fri Jul 30 07:51:15 2010 +++ /trunk/user/src/com/google/gwt/requestfactory/client/RequestFactoryLogHandler.java Wed Aug 4 16:16:12 2010
@@ -20,8 +20,6 @@
 import com.google.gwt.requestfactory.shared.RequestFactory;
 import com.google.gwt.valuestore.shared.SyncResult;

-import java.util.ArrayList;
-import java.util.List;
 import java.util.Set;
 import java.util.logging.Handler;
 import java.util.logging.Level;
@@ -46,59 +44,51 @@
     Logger.getLogger(RequestFactoryLogHandler.class.getName());

   private boolean closed;
-  private List<LogRecord> records;
   private RequestFactory requestFactory;
-
-  public RequestFactoryLogHandler(RequestFactory requestFactory) {
-    this(requestFactory, Level.INFO);
-  }
+  private String ignoredLoggerSubstring;

   /**
    * Since records from this handler go accross the wire, it should only be
* used for important messages, and it's Level will often be higher than the
-   * Level being used app-wide.
- * Do not set the level of this handler below FINER messages, since it logs
-   * messages at that level to acknowledge success/failure, and would cause
-   * an infinite loop.
+ * Level being used app-wide. This handler also takes a string which it will + * use to exclude the messages from some loggers. This usually includes the
+   * name of the logger(s) which will be used to log acknowledgements of
+ * activity going accross the wire. If we did not exclude these loggers, an
+   * infinite loop would occur.
    */
- public RequestFactoryLogHandler(RequestFactory requestFactory, Level level) { + public RequestFactoryLogHandler(RequestFactory requestFactory, Level level,
+      String ignoredLoggerSubstring) {
     this.requestFactory = requestFactory;
+    this.ignoredLoggerSubstring = ignoredLoggerSubstring;
     closed = false;
-    records = new ArrayList<LogRecord>();
     setLevel(level);
   }

   @Override
   public void close() {
-    flush();
     closed = true;
   }

   @Override
   public void flush() {
-    if (!closed) {
-      // We go ahead and just send a request for every message. The request
-      // factory will take care of the batching for us. Once we can send
- // something more complex than Strings to the logMessage function, then
-      // we can do batching here.
-      for (LogRecord record : records) {
-        Receiver<Long> loggingReceiver = new LoggingReceiver();
-        requestFactory.loggingRequest().logMessage(
-            record.getLevel().toString(),
-            record.getLoggerName(),
-            record.getMessage()).fire(loggingReceiver);
-      }
-    }
+    // Do nothing
   }

   @Override
   public void publish(LogRecord record) {
-    if (!closed && isLoggable(record)) {
-      records.add(record);
- // For now, just flush every time since a new request is sent for every
-      // record anyway.
-      flush();
-    }
+    if (closed || !isLoggable(record)) {
+      return;
+    }
+
+    if (record.getLoggerName().contains(ignoredLoggerSubstring)) {
+      return;
+    }
+
+    Receiver<Long> loggingReceiver = new LoggingReceiver();
+    requestFactory.loggingRequest().logMessage(
+        record.getLevel().toString(),
+        record.getLoggerName(),
+        record.getMessage()).fire(loggingReceiver);
   }

 }
=======================================
--- /trunk/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java Wed Aug 4 14:25:37 2010 +++ /trunk/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java Wed Aug 4 16:16:12 2010
@@ -22,6 +22,7 @@
 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.client.RequestFactoryLogHandler;
 import com.google.gwt.requestfactory.shared.RequestEvent;
 import com.google.gwt.requestfactory.shared.RequestFactory;
 import com.google.gwt.requestfactory.shared.RequestObject;
@@ -66,7 +67,14 @@
     }
   }

- private static Logger logger = Logger.getLogger(RequestFactory.class.getName());
+  private static Logger logger =
+    Logger.getLogger(RequestFactory.class.getName());
+
+  // A separate logger for wire activity, which does not get logged by the
+  // remote log handler, so we avoid infinite loops. All log messages that
+ // could happen every time a request is made from the server should be logged
+  // to this logger.
+ private static Logger wireLogger = Logger.getLogger("WireActivityLogger");

   private static String SERVER_ERROR = "Server Error";

@@ -107,16 +115,22 @@

       public void onError(Request request, Throwable exception) {
         postRequestEvent(State.RECEIVED, null);
-        logger.log(Level.SEVERE, SERVER_ERROR, exception);
+        wireLogger.log(Level.SEVERE, SERVER_ERROR, exception);
       }

       public void onResponseReceived(Request request, Response response) {
-        logger.finest("Response received");
+        wireLogger.finest("Response received");
         if (200 == response.getStatusCode()) {
           String text = response.getText();
           requestObject.handleResponseText(text);
-        } else {
- logger.severe(SERVER_ERROR + " (" + response.getStatusText() + ")");
+        } else if (response.SC_UNAUTHORIZED == response.getStatusCode()) {
+          wireLogger.finest("Need to log in");
+        } else if (response.getStatusCode() > 0) {
+ // During the redirection for logging in, we get a response with no
+          // status code, but it's not an error, so we only log errors with
+          // bad status codes here.
+          wireLogger.severe(SERVER_ERROR + " " + response.getStatusCode() +
+              " " + response.getText());
         }
         postRequestEvent(State.RECEIVED, response);
       }
@@ -124,11 +138,11 @@
     });

     try {
-      logger.finest("Sending fire request");
+      wireLogger.finest("Sending fire request");
       builder.send();
       postRequestEvent(State.SENT, null);
     } catch (RequestException e) {
- logger.log(Level.SEVERE, SERVER_ERROR + " (" + e.getMessage() + ")", e); + wireLogger.log(Level.SEVERE, SERVER_ERROR + " (" + e.getMessage() + ")", e);
     }
   }

@@ -142,16 +156,9 @@
   protected void init(HandlerManager handlerManager, RecordToTypeMap map) {
     this.valueStore = new ValueStoreJsonImpl(handlerManager, map);
     this.handlerManager = handlerManager;
- // This Handler should really get added to the Root Logger here, but until - // App Engine Dev Mode logging is fixed, we can't use client side handlers - // on the Root Logger. Instead, just add it to our own logger as a proof of - // concept, and then log a Severe message to it to prove that it's working - // All the "finest" messages that this class normally logs are not logged
-    // to this handler since it would cause an infinite loop.
- // TODO(unnurg): Once this is all set up, ensure that the severe messages
-    // in this class do not cause infinite loops during legitimate errors.
-    // logger.addHandler(new RequestFactoryLogHandler(this));
-    logger.severe("Successful initialization!");
+    Logger.getLogger("").addHandler(new RequestFactoryLogHandler(
+        this, Level.WARNING, wireLogger.getName()));
+    logger.fine("Successfully initialized RequestFactory");
   }

   private void postRequestEvent(State received, Response response) {

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

Reply via email to