From 33206a955f3e9b9f4b4538b46e568a37b9defe9d Mon Sep 17 00:00:00 2001 From: Paul Stoellberger Date: Wed, 18 Jan 2012 20:42:45 +0000 Subject: [PATCH] role support and use of additional xmla properties as part of the connection string in the XMLA driver git-svn-id: https://olap4j.svn.sourceforge.net/svnroot/olap4j/trunk@487 c6a108a4-781c-0410-a6c6-c2d559e19af0 --- .../olap4j/driver/xmla/XmlaOlap4jCatalog.java | 10 ++- .../driver/xmla/XmlaOlap4jConnection.java | 67 +++++++++++++++++-- .../olap4j/driver/xmla/XmlaOlap4jDriver.java | 8 ++- 3 files changed, 78 insertions(+), 7 deletions(-) diff --git a/src/org/olap4j/driver/xmla/XmlaOlap4jCatalog.java b/src/org/olap4j/driver/xmla/XmlaOlap4jCatalog.java index 48f5515..f9f65d2 100644 --- a/src/org/olap4j/driver/xmla/XmlaOlap4jCatalog.java +++ b/src/org/olap4j/driver/xmla/XmlaOlap4jCatalog.java @@ -26,6 +26,7 @@ import org.olap4j.metadata.*; import java.sql.SQLException; +import java.util.List; /** * Implementation of {@link org.olap4j.metadata.Catalog} @@ -40,17 +41,20 @@ class XmlaOlap4jCatalog implements Catalog, Named { private final String name; final DeferredNamedListImpl schemas; private final XmlaOlap4jDatabase database; + private List roles; XmlaOlap4jCatalog( XmlaOlap4jDatabaseMetaData olap4jDatabaseMetaData, XmlaOlap4jDatabase database, - String name) + String name, + List 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 @@ -149,6 +153,10 @@ public NamedList getSchemas() throws OlapException { public String getName() { return name; } + + public List getAvailableRoles() { + return roles; + } public OlapDatabaseMetaData getMetaData() { return olap4jDatabaseMetaData; diff --git a/src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java b/src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java index 2d3f443..5df85e0 100644 --- a/src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java +++ b/src/org/olap4j/driver/xmla/XmlaOlap4jConnection.java @@ -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 <PropertyList/>.
+ * Can be passed to connection via connection string properties. + */ + private Properties databaseProperties; + private boolean autoCommit; private boolean readOnly; @@ -179,6 +186,24 @@ abstract class XmlaOlap4jConnection implements OlapConnection { final Map 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()); @@ -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()); @@ -712,9 +740,17 @@ public String getRoleName() { } public List 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 roleNames = new HashSet(); + try { + for (Catalog catalog : getOlapCatalogs()) { + List catalogRoles = + ((XmlaOlap4jCatalog) catalog).getAvailableRoles(); + roleNames.addAll(catalogRoles); + } + } catch (OlapException e) { + } + + return new ArrayList(roleNames); } public Scenario createScenario() { @@ -908,6 +944,12 @@ public String generateRequest( + " \n" + " \n"); + for (Object prop : databaseProperties.keySet()) { + buf.append(" <" + prop + ">"); + xmlEncode(buf, databaseProperties.getProperty(prop.toString())); + buf.append("\n"); + } + // Add the datasource node only if this request requires it. if (metadataRequest.requiresDatasourceName()) { buf.append(" "); @@ -915,6 +957,12 @@ public String generateRequest( buf.append("\n"); } + if (roleName != null && !("".equals(roleName))) { + buf.append(" "); + xmlEncode(buf, roleName); + buf.append("\n"); + } + String requestCatalogName = null; if (restrictedCatalogName != null && restrictedCatalogName.length() > 0) @@ -1087,12 +1135,21 @@ public void handle( */ String catalogName = XmlaOlap4jUtil.stringElement(row, "CATALOG_NAME"); - // Unused: DESCRIPTION, ROLES + String roles = + XmlaOlap4jUtil.stringElement(row, "ROLES"); + List roleList = new ArrayList(); + 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)); } } diff --git a/src/org/olap4j/driver/xmla/XmlaOlap4jDriver.java b/src/org/olap4j/driver/xmla/XmlaOlap4jDriver.java index da6c560..4e6e4f3 100644 --- a/src/org/olap4j/driver/xmla/XmlaOlap4jDriver.java +++ b/src/org/olap4j/driver/xmla/XmlaOlap4jDriver.java @@ -98,6 +98,11 @@ * object in {@link #PROXY_MAP} via which to * send XMLA requests for testing * purposes. + * Role Comma separated list of role names used for + * this connection (Optional).
+ * Available role names can be retrieved via + * {@link org.olap4j.driver.xmla.XmlaOlap4jConnection#getAvailableRoleNames} + * * * * @@ -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.