KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > jaspersoft > jasperserver > war > xmla > XmlaHandlerImpl


1 /****************************************************************
2  *
3  * JasperServer.
4  * All rights reserved.
5  * Copyright (C) 2005 JasperSoft Corporation
6  *
7  * JasperSoft Corporation
8  * 303 Second Street, Suite 450 North
9  * San Francisco, CA 94107
10  * http://www.jaspersoft.com
11  * $Id: XmlaHandlerImpl.java 3978 2006-07-14 22:44:46Z sbirney $
12  *
13  */

14
15 package com.jaspersoft.jasperserver.war.xmla;
16
17 import java.util.Iterator JavaDoc;
18 import java.util.List JavaDoc;
19 import java.util.Map JavaDoc;
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 /**
58  * @author sbirney
59  */

60
61 public class XmlaHandlerImpl extends XmlaHandler {
62
63     /*
64     public DataSourcesConfig.DataSource getDataSource(XmlaRequest request)
65                 throws XmlaException {
66     DataSourcesConfig.DataSource ds = super.getDataSource(request);
67     log.warn("getDataSource ==> " + ds);
68     return ds;
69     }
70
71     public DataSourcesConfig.Catalog getCatalog(
72             XmlaRequest request,
73             DataSourcesConfig.DataSource ds)
74                 throws XmlaException {
75     DataSourcesConfig.Catalog cat = super.getCatalog(request, ds);
76     log.warn("getCatalog ==> " + cat);
77     return cat;
78     }
79
80     public DataSourcesConfig.Catalog getCatalog(
81             DataSourcesConfig.DataSource ds,
82             String catalogName) {
83     log.warn("getCatalog, catalogName = \"" + catalogName + "\"");
84     log.warn("" + ds);
85     DataSourcesConfig.Catalog cat = super.getCatalog(ds, catalogName);
86     log.warn("getCatalog ==> " + cat);
87     return cat;
88     }
89     */

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     /**
105      * Gets a Connection given a catalog (and implicitly the catalog's data
106      * source) and a user role. overrides XmlaHandler version 18.
107      * does this API have to change with every freakin' revision of Mondrian?
108      *
109      * @param catalog Catalog
110      * @param role User role
111      * @return Connection
112      * @throws XmlaException
113      */

114     protected Connection getConnection(
115             DataSourcesConfig.Catalog catalog,
116             String JavaDoc role)
117             throws XmlaException {
118
119     Map JavaDoc dsMap = getDataSourceEntries();
120     for (Iterator JavaDoc keys = dsMap.keySet().iterator(); keys.hasNext();) {
121         Object JavaDoc 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         // Checking access
134
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 JavaDoc("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     /**
152      * Get a Connection given the Datasource, catalogUrl and user role.
153      *
154      * @param ds
155      * @param catalogUrl
156      * @param role
157      * @return mondrian.olap.Connection
158      * @throws XmlaException
159      *
160      * overides XmlaHandler version 15, package access must be protected
161      */

162     protected Connection getConnection(DataSourcesConfig.DataSource ds,
163                        String JavaDoc catalogUrl, String JavaDoc 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         // Checking access
173
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 JavaDoc("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     /**
190      * Returns a Mondrian connection as specified by a set of properties
191      * which are used to locate the MondrianXMLADefinition in the repository
192      *
193      * overides XmlaHandler version #14, except package access must be protected
194      */

195     protected Connection getConnection(XmlaRequest request)
196             throws XmlaException {
197     log.debug("XmlaHandlerImpl:getConnection");
198     Map JavaDoc dataSourcesMap = getDataSourceEntries();
199         Map JavaDoc properties = request.getProperties();
200
201     // too bad PropertyDefinition is not accessible outside package
202
//final String dataSourceInfo =
203
// (String) properties.get(PropertyDefinition.DataSourceInfo.name);
204
final String JavaDoc dataSourceInfo = (String JavaDoc) 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         // Checking access
235
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 JavaDoc("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     // Use loadResourcesList to filter with security
263

264     // TODO Make this more efficient: cache? use a URI to lookup?
265

266     FilterCriteria f = FilterCriteria.createFilter(MondrianXMLADefinition.class);
267     List JavaDoc lookups = rep.loadResourcesList(f);
268
269     if (lookups == null || lookups.size() == 0) {
270         log.error("No XMLA Definitions");
271     } else {
272     
273         for (Iterator JavaDoc 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     /**
292      * property: olapConnectionService
293      */

294     private OlapConnectionService mConnectionService;
295     public OlapConnectionService getConnectionService() {
296         return mConnectionService;
297     }
298     public void setConnectionService( OlapConnectionService cs ) {
299         mConnectionService = cs;
300     }
301
302     /**
303      * property: repository
304      */

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