Skip to content

Commit

Permalink
role support and use of additional xmla properties as part of the con…
Browse files Browse the repository at this point in the history
…nection string in the XMLA driver

git-svn-id: https://olap4j.svn.sourceforge.net/svnroot/olap4j/trunk@487 c6a108a4-781c-0410-a6c6-c2d559e19af0
  • Loading branch information
pstoellberger committed Jan 18, 2012
1 parent 21a1d43 commit 33206a9
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 7 deletions.
10 changes: 9 additions & 1 deletion src/org/olap4j/driver/xmla/XmlaOlap4jCatalog.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.olap4j.metadata.*;

import java.sql.SQLException;
import java.util.List;

/**
* Implementation of {@link org.olap4j.metadata.Catalog}
Expand All @@ -40,17 +41,20 @@ class XmlaOlap4jCatalog implements Catalog, Named {
private final String name;
final DeferredNamedListImpl<XmlaOlap4jSchema> schemas;
private final XmlaOlap4jDatabase database;
private List<String> roles;

XmlaOlap4jCatalog(
XmlaOlap4jDatabaseMetaData olap4jDatabaseMetaData,
XmlaOlap4jDatabase database,
String name)
String name,
List<String> roles)
{
this.database = database;
assert olap4jDatabaseMetaData != null;
assert name != null;
this.olap4jDatabaseMetaData = olap4jDatabaseMetaData;
this.name = name;
this.roles = roles;

// Some servers don't support MDSCHEMA_MDSCHEMATA, so we will
// override the list class so it tries it first, and falls
Expand Down Expand Up @@ -149,6 +153,10 @@ public NamedList<Schema> getSchemas() throws OlapException {
public String getName() {
return name;
}

public List<String> getAvailableRoles() {
return roles;
}

public OlapDatabaseMetaData getMetaData() {
return olap4jDatabaseMetaData;
Expand Down
67 changes: 62 additions & 5 deletions src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,13 @@ abstract class XmlaOlap4jConnection implements OlapConnection {
*/
private String databaseName;

/**
* List of additional properties being used as part of the XML/A
* calls as part of &lt;PropertyList/&gt;.<br />
* Can be passed to connection via connection string properties.
*/
private Properties databaseProperties;

private boolean autoCommit;
private boolean readOnly;

Expand Down Expand Up @@ -179,6 +186,24 @@ abstract class XmlaOlap4jConnection implements OlapConnection {

final Map<String, String> map = parseConnectString(url, info);

this.databaseProperties = new Properties();
for (String infoKey : map.keySet()) {
boolean addProperty = true;
for (XmlaOlap4jDriver.Property p
: XmlaOlap4jDriver.Property.values())
{
if (infoKey.equals(p.name())
|| "USER".equals(infoKey)
|| "PASSWORD".equals(infoKey))
{
addProperty = false;
}
}
if (addProperty) {
databaseProperties.put(infoKey, map.get(infoKey));
}
}

this.databaseName =
map.get(XmlaOlap4jDriver.Property.DATABASE.name());

Expand All @@ -188,6 +213,9 @@ abstract class XmlaOlap4jConnection implements OlapConnection {
this.schemaName =
map.get(XmlaOlap4jDriver.Property.SCHEMA.name());

this.roleName =
map.get(XmlaOlap4jDriver.Property.ROLE.name());

// Set URL of HTTP server.
final String serverUrl =
map.get(XmlaOlap4jDriver.Property.SERVER.name());
Expand Down Expand Up @@ -712,9 +740,17 @@ public String getRoleName() {
}

public List<String> getAvailableRoleNames() {
// List of available roles is not known. Could potentially add an XMLA
// call to populate this list if useful to a client.
return null;
Set<String> roleNames = new HashSet<String>();
try {
for (Catalog catalog : getOlapCatalogs()) {
List<String> catalogRoles =
((XmlaOlap4jCatalog) catalog).getAvailableRoles();
roleNames.addAll(catalogRoles);
}
} catch (OlapException e) {
}

return new ArrayList<String>(roleNames);
}

public Scenario createScenario() {
Expand Down Expand Up @@ -908,13 +944,25 @@ public String generateRequest(
+ " <Properties>\n"
+ " <PropertyList>\n");

for (Object prop : databaseProperties.keySet()) {
buf.append(" <" + prop + ">");
xmlEncode(buf, databaseProperties.getProperty(prop.toString()));
buf.append("</" + prop + ">\n");
}

// Add the datasource node only if this request requires it.
if (metadataRequest.requiresDatasourceName()) {
buf.append(" <DataSourceInfo>");
xmlEncode(buf, context.olap4jConnection.getDatabase());
buf.append("</DataSourceInfo>\n");
}

if (roleName != null && !("".equals(roleName))) {
buf.append(" <Roles>");
xmlEncode(buf, roleName);
buf.append("</Roles>\n");
}

String requestCatalogName = null;
if (restrictedCatalogName != null
&& restrictedCatalogName.length() > 0)
Expand Down Expand Up @@ -1087,12 +1135,21 @@ public void handle(
*/
String catalogName =
XmlaOlap4jUtil.stringElement(row, "CATALOG_NAME");
// Unused: DESCRIPTION, ROLES
String roles =
XmlaOlap4jUtil.stringElement(row, "ROLES");
List<String> roleList = new ArrayList<String>();
if (roles != null && !"".equals(roles)) {
for (String role : roles.split(",")) {
roleList.add(role);
}
}
// Unused: DESCRIPTION
list.add(
new XmlaOlap4jCatalog(
context.olap4jDatabaseMetaData,
database,
catalogName));
catalogName,
roleList));
}
}

Expand Down
8 changes: 7 additions & 1 deletion src/org/olap4j/driver/xmla/XmlaOlap4jDriver.java
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,11 @@
* object in {@link #PROXY_MAP} via which to
* send XMLA requests for testing
* purposes.</td></tr>
* <tr><td>Role</td> <td>Comma separated list of role names used for
* this connection (Optional). <br />
* Available role names can be retrieved via
* {@link org.olap4j.driver.xmla.XmlaOlap4jConnection#getAvailableRoleNames}
* </td></tr>
*
* </table>
*
Expand Down Expand Up @@ -360,7 +365,8 @@ public enum Property {
DATABASE("Name of the database"),
CATALOG("Catalog name"),
SCHEMA("Name of the schema"),
CACHE("Class name of the SOAP cache implementation");
CACHE("Class name of the SOAP cache implementation"),
ROLE("Comma separated list of roles this connection impersonates");

/**
* Creates a property.
Expand Down

0 comments on commit 33206a9

Please sign in to comment.