Alternate for DigesterLoader.createDigester(url) in digester3

784 Views Asked by At

To be precise my question would be what is the alternate method for Digester.createLoader(url) in new Digester3?

commons-digester:1.8.1 code

    URL url;
    ClassLoader curClassLoader = this.getClass().getClassLoader();
    url = curClassLoader.getResource("filepath");

    if (url != null) {          
        Digester tempDigester = DigesterLoader.createDigester(url);
        ----
        ----
        }

Now I have upgraded commons-digester-1.8.1 to org.apcahe.commons.Digester3-3.2 and in new jar I don't see any method as createDigester(ur);

How can I replace DigesterLoader.createDigester(url) using new API to get Digester object in return.

commons-digester:3.2 code

    URL url;
    ClassLoader curClassLoader = this.getClass().getClassLoader();
    url = curClassLoader.getResource("filepath");

    if (url != null) {          
        Digester tempDigester = ???;
        ----
        ----
        }

Thanks in advance.

1

There are 1 best solutions below

4
Barney On

Haven't checked exactly what the 1.8 version does, but assuming your URL resolves to a stream of XML based rules then something like this should do the trick:

import org.apache.commons.digester3.Digester;
import org.apache.commons.digester3.binder.DigesterLoader;
import org.apache.commons.digester3.binder.RulesModule;
import org.apache.commons.digester3.xmlrules.FromXmlRulesModule;

final URL url = curClassLoader.getResource("filepath");

RulesModule rules = new FromXmlRulesModule() {
  @Override
  protected void loadRules() {
    loadXMLRules(url);
  }
};

DigesterLoader loader = DigesterLoader.newLoader(rules);
Digester digester = loader.newDigester();

Note you probably have to make your URL final to use it within the anonymous subclass.

Tested with the following simple rules file:

<?xml version='1.0'?>
<!DOCTYPE digester-rules PUBLIC '-//Apache Commons //DTD digester-rules XML V1.0//EN' 'http://commons.apache.org/digester/dtds/digester-rules-3.0.dtd'>
<digester-rules>
  <pattern value='data'>
    <object-create-rule classname='test.digester.BasicTest$ClassA'/>
    <bean-property-setter-rule pattern='name' propertyname='name'/>
  </pattern>
</digester-rules>

Requires the DOCTYPE declaration, but works with or without the XML declaration. Running without the DOCTYPE gives:

Parse Error at line 1 column 17: Document root element "digester-rules", must match DOCTYPE root "null"