KickJava   Java API By Example, From Geeks To Geeks.

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


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: XmlaServletImpl.java 3978 2006-07-14 22:44:46Z sbirney $
12  *
13  */

14
15 package com.jaspersoft.jasperserver.war.xmla;
16
17 import javax.servlet.http.HttpServletRequest JavaDoc;
18 import javax.servlet.http.HttpServletResponse JavaDoc;
19 import java.io.IOException JavaDoc;
20 import java.net.InetAddress JavaDoc;
21 import java.net.URL JavaDoc;
22
23 import org.apache.commons.logging.Log;
24 import org.apache.commons.logging.LogFactory;
25
26 import javax.servlet.ServletConfig JavaDoc;
27
28 import mondrian.xmla.impl.DefaultXmlaServlet;
29 import mondrian.xmla.XmlaHandler;
30 import mondrian.xmla.DataSourcesConfig;
31 import mondrian.xmla.XmlaException;
32
33 import com.jaspersoft.jasperserver.api.metadata.common.service.RepositoryService;
34 import com.jaspersoft.jasperserver.api.metadata.common.domain.ResourceLookup;
35 import com.jaspersoft.jasperserver.api.metadata.view.domain.FilterCriteria;
36 import com.jaspersoft.jasperserver.api.metadata.olap.domain.MondrianXMLADefinition;
37 import com.jaspersoft.jasperserver.api.metadata.olap.service.OlapConnectionService;
38
39 import javax.servlet.ServletContext JavaDoc;
40 import javax.servlet.ServletException JavaDoc;
41 import org.springframework.context.ApplicationContext;
42 import org.springframework.web.context.support.WebApplicationContextUtils;
43 import org.springframework.context.support.ClassPathXmlApplicationContext;
44
45 /**
46  * @author sbirney
47  */

