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