You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by ca...@apache.org on 2005/07/14 23:23:55 UTC

cvs commit: logging-log4j/tests/witness dom.A1.4 dom.A2.4

carnold     2005/07/14 14:23:55

  Modified:    src/java/org/apache/log4j/xml Tag: v1_2-branch
                        DOMConfigurator.java
               tests/src/java/org/apache/log4j/xml Tag: v1_2-branch
                        DOMTestCase.java
  Added:       tests/input/xml Tag: v1_2-branch DOMTest4.xml
                        DOMTest4_A1.xml DOMTest4_A2.xml
               tests/witness Tag: v1_2-branch dom.A1.4 dom.A2.4
  Log:
  Bug 23705: Parse gets confused with external entities
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.49.2.7  +73 -36    logging-log4j/src/java/org/apache/log4j/xml/DOMConfigurator.java
  
  Index: DOMConfigurator.java
  ===================================================================
  RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/xml/DOMConfigurator.java,v
  retrieving revision 1.49.2.6
  retrieving revision 1.49.2.7
  diff -u -r1.49.2.6 -r1.49.2.7
  --- DOMConfigurator.java	24 May 2005 05:06:23 -0000	1.49.2.6
  +++ DOMConfigurator.java	14 Jul 2005 21:23:48 -0000	1.49.2.7
  @@ -29,7 +29,8 @@
   import org.apache.log4j.config.PropertySetter;
   
   import org.xml.sax.InputSource;
  -import java.io.FileInputStream;
  +import org.xml.sax.SAXException;
  +import java.io.File;
   import java.io.InputStream;
   import java.io.Reader;
   import java.io.IOException;
  @@ -584,34 +585,37 @@
       xdog.setDelay(delay);
       xdog.start();
     }
  +  
  +  private interface ParseAction {
  +      Document parse(final DocumentBuilder parser) throws SAXException, IOException;
  +  }
  +
   
     public
  -  void doConfigure(String filename, LoggerRepository repository) {
  -    FileInputStream fis = null;
  -    try {
  -      fis = new FileInputStream(filename);
  -      doConfigure(fis, repository);
  -    } catch(IOException e) {
  -      LogLog.error("Could not open ["+filename+"].", e);
  -    } finally {
  -      if (fis != null) {
  -	try {
  -	  fis.close();
  -	} catch(java.io.IOException e) {
  -	  LogLog.error("Could not close ["+filename+"].", e);
  -	}
  -      }
  -    }
  +  void doConfigure(final String filename, LoggerRepository repository) {
  +    ParseAction action = new ParseAction() {
  +          public Document parse(final DocumentBuilder parser) throws SAXException, IOException {
  +              return parser.parse(new File(filename));
  +          }
  +          public String toString() { 
  +              return "file [" + filename + "]"; 
  +          }
  +    };
  +    doConfigure(action, repository);
     }
     
   
     public
  -  void doConfigure(URL url, LoggerRepository repository) {
  -    try {
  -      doConfigure(url.openStream(), repository);
  -    } catch(IOException e) {
  -      LogLog.error("Could not open ["+url+"].", e);
  -    }
  +  void doConfigure(final URL url, LoggerRepository repository) {
  +      ParseAction action = new ParseAction() {
  +          public Document parse(final DocumentBuilder parser) throws SAXException, IOException {
  +              return parser.parse(url.toString());
  +          }
  +          public String toString() { 
  +              return "url [" + url.toString() + "]"; 
  +          }
  +      };
  +      doConfigure(action, repository);
     }
   
     /**
  @@ -620,9 +624,19 @@
   
     */
     public
  -  void doConfigure(InputStream inputStream, LoggerRepository repository) 
  +  void doConfigure(final InputStream inputStream, LoggerRepository repository) 
                                             throws FactoryConfigurationError {
  -    doConfigure(new InputSource(inputStream), repository);
  +      ParseAction action = new ParseAction() {
  +          public Document parse(final DocumentBuilder parser) throws SAXException, IOException {
  +              InputSource inputSource = new InputSource(inputStream);
  +              inputSource.setSystemId("dummy://log4j.dtd");
  +              return parser.parse(inputSource);
  +          }
  +          public String toString() { 
  +              return "input stream [" + inputStream.toString() + "]"; 
  +          }
  +      };
  +      doConfigure(action, repository);
     }
   
     /**
  @@ -631,9 +645,19 @@
   
     */
     public
  -  void doConfigure(Reader reader, LoggerRepository repository) 
  +  void doConfigure(final Reader reader, LoggerRepository repository) 
                                             throws FactoryConfigurationError {
  -    doConfigure(new InputSource(reader), repository);
  +      ParseAction action = new ParseAction() {
  +          public Document parse(final DocumentBuilder parser) throws SAXException, IOException {
  +              InputSource inputSource = new InputSource(reader);
  +              inputSource.setSystemId("dummy://log4j.dtd");
  +              return parser.parse(inputSource);
  +          }
  +          public String toString() { 
  +              return "reader [" + reader.toString() + "]"; 
  +          }
  +      };
  +    doConfigure(action, repository);
     }
   
     /**
  @@ -642,8 +666,25 @@
   
     */
     protected
  -  void doConfigure(InputSource inputSource, LoggerRepository repository) 
  +  void doConfigure(final InputSource inputSource, LoggerRepository repository) 
                                             throws FactoryConfigurationError {
  +      if (inputSource.getSystemId() == null) {
  +          inputSource.setSystemId("dummy://log4j.dtd");
  +      }
  +      ParseAction action = new ParseAction() {
  +          public Document parse(final DocumentBuilder parser) throws SAXException, IOException {
  +              return parser.parse(inputSource);
  +          }
  +          public String toString() { 
  +              return "input source [" + inputSource.toString() + "]"; 
  +          }
  +      };
  +      doConfigure(action, repository);
  +    }
  +    
  +    
  +  private final void doConfigure(final ParseAction action, final LoggerRepository repository)
  +         throws FactoryConfigurationError {
       DocumentBuilderFactory dbf = null;
       this.repository = repository;
       try { 
  @@ -665,17 +706,13 @@
         DocumentBuilder docBuilder = dbf.newDocumentBuilder();
   
         docBuilder.setErrorHandler(new SAXErrorHandler());      
  -      docBuilder.setEntityResolver(new Log4jEntityResolver());        
  -      // we change the system ID to a valid URI so that Crimson won't
  -      // complain. Indeed, "log4j.dtd" alone is not a valid URI which
  -      // causes Crimson to barf. The Log4jEntityResolver only cares
  -      // about the "log4j.dtd" ending.
  -      inputSource.setSystemId("dummy://log4j.dtd");
  -      Document doc = docBuilder.parse(inputSource); 
  +      docBuilder.setEntityResolver(new Log4jEntityResolver());
  +         
  +      Document doc = action.parse(docBuilder);     
         parse(doc.getDocumentElement());
       } catch (Exception e) {
         // I know this is miserable...
  -      LogLog.error("Could not parse input source ["+inputSource+"].", e);
  +      LogLog.error("Could not parse "+ action.toString() + ".", e);
       }
     }
   
  
  
  
  No                   revision
  No                   revision
  1.1.2.1   +29 -0     logging-log4j/tests/input/xml/Attic/DOMTest4.xml
  
  
  
  
  1.1.2.1   +1 -0      logging-log4j/tests/input/xml/Attic/DOMTest4_A1.xml
  
  
  
  
  1.1.2.1   +1 -0      logging-log4j/tests/input/xml/Attic/DOMTest4_A2.xml
  
  
  
  
  No                   revision
  No                   revision
  1.5.2.3   +31 -7     logging-log4j/tests/src/java/org/apache/log4j/xml/Attic/DOMTestCase.java
  
  Index: DOMTestCase.java
  ===================================================================
  RCS file: /home/cvs/logging-log4j/tests/src/java/org/apache/log4j/xml/Attic/DOMTestCase.java,v
  retrieving revision 1.5.2.2
  retrieving revision 1.5.2.3
  diff -u -r1.5.2.2 -r1.5.2.3
  --- DOMTestCase.java	27 Jun 2005 19:40:18 -0000	1.5.2.2
  +++ DOMTestCase.java	14 Jul 2005 21:23:54 -0000	1.5.2.3
  @@ -96,6 +96,37 @@
       assertTrue(Compare.compare(FILTERED_A1, "witness/dom.A1.1"));
       assertTrue(Compare.compare(FILTERED_A2, "witness/dom.A2.1"));
     }
  +  
  +  /**
  +   *   Tests processing of external entities in XML file.
  +   */
  +  public void test4() throws Exception {
  +    DOMConfigurator.configure("input/xml/DOMTest4.xml");
  +    common();
  +
  +    ControlFilter cf1 = new ControlFilter(new String[]{TEST1_1A_PAT, TEST1_1B_PAT, 
  +					       EXCEPTION1, EXCEPTION2, EXCEPTION3});
  +
  +    ControlFilter cf2 = new ControlFilter(new String[]{TEST1_2_PAT, 
  +					       EXCEPTION1, EXCEPTION2, EXCEPTION3});
  +
  +    Transformer.transform(
  +      TEMP_A1 + ".4", FILTERED_A1 + ".4",
  +      new Filter[] {
  +        cf1, new LineNumberFilter(), new SunReflectFilter(),
  +        new JunitTestRunnerFilter()
  +      });
  +
  +    Transformer.transform(
  +      TEMP_A2 + ".4", FILTERED_A2 + ".4",
  +      new Filter[] {
  +        cf2, new LineNumberFilter(), new ISO8601Filter(),
  +        new SunReflectFilter(), new JunitTestRunnerFilter()
  +      });
  +
  +    assertTrue(Compare.compare(FILTERED_A1 + ".4", "witness/dom.A1.4"));
  +    assertTrue(Compare.compare(FILTERED_A2 + ".4", "witness/dom.A2.4"));
  +  }
   
     void common() {
       int i = -1;
  @@ -123,11 +154,4 @@
       root.error("Message " + i, e);    
   
     }
  -
  -  public static Test suite() {
  -    TestSuite suite = new TestSuite();
  -    suite.addTest(new DOMTestCase("test1"));
  -    return suite;
  -  }
  -
   }
  
  
  
  No                   revision
  No                   revision
  1.1.2.1   +93 -0     logging-log4j/tests/witness/Attic/dom.A1.4
  
  
  
  
  1.1.2.1   +62 -0     logging-log4j/tests/witness/Attic/dom.A2.4
  
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org