Fix various error reporting issues:
  Strict root element requirements
  CellPanelParser NPE on bad child

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@6547 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/uibinder/parsers/CellPanelParser.java b/user/src/com/google/gwt/uibinder/parsers/CellPanelParser.java
index 665ead2..4bdede2 100644
--- a/user/src/com/google/gwt/uibinder/parsers/CellPanelParser.java
+++ b/user/src/com/google/gwt/uibinder/parsers/CellPanelParser.java
@@ -84,7 +84,8 @@
       String ns = child.getNamespaceUri();
       String tagName = child.getLocalName();
 
-      if (ns.equals(elem.getNamespaceUri()) && localTagNameIsCell(tagName)) {
+      if (ns != null && ns.equals(elem.getNamespaceUri())
+          && localTagNameIsCell(tagName)) {
         // It's a cell element, so parse its single child as a widget.
         XMLElement widget = child.consumeSingleChildElement();
         String childFieldName = writer.parseElementToField(widget);
@@ -93,6 +94,10 @@
         // Parse the cell tag's alignment & size attributes.
         parseCellAttributes(child, fieldName, childFieldName, writer);
       } else {
+        if (!writer.isWidgetElement(child)) {
+          writer.die("In %s, expected a widget or <%s:%s>, found %s", elem,
+              elem.getPrefix(), CELL_TAG.toLowerCase(), child);
+        }
         // It's just a normal child, so parse it as a widget.
         String childFieldName = writer.parseElementToField(child);
         writer.addStatement("%1$s.add(%2$s);", fieldName, childFieldName);
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
index 26579e3..e746a44 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
@@ -77,6 +77,7 @@
   // guice!!!
 
   private static final String IMPORT_ATTRIBUTE = "import";
+  private static final String TAG = "UiBinder";
   private final UiBinderWriter writer;
   private final TypeOracle oracle;
   private final MessagesWriter messagesWriter;
@@ -105,6 +106,18 @@
    * the document.
    */
   public String parse(XMLElement elem) throws UnableToCompleteException {
+    if (!writer.isBinderElement(elem)) {
+      writer.die("Bad prefix on <%s:%s>? The root element must be in "
+          + "xml namespace \"%s\" (usually with prefix \"ui:\"), "
+          + "but this has prefix \"%s\"", elem.getPrefix(),
+          elem.getLocalName(), UiBinderWriter.BINDER_URI, elem.getPrefix());
+    }
+
+    if (!TAG.equals(elem.getLocalName())) {
+      writer.die("Root element must be %s:%s, but found %s", elem.getPrefix(),
+          TAG, elem);
+    }
+
     findResources(elem);
     messagesWriter.findMessagesConfig(elem);
     XMLElement uiRoot = elem.consumeSingleChildElement();
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
index 144c44e..7f0a9e5 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
@@ -69,7 +69,7 @@
  */
 @SuppressWarnings("deprecation")
 public class UiBinderWriter {
-  private static final String BINDER_URI = "urn:ui:com.google.gwt.uibinder";
+  static final String BINDER_URI = "urn:ui:com.google.gwt.uibinder";
   private static final String BUNDLE_URI_SCHEME = "urn:with:";
   private static final String PACKAGE_URI_SCHEME = "urn:import:";
 
@@ -644,7 +644,7 @@
   public String getUiFieldAttributeName() {
     return gwtPrefix + ":field";
   }
-
+  
   public boolean isBinderElement(XMLElement elem) {
     String uri = elem.getNamespaceUri();
     return uri != null && BINDER_URI.equals(uri);
diff --git a/user/src/com/google/gwt/uibinder/rebind/XMLElement.java b/user/src/com/google/gwt/uibinder/rebind/XMLElement.java
index 6d59267..9ef7461 100644
--- a/user/src/com/google/gwt/uibinder/rebind/XMLElement.java
+++ b/user/src/com/google/gwt/uibinder/rebind/XMLElement.java
@@ -391,8 +391,8 @@
     XMLElement ret = null;
     for (XMLElement child : consumeChildElements()) {
       if (ret != null) {
-        writer.die("%s may only contain a single child element, but found"
-            + "%s and %s.", getLocalName(), ret, child);
+        writer.die("%s may only contain a single child element, but found "
+            + "%s and %s.", this, ret, child);
       }
 
       ret = child;
diff --git a/user/src/com/google/gwt/uibinder/sample/client/HandlerDemo.ui.xml b/user/src/com/google/gwt/uibinder/sample/client/HandlerDemo.ui.xml
index 6e9f727..6640802 100644
--- a/user/src/com/google/gwt/uibinder/sample/client/HandlerDemo.ui.xml
+++ b/user/src/com/google/gwt/uibinder/sample/client/HandlerDemo.ui.xml
@@ -1,4 +1,4 @@
-<gwt:UiBinder
+<ui:UiBinder
   xmlns:ui='urn:ui:com.google.gwt.uibinder'
   xmlns:gwt='urn:import:com.google.gwt.user.client.ui'>
 
@@ -16,4 +16,4 @@
     <gwt:TextBox ui:field="textBoxValueChange"/>
   </gwt:FlowPanel>
 
-</gwt:UiBinder>
+</ui:UiBinder>