DATASOURCE_NAME,
null,
null,
new Properties() );
} catch ( Exception e ) {
throw new IOlapServiceException( e );
}
}
// Check Access
if ( !hasAccess( catalogName, EnumSet.of( RepositoryFilePermission.READ ), session ) ) {
LOG.debug( "user does not have access; throwing exception" ); //$NON-NLS-1$
throw new IOlapServiceException(
Messages.getInstance().getErrorString(
"OlapServiceImpl.ERROR_0003_INSUFFICIENT_PERMISSION" ), //$NON-NLS-1$
IOlapServiceException.Reason.ACCESS_DENIED );
}
// Check its existence.
if ( !getCatalogNames( session ).contains( catalogName ) ) {
throw new IOlapServiceException(
Messages.getInstance().getErrorString(
"MondrianCatalogHelper.ERROR_0015_CATALOG_NOT_FOUND",
catalogName ) );
}
// Check if it is a remote server
if ( getHelper().getOlap4jServers().contains( catalogName ) ) {
return makeOlap4jConnection( catalogName );
}
final StringBuilder roleName = new StringBuilder();
Entry roleMonikor = null;
if ( this.role != null ) {
// We must use a custom role implementation.
// Register the instance with the mondrian server.
roleMonikor = getServer().getLockBox().register( this.role );
roleName.append( roleMonikor.getMoniker() );
} else {
final IConnectionUserRoleMapper mapper =
PentahoSystem.get(
IConnectionUserRoleMapper.class,
MDXConnection.MDX_CONNECTION_MAPPER_KEY,
null ); // Don't use the user session here yet.
String[] effectiveRoles = new String[0];
/*
* If Catalog/Schema are null (this happens with high level metadata requests,
* like DISCOVER_DATASOURCES) we can't use the role mapper, even if it
* is present and configured.
*/
if ( session != null
&& mapper != null ) {
// Use the role mapper.
try {
effectiveRoles =
mapper
.mapConnectionRoles(
session,
catalogName );
if ( effectiveRoles == null ) {
effectiveRoles = new String[0];
}
} catch ( PentahoAccessControlException e ) {
throw new IOlapServiceException( e );
}
}
// Now we tokenize that list.
boolean addComma = false;
for ( String role : effectiveRoles ) {
if ( addComma ) {
roleName.append( "," ); //$NON-NLS-1$
}
roleName.append( role );
addComma = true;
}
}
// Populate some properties, like locale.
final Properties properties = new Properties();
properties.put(
RolapConnectionProperties.Locale.name(),
getLocale().toString() );
// Return a connection
try {
return getServer().getConnection(
DATASOURCE_NAME,
catalogName,
Util.isEmpty( roleName.toString() )
? null
: roleName.toString(),
properties );
} catch ( Exception e ) {
throw new IOlapServiceException( e );
} finally {
// Cleanup our lockbox entry.
if ( roleMonikor != null ) {
getServer().getLockBox().deregister( roleMonikor );
}