48
49 public class XmlaServletImpl extends DefaultXmlaServlet {
50
51     private static final Log log = LogFactory.getLog(XmlaServletImpl.class);
52
53     private static ApplicationContext ctx;
54
55     public static ApplicationContext getContext() { return ctx; }
56
57     public void init(ServletConfig JavaDoc config) throws ServletException JavaDoc {
58     log.debug("XmlaServletImpl:init");
59    
60         ServletContext JavaDoc servletContext = config.getServletContext();
61         ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
62     if (ctx == null) {
63         log.error("XmlaServletImpl:init Unable to obtain ApplicationContext from servletContext");
64         ctx = new ClassPathXmlApplicationContext(new String JavaDoc[] {"applicationContext.xml"});
65         if (ctx == null) {
66         log.error("XmlaServletImpl:init Unable to obtain ApplicationContext");
67         }
68     }
69     
70         super.init(config);
71     }
72
73     protected void doPost(
74             HttpServletRequest JavaDoc request,
75             HttpServletResponse JavaDoc response)
76         throws ServletException JavaDoc, IOException JavaDoc {
77     try {
78         super.doPost( request, response ) ;
79     } catch (Throwable JavaDoc t) {
80         log.error("XMLA Servlet Error, ROOT CAUSE:");
81         log.error(XmlaException.getRootCause(t).getStackTrace());
82         throw new ServletException JavaDoc(t);
83     }
84     }
85
86     protected void handleFault(
87                     HttpServletResponse JavaDoc response,
88                     byte[][] responseSoapParts,
89                     int phase,
90                     Throwable JavaDoc t) {
91     log.error("XMLA FAULT!!!");
92     log.error(XmlaException.getRootCause(t).getStackTrace());
93     super.handleFault(response, responseSoapParts, phase, t);
94     }
95
96     protected DataSourcesConfig.DataSources makeDataSources(ServletConfig JavaDoc servletConfig) {
97         log.debug("makeDataSources");
98         RepositoryService rep = getRepository();
99         
100         // TODO it is meaningless to generate URLs here, but the XMLServlet requires it
101
// Looks like XML/A clients ignore the URL
102

103         String JavaDoc servletURL = null;
104         try {
105             ServletContext JavaDoc servletContext = servletConfig.getServletContext();
106             InetAddress JavaDoc local = InetAddress.getLocalHost();
107             
108             // We can override the default protocol and port with servlet init parameters
109

110             String JavaDoc defaultProtocol = servletContext.getInitParameter("defaultProtocol");
111             if (defaultProtocol == null || defaultProtocol.trim().length() == 0) {
112                 defaultProtocol = "http";
113             }
114             
115             String JavaDoc defaultPort = servletContext.getInitParameter("defaultPort");
116             if (defaultPort == null || defaultPort.trim().length() == 0) {
117                 defaultPort = "-1";
118             }
119             int port = Integer.parseInt(defaultPort);
120             
121             
122             URL JavaDoc root = servletContext.getResource("/");
123             // Looks like the path will be /localhost/webapp
124

125             int pastHost = root.getPath().indexOf("/", 1);
126             String JavaDoc path = root.getPath().substring(pastHost, root.getPath().length());
127             
128             servletURL = (new URL JavaDoc(defaultProtocol, local.getCanonicalHostName(), port, path)).toString() + "xmla";
129         } catch (Exception JavaDoc e) {
130             throw new RuntimeException JavaDoc(e);
131         }
132             
133         DataSourcesConfig.DataSources datasources = new DataSourcesConfig.DataSources();
134         
135         // Use findResource to avoid filtering with security
136
FilterCriteria f = FilterCriteria.createFilter(MondrianXMLADefinition.class);
137         ResourceLookup[] lookups = rep.findResource(null, f);
138     
139         if (lookups == null || lookups.length == 0) {
140             log.debug("No XML/A Connections available");
141             return datasources;
142         }
143     
144         datasources.dataSources = new DataSourcesConfig.DataSource[lookups.length];
145         DataSourcesConfig.DataSource[] ds = datasources.dataSources;
146         
147         for (int i = 0; i < lookups.length; i++) {
148             DataSourcesConfig.DataSource d = new DataSourcesConfig.DataSource();
149             
150             MondrianXMLADefinition def = (MondrianXMLADefinition) rep.getResource(null, lookups[i].getURIString());
151     
152             d.description = def.getDescription();
153     
154             d.url = servletURL;
155     
156             d.providerName = "Mondrian";
157             d.providerType = DataSourcesConfig.DataSource.PROVIDER_TYPE_MDP;
158             
159             // This is really about requiring roles
160

161             d.authenticationMode = DataSourcesConfig.DataSource.AUTH_MODE_UNAUTHENTICATED;
162             
163             d.name = "Provider=" + d.providerName + ";DataSource=" + def.getCatalog() + ";";
164             d.dataSourceInfo = d.name;
165             
166             DataSourcesConfig.Catalogs cs = new DataSourcesConfig.Catalogs();
167             DataSourcesConfig.Catalog c = new DataSourcesConfig.Catalog();
168             c.name = def.getCatalog();
169             //c.setDataSource(d); //XmlaHandler.java constructor does this for us
170
cs.catalogs = new DataSourcesConfig.Catalog[1];
171             cs.catalogs[0] = c;
172             d.catalogs = cs;
173
174             if (log.isDebugEnabled()) {
175             log.debug("loading DataSource name=" + d.name +
176                  ", info=" + d.dataSourceInfo + ", url=" + d.url);
177             }
178     
179             ds[i] = d;
180         }
181         return datasources;
182     }
183
184     /**
185      * property: xmlaHandler
186      */

187     protected XmlaHandler getXmlaHandler() {
188         if (this.xmlaHandler == null) {
189         log.debug("getXmlaHandler");
190             this.xmlaHandler =
191                 new XmlaHandlerImpl(this.dataSources, this.catalogLocator,
192                     getRepository(), getConnectionService());
193         }
194         return this.xmlaHandler;
195     }
196
197     /**
198      * property: repository
199      */

200     private RepositoryService mRepository;
201     public RepositoryService getRepository() {
202     if (mRepository == null) {
203         log.debug("getRepository");
204         mRepository = (RepositoryService)ctx.getBean("repositoryService");
205         if (mRepository == null) {
206         log.error("repositoryService not available in context: " + ctx);
207         }
208     }
209         return mRepository;
210     }
211     public void setRepository(RepositoryService repository) {
212         mRepository = repository;
213     }
214
215     /**
216      * property: olapConnectionService
217      */

218     private OlapConnectionService mConnectionService;
219     public OlapConnectionService getConnectionService() {
220     if (mConnectionService == null) {
221         log.debug("getConnectionService");
222         mConnectionService = (OlapConnectionService)ctx.getBean("olapConnectionService");
223         if (mConnectionService == null) {
224         log.error("repositoryService not available in context: " + ctx);
225         }
226     }
227         return mConnectionService;
228     }
229     public void setConnectionService( OlapConnectionService cs ) {
230         mConnectionService = cs;
231     }
232
233 }
Popular Tags