Definición de capacidades y el flujo de eventos

En esta sección, se presenta AdvancedExampleServlet2. AdvancedExampleServlet2 es un ejemplo de implementación de fuente de datos que define las capacidades y el flujo de eventos. En esta sección, también se proporcionan instrucciones paso a paso sobre cómo ejecutar y probar AdvancedExampleServlet2.

Nota: Debes completar la sección Cómo comenzar antes de comenzar esta sección.

Presentamos AdvancedExampleServlet2

La clase AdvancedExampleServlet2 se encuentra en el paquete examples. Esta clase proporciona una implementación de ejemplo que define las capacidades y el flujo de eventos.

Las partes más importantes de AdvancedExampleServlet2 se describen en las siguientes secciones:

Cómo definir el flujo de eventos

AdvancedExampleServlet2 define el flujo de eventos anulando el método HttpServlet.doGet() y llamando a varias funciones auxiliares que proporciona DataSourceHelper.

El siguiente fragmento anula doGet(). El parámetro HttpServletRequest encapsula la solicitud que realiza una visualización al servlet. El parámetro HttpServletResponse encapsula la respuesta del servlet a la visualización de consulta. Este fragmento también establece dsRequest como nulo. dsRequest se usa en varios puntos en el resto del código.

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    DataSourceRequest dsRequest = null;

En el siguiente fragmento, se extraen los parámetros de la solicitud de HttpServletRequest para crear el contexto en el que se ejecuta la solicitud.

    try {
      // Extract the request parameters.
      dsRequest = new DataSourceRequest(req);

El siguiente fragmento toma la consulta del objeto dsRequest y la divide en dos consultas separadas. Una consulta se llama consulta de fuente de datos y la otra consulta de finalización. Debido a que la capacidad declarada de la fuente de datos es SELECT, la consulta de la fuente de datos consiste en una operación SELECT si el objeto dsRequest incluye una operación SELECT. La consulta de finalización consta de todas las demás operaciones que requiere la solicitud, que también pueden incluir una operación SELECT. Por ejemplo, si la consulta solicitada es SELECT a ORDER BY b, la consulta de la fuente de datos será SELECT a, b y la consulta de finalización será la misma que la consulta original SELECT a ORDER BY b.

      // Split the query.
      QueryPair query = DataSourceHelper.splitQuery(dsRequest.getQuery(), Capabilities.SELECT);

El siguiente fragmento toma la consulta de la fuente de datos creada por el fragmento anterior y por HttpServletRequest,, y crea una tabla de datos. Para obtener más detalles, consulta la sección Uso de capacidades.

      // Generate the data table.
      DataTable data = generateMyDataTable(query.getDataSourceQuery(), req);

El siguiente código toma la consulta de finalización producida cuando se dividió la consulta, la tabla de datos que produjo el fragmento anterior y la configuración regional del usuario de la visualización de consulta. Luego, el código crea una nueva tabla de datos.

      // Apply the completion query to the data table.
      DataTable newData = DataSourceHelper.applyQuery(query.getCompletionQuery(), data,
          dsRequest.getUserLocale());

El siguiente código toma la tabla de datos que produjo el fragmento anterior y los parámetros de solicitud de HttpServletRequest. Luego, el código configura la respuesta del servlet. El contenedor de servlet muestra esta respuesta a la visualización de consulta.

      DataSourceHelper.setServletResponse(newData, dsRequest, resp);

Manejo de errores

El siguiente fragmento detecta una excepción, obtiene el mensaje adecuado, formatea la respuesta y establece la respuesta del servlet. Si dsRequest es nulo, DataSourceRequest no está disponible, posiblemente debido a una falla del constructor. En este caso, se usa HttpRequest en lugar de DataSourceRequest.

    catch (RuntimeException rte) {
      log.error("A runtime exception has occured", rte);
      ResponseStatus status = new ResponseStatus(StatusType.ERROR, ReasonType.INTERNAL_ERROR,
          rte.getMessage());
      if (dsRequest == null) {
        dsRequest = DataSourceRequest.getDefaultDataSourceRequest(req);
      }
      DataSourceHelper.setServletErrorResponse(status, dsRequest, resp);
    } catch (DataSourceException e) {
      if (dsRequest != null) {
        DataSourceHelper.setServletErrorResponse(e, dsRequest, resp);
      } else {
        DataSourceHelper.setServletErrorResponse(e, req, resp);
      }
    }

Cómo usar parámetros de URL

El siguiente fragmento toma la consulta de la fuente de datos que se creó cuando se dividió la consulta y el HttpServletRequest. De manera opcional, HttpServletRequest puede incluir un parámetro tableId especificado como una URL. Este parámetro tableId determina qué tabla de datos se muestra de la siguiente manera:

  • Si se omite el parámetro tableId, o no es planets, la fuente de datos muestra la tabla de datos de animales.
  • Si el parámetro tableId se especifica como planets, la fuente de datos muestra la tabla de datos de los planetas.

Cuando escribes tu propio código para mostrar una tabla de datos, tú decides qué parámetros tomar.

  private DataTable generateMyDataTable(Query query, HttpServletRequest req)
      throws TypeMismatchException {
    String tableID = req.getParameter("tableId");
    if ((tableID != null) && (tableID.equalsIgnoreCase("planets"))) {
      return generatePlanetsTable(query);
    }
    return generateAnimalsTable(query);
  }

Cómo usar las funciones

En el siguiente fragmento, se toma la consulta y se genera la tabla de datos animals.

private DataTable generateAnimalsTable(Query query) throws TypeMismatchException {
  DataTable data = new DataTable();
  List requiredColumns = getRequiredColumns(query,
      ANIMAL_TABLE_COLUMNS);
  data.addColumns(requiredColumns);

  // Populate the data table
  for (String key : animalLinksByName.keySet()) {
    TableRow row = new TableRow();
    for (ColumnDescription selectionColumn : requiredColumns) {
      String columnName = selectionColumn.getId();
      if (columnName.equals(ANIMAL_COLUMN)) {
        row.addCell(key);
      } else if (columnName.equals(ARTICLE_COLUMN)) {
        row.addCell(animalLinksByName.get(key));
      }
    }
    data.addRow(row);
  }
  return data;
}

En el siguiente fragmento, se toma la consulta y se genera la tabla de datos planets.

private DataTable generatePlanetsTable(Query query) throws TypeMismatchException {
  DataTable data = new DataTable();
  List requiredColumns = getRequiredColumns(
      query, planetTableColumns);
  data.addColumns(requiredColumns);

  // Populate data table
  for (Planet planet : Planet.values()) {
    TableRow row = new TableRow();
    for (ColumnDescription selectionColumn : requiredColumns) {
      String columnName = selectionColumn.getId();
      if (columnName.equals(PLANET_COLUMN)) {
        row.addCell(planet.name());
      } else if (columnName.equals(MASS_COLUMN)) {
        row.addCell(planet.getMass());
      } else if (columnName.equals(GRAVITY_COLUMN)) {
        row.addCell(planet.getSurfaceGravity());
      } else if (columnName.equals(MOONS_COLUMN)) {
        row.addCell(planet.getNumberOfMoons());
      }
    }
    data.addRow(row);
  }
  return data;
}

Ejecución y pruebas de AdvancedExampleServlet2

En esta sección, se proporcionan instrucciones para ejecutar y probar AdvancedExampleServlet2.

Para ejecutar y probar AdvancedExampleServlet2, actualiza tu aplicación web y configura una visualización que consulte la fuente de datos, como se describe en las siguientes secciones:

Cómo actualizar una aplicación web en Apache Tomcat

Sigue o adapta las instrucciones que se indican a continuación para actualizar tu aplicación web en Apache Tomcat. Estas instrucciones son específicas para Apache Tomcat en un sistema Windows:

  1. El archivo web.xml que copiaste antes en el directorio WEB-INF ya contiene la definición y la asignación necesarias para este ejemplo. Las líneas que definen esto son las siguientes:

    <servlet>
      <servlet-name>AdvancedExampleServlet2</servlet-name>
      <description>
      AdvancedExampleServlet2
      </description>
      <servlet-class>AdvancedExampleServlet2</servlet-class>
    </servlet>
      
    <servlet-mapping>
      <servlet-name>AdvancedExampleServlet2</servlet-name>
      <url-pattern>/advanced</url-pattern>
    </servlet-mapping> 
  2. Inicia Tomcat o reinícialo si ya se está ejecutando.
  3. Haz clic en el siguiente vínculo:http://localhost:8080/myWebApp/advanced
    La pantalla muestra entre 6 y 7 líneas de texto, según el ancho de tu pantalla. El texto comienza con google.visualization.Query.setResponse y termina con {v:'http://en.wikipedia.org/wiki/Tiger'}]}]}});.
    Esta es la respuesta que la fuente de datos CSV de ejemplo envía a una visualización.

