tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "James Dekker" <james.dek...@gmail.com>
Subject FileNotFoundException: When Trying to Use Commons Digester
Date Sat, 27 Jan 2007 02:36:01 GMT
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: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Mime
View raw message