diff --git a/src/digester/checkstyle_checks.xml b/src/digester/checkstyle_checks.xml
new file mode 100644
index 000000000..bf8db0147
--- /dev/null
+++ b/src/digester/checkstyle_checks.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/digester/checkstyle_rules.xml b/src/digester/checkstyle_rules.xml
new file mode 100644
index 000000000..49f4f0396
--- /dev/null
+++ b/src/digester/checkstyle_rules.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/digester/com/puppycrawl/tools/checkstyle/ConfigurationDigesterLoader.java b/src/digester/com/puppycrawl/tools/checkstyle/ConfigurationDigesterLoader.java
new file mode 100644
index 000000000..db4945d24
--- /dev/null
+++ b/src/digester/com/puppycrawl/tools/checkstyle/ConfigurationDigesterLoader.java
@@ -0,0 +1,97 @@
+////////////////////////////////////////////////////////////////////////////////
+// checkstyle: Checks Java source code for adherence to a set of rules.
+// Copyright (C) 2001-2002 Oliver Burn
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+////////////////////////////////////////////////////////////////////////////////
+package com.puppycrawl.tools.checkstyle;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Properties;
+import java.util.Stack;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParserFactory;
+
+import com.puppycrawl.tools.checkstyle.api.Configuration;
+
+import org.apache.commons.digester.Digester;
+import org.apache.commons.digester.RuleSet;
+import org.apache.commons.digester.xmlrules.FromXmlRuleSet;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
+
+/**
+ * Describe class ConfigurationLoaderDigester here.
+ *
+ * @author Oliver Burn
+ * @version 1.0
+ */
+class ConfigurationDigesterLoader
+ extends DefaultHandler
+{
+ /** overriding properties **/
+ private Properties mOverrideProps = new Properties();
+
+ /**
+ * Creates a new ConfigurationLoaderDigester instance.
+ * @throws ParserConfigurationException if an error occurs
+ * @throws SAXException if an error occurs
+ */
+ private ConfigurationDigesterLoader()
+ {
+ }
+
+ /**
+ * Returns the check configurations in a specified file.
+ * @param aRulesFname name of digester rules file
+ * @param aConfigFname name of config file
+ * @param aOverrideProps overriding properties
+ * @return the check configurations
+ * @throws CheckstyleException if an error occurs
+ */
+ public static Configuration loadConfiguration(String aRulesFname,
+ String aConfigFname,
+ Properties aOverrideProps)
+ throws CheckstyleException
+ {
+ try {
+ final File rulesFile = new File(aRulesFname);
+ final File configFile = new File(aConfigFname);
+ final RuleSet ruleSet = new FromXmlRuleSet(rulesFile.toURL(),
+ new ConfigurationRuleParser());
+ final Digester digester = new Digester();
+ digester.addRuleSet(ruleSet);
+ digester.setValidating(false);
+ digester.push(new DefaultConfiguration("root"));
+ //TODO: apply aOverrideProps and perform property expansion
+ return (DefaultConfiguration) digester.parse(configFile);
+ }
+ catch (FileNotFoundException e) {
+ throw new CheckstyleException("unable to find " + aConfigFname);
+ }
+ catch (SAXException e) {
+ throw new CheckstyleException("unable to parse "
+ + aConfigFname + " - " + e.getMessage());
+ }
+ catch (IOException e) {
+ throw new CheckstyleException("unable to read " + aConfigFname);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/digester/com/puppycrawl/tools/checkstyle/ConfigurationRuleParser.java b/src/digester/com/puppycrawl/tools/checkstyle/ConfigurationRuleParser.java
new file mode 100644
index 000000000..dd01787cc
--- /dev/null
+++ b/src/digester/com/puppycrawl/tools/checkstyle/ConfigurationRuleParser.java
@@ -0,0 +1,168 @@
+package com.puppycrawl.tools.checkstyle;
+
+import org.apache.commons.digester.AbstractObjectCreationFactory;
+import org.apache.commons.digester.Digester;
+import org.apache.commons.digester.Rule;
+import org.apache.commons.digester.xmlrules.DigesterRuleParser;
+
+import org.xml.sax.Attributes;
+
+/**
+ * This is a RuleSet that parses XML into Digester rules, and then
+ * adds those rules to a 'target' Digester.
+ * @author Rick Giles
+ * @version 1-Dec-2002
+ */
+public class ConfigurationRuleParser extends DigesterRuleParser
+{
+ /** name of the Rule class */
+ private final String ruleClassName = Rule.class.getName();
+
+ /** @see org.apache.commons.digester.xmlrules.DigesterRuleParser */
+ public void addRuleInstances(Digester aDigester)
+ {
+ super.addRuleInstances(aDigester);
+ aDigester.addFactoryCreate(
+ "*/config-create-rule", new ConfigCreateRuleFactory());
+ aDigester.addRule(
+ "*/config-create-rule", new PatternRule("pattern"));
+ aDigester.addSetNext("*/config-create-rule", "add", ruleClassName);
+ }
+
+ /**
+ * Factory for creating a configCreateRule
+ */
+ protected class ConfigCreateRuleFactory
+ extends AbstractObjectCreationFactory
+ {
+ public Object createObject(Attributes anAttributes)
+ {
+ final String className = anAttributes.getValue("classname");
+
+ return new ConfigCreateRule(className);
+ }
+ }
+
+ /**
+ * A rule for extracting the pattern matching strings from the rules XML.
+ * In the digester-rules document type, a pattern can either be declared
+ * in the 'value' attribute of a element (in which case the
+ * pattern applies to all rules elements contained within the
+ * element), or it can be declared in the optional 'pattern' attribute of
+ * a rule element.
+ */
+ private class PatternRule extends Rule
+ {
+
+ private String mAttrName;
+ private String mPattern = null;
+
+ /**
+ * Creates a pattern rule.
+ * @param attrName The name of the attribute containing the pattern
+ */
+ public PatternRule(String aAttrName)
+ {
+ mAttrName = aAttrName;
+ }
+
+ /**
+ * If a pattern is defined for the attribute, push it onto the
+ * pattern stack.
+ * @param aAttrs the attributes to search.
+ *
+ */
+ public void begin(Attributes aAttrs)
+ {
+ mPattern = aAttrs.getValue(mAttrName);
+ if (mPattern != null) {
+ patternStack.push(mPattern);
+ }
+ }
+
+ /**
+ * If there was a pattern for this element, pop it off the pattern
+ * stack.
+ */
+ public void end()
+ {
+ if (mPattern != null) {
+ patternStack.pop();
+ }
+ }
+ }
+ protected class ConfigCreateRule extends Rule
+ {
+ /** name of the class for the configuration */
+ private String mClassName;
+
+ /**
+ * Construct an configuration create rule with the specified class
+ * name.
+ *
+ * @param aClassName Java class name of the object to be created
+ */
+ public ConfigCreateRule(String aClassName)
+ {
+ mClassName = aClassName;
+ }
+
+ /**
+ * Process the beginning of this element.
+ * @param aAtts The attribute list of this element
+ */
+ public void begin(Attributes aAtts)
+ {
+ // TODO: add logging
+// if (digester.log.isDebugEnabled()) {
+// digester.log.debug(
+// "[ObjectCreateRule]{" + digester.match + "}New "
+// + realClassName);
+// }
+
+ // Instantiate the new object and push it on the context stack
+ final DefaultConfiguration config =
+ new DefaultConfiguration(mClassName);
+ config.addAttribute("classname", mClassName);
+ final int attCount = aAtts.getLength();
+ for (int i = 0; i < attCount; i++) {
+ final String name = aAtts.getQName(i);
+ final String value = aAtts.getValue(i);
+ config.addAttribute(name, value);
+ }
+ final DefaultConfiguration parent =
+ (DefaultConfiguration) digester.peek();
+ parent.addChild(config);
+ digester.push(config);
+ }
+
+ /**
+ * Process the end of this element.
+ */
+ public void end()
+ {
+
+ Object top = digester.pop();
+ // TODO: add logging
+// if (digester.log.isDebugEnabled()) {
+// digester.log.debug("[ObjectCreateRule]{" + digester.match +
+// "} Pop " + top.getClass().getName());
+// }
+ }
+
+
+ /**
+ * Render a printable version of this Rule.
+ * @return a String representation of this Rule.
+ */
+ public String toString()
+ {
+ StringBuffer sb = new StringBuffer("ConfigCreateRule[");
+ sb.append("className=");
+ sb.append(mClassName);
+ sb.append("]");
+ return (sb.toString());
+ }
+
+ }
+}
diff --git a/src/digester/com/puppycrawl/tools/checkstyle/DigesterLoaderTest.java b/src/digester/com/puppycrawl/tools/checkstyle/DigesterLoaderTest.java
new file mode 100644
index 000000000..db1e97e4a
--- /dev/null
+++ b/src/digester/com/puppycrawl/tools/checkstyle/DigesterLoaderTest.java
@@ -0,0 +1,23 @@
+package com.puppycrawl.tools.checkstyle;
+
+import com.puppycrawl.tools.checkstyle.api.Configuration;
+
+
+public class DigesterLoaderTest
+{
+ public static void main(String[] args)
+ {
+ try {
+ final String inputFname = "src/digester/checkstyle_checks.xml";
+ final String rulesFname = "src/digester/checkstyle_rules.xml";
+ final Configuration config =
+ ConfigurationDigesterLoader.loadConfiguration(
+ rulesFname, inputFname, null);
+ System.out.println(config.toString());
+
+ }
+ catch (Exception exc) {
+ exc.printStackTrace();
+ }
+ }
+}
\ No newline at end of file