001    /*
002    @license.text@
003     */
004    package biz.hammurapi.ant;
005    
006    import java.io.File;
007    
008    import javax.xml.parsers.DocumentBuilder;
009    import javax.xml.parsers.DocumentBuilderFactory;
010    
011    import org.apache.tools.ant.BuildException;
012    import org.apache.tools.ant.Project;
013    import org.apache.tools.ant.Task;
014    import org.w3c.dom.Element;
015    
016    /**
017     * Base class for elements, which need to read xml files.
018     * @author Pavel Vlasov
019     * @version $Revision: 1.2 $
020     */
021    public class XmlSourceEntry extends Task {
022    
023        /** Holds value of property failOnError. */
024        private boolean failOnError = true;
025    
026        /**
027         * Fail build if unable to read source. Default is true.
028         * @ant.non-required
029         */
030        public void setFailOnError(boolean failOnError) {
031            this.failOnError = failOnError;
032        }
033    
034        /** Getter for property failOnError.
035         * @return Value of property failOnError.
036         */
037        public boolean isFailOnError() {
038            return this.failOnError;
039        }
040    
041        /**
042         * URL to read rules from. 
043         * @ant.non-required Yes, unless file is set.
044         */
045        public void setURL(String url) {
046            this.url = url;
047        }
048    
049        /** Getter for property URL.
050         * @return Value of property URL.
051         */
052        public String getURL() {
053            return this.url;
054        }
055    
056        /**
057         * File to read rules from.
058         * @ant.required Yes, unless URL is set.
059         */
060        public void setFile(File file) {
061            this.file=file;
062        }
063    
064        /** Getter for property file.
065         * @return Value of property file.
066         */
067        public File getFile() {
068            return this.file;
069        }
070    
071        /** Holds value of property URL. */
072        private String url;
073        /** Holds value of property file. */
074        private File file;
075    
076        public Element getDocumentElement() {
077            if (file!=null && url!=null) {
078                throw new BuildException("file and url are mutually exclusive");
079            }
080            
081            try {
082                DocumentBuilder builder=DocumentBuilderFactory.newInstance().newDocumentBuilder();
083                if (file!=null) {
084                            if (failOnError && !(file.exists() && file.isFile())) {
085                                    throw new BuildException(file.getAbsolutePath()+" does not exist or is not a file");
086                            }
087    
088                    if (getProject()!=null) {
089                            log("Parsing "+file.getAbsolutePath(), Project.MSG_VERBOSE);
090                    }
091                    return builder.parse(file).getDocumentElement(); 
092                } else if (url!=null) {
093                    if (getProject()!=null) {
094                            log("Parsing URL "+url, Project.MSG_VERBOSE);
095                    }
096                    java.net.URL theURL=new java.net.URL(url);
097                    return builder.parse(theURL.openStream()).getDocumentElement();
098                } else {
099                    throw new BuildException("file or url must be set");
100                }
101            } catch (Exception e) {
102                if (failOnError) {
103                    throw new BuildException("Cannot load xml document", e);
104                }
105                
106                            return null;
107            }        
108        }    
109    }