1 10 11 package mondrian.rolap.aggmatcher; 12 13 14 import mondrian.olap.*; 15 import mondrian.rolap.RolapStar; 16 import mondrian.recorder.*; 17 import mondrian.resource.MondrianResource; 18 19 import org.apache.log4j.Logger; 20 import org.eigenbase.xom.*; 21 import org.eigenbase.xom.Parser; 22 import org.eigenbase.util.property.*; 23 import org.eigenbase.util.property.Property; 24 25 import java.io.*; 26 import java.net.MalformedURLException ; 27 import java.net.URL ; 28 import java.util.HashMap ; 29 import java.util.Map ; 30 31 44 public class DefaultRules { 45 46 private static final Logger LOGGER = Logger.getLogger(DefaultRules.class); 47 48 private static final MondrianResource mres = MondrianResource.instance(); 49 53 public static synchronized DefaultRules getInstance() { 54 if (instance == null) { 55 InputStream inStream = getAggRuleInputStream(); 56 if (inStream == null) { 57 return null; 58 } 59 60 DefaultDef.AggRules defs = makeAggRules(inStream); 61 62 ListRecorder reclists = new ListRecorder(); 64 try { 65 defs.validate(reclists); 66 } catch (RecorderException e) { 67 } 69 70 reclists.logWarningMessage(LOGGER); 71 reclists.logErrorMessage(LOGGER); 72 73 if (reclists.hasErrors()) { 74 reclists.throwRTException(); 75 } 76 77 78 String tag = MondrianProperties.instance().AggregateRuleTag.get(); 80 DefaultDef.AggRule aggrule = defs.getAggRule(tag); 81 if (aggrule == null) { 82 throw mres.MissingDefaultAggRule.ex(tag); 83 } 84 85 DefaultRules rules = new DefaultRules(defs); 86 rules.setTag(tag); 87 instance = rules; 88 } 89 return instance; 90 } 91 92 private static InputStream getAggRuleInputStream() { 93 String aggRules = MondrianProperties.instance().AggregateRules.get(); 94 95 InputStream inStream = DefaultRules.class.getResourceAsStream(aggRules); 96 if (inStream == null) { 97 try { 98 URL url = new URL (aggRules); 99 inStream = url.openStream(); 100 } catch (MalformedURLException e) { 101 } catch (IOException e) { 103 } 105 } 106 if (inStream == null) { 107 String msg = mres.CouldNotLoadDefaultAggregateRules.str(aggRules); 108 LOGGER.warn(msg); 109 } 110 return inStream; 111 } 112 private static DefaultRules instance = null; 113 114 static { 115 Trigger trigger = 120 new Trigger() { 121 public boolean isPersistent() { 122 return true; 123 } 124 public int phase() { 125 return Trigger.PRIMARY_PHASE; 126 } 127 public void execute(Property property, String value) { 128 synchronized (DefaultRules.class) { 129 DefaultRules oldInstance = DefaultRules.instance; 130 DefaultRules.instance = null; 131 132 DefaultRules newInstance = null; 133 Exception ex = null; 134 try { 135 newInstance = DefaultRules.getInstance(); 136 } catch (Exception e) { 137 ex = e; 138 } 139 if (ex != null) { 140 DefaultRules.instance = oldInstance; 141 142 throw new Trigger.VetoRT(ex); 143 144 } else if (newInstance == null) { 145 DefaultRules.instance = oldInstance; 146 147 String msg = 148 mres.FailedCreateNewDefaultAggregateRules.str( 149 property.getPath(), value); 150 throw new Trigger.VetoRT(msg); 151 152 } else { 153 instance = newInstance; 154 } 155 } 156 } 157 }; 158 159 final MondrianProperties properties = MondrianProperties.instance(); 160 properties.AggregateRules.addTrigger(trigger); 161 properties.AggregateRuleTag.addTrigger(trigger); 162 } 163 164 protected static DefaultDef.AggRules makeAggRules(final File file) { 165 DOMWrapper def = makeDOMWrapper(file); 166 try { 167 DefaultDef.AggRules rules = new DefaultDef.AggRules(def); 168 return rules; 169 } catch (XOMException e) { 170 throw mres.AggRuleParse.ex(file.getName(), e); 171 } 172 } 173 174 protected static DefaultDef.AggRules makeAggRules(final URL url) { 175 DOMWrapper def = makeDOMWrapper(url); 176 try { 177 DefaultDef.AggRules rules = new DefaultDef.AggRules(def); 178 return rules; 179 } catch (XOMException e) { 180 throw mres.AggRuleParse.ex(url.toString(),e); 181 } 182 } 183 184 protected static DefaultDef.AggRules makeAggRules( 185 final InputStream inStream) { 186 DOMWrapper def = makeDOMWrapper(inStream); 187 try { 188 DefaultDef.AggRules rules = new DefaultDef.AggRules(def); 189 return rules; 190 } catch (XOMException e) { 191 throw mres.AggRuleParse.ex("InputStream",e); 192 } 193 } 194 195 protected static DefaultDef.AggRules makeAggRules( 196 final String text, 197 final String name) { 198 DOMWrapper def = makeDOMWrapper(text, name); 199 try { 200 DefaultDef.AggRules rules = new DefaultDef.AggRules(def); 201 return rules; 202 } catch (XOMException e) { 203 throw mres.AggRuleParse.ex(name,e); 204 } 205 } 206 207 protected static DOMWrapper makeDOMWrapper(final File file) { 208 try { 209 return makeDOMWrapper(file.toURL()); 210 } catch (MalformedURLException e) { 211 throw mres.AggRuleParse.ex(file.getName(),e); 212 } 213 } 214 215 protected static DOMWrapper makeDOMWrapper(final URL url) { 216 try { 217 final Parser xmlParser = XOMUtil.createDefaultParser(); 218 DOMWrapper def = xmlParser.parse(url); 219 return def; 220 } catch (XOMException e) { 221 throw mres.AggRuleParse.ex(url.toString(),e); 222 } 223 } 224 225 protected static DOMWrapper makeDOMWrapper(final InputStream inStream) { 226 try { 227 final Parser xmlParser = XOMUtil.createDefaultParser(); 228 DOMWrapper def = xmlParser.parse(inStream); 229 return def; 230 } catch (XOMException e) { 231 throw mres.AggRuleParse.ex("InputStream",e); 232 } 233 } 234 235 protected static DOMWrapper makeDOMWrapper( 236 final String text, 237 final String name) { 238 try { 239 final Parser xmlParser = XOMUtil.createDefaultParser(); 240 DOMWrapper def = xmlParser.parse(text); 241 return def; 242 } catch (XOMException e) { 243 throw mres.AggRuleParse.ex(name,e); 244 } 245 } 246 247 248 private final DefaultDef.AggRules rules; 249 private final Map <String , Recognizer.Matcher> factToPattern; 250 private final Map <String , Recognizer.Matcher> foreignKeyMatcherMap; 251 private Recognizer.Matcher ignoreMatcherMap; 252 private Recognizer.Matcher factCountMatcher; 253 private String tag; 254 255 private DefaultRules(final DefaultDef.AggRules rules) { 256 this.rules = rules; 257 this.factToPattern = new HashMap <String , Recognizer.Matcher>(); 258 this.foreignKeyMatcherMap = new HashMap <String , Recognizer.Matcher>(); 259 this.tag = MondrianProperties.instance().AggregateRuleTag. 260 getDefaultValue(); 261 } 262 263 public void validate(MessageRecorder msgRecorder) { 264 rules.validate(msgRecorder); 265 } 266 267 272 private void setTag(final String tag) { 273 this.tag = tag; 274 } 275 276 280 public String getTag() { 281 return this.tag; 282 } 283 284 285 289 public DefaultDef.AggRule getAggRule() { 290 return getAggRule(getTag()); 291 } 292 293 300 public DefaultDef.AggRule getAggRule(final String tag) { 301 return this.rules.getAggRule(tag); 302 } 303 304 310 public Recognizer.Matcher getTableMatcher(final String tableName) { 311 Recognizer.Matcher matcher = factToPattern.get(tableName); 312 if (matcher == null) { 313 DefaultDef.AggRule rule = getAggRule(); 315 DefaultDef.TableMatch tableMatch = rule.getTableMatch(); 316 matcher = tableMatch.getMatcher(tableName); 317 factToPattern.put(tableName, matcher); 318 } 319 return matcher; 320 } 321 322 326 public Recognizer.Matcher getIgnoreMatcher() { 327 if (ignoreMatcherMap == null) { 328 DefaultDef.AggRule rule = getAggRule(); 330 DefaultDef.IgnoreMap ignoreMatch = rule.getIgnoreMap(); 331 if (ignoreMatch == null) { 332 ignoreMatcherMap = new Recognizer.Matcher() { 333 public boolean matches(String name) { 334 return false; 335 } 336 }; 337 } else { 338 ignoreMatcherMap = ignoreMatch.getMatcher(); 339 } 340 } 341 return ignoreMatcherMap; 342 } 343 344 350 public Recognizer.Matcher getFactCountMatcher() { 351 if (factCountMatcher == null) { 352 DefaultDef.AggRule rule = getAggRule(); 354 DefaultDef.FactCountMatch factCountMatch = 355 rule.getFactCountMatch(); 356 factCountMatcher = factCountMatch.getMatcher(); 357 } 358 return factCountMatcher; 359 } 360 361 367 public Recognizer.Matcher getForeignKeyMatcher(String foreignKeyName) { 368 Recognizer.Matcher matcher = 369 foreignKeyMatcherMap.get(foreignKeyName); 370 if (matcher == null) { 371 DefaultDef.AggRule rule = getAggRule(); 373 DefaultDef.ForeignKeyMatch foreignKeyMatch = 374 rule.getForeignKeyMatch(); 375 matcher = foreignKeyMatch.getMatcher(foreignKeyName); 376 foreignKeyMatcherMap.put(foreignKeyName, matcher); 377 } 378 return matcher; 379 } 380 381 388 public boolean matchesTableName( 389 final String factTableName, 390 final String name) { 391 Recognizer.Matcher matcher = getTableMatcher(factTableName); 392 return matcher.matches(name); 393 } 394 395 400 public Recognizer.Matcher getMeasureMatcher( 401 final String measureName, 402 final String measureColumnName, 403 final String aggregateName) { 404 DefaultDef.AggRule rule = getAggRule(); 405 Recognizer.Matcher matcher = 406 rule.getMeasureMap().getMatcher(measureName, 407 measureColumnName, 408 aggregateName); 409 return matcher; 410 } 411 412 416 public Recognizer.Matcher getLevelMatcher( 417 final String usagePrefix, 418 final String hierarchyName, 419 final String levelName, 420 final String levelColumnName) { 421 DefaultDef.AggRule rule = getAggRule(); 422 Recognizer.Matcher matcher = 423 rule.getLevelMap().getMatcher(usagePrefix, 424 hierarchyName, 425 levelName, 426 levelColumnName); 427 return matcher; 428 } 429 430 435 public boolean columnsOK( 436 final RolapStar star, 437 final JdbcSchema.Table dbFactTable, 438 final JdbcSchema.Table aggTable, 439 final MessageRecorder msgRecorder) { 440 Recognizer cb = new DefaultRecognizer( 441 this, 442 star, 443 dbFactTable, 444 aggTable, 445 msgRecorder); 446 return cb.check(); 447 } 448 } 449 450 | Popular Tags |