Hello there,

I am using the Apache Commons Digester as a way to load up and marshal
XML config files. Am using Tomcat 5.5.9 and JDK 1.5.

I have an init servlet which loads an xml file config file (holding
information to two more XML config files). I get the following
exception at runtime:

   INFO: Deploying web application archive coffeebreak.war
   2007-01-26 17:54:24,530
   DEBUG [org.coffeebreak.config.XmlConfigInitServlet] -
   commons digester rules location:
file:/C:/DevTools/tomcat/jakarta-tomcat-5.5.9/work/
       
Catalina/localhost/WEB-INF/classes/org/coffeebreak/config/affiliate-rules.xml
   2007-01-26 17:54:24,935
   DEBUG [org.coffeebreak.config.ConfigHelper] - commons digester
rules location: file:/C:/DevTools/tomcat/jakarta-tomcat-5.5.9/work/
       
Catalina/localhost/WEB-INF/classes/org/coffeebreak/config/attribute-rules.xml
   2007-01-26 17:54:24,935
   DEBUG [org.coffeebreak.config.ConfigHelper] - loading config for: Contractor
   java.lang.NullPointerException
        at java.io.FileInputStream.<init>(FileInputStream.java:103)
        at org.coffeebreak.config.ConfigHelper.parse(ConfigHelper.java:43)
        at 
org.coffeebreak.config.XmlConfigInitServlet.init(XmlConfigInitServlet.java:35)
        at javax.servlet.GenericServlet.init(GenericServlet.java:211)
        at 
org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1091)
        at 
org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:925)
        at 
org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3857)
        at 
org.apache.catalina.core.StandardContext.start(StandardContext.java:4118)

My XMLConfigServlet:

   public class XmlConfigInitServlet extends HttpServlet {

        List<AffiliateBean> affiliateList;
        
        public void init() throws ServletException {
                String affiliateFile = getInitParameter("xml-config-file");
                File xmlConfigFile = new File(affiliateFile);
                   if (!xmlConfigFile.exists()) {
                
Logger.getLogger(this.getClass()).debug(affiliateFile + "     not
found " + xmlConfigFile.getAbsolutePath());
                   }
                try {
                        affiliateList = parse(xmlConfigFile);
                        for (AffiliateBean bean : affiliateList) {
                                ConfigHelper.parse(bean.getName(), 
bean.getFileName());
                        }
                } catch (Throwable t) {
                        t.printStackTrace();
                }
        }
        
        public List<AffiliateBean> parse(File xmlConfigFile) throws
IOException, SAXException {
                URL rules = this.getClass().getResource("affiliate-rules.xml");
                Logger.getLogger(this.getClass()).debug("commons digester rules
location: "+rules);
                Digester digester = null;
                try {
                        digester = DigesterLoader.createDigester(rules);
                } catch (Throwable e) {
                        e.printStackTrace();
                        e.getCause().printStackTrace();
                }

                // Push empty list onto Digester's Stack
                List<AffiliateBean> affiliateList = new 
ArrayList<AffiliateBean>();
                   digester.push(affiliateList);

                // Parse the XML document
                InputStream input = new FileInputStream(xmlConfigFile);
                digester.parse(input);
                return affiliateList;
        }
   }

ConfigHelper (This is where the exception actually occurs, look for my
comment, in order, to pinpoint the actual line of code):

   public class ConfigHelper {
        
        private static List<AttributeConfig> attributeConfigs = new
ArrayList<AttributeConfig>();
           private static Map<String, AttributeConfig>
attributeConfigMap = new HashMap<String, AttributeConfig>();
        
        public static void parse(String name, File xmlConfigFile) throws
IOException, SAXException {
                URL rules = 
ConfigHelper.class.getResource("attribute-rules.xml");
                Logger.getLogger(ConfigHelper.class).debug("commons digester
rules location: "+rules);
                Digester digester = null;
                Logger.getLogger(ConfigHelper.class).debug("loading config for: 
"+name);
                try {
                        digester = DigesterLoader.createDigester(rules);
                } catch (Throwable e) {
                        e.printStackTrace();
                        e.getCause().printStackTrace();
                }

                // Push empty list onto Digester's Stack
                List<AttributeBean> attributeConfigList = new 
ArrayList<AttributeBean>();
                   digester.push(attributeConfigList);

                // Parse the XML document
                InputStream input = new FileInputStream(xmlConfigFile); // <--
This is where the FileNotFound Exception is occurring.
                digester.parse(input);
                
                   AttributeConfig config = new AttributeConfig(name,
attributeConfigs.size(), attributeConfigList);
                attributeConfigs.add(config);
                   attributeConfigMap.put(name, config);

Logger.getLogger(ConfigHelper.class).debug("attributes: " +
attributeConfigList);
        }
        
        public static AttributeConfig getConfig(int i) {
                return attributeConfigs.get(i);
        }

           public static AttributeConfig getConfigByName(String name) {
                   return attributeConfigMap.get(name);
           }

           public static AttributeConfig getDefaultConfig() {
                   return attributeConfigs.get(0);
           }

           public static List<AttributeConfig> getConfigs() {
                   return attributeConfigs;
           }
   }

Here's the affiliates-rules file:

   <digester-rules>
        <pattern value="affiliates/affiliate">
                <object-create-rule 
classname="org.coffeebreak.config.AffiliateBean"/>
        <set-next-rule methodname="add" paramtype="java.lang.Object"/>
        <set-properties-rule/>
        <bean-property-setter-rule pattern="name"/>
        <bean-property-setter-rule pattern="fileName"/>
        </pattern>
   </digester-rules>

AffiliateBean:

   public class AffiliateBean {
        
        private String name;

        private File fileName;

        public String getName() {
                return name;
        }
        
        public void setName(String name) {
                this.name = name;
        }
        
        public File getFileName() {
                return fileName;
        }
        
        public void setFileName(File file) {
                this.fileName = file;
        }
   }

The actual affiliates-config file itself:

   <affiliates>
        <affiliate>
                <name>Contractor</name>
                <file>/temp/contractor-config.xml</file>
        </affiliate>
        <affiliate>
                <name>Employee</name>
                <file>/temp/employee-config.xml</file>
        </affiliate>
   </affiliates>

Here's my web.xml file:

   <web-app>      
          <servlet>
               <servlet-name>xml-config-init</servlet-name>
               <servlet-class>
                    org.coffeebreak.config.XmlConfigInitServlet
               </servlet-class>
               <init-param>
                    <param-name>xml-config-file</param-name>
                   <param-value>/temp/affiliate-config.xml</param-value>
               </init-param>
              <load-on-startup>2</load-on-startup>
        </servlet>
   </web-app>

Why is it failing inside ConfigHelper? For some odd reason, it can't
seem to find the contractor-config.xml file's location from the
affiliates-config.xml file.

Sincerely,

James

---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to