/**
   * Adds a catalog and its children to the cache. Do not use directly. This must be called with a
   * write lock on the cache.
   *
   * @param catalogName The name of the catalog to load in cache.
   */
  private void addCatalogToCache(IPentahoSession session, String catalogName) {

    final IOlapService.Catalog catalog =
        new Catalog(catalogName, new ArrayList<IOlapService.Schema>());

    OlapConnection connection = null;

    try {

      connection = getConnection(catalogName, session);

      for (org.olap4j.metadata.Schema schema4j : connection.getOlapSchemas()) {

        connection.setSchema(schema4j.getName());

        final IOlapService.Schema schema =
            new Schema(
                schema4j.getName(),
                catalog,
                new ArrayList<IOlapService.Cube>(),
                new ArrayList<String>(connection.getAvailableRoleNames()));

        for (org.olap4j.metadata.Cube cube4j : schema4j.getCubes()) {
          schema.cubes.add(new IOlapService.Cube(cube4j.getName(), cube4j.getCaption(), schema));
        }

        catalog.schemas.add(schema);
      }

      // We're done.
      getCache(session).add(catalog);

    } catch (OlapException e) {

      LOG.warn("Failed to initialize the olap connection cache for catalog " + catalogName, e);

    } finally {
      try {
        if (connection != null) {
          connection.close();
        }
      } catch (SQLException e) {
        LOG.warn("Failed to gracefully close an olap connection to catalog " + catalogName, e);
      }
    }
  }
  /** @see org.pivot4j.analytics.datasource.DataSourceManager#getCubes(java.lang.String) */
  @Override
  public List<CubeInfo> getCubes(String catalogName) {
    if (catalogName == null) {
      throw new NullArgumentException("catalogName");
    }

    SimpleDataSourceInfo definition = getDefinition(catalogName);

    if (definition == null) {
      throw new IllegalArgumentException(
          "Data source with the given name does not exist : " + catalogName);
    }

    OlapDataSource dataSource = createDataSource(definition);

    List<CubeInfo> cubes = new LinkedList<CubeInfo>();

    OlapConnection connection = null;

    try {
      connection = dataSource.getConnection();

      for (Cube cube : connection.getOlapSchema().getCubes()) {
        if (cube.isVisible()) {
          cubes.add(new CubeInfo(cube.getName(), cube.getCaption(), cube.getDescription()));
        }
      }
    } catch (SQLException e) {
      throw new PivotException(e);
    } finally {
      if (connection != null) {
        try {
          connection.close();
        } catch (SQLException e) {
          throw new PivotException(e);
        }
      }
    }

    return cubes;
  }
 /**
  * Flushes all catalogs in the catalogNames collection. If hosted=true the method breaks after the
  * first successful schemaCacheFlush, since we know that all schemas will be flushed by the
  * operation. For remote we assume that each needs to be flushed separately, since there are
  * possibly multiple servers.
  */
 private void flushCatalogs(Collection<String> catalogNames, IPentahoSession session)
     throws SQLException {
   for (String name : catalogNames) {
     OlapConnection connection = null;
     try {
       connection = getConnection(name, session);
       XmlaHandler.XmlaExtra xmlaExtra = getXmlaExtra(connection);
       if (xmlaExtra != null) {
         xmlaExtra.flushSchemaCache(connection);
       }
     } catch (Exception e) {
       LOG.warn(
           Messages.getInstance()
               .getErrorString("MondrianCatalogHelper.ERROR_0019_FAILED_TO_FLUSH", name),
           e);
     } finally {
       if (connection != null) {
         connection.close();
       }
     }
   }
 }