1 14 15 package com.jaspersoft.jasperserver.war.xmla; 16 17 import javax.servlet.http.HttpServletRequest ; 18 import javax.servlet.http.HttpServletResponse ; 19 import java.io.IOException ; 20 import java.net.InetAddress ; 21 import java.net.URL ; 22 23 import org.apache.commons.logging.Log; 24 import org.apache.commons.logging.LogFactory; 25 26 import javax.servlet.ServletConfig ; 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 ; 40 import javax.servlet.ServletException ; 41 import org.springframework.context.ApplicationContext; 42 import org.springframework.web.context.support.WebApplicationContextUtils; 43 import org.springframework.context.support.ClassPathXmlApplicationContext; 44 45 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 config) throws ServletException { 58 log.debug("XmlaServletImpl:init"); 59 60 ServletContext 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 [] {"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 request, 75 HttpServletResponse response) 76 throws ServletException , IOException { 77 try { 78 super.doPost( request, response ) ; 79 } catch (Throwable t) { 80 log.error("XMLA Servlet Error, ROOT CAUSE:"); 81 log.error(XmlaException.getRootCause(t).getStackTrace()); 82 throw new ServletException (t); 83 } 84 } 85 86 protected void handleFault( 87 HttpServletResponse response, 88 byte[][] responseSoapParts, 89 int phase, 90 Throwable 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 servletConfig) { 97 log.debug("makeDataSources"); 98 RepositoryService rep = getRepository(); 99 100 103 String servletURL = null; 104 try { 105 ServletContext servletContext = servletConfig.getServletContext(); 106 InetAddress local = InetAddress.getLocalHost(); 107 108 110 String defaultProtocol = servletContext.getInitParameter("defaultProtocol"); 111 if (defaultProtocol == null || defaultProtocol.trim().length() == 0) { 112 defaultProtocol = "http"; 113 } 114 115 String 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 root = servletContext.getResource("/"); 123 125 int pastHost = root.getPath().indexOf("/", 1); 126 String path = root.getPath().substring(pastHost, root.getPath().length()); 127 128 servletURL = (new URL (defaultProtocol, local.getCanonicalHostName(), port, path)).toString() + "xmla"; 129 } catch (Exception e) { 130 throw new RuntimeException (e); 131 } 132 133 DataSourcesConfig.DataSources datasources = new DataSourcesConfig.DataSources(); 134 135 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 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 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 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 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 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 |