1 14 15 package com.jaspersoft.jasperserver.war.xmla; 16 17 import java.util.Iterator ; 18 import java.util.List ; 19 import java.util.Map ; 20 21 import org.apache.commons.logging.Log; 22 import org.apache.commons.logging.LogFactory; 23 24 import com.jaspersoft.jasperserver.api.common.domain.ExecutionContext; 25 import com.jaspersoft.jasperserver.api.metadata.common.domain.Folder; 26 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.FolderImpl; 27 import com.jaspersoft.jasperserver.api.metadata.common.domain.Resource; 28 import com.jaspersoft.jasperserver.api.metadata.common.domain.ResourceReference; 29 import com.jaspersoft.jasperserver.api.metadata.common.domain.FileResource; 30 import com.jaspersoft.jasperserver.api.metadata.common.domain.FileResourceData; 31 import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.ReportDataSource; 32 import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.JdbcReportDataSource; 33 import com.jaspersoft.jasperserver.api.metadata.jasperreports.domain.JndiJdbcReportDataSource; 34 import com.jaspersoft.jasperserver.api.metadata.common.service.RepositoryService; 35 36 import com.jaspersoft.jasperserver.api.metadata.common.domain.ResourceLookup; 37 import com.jaspersoft.jasperserver.api.metadata.view.domain.FilterCriteria; 38 import com.jaspersoft.jasperserver.api.metadata.olap.domain.MondrianConnection; 39 import com.jaspersoft.jasperserver.api.metadata.olap.domain.OlapUnit; 40 import com.jaspersoft.jasperserver.api.metadata.olap.domain.MondrianXMLADefinition; 41 import com.jaspersoft.jasperserver.api.metadata.olap.domain.XMLAConnection; 42 import com.jaspersoft.jasperserver.api.metadata.olap.service.OlapConnectionService; 43 44 import mondrian.xmla.XmlaRequest; 45 import mondrian.xmla.XmlaException; 46 import mondrian.xmla.XmlaHandler; 47 import mondrian.xmla.XmlaConstants; 48 import mondrian.xmla.DataSourcesConfig; 49 50 import mondrian.rolap.RolapConnectionProperties; 51 import mondrian.olap.Util; 52 import mondrian.olap.Connection; 53 import mondrian.olap.DriverManager; 54 import mondrian.rolap.RolapConnection; 55 import mondrian.spi.CatalogLocator; 56 57 60 61 public class XmlaHandlerImpl extends XmlaHandler { 62 63 90 91 private static final Log log = LogFactory.getLog(XmlaHandlerImpl.class); 92 93 public XmlaHandlerImpl( 94 DataSourcesConfig.DataSources dataSources, 95 CatalogLocator catalogLocator, 96 RepositoryService repository, 97 OlapConnectionService connectionService) 98 { 99 super(dataSources, catalogLocator); 100 setRepository(repository); 101 setConnectionService(connectionService); 102 } 103 104 114 protected Connection getConnection( 115 DataSourcesConfig.Catalog catalog, 116 String role) 117 throws XmlaException { 118 119 Map dsMap = getDataSourceEntries(); 120 for (Iterator keys = dsMap.keySet().iterator(); keys.hasNext();) { 121 Object key = keys.next(); 122 log.warn("DATASOURCE KEY=" + key + " " + key.getClass() + 123 " ,VALUE=" + dsMap.get(key) + " " + dsMap.get(key).getClass()); 124 } 125 126 DataSourcesConfig.DataSource ds = catalog.getDataSource(); 127 128 ExecutionContext context = null; 129 MondrianConnection monConn = lookupXmlaConnection(context, ds); 130 Util.PropertyList connectProperties = 131 getConnectionService().getMondrianConnectProperties(context, monConn); 132 133 if (!DataSourcesConfig.DataSource.AUTH_MODE_UNAUTHENTICATED. 135 equalsIgnoreCase(ds.getAuthenticationMode()) && null == role) { 136 throw new XmlaException( 137 CLIENT_FAULT_FC, 138 HSB_ACCESS_DENIED_CODE, 139 HSB_ACCESS_DENIED_FAULT_FS, 140 new SecurityException ("Access denied for data source needing authentication") 141 ); 142 } 143 144 connectProperties.put("role", role); 145 RolapConnection conn = 146 (RolapConnection) DriverManager.getConnection(connectProperties, null, false); 147 148 return conn; 149 } 150 151 162 protected Connection getConnection(DataSourcesConfig.DataSource ds, 163 String catalogUrl, String role) 164 throws XmlaException { 165 166 167 ExecutionContext context = null; 168 MondrianConnection monConn = lookupXmlaConnection(context, ds); 169 Util.PropertyList connectProperties = 170 getConnectionService().getMondrianConnectProperties(context, monConn); 171 172 if (!DataSourcesConfig.DataSource.AUTH_MODE_UNAUTHENTICATED.equalsIgnoreCase(ds.getAuthenticationMode()) && null == role) { 174 throw new XmlaException( 175 CLIENT_FAULT_FC, 176 HSB_ACCESS_DENIED_CODE, 177 HSB_ACCESS_DENIED_FAULT_FS, 178 new SecurityException ("Access denied for data source needing authentication") 179 ); 180 } 181 182 connectProperties.put("role", role); 183 RolapConnection conn = 184 (RolapConnection) DriverManager.getConnection(connectProperties, null, false); 185 186 return conn; 187 } 188 189 195 protected Connection getConnection(XmlaRequest request) 196 throws XmlaException { 197 log.debug("XmlaHandlerImpl:getConnection"); 198 Map dataSourcesMap = getDataSourceEntries(); 199 Map properties = request.getProperties(); 200 201 final String dataSourceInfo = (String ) properties.get("DataSourceInfo"); 205 206 if (!dataSourcesMap.containsKey(dataSourceInfo)) { 207 throw new XmlaException( 208 CLIENT_FAULT_FC, 209 HSB_CONNECTION_DATA_SOURCE_CODE, 210 HSB_CONNECTION_DATA_SOURCE_FAULT_FS, 211 Util.newError("no data source is configured with name '" + dataSourceInfo + "'")); 212 } 213 if (log.isDebugEnabled()) { 214 log.debug("XmlaHandlerImpl.getConnection: dataSourceInfo=" + 215 dataSourceInfo); 216 } 217 218 DataSourcesConfig.DataSource ds = 219 (DataSourcesConfig.DataSource) dataSourcesMap.get(dataSourceInfo); 220 if (log.isDebugEnabled()) { 221 if (ds == null) { 222 log.debug("XmlaHandlerImpl.getConnection: ds is null"); 223 } else { 224 log.debug("XmlaHandlerImpl.getConnection: ds.dataSourceInfo=" + 225 ds.getDataSourceInfo()); 226 } 227 } 228 229 ExecutionContext context = null; 230 MondrianConnection monConn = lookupXmlaConnection(context, ds); 231 Util.PropertyList connectProperties = 232 getConnectionService().getMondrianConnectProperties(context, monConn); 233 234 if (!DataSourcesConfig.DataSource.AUTH_MODE_UNAUTHENTICATED.equalsIgnoreCase(ds.getAuthenticationMode()) && 236 null == request.getRole()) { 237 throw new XmlaException( 238 CLIENT_FAULT_FC, 239 HSB_ACCESS_DENIED_CODE, 240 HSB_ACCESS_DENIED_FAULT_FS, 241 new SecurityException ("Access denied for data source needing authentication") 242 ); 243 } 244 245 connectProperties.put("role", request.getRole()); 246 RolapConnection conn = 247 (RolapConnection) DriverManager.getConnection(connectProperties, null, false); 248 249 return conn; 250 } 251 252 protected MondrianConnection lookupXmlaConnection(ExecutionContext context, 253 DataSourcesConfig.DataSource ds) { 254 if (log.isDebugEnabled()) { 255 log.debug("looking up DataSource name=" + ds.name + 256 ", info=" + ds.dataSourceInfo + ", url=" + ds.url); 257 } 258 259 MondrianConnection result = null; 260 RepositoryService rep = getRepository(); 261 262 264 266 FilterCriteria f = FilterCriteria.createFilter(MondrianXMLADefinition.class); 267 List lookups = rep.loadResourcesList(f); 268 269 if (lookups == null || lookups.size() == 0) { 270 log.error("No XMLA Definitions"); 271 } else { 272 273 for (Iterator it = lookups.iterator(); it.hasNext(); ) { 274 275 MondrianXMLADefinition xmlaDef = (MondrianXMLADefinition) rep.getResource(context, ((ResourceLookup) it.next()).getURIString()); 276 if (ds.name != null && 277 ds.name.endsWith( "DataSource=" + xmlaDef.getCatalog() + ";" )) { 278 result = (MondrianConnection) 279 getConnectionService().dereference(context, xmlaDef.getMondrianConnection()); 280 log.debug("Connection Found for catalog: " + xmlaDef.getCatalog()); 281 break; 282 } 283 } 284 } 285 if (result == null) { 286 log.error("Mondrian XMLA Definition not found for name: " + ds.name); 287 } 288 return result; 289 } 290 291 294 private OlapConnectionService mConnectionService; 295 public OlapConnectionService getConnectionService() { 296 return mConnectionService; 297 } 298 public void setConnectionService( OlapConnectionService cs ) { 299 mConnectionService = cs; 300 } 301 302 305 private RepositoryService mRepository; 306 public RepositoryService getRepository() { 307 return mRepository; 308 } 309 public void setRepository(RepositoryService repository) { 310 mRepository = repository; 311 } 312 313 } 314 | Popular Tags |