3

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.

Praveen Kumar Mekala
  • 628
  • 1
  • 10
  • 26

1 Answers1

2

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"
Barney
  • 2,786
  • 2
  • 32
  • 34
  • @PraveenKumarMekala works for me with a quick test file - what is the contents of the xml rules you are trying to read? – Barney Nov 23 '17 at 11:20
  • am digging into my exception and got doubt, is it mandatory to define in my xml files? – Praveen Kumar Mekala Nov 27 '17 at 10:10
  • @PraveenKumarMekala yes, the DOCTYPE is required - see sample rules above. Can you post a simple version of the rules file you are trying to load? – Barney Nov 28 '17 at 07:53
  • @PraveenKumarMekala Neither of your xml snippets have closing tags - assuming that is just a cut and paste error. Added those tags and a DOCTYPE - need that as per earlier comment - then loads fine for me so not sure what to suggest. What is the full stack trace of your exception? – Barney Nov 28 '17 at 10:49