1 13 package com.tonbeller.jpivot.tags; 14 15 import java.io.IOException ; 16 import java.net.URL ; 17 import java.sql.Connection ; 18 import java.sql.SQLException ; 19 20 import javax.naming.InitialContext ; 21 import javax.sql.DataSource ; 22 23 import org.apache.log4j.Logger; 24 import org.xml.sax.SAXException ; 25 26 import com.tonbeller.jpivot.core.ModelFactory; 27 import com.tonbeller.jpivot.mondrian.MondrianModel; 28 import com.tonbeller.tbutils.res.Resources; 29 import com.tonbeller.wcf.controller.RequestContext; 30 import com.tonbeller.wcf.expr.ExprUtils; 31 32 36 public class MondrianModelFactory { 37 private static Logger logger = Logger.getLogger(MondrianModelFactory.class); 38 39 private MondrianModelFactory() { 40 } 41 42 static String makeConnectString(Config cfg) { 43 44 46 49 StringBuffer sb = new StringBuffer ("provider=Mondrian"); 51 if (cfg.getJdbcUrl() != null) { 52 String jdbcUrl = cfg.getJdbcUrl(); 53 sb.append(";Jdbc="); 54 if (jdbcUrl.indexOf(';') >= 0) { 56 char c = jdbcUrl.charAt(0); 57 if (c != '"' && c != '\'') { 58 char escape = '"'; 59 if (jdbcUrl.indexOf('"') >= 0) { 60 if (jdbcUrl.indexOf('\'') >= 0) { 61 throw new IllegalArgumentException ( 63 "jdbcUrl is not valid - contains single and double quotes"); 64 } 65 escape = '\''; 66 } 67 sb.append(escape); 68 sb.append(jdbcUrl); 69 sb.append(escape); 70 } else 71 sb.append(jdbcUrl); } else 73 sb.append(jdbcUrl); 75 if (cfg.getJdbcUser() != null) 76 sb.append(";JdbcUser=").append(cfg.getJdbcUser()); 77 if (cfg.getJdbcPassword() != null && cfg.getJdbcPassword().length() > 0) 78 sb.append(";JdbcPassword=").append(cfg.getJdbcPassword()); 79 } else if (cfg.getDataSource() != null) { 80 sb.append(";DataSource=java:comp/env/").append(cfg.getDataSource()); 81 testDataSource(cfg.getDataSource()); 82 } 83 sb.append(";Catalog=").append(cfg.getSchemaUrl()); 84 85 if (cfg.getDynLocale() != null) 86 sb.append(";Locale=").append(cfg.getDynLocale()); 87 88 if (cfg.getRole() != null) { 90 sb.append(";Role=").append(cfg.getRole()); 91 } 92 if (cfg.getDataSourceChangeListener() != null) { 93 sb.append(";dataSourceChangeListener=").append(cfg.getDataSourceChangeListener()); 94 } 95 return sb.toString(); 97 } 98 99 private static void testDataSource(String dataSourceName) { 100 final DataSource dataSource; 101 Connection connection = null; 102 String dsName = "java:comp/env/" + dataSourceName; 103 try { 104 dataSource = (DataSource ) new InitialContext ().lookup(dsName); 105 connection = dataSource.getConnection(); 106 } catch (Throwable e) { 107 String msg = "Datasource " + dsName + " is not configured properly"; 108 logger.error(msg, e); 109 throw new RuntimeException (msg, e); 110 } finally { 111 if (connection != null) 112 try { 113 connection.close(); 114 } catch (SQLException e) { 115 logger.error("could not close SQL Connection for DataSource " + dataSourceName, e); 116 } 117 } 118 } 119 120 public static MondrianModel instance() throws SAXException , IOException { 121 URL url = MondrianModel.class.getResource("config.xml"); 122 return (MondrianModel) ModelFactory.instance(url); 123 } 124 125 public static MondrianModel instance(Config cfg) throws SAXException , IOException { 126 URL url = MondrianModel.class.getResource("config.xml"); 127 return instance(url, cfg); 128 } 129 130 public static MondrianModel instance(URL url, Config cfg) throws SAXException , IOException { 131 if (logger.isInfoEnabled()) { 132 logger.info(cfg.toString()); 133 logger.info("ConnectString=" + makeConnectString(cfg)); 134 } 135 MondrianModel mm = (MondrianModel) ModelFactory.instance(url); 136 mm.setMdxQuery(cfg.getMdxQuery()); 137 mm.setConnectString(makeConnectString(cfg)); 138 mm.setJdbcDriver(cfg.getJdbcDriver()); 139 mm.setDynresolver(cfg.getDynResolver()); 140 mm.setDynLocale(cfg.getDynLocale()); 141 mm.setDataSourceChangeListener( cfg.getDataSourceChangeListener()); 142 143 if ("false".equalsIgnoreCase(cfg.getConnectionPooling())) 144 mm.setConnectionPooling(false); 145 mm.setExternalDataSource(cfg.getExternalDataSource()); 146 return mm; 147 } 148 149 public static class Config { 150 String jdbcUrl; 151 String jdbcDriver; 152 String jdbcUser; 153 String jdbcPassword; 154 String dataSource; 156 String schemaUrl; 157 String mdxQuery; 158 String role; 159 String dynResolver; 160 String dynLocale; 162 163 String connectionPooling; 164 DataSource externalDataSource = null; 166 167 String dataSourceChangeListener; 168 169 185 public void allowOverride(RequestContext context) { 186 Resources res = context.getResources(); 187 188 setRole(getDefault(res, "mondrian.role", getRole())); 190 setDynResolver(getDefault(res, "mondrian.dynResolver", getDynResolver())); 191 setDynLocale(getDefault(res, "mondrian.dynLocale", getDynLocale())); 192 193 setDataSourceChangeListener(getDefault(res, "mondrian.dataSourceChangeListener", getDataSourceChangeListener())); 194 195 if (externalDataSource != null) { 197 logger.info("using external data source"); 198 return; 199 } 200 201 setJdbcDriver(replace(res, getJdbcDriver())); 203 setJdbcUrl(replace(res, getJdbcUrl())); 204 setJdbcUser(replace(res, getJdbcUser())); 205 setJdbcPassword(replace(res, getJdbcPassword())); 206 setConnectionPooling(replace(res, getConnectionPooling())); 207 setDataSource(replace(res, getDataSource())); 208 209 if (!empty(dataSource)) { 211 logger.info("using data source " + dataSource); 212 findDataSource(context); 213 return; 214 } 215 216 if (!empty(jdbcDriver)) { 218 logger.info("using driver manager " + jdbcUrl); 219 return; 220 } 221 222 setDataSource(getDefault(res, "jdbc.datasource", getDataSource())); 224 if (!empty(dataSource)) { 225 logger.info("using default data source " + dataSource); 226 findDataSource(context); 227 return; 228 } 229 230 logger.info("using default driver manager " + jdbcUrl); 232 setJdbcDriver(getDefault(res, "jdbc.driver", getJdbcDriver())); 233 setJdbcUrl(getDefault(res, "jdbc.url", getJdbcUrl())); 234 setJdbcUser(getDefault(res, "jdbc.user", getJdbcUser())); 235 setJdbcPassword(getDefault(res, "jdbc.password", getJdbcPassword())); 236 setConnectionPooling(getDefault(res, "jdbc.connectionPooling", getConnectionPooling())); 237 } 238 239 243 private void findDataSource(RequestContext context) { 244 Object obj; 245 if (ExprUtils.isExpression(dataSource)) { 246 obj = context.getModelReference(dataSource); 248 } else { 249 obj = context.getSession().getAttribute(dataSource); 251 } 252 if (obj instanceof DataSource ) { 253 logger.info("using app dataSource " + dataSource); 254 this.dataSource = null; 255 this.externalDataSource = (DataSource ) obj; 256 } 257 } 259 260 264 private String getDefault(Resources res, String key, String val) { 265 val = replace(res, val); 267 if (val != null) 268 return val; 269 return res.getOptionalString(key, null); 270 } 271 272 275 private String replace(Resources res, String val) { 276 if (empty(val)) 277 return null; 278 return res.replace(val); 279 } 280 281 private boolean empty(String s) { 282 return s == null || s.trim().length() == 0; 283 } 284 285 289 public String getJdbcDriver() { 290 return jdbcDriver; 291 } 292 293 297 public String getJdbcPassword() { 298 return jdbcPassword; 299 } 300 301 305 public String getJdbcUrl() { 306 return jdbcUrl; 307 } 308 309 313 public String getJdbcUser() { 314 return jdbcUser; 315 } 316 317 321 public String getMdxQuery() { 322 return mdxQuery; 323 } 324 325 329 public String getSchemaUrl() { 330 return schemaUrl; 331 } 332 333 337 public String getRole() { 338 return role; 339 } 340 341 345 public void setRole(String role) { 346 this.role = role; 347 } 348 349 353 public void setJdbcDriver(String jdbcDriver) { 354 this.jdbcDriver = jdbcDriver; 355 } 356 357 361 public void setJdbcPassword(String jdbcPassword) { 362 this.jdbcPassword = jdbcPassword; 363 } 364 365 369 public void setJdbcUrl(String jdbcUrl) { 370 this.jdbcUrl = jdbcUrl; 371 } 372 373 377 public void setJdbcUser(String jdbcUser) { 378 this.jdbcUser = jdbcUser; 379 } 380 381 385 public void setMdxQuery(String mdxQuery) { 386 this.mdxQuery = mdxQuery; 387 } 388 389 393 public void setSchemaUrl(String schemaUrl) { 394 this.schemaUrl = schemaUrl; 395 } 396 397 400 public String getDataSource() { 401 return dataSource; 402 } 403 404 407 public void setDataSource(String string) { 408 dataSource = string; 409 } 410 411 public String getDynResolver() { 412 return dynResolver; 413 } 414 415 public void setDynResolver(String dynResolver) { 416 this.dynResolver = dynResolver; 417 } 418 419 public String getConnectionPooling() { 420 return connectionPooling; 421 } 422 423 public void setConnectionPooling(String connectionPooling) { 424 this.connectionPooling = connectionPooling; 425 } 426 427 public DataSource getExternalDataSource() { 428 return externalDataSource; 429 } 430 431 public void setExternalDataSource(DataSource externalDataSource) { 432 this.externalDataSource = externalDataSource; 433 } 434 435 439 public String getDynLocale() { 440 return this.dynLocale; 441 } 442 443 447 public void setDynLocale(String dynLocale) { 448 this.dynLocale = dynLocale; 449 } 450 451 public String toString() { 452 return "Config[" + "jdbcUrl=" + jdbcUrl + ", jdbcDriver=" + jdbcDriver + ", jdbcUser=" 453 + jdbcUser + ", jdbcPassword=" + jdbcPassword + ", dataSource=" + dataSource 454 + ", schemaUrl=" + schemaUrl + ", mdxQuery=" + mdxQuery + ", role=" + role 455 + ", dynResolver=" + dynResolver + ", connectionPooling=" + connectionPooling 456 + ", externalDataSource=" + externalDataSource + ", dynLocale=" + dynLocale + ", dataSourceChangeListener=" + dataSourceChangeListener + "]"; 457 } 458 462 463 public String getDataSourceChangeListener() { 464 return dataSourceChangeListener; 465 } 466 470 471 public void setDataSourceChangeListener(String dataSourceChangeListener) { 472 this.dataSourceChangeListener = dataSourceChangeListener; 473 } 474 } 475 } | Popular Tags |