Définir les capacités et le flux d'événements

Cette section présente AdvancedExampleServlet2. AdvancedExampleServlet2 est un exemple d'implémentation de source de données qui définit les capacités et le flux d'événements. Cette section fournit également des instructions détaillées sur l'exécution et le test de AdvancedExampleServlet2.

Remarque: Vous devez remplir la section Premiers pas avant de commencer.

Découvrez AdvancedExampleServlet2

La classe AdvancedExampleServlet2 se trouve dans le package examples. Cette classe fournit un exemple d'implémentation qui définit les capacités et le flux d'événements.

Les parties les plus importantes de AdvancedExampleServlet2 sont décrites dans les sections suivantes:

Définir le flux d'événements

AdvancedExampleServlet2 définit le flux d'événements en remplaçant la méthode HttpServlet.doGet() et en appelant différentes fonctions d'assistance fournies par DataSourceHelper.

L'extrait de code suivant remplace doGet(). Le paramètre HttpServletRequest encapsule la requête envoyée par une visualisation au webhook. Le paramètre HttpServletResponse encapsule la réponse du webhook à la visualisation de requête. Cet extrait définit également dsRequest sur "null". dsRequest est utilisé à différents stades du reste du code.

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

L'extrait de code suivant extrait les paramètres de la requête de HttpServletRequest pour créer le contexte dans lequel la requête s'exécute.

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

L'extrait de code suivant extrait la requête de l'objet dsRequest et la divise en deux requêtes distinctes. L'une est la requête de source de données, l'autre la requête de saisie semi-automatique. Comme la capacité déclarée de la source de données est SELECT, la requête sur la source de données consiste en une opération SELECT si l'objet dsRequest inclut une opération SELECT. La requête de saisie semi-automatique est constituée de toutes les autres opérations requises par la requête, qui peut également inclure une opération SELECT. Par exemple, si la requête demandée est SELECT a ORDER BY b, la requête de source de données sera SELECT a, b et la requête de fin sera identique à la requête d'origine SELECT a ORDER BY b.

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

L'extrait de code suivant accepte la requête de source de données créée par l'extrait précédent et l'élément HttpServletRequest,, puis crée une table de données. Pour en savoir plus, consultez la section Utiliser les fonctionnalités.

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

Le code suivant utilise la requête de fin produite lorsque la requête a été divisée, la table de données produite par l'extrait précédent et les paramètres régionaux de l'utilisateur issus de la visualisation de requête. Le code crée ensuite une table de données.

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

Le code suivant utilise la table de données produite par l'extrait précédent et les paramètres de requête de HttpServletRequest. Le code définit ensuite la réponse du webhook. Le conteneur de webhook renvoie cette réponse à la visualisation de la requête.

      DataSourceHelper.setServletResponse(newData, dsRequest, resp);

Traitement des erreurs

L'extrait de code suivant identifie une exception, obtient le message approprié, met en forme la réponse et définit la réponse du jeton. Si dsRequest est nul, DataSourceRequest n'est pas disponible, peut-être en raison de l'échec du constructeur. Dans ce cas, HttpRequest est utilisé à la place 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);
      }
    }

Utiliser des paramètres d'URL

L'extrait de code suivant accepte la requête de source de données créée lors de la division de la requête et la valeur HttpServletRequest. HttpServletRequest peut éventuellement inclure un paramètre tableId spécifié en tant qu'URL. Ce paramètre tableId détermine quelle table de données est renvoyée comme suit:

  • Si le paramètre tableId est omis ou contient une valeur autre que planets, la source de données renvoie la table des données sur les animaux.
  • Si le paramètre tableId est spécifié en tant que planets, la source de données renvoie la table de données des planètes.

Lorsque vous écrivez votre propre code pour renvoyer une table de données, vous décidez quels paramètres prendre.

  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);
  }

Utiliser des fonctionnalités

L'extrait de code suivant prend la requête et génère la table de données 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;
}

L'extrait de code suivant prend la requête et génère la table de données 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;
}

Exécuter et tester AdvancedExampleServlet2

Cette section explique comment exécuter et tester AdvancedExampleServlet2.

Pour exécuter et tester AdvancedExampleServlet2, mettez à jour votre application Web et configurez une visualisation qui interroge la source de données, comme décrit dans les sections suivantes:

Mettre à jour une application Web sur Apache Tomcat

Suivez ou adaptez les instructions ci-dessous pour mettre à jour votre application Web sur Apache Tomcat. Ces instructions sont spécifiques à Apache Tomcat sur un système Windows:

  1. Le fichier web.xml que vous avez précédemment copié dans le répertoire WEB-INF contient déjà la définition et le mappage requis pour cet exemple. Les lignes suivantes définissent ce paramètre :

    <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. Lancez Tomcat, ou redémarrez-le s'il est déjà en cours d'exécution.
  3. Cliquez sur le lien suivant : http://localhost:8080/myWebApp/advanced.
    L'écran affiche entre 6 et 7 lignes de texte, en fonction de la largeur de votre écran. Le texte commence par google.visualization.Query.setResponse et se termine par {v:'http://en.wikipedia.org/wiki/Tiger'}]}]}});
    C'est la réponse que l'exemple de source de données CSV envoie à une visualisation.

Utiliser une visualisation pour consulter les données

Le fichier all_examples.html du répertoire <data_source_library_install>/examples/src/html permet d'afficher une visualisation des données.

L'extrait de code all_examples suivant spécifie le webhook advanced, la table planets, une requête SELECT et une visualisation sous forme de graphique à barres.

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

Pour en savoir plus sur les autres visualisations incluses dans all_examples.html, consultez la section Utiliser un datastore externe.

Pour savoir comment spécifier une visualisation et utiliser le langage de requête, consultez les pages Utiliser des graphiques et Documentation de référence sur le langage de requête.

Suivez ou suivez les instructions ci-dessous pour visualiser les données fournies par la source de données avancée:

  1. Si vous ne l'avez pas déjà fait, copiez le fichier all_examples.html du répertoire <data_source_library_install>/examples/src/html
    dans le répertoire <tomcat_home>/webapps/myWebApp/.
     
  2. Cliquez sur le lien suivant: http://localhost:8080/myWebApp/all_examples.html dans un navigateur. Vous devriez obtenir le résultat suivant:

Next Steps

Pour examiner plus en détail les exemples fournis avec la bibliothèque, consultez la documentation de référence sur les exemples. Pour en savoir plus sur l'implémentation d'une source de données complexe, consultez les conseils d'implémentation.