[Mondrian] Re: Eigenbase perforce change 8742 for review

John V. Sichi jsichi at gmail.com
Wed Feb 21 02:45:06 EST 2007


Richard, in the change below, did you intentionally re-enable 
mondrian.util.memoryMonitor.enable=true?  The comment in 
mondrian.properties still says the default should be false (and I agree, 
since Derby tests fail with true).  But you changed the actual default 
in MondrianProperties.

I remain convinced that a properties file that a developer is forced to 
check out for overlapping purposes (submitting changes to property 
definitions; changing mandatory site-specific settings as part of 
sandbox setup) is very problematic.  It's especially troublesome because 
it breaks the rhythm of edit, run tests, check in--instead, after 
running tests against changed property definitions, the developer has to 
remember to undo site-specific settings, check in, and then re-checkout 
and reapply site-specific settings.

Julian has spoken quite adamantly, but I'm not clear on why site-local 
setup instructions can't be kept "members only" for developers so that 
there's no impact on end-users, forum support, etc.  But pending that: 
Richard, could you be more careful?

JVS

Richard Emberson wrote:
> http://p4web.eigenbase.org/@md=d&c=6PU@//8742?ac=10
> 
> Change 8742 by emberson at bortei.head on 2007/02/17 11:30:51
> 
> 	MONDRIAN
> 	   ObjectFactory now uses MondrianProperties values as 
> 	   overriding property mechanism. The factory properties were
> 	   added to MondrianProperties.java for the MemoryMonitorFactory
> 	   and the ExpCompiler.Factory. Removed previously added
> 	   alteration to build.xml - not needed when using MondrianProperties.
> 
> Affected files ...
> 
> ... //open/mondrian/build.xml#140 edit
> ... //open/mondrian/doc/configuration.html#21 edit
> ... //open/mondrian/mondrian.properties#35 edit
> ... //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#9 edit
> ... //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#65 edit
> ... //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#7 edit
> ... //open/mondrian/src/main/mondrian/util/ObjectFactory.java#9 edit
> 
> Differences ...
> 
> ==== //open/mondrian/build.xml#140 (ktext) ====
> 
> 2c2
> <   == $Id: //open/mondrian/build.xml#139 $
> ---
>>   == $Id: //open/mondrian/build.xml#140 $
> 458,461d457
> <     <propertyset id="properties-starting-with-mondrian">
> <         <propertyref prefix="mondrian"/>
> <     </propertyset>
> < 
> 485,489d480
> <       <!-- include all properties starting with "mondrian" -->
> <       <syspropertyset>
> <         <propertyset refid="properties-starting-with-mondrian"/>
> <       </syspropertyset>
> < 
> 
> ==== //open/mondrian/doc/configuration.html#21 (ktext) ====
> 
> 3c3
> <   == $Id: //open/mondrian/doc/configuration.html#20 $
> ---
>>   == $Id: //open/mondrian/doc/configuration.html#21 $
> 97c97
> <       mondrian.foodmart .jdbcURL</a></code></td>
> ---
>>       mondrian.foodmart.jdbcURL</a></code></td>
> 105c105
> <       mondrian.query. limit</a></code></td>
> ---
>>       mondrian.query.limit</a></code></td>
> 116c116
> <       mondrian. jdbcDrivers</a></code></td>
> ---
>>       mondrian.jdbcDrivers</a></code></td>
> 119c119
> <       sun.jdbc.odbc .JdbcOdbcDriver,<br>
> ---
>>       sun.jdbc.odbc.JdbcOdbcDriver,<br>
> 123c123
> <       com.mysql.jdbc .Driver</td>
> ---
>>       com.mysql.jdbc.Driver</td>
> 130c130
> <       mondrian.result .limit</a></code></td>
> ---
>>       mondrian.result.limit</a></code></td>
> 156c156
> <       mondrian.rolap. CachePool.costLimit</a></code></td>
> ---
>>       mondrian.rolap.CachePool.costLimit</a></code></td>
> 164c164
> <       evaluate. MaxEvalDepth</a></code></td>
> ---
>>       evaluate.MaxEvalDepth</a></code></td>
> 174c174
> <       mondrian.rolap. LargeDimension Threshold</a></code></td>
> ---
>>       mondrian.rolap.LargeDimension Threshold</a></code></td>
> 185c185
> <       mondrian.rolap. SparseSegment ValueThreshold</a></code></td>
> ---
>>       mondrian.rolap.SparseSegmentValueThreshold</a></code></td>
> 226c226
> <       mondrian.rolap. SparseSegment DensityThreshold</a></code></td>
> ---
>>       mondrian.rolap.SparseSegmentDensityThreshold</a></code></td>
> 229c229
> <       <td>See <code>mondrian.rolap. SparseSegment ValueThreshold</code>.</td>
> ---
>>       <td>See <code>mondrian.rolap.SparseSegmentValueThreshold</code>.</td>
> 235c235
> <       mondrian.olap. triggers.enable</a></code></td>
> ---
>>       mondrian.olap.triggers.enable</a></code></td>
> 244c244
> <         <p>&nbsp;<code>MondrianProperties .instance() .populate(null)</code>;</p>
> ---
>>         <p>&nbsp;<code>MondrianProperties.instance().populate(null)</code>;</p>
> 249c249
> <         <p><code>MondrianProperties .instance() .QueryLimit.set(50);</code></p>
> ---
>>         <p><code>MondrianProperties.instance().QueryLimit.set(50);</code></p>
> 255c255
> <       mondrian.olap. case.sensitive</a></code></td>
> ---
>>       mondrian.olap.case.sensitive</a></code></td>
> 265c265
> <       mondrian.rolap. localePropFile</a></code></td>
> ---
>>       mondrian.rolap.localePropFile</a></code></td>
> 303,304c303
> <       <td><a href="api/mondrian/olap/MondrianProperties.html#IgnoreInvalidMembers">
> <       <code>mondrian.rolap.ignoreInvalidMembers</code></a></td>
> ---
>>       <td><code><a href="api/mondrian/olap/MondrianProperties.html#IgnoreInvalidMembers">mondrian.rolap.ignoreInvalidMembers</a></code></td>
> 312,313c311
> <       <td><a href="api/mondrian/olap/MondrianProperties.html#IterationLimit">
> <       <code>mondrian.rolap.IterationLimit</code></a></td>
> ---
>>       <td><code><a href="api/mondrian/olap/MondrianProperties.html#IterationLimit">mondrian.rolap.IterationLimit</a></code></td>
> 329a328,365
>>     <tr> 
>>       <td>
>>         <code>
>>         <a href="api/mondrian/olap/MondrianProperties.html#CrossJoinOptimizerSize">mondrian.olap.fun.crossjoin.optimizer.size</a></code></td>
>>       <td>int</td>
>>       <td>0</td>
>>       <td>
>>          If a crossjoin input list's size is larger than this property's
>>          value and the axis has the "NON EMPTY" qualifier, then
>>          the crossjoin non-empty optimizer is applied.
>>          Setting this value to '0' means that for all crossjoin
>>          input lists in non-empty axes will have the optimizer applied.
>>          On the other hand, if the value is set larger than any possible
>>          list, say <code>Integer.MAX_VALUE</code>, then the optimizer 
>>          will never be applied.
>>       </td>
>>     </tr>
>>     <tr> 
>>       <td>
>>         <code>
>>         <a href="api/mondrian/olap/MondrianProperties.html#UseImplicitMembers">mondrian.rolap.RolapResult.useImplicitMembers</a></code></td>
>>       <td>boolean</td>
>>       <td>true</td>
>>       <td>
>>          The crossjoin optimizer is flawed. It evaluates potential cells
>>          using default members when a member is not explicitly set in
>>          the particular axis. This works unless another axis, normal or
>>          slicer, uses a member other than the default.
>>          Setting this property to <code>true</code> will enable the
>>          RolapResult to collect these implied members and if any are
>>          found, then re-evaluate using the discovered members.
>>          <p>
>>          If you do not enable this property, then the crossjoin optimizer,
>>          if used, can produce errors. Bad results are produced for some
>>          queries and some data sets - its a combination of both so the 
>>          error does not manifest itself all the time.
>>       </td>
>>     </tr>
> 340c376
> <       mondrian.trace. level</a></code></td>
> ---
>>       mondrian.trace.level</a></code></td>
> 350c386
> <       mondrian.debug. out.file</a></code></td>
> ---
>>       mondrian.debug.out.file</a></code></td>
> 359c395
> <       mondrian.rolap. RolapResult. printCacheables</a></code></td>
> ---
>>       mondrian.rolap.RolapResult.printCacheables</a></code></td>
> 375c411
> <       mondrian.test. Name</a></code></td>
> ---
>>       mondrian.test.Name</a></code></td>
> 386c422
> <       mondrian.test. Class</a></code></td>
> ---
>>       mondrian.test.Class</a></code></td>
> 393c429
> <       junit .framework.Test</a></code> or has a method <code>public static
> ---
>>       junit.framework.Test</a></code> or has a method <code>public static
> 398c434
> <       mondrian.test .connectString</a></code></td>
> ---
>>       mondrian.test.connectString</a></code></td>
> 409c445
> <       mondrian.test .QueryFilePattern</a></code></td>
> ---
>>       mondrian.test.QueryFilePattern</a></code></td>
> 418c454
> <       mondrian.test .QueryFileDirectory</a></code></td>
> ---
>>       mondrian.test.QueryFileDirectory</a></code></td>
> 426c462
> <       mondrian.test .Iterations</a></code></td>
> ---
>>       mondrian.test.Iterations</a></code></td>
> 434c470
> <       mondrian.test .VUsers</a></code></td>
> ---
>>       mondrian.test.VUsers</a></code></td>
> 442c478
> <       mondrian.test .TimeLimit</a></code></td>
> ---
>>       mondrian.test.TimeLimit</a></code></td>
> 451c487
> <       mondrian.test .Warmup</a></code></td>
> ---
>>       mondrian.test.Warmup</a></code></td>
> 459c495
> <       mondrian. catalogURL</a></code></td>
> ---
>>       mondrian.catalogURL</a></code></td>
> 468c504
> <       mondrian.test .ExpDependencies</a></code></td>
> ---
>>       mondrian.test.ExpDependencies</a></code></td>
> 482c518
> <       mondrian.test .random.seed</a></code></td>
> ---
>>       mondrian.test.random.seed</a></code></td>
> 504c540
> <       mondrian.test. jdbcURL</a></code></td>
> ---
>>       mondrian.test.jdbcURL</a></code></td>
> 513c549
> <       mondrian.test .jdbcUser</a></code></td>
> ---
>>       mondrian.test.jdbcUser</a></code></td>
> 522c558
> <       mondrian.test .jdbcPassword</a></code></td>
> ---
>>       mondrian.test.jdbcPassword</a></code></td>
> 539c575
> <       mondrian.rolap .aggregates.Use</a></code></td>
> ---
>>       mondrian.rolap.aggregates.Use</a></code></td>
> 553c589
> <       mondrian.rolap .aggregates.Read</a></code></td>
> ---
>>       mondrian.rolap.aggregates.Read</a></code></td>
> 566c602
> <       mondrian.rolap. aggregates. ChooseByVolume</a></code></td>
> ---
>>       mondrian.rolap.aggregates.ChooseByVolume</a></code></td>
> 578c614
> <       mondrian.rolap. aggregates.rules</a></code></td>
> ---
>>       mondrian.rolap.aggregates.rules</a></code></td>
> 582c618
> <       (which is in the <code>mondrian.rolap .aggmatcher</code>
> ---
>>       (which is in the <code>mondrian.rolap.aggmatcher</code>
> 593c629
> <       mondrian.rolap. aggregates.rule.tag</a></code></td>
> ---
>>       mondrian.rolap.aggregates.rule.tag</a></code></td>
> 603c639
> <       <a href="api/mondrian/olap/MondrianProperties.html#GenerateAggregateSql">mondrian.rolap. aggregates. generateSql</a></code></td>
> ---
>>       <a href="api/mondrian/olap/MondrianProperties.html#GenerateAggregateSql">mondrian.rolap.aggregates.generateSql</a></code></td>
> 624c660
> <       <a href="api/mondrian/olap/MondrianProperties.html#DisableCaching">mondrian.rolap. star.disable Caching</a></code></td>
> ---
>>       <a href="api/mondrian/olap/MondrianProperties.html#DisableCaching">mondrian.rolap.star.disableCaching</a></code></td>
> 635c671
> <       <a href="api/mondrian/olap/MondrianProperties.html#EnableExpCache">mondrian.expCache .enable</a></code></td>
> ---
>>       <a href="api/mondrian/olap/MondrianProperties.html#EnableExpCache">mondrian.expCache.enable</a></code></td>
> 647c683
> <       Order([Product] .MEMBERS, [Measures].[Unit Sales]))<br>
> ---
>>       Order([Product].MEMBERS, [Measures].[Unit Sales]))<br>
> 653c689
> <       mondrian.rolap. RolapResult. flushAfter EachQuery</a></code></td>
> ---
>>       mondrian.rolap.RolapResult.flushAfterEachQuery</a></code></td>
> 669c705
> <       <a href="api/mondrian/olap/MondrianProperties.html#EnableNativeCrossJoin">mondrian.native .crossjoin.enable</a></code></td>
> ---
>>       <a href="api/mondrian/olap/MondrianProperties.html#EnableNativeCrossJoin">mondrian.native.crossjoin.enable</a></code></td>
> 680c716
> <       <a href="api/mondrian/olap/MondrianProperties.html#EnableNativeTopCount">mondrian.native .topcount.enable</a></code></td>
> ---
>>       <a href="api/mondrian/olap/MondrianProperties.html#EnableNativeTopCount">mondrian.native.topcount.enable</a></code></td>
> 690c726
> <       <a href="api/mondrian/olap/MondrianProperties.html#EnableNativeFilter">mondrian.native .filter.enable</a></code></td>
> ---
>>       <a href="api/mondrian/olap/MondrianProperties.html#EnableNativeFilter">mondrian.native.filter.enable</a></code></td>
> 701c737
> <       mondrian.native .nonempty.enable</a></code></td>
> ---
>>       mondrian.native.nonempty.enable</a></code></td>
> 713,714c749,750
> <       <td><a href="api/mondrian/olap/MondrianProperties.html#AlertNativeEvaluationUnsupported">
> <       <code>mondrian.native.unsupported.alert</code></a></td>
> ---
>>       <td><code><a
>> href="api/mondrian/olap/MondrianProperties.html#AlertNativeEvaluationUnsupported">mondrian.native.unsupported.alert</a></code></td>
> 727c763
> <       mondrian.rolap. generate.formatted .sql</a></code></td>
> ---
>>       mondrian.rolap.generate.formatted.sql</a></code></td>
> 738c774
> <       mondrian.rolap. maxConstraints</a></code></td>
> ---
>>       mondrian.rolap.maxConstraints</a></code></td>
> 766c802
> <       mondrian.xmla. drillthrough TotalCount.enable</a></code></td>
> ---
>>       mondrian.xmla.drillthrough TotalCount.enable</a></code></td>
> 775c811
> <       mondrian.xmla. drillthrough MaxRows</a></code></td>
> ---
>>       mondrian.xmla.drillthrough MaxRows</a></code></td>
> 812a849,850
>>     <tr>
>>       <td style="vertical-align: top;" colspan="4">
> 813a852,885
>>       <b><br>Factories</b>
>>       </td>
>>   </tr>
>>     <tr>
>>       <td><code>
>>       <a href="api/mondrian/olap/MondrianProperties.html#MemoryMonitorClass">
>>       mondrian.util.MemoryMonitor.class
>>       </a></code></td>
>>
>>       <td>string</td>
>>       <td>-</td>
>>       <td>
>>       By default this property does not have a value. 
>>       If set, then it is the class name of an implementation of
>>       the MemoryMonitor class and is used by the
>>       MemoryMonitorFactory to create the single instance.
>>       </td>
>>     </tr>
>>     <tr>
>>       <td><code>
>>       <a href="api/mondrian/olap/MondrianProperties.html#ExpCompilerClass">
>>       mondrian.calc.ExpCompiler.class
>>       </a></code></td>
>>
>>       <td>string</td>
>>       <td>-</td>
>>       <td>
>>       By default this property does not have a value. 
>>       If set, then it is the class name of an implementation of
>>       the ExpCompiler class and is used by the
>>       ExpCompiler.Factory to create each instance.
>>       </td>
>>     </tr>
>>
> 1091c1163
> <     Version: $Id: //open/mondrian/doc/configuration.html#20 $
> ---
>>     Version: $Id: //open/mondrian/doc/configuration.html#21 $
> 
> ==== //open/mondrian/mondrian.properties#35 (ktext) ====
> 
> 1c1
> < # $Id: //open/mondrian/mondrian.properties#34 $
> ---
>> # $Id: //open/mondrian/mondrian.properties#35 $
> 71,75c71,75
> < #mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart
> < #mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart
> < #mondrian.foodmart.jdbcUser=foodmart
> < #mondrian.foodmart.jdbcPassword=foodmart
> < #mondrian.jdbcDrivers=com.mysql.jdbc.Driver
> ---
>> mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart
>> mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart
>> mondrian.foodmart.jdbcUser=foodmart
>> mondrian.foodmart.jdbcPassword=foodmart
>> mondrian.jdbcDrivers=com.mysql.jdbc.Driver
> 284c284,290
> < mondrian.util.memoryMonitor.percentage.threshold=90
> ---
>> # If enabled, when Java5 memory monitor detects that post-garbage
>> # collection is above this value, notifications are generated.
>> #mondrian.util.memoryMonitor.percentage.threshold=90
>>
>> ###############################################################################
>> # Property for overriding default MemoryMonitor implementation.
>> #mondrian.util.MemoryMonitor.class=null
> 286a293
>> # Property for overriding default ExpCompiler implementation.
> 288c295,314
> < #mondrian.calc.ExpCompiler=mondrian.olap.fun.ResultStyleCompiler
> ---
>> #
>> # To test that for all test MDX queries that all functions can
>> # handle requests for ITERABLE, LIST and MUTABLE_LIST evalutation
>> # results, the following can be used:
>> # mondrian.calc.ExpCompiler.class=mondrian.olap.fun.ResultStyleCompiler
>> #
>> #mondrian.calc.ExpCompiler.class=null
>>
>> ###############################################################################
>> # Controls when a non-empty crossjoin input list will have the
>> # optimiztion applied base upon the list's size.
>> # The size of the list must be greater than the property value size
>> # for optimiztion.
>> # mondrian.olap.fun.crossjoin.optimizer.size=0
>>
>> ###############################################################################
>> # If true, the the RolapResult will apply its implicit member
>> # fix by merging axes when a non-empty crossjoin uses the incorrect
>> # memebers.
>> # mondrian.rolap.RolapResult.useImplicitMembers=true
> 
> ==== //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#9 (ktext) ====
> 
> 2c2
> < // $Id: //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#8 $
> ---
>> // $Id: //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#9 $
> 11a12
>> import org.eigenbase.util.property.StringProperty;
> 21c22
> <  * @version $Id: //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#8 $
> ---
>>  * @version $Id: //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#9 $
> 352a354,362
>>         /** 
>>          * Return the <code>ExpCompiler.Factory</code property name. 
>>          * 
>>          * @return <code>ExpCompiler.Factory</code> property name
>>          */
>>         protected StringProperty getStringProperty() {
>>             return MondrianProperties.instance().ExpCompilerClass;
>>         }
> 
> ==== //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#65 (ktext) ====
> 
> 2c2
> < // $Id: //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#64 $
> ---
>> // $Id: //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#65 $
> 58c58
> <  * @version $Id: //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#64 $
> ---
>>  * @version $Id: //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#65 $
> 858c858
> <         this, "mondrian.util.memoryMonitor.enable", false);
> ---
>>         this, "mondrian.util.memoryMonitor.enable", true);
> 864a865,910
>>     /**
>>      * The <code>MemoryMonitor</code> class property. If the value is 
>>      * non-null, it is used by the <code>MemoryMonitorFactory</code> 
>>      * to create the implementation.
>>      */
>>     public final StringProperty MemoryMonitorClass = new StringProperty(
>>             this, "mondrian.util.MemoryMonitor.class", null);
>>
>>     /**
>>      * The <code>ExpCompiler</code> class property. If the value is 
>>      * non-null, it is used by the <code>ExpCompiler.Factory</code> 
>>      * to create the implementation.
>>      */
>>     public final StringProperty ExpCompilerClass = new StringProperty(
>>             this, "mondrian.calc.ExpCompiler.class", null);
>>
>>     /**
>>      * If a crossjoin input list's size is larger than this property's
>>      * value and the axis has the "NON EMPTY" qualifier, then
>>      * the crossjoin non-empty optimizer is applied.
>>      * Setting this value to '0' means that for all crossjoin
>>      * input lists in non-empty axes will have the optimizer applied.
>>      * On the other hand, if the value is set larger than any possible
>>      * list, say <code>Integer.MAX_VALUE</code>, then the optimizer 
>>      * will never be applied.
>>      */
>>     public final IntegerProperty CrossJoinOptimizerSize = new IntegerProperty(
>>             this, "mondrian.olap.fun.crossjoin.optimizer.size", 0);
>>
>>     /**
>>      * The crossjoin optimizer is flawed. It evaluates potential cells
>>      * using default members when a member is not explicitly set in
>>      * the particular axis. This works unless another axis, normal or
>>      * slicer, uses a member other than the default.
>>      * Setting this property to <code>true</code> will enable the
>>      * RolapResult to collect these implied members and if any are
>>      * found, then re-evaluate using the discovered members.
>>      * <p>
>>      * If you do not enable this property, then the crossjoin optimizer,
>>      * if used, can produce errors. Bad results are produced for some
>>      * queries and some data sets - its a combination of both so the 
>>      * error does not manifest itself all the time.
>>      */
>>     public final BooleanProperty UseImplicitMembers = new BooleanProperty(
>>             this, "mondrian.rolap.RolapResult.useImplicitMembers", true);
> 
> ==== //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#7 (ktext) ====
> 
> 2c2
> < // $Id: //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#6 $
> ---
>> // $Id: //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#7 $
> 14a15
>> import org.eigenbase.util.property.StringProperty;
> 40c41
> <  * @version $Id: //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#6 $
> ---
>>  * @version $Id: //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#7 $
> 135a137,145
>>     /** 
>>      * Return the <code>MemoryMonitorFactory</code property name. 
>>      * 
>>      * @return <code>MemoryMonitorFactory</code> property name
>>      */
>>     protected StringProperty getStringProperty() {
>>         return MondrianProperties.instance().MemoryMonitorClass;
>>     }
>>
> 
> ==== //open/mondrian/src/main/mondrian/util/ObjectFactory.java#9 (ktext) ====
> 
> 2c2
> < // $Id: //open/mondrian/src/main/mondrian/util/ObjectFactory.java#8 $
> ---
>> // $Id: //open/mondrian/src/main/mondrian/util/ObjectFactory.java#9 $
> 11a12
>> import org.eigenbase.util.property.StringProperty;
> 278c279
> <  * @version $Id: //open/mondrian/src/main/mondrian/util/ObjectFactory.java#8 $
> ---
>>  * @version $Id: //open/mondrian/src/main/mondrian/util/ObjectFactory.java#9 $
> 481,482c482,485
> <      * By default the name returned is the value of a property
> <      * with key equal to the class name of the <code>interfaceClass</code>.
> ---
>>      * The factory's <code>StringProperty</code> is gotten and
>>      * if it has a non-null value, then that is returned. Otherwise,
>>      * the <code>StringProperty</code>'s name (path) is used as the
>>      * name to probe the <code>Properties</code> object for a value.
> 488,489c491,496
> <         return (props == null)
> <             ? null : props.getProperty(this.interfaceClass.getName());
> ---
>>         final StringProperty stringProp = getStringProperty();
>>         final String className = stringProp.get();
>>         return (className != null) 
>>                 ? className
>>                 : (props == null)
>>                     ? null : props.getProperty(stringProp.getPath());
> 491a499,505
>>     /** 
>>      * Return the <code>StringProperty</code> associated with this factory. 
>>      * 
>>      * @return the  <code>StringProperty</code> 
>>      */
>>     protected abstract StringProperty getStringProperty();
>>
> 




More information about the Mondrian mailing list