You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-dev@lucene.apache.org by "Mo Chen (JIRA)" <ji...@apache.org> on 2009/02/05 08:59:59 UTC

[jira] Created: (SOLR-1007) Use property values immediately after definition in every configuration files

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


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.


[jira] Updated: (SOLR-1007) Use property values immediately after definition in every configuration files

Posted by "Mo Chen (JIRA)" <ji...@apache.org>.
     [ 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.