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