4 Replies Latest reply on Dec 15, 2010 8:42 AM by Alexey Loubyansky

    Disable system property replacement in a specific xml file

    jaikiran pai Master

      Consider the following ejb-jar.xml snippet:

      <env-entry>
         <env-entry-name>Dummy</env-entry-name>
         <env-entry-value>${java.home}</env-entry-value>
      </env-entry>
      

       

       

      By default, JBoss XB replaces ${java.home} with the value set as a System property. Is there a way, I can disable this replacement for a specific file (ejb-jar.xml in this case)?  By the way, I'm trying this against AS trunk.

        • 1. Re: Disable system property replacement in a specific xml file
          Alexey Loubyansky Master

          It can be done per SchemaBinding. E.g.

          @JBossXmlSchema(replacePropertyRefs=false)
          public class Root {...

          • 2. Re: Disable system property replacement in a specific xml file
            jaikiran pai Master

            Does that mean we can't configure it in a runtime? For example, if we wanted to disable this for ejb-jar.xml in "all" profile and allow it for ejb-jar.xml in "default" profile which share the same schema binding classes.

            • 3. Re: Disable system property replacement in a specific xml file
              Alexey Loubyansky Master

              In the AS runtime - no, we can't. There is no deployer configuration option for it.

              From the XB point of view, it's a property of SchemaBinding, so it's possible. What complicates this in the AS is that SchemaBinding's aren't directly passed to the unmarshaller. Instead SchemaResolver is responsible for providing (building & caching) SchemaBinding's *during* unmarshalling and it doesn't modify their properties initialized from annotations.

              A dirty workaround would be to get the resolver in the parsing deployer, ask it to resolve the SchemaBinding and change its property.

              • 4. Re: Disable system property replacement in a specific xml file
                Alexey Loubyansky Master

                With the addition of a new property "Map<String, SchemaBindingInitializer> schemaInitializerInstances" to SchemaResolverConfig (I'd need to make another release of xb of that), this could be done by registering a SchemaBindingInitializer that would modify the properties (initialized with metadata annotations) of the just built SchemaBinding object, e.g.

                 

                {code}public class SchemaBindingPropertyInitializer implements SchemaBindingInitializer

                {

                   private boolean replacePropertyRefs;

                 

                   public boolean isReplaceProperyRefs()

                   {

                      return replacePropertyRefs;

                   }

                 

                   public void setReplacePropertyRefs(boolean replacePropertyRefs)

                   {

                      this.replacePropertyRefs = replacePropertyRefs;

                   }

                 

                   public SchemaBinding init(SchemaBinding schema)

                   {

                      schema.setReplacePropertyRefs(replacePropertyRefs);

                      return schema;

                   }

                }{code}

                 

                Then in metadata-deployer-jboss-beans.xml we'll need to add schemaInitializerInstances property in SchemaResolverConfig like

                 

                {code:xml}<bean name="SchemaResolverConfig"

                      class="org.jboss.xb.binding.sunday.unmarshalling.SchemaResolverConfig">

                 

                      <property name="schemaInitializerInstances">

                         <map keyClass="java.lang.String" valueClass="java.lang.String">

                            <entry>

                               <key>http://java.sun.com/xml/ns/javaee</key>

                               <value>

                                  <bean class="org.jboss.xb.util.SchemaBindingPropertyInitializer">

                                     <property name="replacePropertyRefs">true</property>

                                  </bean>

                               </value>

                            </entry>

                         </map>

                      </property>

                      ...

                {code}

                 

                Note, that with this configuration every schema with target namespace javaee is going to be affected.

                 

                What do you think about this? Note, I am not sure SchemaBindingPropertyInitializer should reside in the XB codebase...