gt:         dataMap = new HashMap();
context: /*
   * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 only, as
   * published by the Free Software Foundation.  Sun designates this
   * particular file as subject to the "Classpath" exception as provided
   * by Sun in the LICENSE file that accompanied this code.
   *
   * This code 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 General Public License
   * version 2 for more details (a copy is included in the LICENSE file that
   * accompanied this code).
   *
   * You should have received a copy of the GNU General Public License version
   * 2 along with this work; if not, write to the Free Software Foundation,
   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   *
   * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
   * CA 95054 USA or visit www.sun.com if you need additional information or
   * have any questions.
   */
  
  package com.sun.rowset.internal;
  
  import java.util.*;
  
  import org.xml.sax.*;
  import org.xml.sax.helpers.*;
  
  import java.sql.*;
  import javax.sql.*;
  
  import javax.sql.rowset.*;
  import com.sun.rowset.*;
  import java.io.IOException;
  import java.text.MessageFormat;
  
  /**
   * The document handler that receives parse events that an XML parser sends while it
   * is parsing an XML document representing a <code>WebRowSet</code> object. The
   * parser sends strings to this <code>XmlReaderContentHandler</code> and then uses
   * these strings as arguments for the <code>XmlReaderContentHandler</code> methods
   * it invokes. The final goal of the SAX parser working with an
   * <code>XmlReaderContentHandler</code> object is to read an XML document that represents
   * a <code>RowSet</code> object.
   * <P>
   * A rowset consists of its properties, metadata, and data values. An XML document
   * representating a rowset includes the values in these three categories along with
   * appropriate XML tags to identify them.  It also includes a top-level XML tag for
   * the rowset and three section tags identifying the three categories of values.
   * <P>
   * The tags in an XML document are hierarchical.
   * This means that the top-level tag, <code>RowSet</code>, is
   * followed by the three sections with appropriate tags, which are in turn each
   * followed by their constituent elements. For example, the <code>properties</code>
   * element will be followed by an element for each of the properties listed in
   * in this <code>XmlReaderContentHandler</code> object's <code>properties</code>
   * field.  The content of the other two fields, <code>colDef</code>, which lists
   * the rowset's metadata elements, and <code>data</code>, which lists the rowset's data
   * elements, are handled similarly .
   * <P>
   * This implementation of <code>XmlReaderContentHandler</code> provides the means for the
   * parser to determine which elements need to have a value set and then to set
   * those values. The methods in this class are all called by the parser; an
   * application programmer never calls them directly.
   *
   */
  
  public class XmlReaderContentHandler extends DefaultHandler {
  
      private HashMap propMap;
      private HashMap colDefMap;
      private HashMap dataMap;
  
      private HashMap typeMap;
  
      private Vector updates;
      private Vector keyCols;
  
      private String columnValue;
      private String propertyValue;
      private String metaDataValue;
  
      private int tag;
      private int state;
  
      private WebRowSetImpl rs;
      private boolean nullVal;
      private boolean emptyStringVal;
      private RowSetMetaData md;
      private int idx;
      private String lastval;
      private String Key_map;
      private String Value_map;
      private String tempStr;
      private String tempUpdate;
      private String tempCommand;
      private Object [] upd;
  
      /**
       * A list of the properties for a rowset. There is a constant defined to
       * correspond to each of these properties so that a <code>HashMap</code>
       * object can be created to map the properties, which are strings, to
       * the constants, which are integers.
       */
      private String [] properties = {"command", "concurrency", "datasource",
                              "escape-processing", "fetch-direction", "fetch-size",
                              "isolation-level", "key-columns", "map",
                              "max-field-size", "max-rows", "query-timeout",
                              "read-only", "rowset-type", "show-deleted",
                              "table-name", "url", "null", "column", "type",
                              "class", "sync-provider", "sync-provider-name",
                               "sync-provider-vendor", "sync-provider-version",
                               "sync-provider-grade","data-source-lock"};
  
      /**
       * A constant representing the tag for the command property.
       */
      private final static int CommandTag = 0;
  
      /**
       * A constant representing the tag for the concurrency property.
       */
      private final static int ConcurrencyTag = 1;
  
      /**
       * A constant representing the tag for the datasource property.
       */
      private final static int DatasourceTag = 2;
  
      /**
       * A constant representing the tag for the escape-processing property.
       */
      private final static int EscapeProcessingTag = 3;
  
      /**
       * A constant representing the tag for the fetch-direction property.
       */
      private final static int FetchDirectionTag = 4;
  
      /**
       * A constant representing the tag for the fetch-size property.
       */
      private final static int FetchSizeTag = 5;
  
      /**
       * A constant representing the tag for the isolation-level property
       */
      private final static int IsolationLevelTag = 6;
  
      /**
       * A constant representing the tag for the key-columns property.
       */
      private final static int KeycolsTag = 7;
  
      /**
       * A constant representing the tag for the map property.
       * This map is the type map that specifies the custom mapping
       * for an SQL user-defined type.
       */
      private final static int MapTag = 8;
  
      /**
       * A constant representing the tag for the max-field-size property.
       */
      private final static int MaxFieldSizeTag = 9;
  
      /**
       * A constant representing the tag for the max-rows property.
       */
      private final static int MaxRowsTag = 10;
  
      /**
       * A constant representing the tag for the query-timeout property.
       */
      private final static int QueryTimeoutTag = 11;
  
      /**
       * A constant representing the tag for the read-only property.
       */
      private final static int ReadOnlyTag = 12;
  
      /**
       * A constant representing the tag for the rowset-type property.
       */
      private final static int RowsetTypeTag = 13;
  
      /**
       * A constant representing the tag for the show-deleted property.
       */
      private final static int ShowDeletedTag = 14;
  
      /**
       * A constant representing the tag for the table-name property.
       */
      private final static int TableNameTag = 15;
  
      /**
       * A constant representing the tag for the URL property.
       */
      private final static int UrlTag = 16;
  
      /**
       * A constant representing the tag for the null property.
       */
      private final static int PropNullTag = 17;
  
      /**
       * A constant representing the tag for the column property.
       */
      private final static int PropColumnTag = 18;
  
      /**
       * A constant representing the tag for the type property.
       */
      private final static int PropTypeTag = 19;
  
      /**
       * A constant representing the tag for the class property.
       */
      private final static int PropClassTag = 20;
  
      /**
       * A constant representing the tag for the sync-provider.
       */
      private final static int SyncProviderTag = 21;
  
      /**
       * A constant representing the tag for the sync-provider
       * name
       */
      private final static int SyncProviderNameTag = 22;
  
      /**
       * A constant representing the tag for the sync-provider
       * vendor tag.
       */
      private final static int SyncProviderVendorTag = 23;
  
      /**
       * A constant representing the tag for the sync-provider
       * version tag.
       */
      private final static int SyncProviderVersionTag = 24;
  
      /**
       * A constant representing the tag for the sync-provider
       * grade tag.
       */
      private final static int SyncProviderGradeTag = 25;
  
      /**
       * A constant representing the tag for the data source lock.
       */
      private final static int DataSourceLock = 26;
  
      /**
       * A listing of the kinds of metadata information available about
       * the columns in a <code>WebRowSet</code> object.
       */
      private String [] colDef = {"column-count", "column-definition", "column-index",
                          "auto-increment", "case-sensitive", "currency",
                          "nullable", "signed", "searchable",
                          "column-display-size", "column-label", "column-name",
                          "schema-name", "column-precision", "column-scale",
                          "table-name", "catalog-name", "column-type",
                          "column-type-name", "null"};
  
  
      /**
       * A constant representing the tag for column-count.
       */
      private final static int ColumnCountTag = 0;
  
      /**
       * A constant representing the tag for column-definition.
       */
      private final static int ColumnDefinitionTag = 1;
  
      /**
       * A constant representing the tag for column-index.
       */
      private final static int ColumnIndexTag = 2;
  
      /**
       * A constant representing the tag for auto-increment.
       */
      private final static int AutoIncrementTag = 3;
  
      /**
       * A constant representing the tag for case-sensitive.
       */
      private final static int CaseSensitiveTag = 4;
  
      /**
       * A constant representing the tag for currency.
       */
      private final static int CurrencyTag = 5;
  
      /**
       * A constant representing the tag for nullable.
       */
      private final static int NullableTag = 6;
  
      /**
       * A constant representing the tag for signed.
       */
      private final static int SignedTag = 7;
  
      /**
       * A constant representing the tag for searchable.
       */
      private final static int SearchableTag = 8;
  
      /**
       * A constant representing the tag for column-display-size.
       */
      private final static int ColumnDisplaySizeTag = 9;
  
      /**
       * A constant representing the tag for column-label.
       */
      private final static int ColumnLabelTag = 10;
  
      /**
       * A constant representing the tag for column-name.
       */
      private final static int ColumnNameTag = 11;
  
      /**
       * A constant representing the tag for schema-name.
       */
      private final static int SchemaNameTag = 12;
  
      /**
       * A constant representing the tag for column-precision.
       */
      private final static int ColumnPrecisionTag = 13;
  
      /**
       * A constant representing the tag for column-scale.
       */
      private final static int ColumnScaleTag = 14;
  
      /**
       * A constant representing the tag for table-name.
       */
      private final static int MetaTableNameTag = 15;
  
      /**
       * A constant representing the tag for catalog-name.
       */
      private final static int CatalogNameTag = 16;
  
      /**
       * A constant representing the tag for column-type.
       */
      private final static int ColumnTypeTag = 17;
  
      /**
       * A constant representing the tag for column-type-name.
       */
      private final static int ColumnTypeNameTag = 18;
  
      /**
       * A constant representing the tag for null.
       */
      private final static int MetaNullTag = 19;
  
      private String [] data = {"currentRow", "columnValue", "insertRow", "deleteRow", "insdel", "updateRow", "null" , "emptyString"};
  
      private final static int RowTag = 0;
      private final static int ColTag = 1;
      private final static int InsTag = 2;
      private final static int DelTag = 3;
      private final static int InsDelTag = 4;
      private final static int UpdTag = 5;
      private final static int NullTag = 6;
      private final static int EmptyStringTag = 7;
  
      /**
       * A constant indicating the state of this <code>XmlReaderContentHandler</code>
       * object in which it has not yet been called by the SAX parser and therefore
       * has no indication of what type of input to expect from the parser next.
       * <P>
       * The state is set to <code>INITIAL</code> at the end of each
       * section, which allows the sections to appear in any order and
       * still be parsed correctly (except that metadata must be
       * set before data values can be set).
       */
      private final static int INITIAL = 0;
  
      /**
       * A constant indicating the state in which this <code>XmlReaderContentHandler</code>
       * object expects the next input received from the
       * SAX parser to be a string corresponding to one of the elements in
       * <code>properties</code>.
       */
      private final static int PROPERTIES = 1;
  
      /**
       * A constant indicating the state in which this <code>XmlReaderContentHandler</code>
       * object expects the next input received from the
       * SAX parser to be a string corresponding to one of the elements in
       * <code>colDef</code>.
       */
      private final static int METADATA = 2;
  
      /**
       * A constant indicating the state in which this <code>XmlReaderContentHandler</code>
       * object expects the next input received from the
       * SAX parser to be a string corresponding to one of the elements in
       * <code>data</code>.
       */
      private final static int DATA = 3;
  
      private  JdbcRowSetResourceBundle resBundle;
  
      /**
       * Constructs a new <code>XmlReaderContentHandler</code> object that will
       * assist the SAX parser in reading a <code>WebRowSet</code> object in the
       * format of an XML document. In addition to setting some default values,
       * this constructor creates three <code>HashMap</code> objects, one for
       * properties, one for metadata, and one for data.  These hash maps map the
       * strings sent by the SAX parser to integer constants so that they can be
       * compared more efficiently in <code>switch</code> statements.
       *
       * @param r the <code>RowSet</code> object in XML format that will be read
       */
      public XmlReaderContentHandler(RowSet r) {
          // keep the rowset we've been given
          rs = (WebRowSetImpl)r;
  
          // set-up the token maps
          initMaps();
  
          // allocate the collection for the updates
          updates = new Vector();
  
          // start out with the empty string
          columnValue = new String("");
          propertyValue = new String("");
          metaDataValue = new String("");
  
          nullVal = false;
          idx = 0;
          tempStr = "";
          tempUpdate = "";
          tempCommand = "";
  
          try {
             resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle();
          } catch(IOException ioe) {
              throw new RuntimeException(ioe);
          }
      }
  
      /**
       * Creates and initializes three new <code>HashMap</code> objects that map
       * the strings returned by the SAX parser to <code>Integer</code>
       * objects.  The strings returned by the parser will match the strings that
       * are array elements in this <code>XmlReaderContentHandler</code> object's
       * <code>properties</code>, <code>colDef</code>, or <code>data</code>
       * fields. For each array element in these fields, there is a corresponding
       * constant defined. It is to these constants that the strings are mapped.
       * In the <code>HashMap</code> objects, the string is the key, and the
       * integer is the value.
       * <P>
       * The purpose of the mapping is to make comparisons faster.  Because comparing
       * numbers is more efficient than comparing strings, the strings returned
       * by the parser are mapped to integers, which can then be used in a
       * <code>switch</code> statement.
       */
      private void initMaps() {
          int items, i;
  
          propMap = new HashMap();
          items = properties.length;
  
          for (i=0;i<items;i++) {
              propMap.put(properties[i], new Integer(i));
          }
  
          colDefMap = new HashMap();
          items = colDef.length;
  
          for (i=0;i<items;i++) {
              colDefMap.put(colDef[i], new Integer(i));
          }
  
  