[ 
https://issues.apache.org/jira/browse/SOLR-1007?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mo Chen updated SOLR-1007:
--------------------------

    Attachment: solr-1007(solr-336).patch

> Use property values immediately after definition in every configuration files
> -----------------------------------------------------------------------------
>
>                 Key: SOLR-1007
>                 URL: https://issues.apache.org/jira/browse/SOLR-1007
>             Project: Solr
>          Issue Type: Improvement
>    Affects Versions: 1.3
>         Environment: sun-jre-1.6.0_01, apache-tomcat-6.0, apache-solr-1.3.0
>            Reporter: Mo Chen
>            Priority: Minor
>         Attachments: solr-1007(solr-336).patch
>
>
> h3. Requirement & Target
> the follwing code cause a "No system property or default value specified" 
> exception:
> {code:xml|title=solr_home/solr.xml}
> <solr>
>   <property name="foo" value="blah" />
>   <property name="bar" value="${foo}" />
> </solr>
> {code}
> because the property *foo* won't be appended to context until method 
> *CoreContainer#readProperties(Config cfg, Node node)* has been accomplished,
> the method can't used it to fill the value of property *bar*.
> The patch allow configuration files use defined property values immediately 
> in the next property definition.
> Also, base on the patch for issue [SOLR-336], the mechanism works in every 
> configuration files like *solr.xml*, and *solrconfig.xml*
> h3. Use cases:
> * define some long base dir at the begining of a configuration file
> * maps some JNDI values and refer them in other properties
> h3. Usage:
> define two main cores and some test cores, two main cores share a same 
> configuration, and test cores share another one.
> {code:xml|title=solr_home/solr.xml}
> <solr persistent="true" sharedLib="lib">
>   <property name="solr.solr.home" value="java:comp/env/solr/home" />
>   <property name="mainDir" value="${solr.solr.home:./solr}/cores/main/" />
>   <property name="testDir" value="${solr.solr.home:./solr}/cores/test/" />
>       
>   <cores adminPath="/admin/cores">
>     <core name="core1" instanceDir="${mainDir}" />
>     <core name="core2" instanceDir="${mainDir}" />
>     <core name="testcore1" instanceDir="${testDir}" />
>     ...
>   </cores>
> </solr>
> {code}
> {code:xml|title=solr_home/cores/main/conf/solrconfig.xml}
> <config>
>   <!-- this will create two data dirs: solr_home/cores/main/data/core1 & 
> solr_home/cores/main/data/core2 -->
>   <dataDir>${solr.core.instanceDir}/data/${solr.core.name}</dataDir>
>   ...
> </config>
> {code}
> h3. Coding notes: (including changes from issue [SOLR-336])
> * DOMUtil.java
>   public method *substituteProperty(String value, Properties coreProperties)*
>   {quote}??method *readProperties(Config cfg, Node node)* use it to convert 
> property values??{quote}
> * CoreContainer.java
>   move method *readProperties(Config cfg, Node node)* to *Config.java*
>   {quote}??the moved method got a Config for the first argument already... so 
> I think that will be ok??{quote}
> * Config.java
> .
>   ** *public Properties readProperties(Node node)*
>      create a *context properties* including just parsed properties, default 
> JNDI properties and loader's core properties.
>      each property value must be converted by this using 
> *DOMUtil#substituteProperty* and *substituteJNDIProperties*
>      before being appended to just parsed properties.
> .
>   ** *public Config(SolrResourceLoader loader, String name, InputStream is, 
> String prefix)*
>      create a *config properties* base on loader.getCoreProperties(), 
> overwrite JNDI properties and read properties onto it
>      and pass it to *DOMUtil.substituteProperties(doc, properties)* instead 
> of loader.getCoreProperties()
>      {quote}
>        ??this ensure the properties defined in a configuration file only 
> works in the same configuration file.??
>        ??I didn't change the core properties itself because I'm not very sure 
> about its influence...??
>        ??properties inheriting between files can be implemented by other 
> patches like [SOLR-646]??
>      {quote}
>   ** *static final Properties DEFAULT_JNDI_PROPERTIES*
>      default JNDI mappings. just mapped {{solr/home}} to {{solr.solr.home}} 
> currently.
> .
>   ** *private String substituteJNDIProperty(String value)*
>      convert a value string in JNDI format like {{java:comp/env/xxx}} into 
> real value
>      {quote}??but if you don't want it to be convert... I write 
> {{$\{:java:comp/env/xxx\}}} now. ugly... any better solution???{quote}
>   ** *private Properties substituteJNDIProperties(Properties jndiProps)*
>      convert all JNDI values in a *Properties* object
> .

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to