Uso de una visualización para ver los datos

Se puede usar el archivo all_examples.html en el directorio <data_source_library_install>/examples/src/html para obtener una visualización de los datos.

En el siguiente fragmento de all_examples, se especifica el servlet advanced, la tabla planets, una consulta de selección y una visualización de gráfico de barras.

query = new google.visualization.Query('advanced?tableId=planets&tq=select planet,mass');
...
var chart = new google.visualization.BarChart(document.getElementById('advanced_div'));

Para obtener una explicación de las otras visualizaciones incluidas en all_examples.html, consulta la sección Cómo usar un almacén de datos externo.

Si deseas obtener más información sobre cómo especificar una visualización y usar el lenguaje de consulta, consulta Usa gráficos y la Referencia del lenguaje de consulta.

Sigue o adapta las siguientes instrucciones para ver una visualización de los datos que proporciona la fuente de datos avanzada:

  1. Si aún no lo hiciste, copia el archivo all_examples.html del directorio <data_source_library_install>/examples/src/html
    al directorio <tomcat_home>/webapps/myWebApp/.
     
  2. Haz clic en el vínculo http://localhost:8080/myWebApp/all_examples.html en un navegador. Deberías ver lo siguiente:

Próximos pasos

Para explorar más a fondo los ejemplos proporcionados con la biblioteca, consulta Referencia rápida de ejemplos. Para obtener más información sobre la implementación de una fuente de datos compleja, consulta Sugerencias de implementación.