gmazza      2004/07/05 16:47:56

  Modified:    src/java/org/apache/fop/apps Driver.java
               src/java/org/apache/fop/fo/pagination Flow.java
                        StaticContent.java
  Added:       src/java/org/apache/fop/apps DocumentInputSource.java
                        DocumentReader.java
  Removed:     src/java/org/apache/fop/tools DocumentInputSource.java
                        DocumentReader.java
  Log:
  1.) Moved DocumentInputSource & DocumentReader to apps package, made private
  to package.
  
  2.) Added validity checking to fo:static-content.
  
  3.) Bug with uninitialized FOUserAgent in Driver fixed (this will probably
  need more analysis later.)
  
  Revision  Changes    Path
  1.78      +4 -3      xml-fop/src/java/org/apache/fop/apps/Driver.java
  
  Index: Driver.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/apps/Driver.java,v
  retrieving revision 1.77
  retrieving revision 1.78
  diff -u -r1.77 -r1.78
  --- Driver.java       27 Jun 2004 13:29:32 -0000      1.77
  +++ Driver.java       5 Jul 2004 23:47:56 -0000       1.78
  @@ -38,8 +38,6 @@
   import org.apache.fop.render.awt.AWTRenderer;
   import org.apache.fop.render.mif.MIFHandler;
   import org.apache.fop.render.rtf.RTFHandler;
  -import org.apache.fop.tools.DocumentInputSource;
  -import org.apache.fop.tools.DocumentReader;
   
   /**
    * Primary class that drives overall FOP process.
  @@ -163,6 +161,9 @@
               throw new IllegalStateException("Driver already initialized");
           }
           treeBuilder = new FOTreeBuilder();
  +        if (foUserAgent == null) {
  +            foUserAgent = new FOUserAgent();
  +        }
       }
   
       /**
  
  
  
  1.1                  xml-fop/src/java/org/apache/fop/apps/DocumentInputSource.java
  
  Index: DocumentInputSource.java
  ===================================================================
  /*
   * Copyright 1999-2004 The Apache Software Foundation.
   * 
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   * 
   *      http://www.apache.org/licenses/LICENSE-2.0
   * 
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  /* $Id: DocumentInputSource.java,v 1.1 2004/07/05 23:47:56 gmazza Exp $ */
   
  package org.apache.fop.apps;
  
  import org.w3c.dom.Document;
  import org.xml.sax.InputSource;
  
  /**
   * This is an InputSource to be used with DocumentReader.
   *
   * @author Kelly A Campbell
   */
  class DocumentInputSource extends InputSource {
      
      private Document document;
  
      /**
       * Default constructor.
       */
      public DocumentInputSource() {
          super();
      }
  
      /**
       * Main constructor
       * @param document the DOM document to use as input
       */
      public DocumentInputSource(Document document) {
          this();
          setDocument(document);
      }
  
      /**
       * Returns the input document.
       * @return the input DOM document.
       */
      public Document getDocument() {
          return this.document;
      }
  
      /**
       * Sets the input document.
       * @param document the DOM document to use as input
       */
      public void setDocument(Document document) {
          this.document = document;
      }
  
  }
  
  
  
  
  
  1.1                  xml-fop/src/java/org/apache/fop/apps/DocumentReader.java
  
  Index: DocumentReader.java
  ===================================================================
  /*
   * Copyright 1999-2004 The Apache Software Foundation.
   * 
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   * 
   *      http://www.apache.org/licenses/LICENSE-2.0
   * 
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  /* $Id: DocumentReader.java,v 1.1 2004/07/05 23:47:56 gmazza Exp $ */
   
  package org.apache.fop.apps;
  
  import java.io.IOException;
  
  // DOM
  import org.w3c.dom.Attr;
  import org.w3c.dom.Document;
  import org.w3c.dom.NamedNodeMap;
  import org.w3c.dom.Node;
  
  // SAX
  import org.xml.sax.ContentHandler;
  import org.xml.sax.DTDHandler;
  import org.xml.sax.EntityResolver;
  import org.xml.sax.ErrorHandler;
  import org.xml.sax.InputSource;
  import org.xml.sax.SAXException;
  import org.xml.sax.SAXNotRecognizedException;
  import org.xml.sax.SAXNotSupportedException;
  import org.xml.sax.XMLReader;
  import org.xml.sax.helpers.AttributesImpl;
  
  /**
   * This presents a DOM as an XMLReader to make it easy to use a Document
   * with a SAX-based implementation.
   *
   * @author Kelly A Campbell
   *
   */
  
  class DocumentReader implements XMLReader {
  
      // //////////////////////////////////////////////////////////////////
      // Configuration.
      // //////////////////////////////////////////////////////////////////
      private boolean namespaces = true;
      private boolean namespacePrefixes = true;
  
  
      /**
       * Look up the value of a feature.
       *
       * <p>The feature name is any fully-qualified URI.  It is
       * possible for an XMLReader to recognize a feature name but
       * to be unable to return its value; this is especially true
       * in the case of an adapter for a SAX1 Parser, which has
       * no way of knowing whether the underlying parser is
       * performing validation or expanding external entities.</p>
       *
       * <p>All XMLReaders are required to recognize the
       * http://xml.org/sax/features/namespaces and the
       * http://xml.org/sax/features/namespace-prefixes feature names.</p>
       *
       * <p>Some feature values may be available only in specific
       * contexts, such as before, during, or after a parse.</p>
       *
       * <p>Typical usage is something like this:</p>
       *
       * <pre>
       * XMLReader r = new MySAXDriver();
       *
       * // try to activate validation
       * try {
       * r.setFeature("http://xml.org/sax/features/validation";, true);
       * } catch (SAXException e) {
       * System.err.println("Cannot activate validation.");
       * }
       *
       * // register event handlers
       * r.setContentHandler(new MyContentHandler());
       * r.setErrorHandler(new MyErrorHandler());
       *
       * // parse the first document
       * try {
       * r.parse("http://www.foo.com/mydoc.xml";);
       * } catch (IOException e) {
       * System.err.println("I/O exception reading XML document");
       * } catch (SAXException e) {
       * System.err.println("XML exception reading document.");
       * }
       * </pre>
       *
       * <p>Implementors are free (and encouraged) to invent their own features,
       * using names built on their own URIs.</p>
       *
       * @param name The feature name, which is a fully-qualified URI.
       * @return The current state of the feature (true or false).
       * @exception SAXNotRecognizedException When the
       * XMLReader does not recognize the feature name.
       * @exception SAXNotSupportedException When the
       * XMLReader recognizes the feature name but
       * cannot determine its value at this time.
       * @see #setFeature
       */
      public boolean getFeature(String name)
              throws SAXNotRecognizedException, SAXNotSupportedException {
          if ("http://xml.org/sax/features/namespaces".equals(name)) {
              return namespaces;
          } else if ("http://xml.org/sax/features/namespace-prefixes".equals(name)) {
              return namespacePrefixes;
          } else {
              throw new SAXNotRecognizedException("Feature '" + name
                      + "' not recognized or supported by Document2SAXAdapter");
          }
  
      }
  
  
  
      /**
       * Set the state of a feature.
       *
       * <p>The feature name is any fully-qualified URI.  It is
       * possible for an XMLReader to recognize a feature name but
       * to be unable to set its value; this is especially true
       * in the case of an adapter for a SAX1 [EMAIL PROTECTED] org.xml.sax.Parser 
Parser},
       * which has no way of affecting whether the underlying parser is
       * validating, for example.</p>
       *
       * <p>All XMLReaders are required to support setting
       * http://xml.org/sax/features/namespaces to true and
       * http://xml.org/sax/features/namespace-prefixes to false.</p>
       *
       * <p>Some feature values may be immutable or mutable only
       * in specific contexts, such as before, during, or after
       * a parse.</p>
       *
       * @param name The feature name, which is a fully-qualified URI.
       * @param value The requested state of the feature (true or false).
       * @exception SAXNotRecognizedException When the
       * XMLReader does not recognize the feature name.
       * @exception SAXNotSupportedException When the
       * XMLReader recognizes the feature name but
       * cannot set the requested value.
       * @see #getFeature
       */
      public void setFeature(String name, boolean value)
              throws SAXNotRecognizedException, SAXNotSupportedException {
          if ("http://xml.org/sax/features/namespaces".equals(name)) {
              namespaces = value;
          } else if ("http://xml.org/sax/features/namespace-prefixes".equals(name)) {
              namespacePrefixes = value;
          } else {
              throw new SAXNotRecognizedException("Feature '" + name
                      + "' not recognized or supported by Document2SAXAdapter");
          }
  
      }
  
  
  
      /**
       * Look up the value of a property.
       *
       * <p>The property name is any fully-qualified URI.  It is
       * possible for an XMLReader to recognize a property name but
       * to be unable to return its state; this is especially true
       * in the case of an adapter for a SAX1 [EMAIL PROTECTED] org.xml.sax.Parser
       * Parser}.</p>
       *
       * <p>XMLReaders are not required to recognize any specific
       * property names, though an initial core set is documented for
       * SAX2.</p>
       *
       * <p>Some property values may be available only in specific
       * contexts, such as before, during, or after a parse.</p>
       *
       * <p>Implementors are free (and encouraged) to invent their own properties,
       * using names built on their own URIs.</p>
       *
       * @param name The property name, which is a fully-qualified URI.
       * @return The current value of the property.
       * @exception SAXNotRecognizedException When the
       * XMLReader does not recognize the property name.
       * @exception SAXNotSupportedException When the
       * XMLReader recognizes the property name but
       * cannot determine its value at this time.
       * @see #setProperty
       */
      public Object getProperty(String name)
              throws SAXNotRecognizedException, SAXNotSupportedException {
          throw new SAXNotRecognizedException("Property '" + name
                  + "' not recognized or supported by Document2SAXAdapter");
      }
  
  
  
      /**
       * Set the value of a property.
       *
       * <p>The property name is any fully-qualified URI.  It is
       * possible for an XMLReader to recognize a property name but
       * to be unable to set its value; this is especially true
       * in the case of an adapter for a SAX1 [EMAIL PROTECTED] org.xml.sax.Parser
       * Parser}.</p>
       *
       * <p>XMLReaders are not required to recognize setting
       * any specific property names, though a core set is provided with
       * SAX2.</p>
       *
       * <p>Some property values may be immutable or mutable only
       * in specific contexts, such as before, during, or after
       * a parse.</p>
       *
       * <p>This method is also the standard mechanism for setting
       * extended handlers.</p>
       *
       * @param name The property name, which is a fully-qualified URI.
       * @param value The requested value for the property.
       * @exception SAXNotRecognizedException When the
       * XMLReader does not recognize the property name.
       * @exception SAXNotSupportedException When the
       * XMLReader recognizes the property name but
       * cannot set the requested value.
       */
      public void setProperty(String name, Object value)
              throws SAXNotRecognizedException, SAXNotSupportedException {
          throw new SAXNotRecognizedException("Property '" + name
                  + "' not recognized or supported by Document2SAXAdapter");
      }
  
  
  
      // //////////////////////////////////////////////////////////////////
      // Event handlers.
      // //////////////////////////////////////////////////////////////////
      private EntityResolver entityResolver = null;
      private DTDHandler dtdHandler = null;
      private ContentHandler contentHandler = null;
      private ErrorHandler errorHandler = null;
  
  
      /**
       * Allow an application to register an entity resolver.
       *
       * <p>If the application does not register an entity resolver,
       * the XMLReader will perform its own default resolution.</p>
       *
       * <p>Applications may register a new or different resolver in the
       * middle of a parse, and the SAX parser must begin using the new
       * resolver immediately.</p>
       *
       * @param resolver The entity resolver.
       * @see #getEntityResolver
       */
      public void setEntityResolver(EntityResolver resolver) {
          entityResolver = resolver;
      }
  
  
  
      /**
       * Return the current entity resolver.
       *
       * @return The current entity resolver, or null if none
       * has been registered.
       * @see #setEntityResolver
       */
      public EntityResolver getEntityResolver() {
          return entityResolver;
      }
  
  
  
      /**
       * Allow an application to register a DTD event handler.
       *
       * <p>If the application does not register a DTD handler, all DTD
       * events reported by the SAX parser will be silently ignored.</p>
       *
       * <p>Applications may register a new or different handler in the
       * middle of a parse, and the SAX parser must begin using the new
       * handler immediately.</p>
       *
       * @param handler The DTD handler.
       * @see #getDTDHandler
       */
      public void setDTDHandler(DTDHandler handler) {
          dtdHandler = handler;
      }
  
  
  
      /**
       * Return the current DTD handler.
       *
       * @return The current DTD handler, or null if none
       * has been registered.
       * @see #setDTDHandler
       */
      public DTDHandler getDTDHandler() {
          return dtdHandler;
      }
  
  
  
      /**
       * Allow an application to register a content event handler.
       *
       * <p>If the application does not register a content handler, all
       * content events reported by the SAX parser will be silently
       * ignored.</p>
       *
       * <p>Applications may register a new or different handler in the
       * middle of a parse, and the SAX parser must begin using the new
       * handler immediately.</p>
       *
       * @param handler The content handler.
       * @see #getContentHandler
       */
      public void setContentHandler(ContentHandler handler) {
          contentHandler = handler;
      }
  
  
  
      /**
       * Return the current content handler.
       *
       * @return The current content handler, or null if none
       * has been registered.
       * @see #setContentHandler
       */
      public ContentHandler getContentHandler() {
          return contentHandler;
      }
  
  
  
      /**
       * Allow an application to register an error event handler.
       *
       * <p>If the application does not register an error handler, all
       * error events reported by the SAX parser will be silently
       * ignored; however, normal processing may not continue.  It is
       * highly recommended that all SAX applications implement an
       * error handler to avoid unexpected bugs.</p>
       *
       * <p>Applications may register a new or different handler in the
       * middle of a parse, and the SAX parser must begin using the new
       * handler immediately.</p>
       *
       * @param handler The error handler.
       * @see #getErrorHandler
       */
      public void setErrorHandler(ErrorHandler handler) {
          errorHandler = handler;
      }
  
      /**
       * Return the current error handler.
       *
       * @return The current error handler, or null if none
       * has been registered.
       * @see #setErrorHandler
       */
      public ErrorHandler getErrorHandler() {
          return errorHandler;
      }
  
  
  
      // //////////////////////////////////////////////////////////////////
      // Parsing.
      // //////////////////////////////////////////////////////////////////
  
      /**
       * Parse an XML DOM document.
       *
       *
       *
       * @param input The input source for the top-level of the
       * XML document.
       * @exception SAXException Any SAX exception, possibly
       * wrapping another exception.
       * @exception IOException An IO exception from the parser,
       * possibly from a byte stream or character stream
       * supplied by the application.
       * @see org.xml.sax.InputSource
       * @see #parse(java.lang.String)
       * @see #setEntityResolver
       * @see #setDTDHandler
       * @see #setContentHandler
       * @see #setErrorHandler
       */
      public void parse(InputSource input) throws IOException, SAXException {
          if (input instanceof DocumentInputSource) {
              Document document = ((DocumentInputSource)input).getDocument();
              if (contentHandler == null) {
                  throw new SAXException("ContentHandler is null. Please use 
setContentHandler()");
              }
  
              // refactored from org.apache.fop.apps.Driver
              /* most of this code is modified from John Cowan's */
  
              Node currentNode;
              AttributesImpl currentAtts;
  
              /* temporary array for making Strings into character arrays */
              char[] array = null;
  
              currentAtts = new AttributesImpl();
  
              /* start at the document element */
              currentNode = document;
              while (currentNode != null) {
                  switch (currentNode.getNodeType()) {
                  case Node.DOCUMENT_NODE:
                      contentHandler.startDocument();
                      break;
                  case Node.CDATA_SECTION_NODE:
                  case Node.TEXT_NODE:
                      String data = currentNode.getNodeValue();
                      int datalen = data.length();
                      if (array == null || array.length < datalen) {
                          /*
                           * if the array isn't big enough, make a new
                           * one
                           */
                          array = new char[datalen];
                      }
                      data.getChars(0, datalen, array, 0);
                      contentHandler.characters(array, 0, datalen);
                      break;
                  case Node.PROCESSING_INSTRUCTION_NODE:
                      contentHandler.processingInstruction(currentNode.getNodeName(),
                                                            
currentNode.getNodeValue());
                      break;
                  case Node.ELEMENT_NODE:
                      NamedNodeMap map = currentNode.getAttributes();
                      currentAtts.clear();
                      for (int i = map.getLength() - 1; i >= 0; i--) {
                          Attr att = (Attr)map.item(i);
                          currentAtts.addAttribute(att.getNamespaceURI(),
                                                   att.getLocalName(),
                                                   att.getName(), "CDATA",
                                                   att.getValue());
                      }
                      contentHandler.startElement(currentNode.getNamespaceURI(),
                                                   currentNode.getLocalName(),
                                                   currentNode.getNodeName(),
                                                   currentAtts);
                      break;
                  }
  
                  Node nextNode = currentNode.getFirstChild();
                  if (nextNode != null) {
                      currentNode = nextNode;
                      continue;
                  }
  
                  while (currentNode != null) {
                      switch (currentNode.getNodeType()) {
                      case Node.DOCUMENT_NODE:
                          contentHandler.endDocument();
                          break;
                      case Node.ELEMENT_NODE:
                          contentHandler.endElement(currentNode.getNamespaceURI(),
                                                     currentNode.getLocalName(),
                                                     currentNode.getNodeName());
                          break;
                      }
  
                      nextNode = currentNode.getNextSibling();
                      if (nextNode != null) {
                          currentNode = nextNode;
                          break;
                      }
  
                      currentNode = currentNode.getParentNode();
                  }
              }
  
          } else {
              throw new SAXException("DocumentReader only supports parsing of a 
DocumentInputSource");
          }
  
      }
  
  
  
      /**
       * DocumentReader requires a DocumentInputSource, so this is not
       * implements and simply throws a SAXException. Use parse(DocumentInputSource)
       * instead
       *
       * @param systemId The system identifier (URI).
       * @exception SAXException Any SAX exception, possibly
       * wrapping another exception.
       * @exception IOException An IO exception from the parser,
       * possibly from a byte stream or character stream
       * supplied by the application.
       * @see #parse(org.xml.sax.InputSource)
       */
      public void parse(String systemId) throws IOException, SAXException {
          throw new SAXException("DocumentReader only supports parsing of a 
DocumentInputSource");
      }
  
  }
  
  
  
  
  
  1.17      +2 -2      xml-fop/src/java/org/apache/fop/fo/pagination/Flow.java
  
  Index: Flow.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/fo/pagination/Flow.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- Flow.java 4 Jul 2004 05:15:38 -0000       1.16
  +++ Flow.java 5 Jul 2004 23:47:56 -0000       1.17
  @@ -73,7 +73,7 @@
        * @see org.apache.fop.fo.FONode#validateChildNode(Locator, String, String)
        * XSL/FOP Content Model: marker* (%block;)+
        */
  -     protected void validateChildNode(Locator loc, String nsURI, String localName) {
  +    protected void validateChildNode(Locator loc, String nsURI, String localName) {
           if (nsURI == FOElementMapping.URI && localName.equals("marker")) {
               if (blockItemFound) {
                  nodesOutOfOrderError(loc, "fo:marker", "(%block;)");
  
  
  
  1.10      +28 -2     xml-fop/src/java/org/apache/fop/fo/pagination/StaticContent.java
  
  Index: StaticContent.java
  ===================================================================
  RCS file: 
/home/cvs/xml-fop/src/java/org/apache/fop/fo/pagination/StaticContent.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- StaticContent.java        12 Jun 2004 23:18:52 -0000      1.9
  +++ StaticContent.java        5 Jul 2004 23:47:56 -0000       1.10
  @@ -18,10 +18,15 @@
   
   package org.apache.fop.fo.pagination;
   
  +// XML
  +import org.xml.sax.Attributes;
  +import org.xml.sax.Locator;
  +
   // FOP
  +import org.apache.fop.apps.FOPException;
  +import org.apache.fop.fo.FOElementMapping;
   import org.apache.fop.fo.FONode;
   import org.apache.fop.fo.FOTreeVisitor;
  -import org.apache.fop.apps.FOPException;
   
   /**
    * Class modelling the fo:static-content object. See Sec. 6.4.19 of the XSL-FO
  @@ -37,6 +42,27 @@
       }
   
       private void setup() {
  +    }
  +
  +    /**
  +     * @see org.apache.fop.fo.FONode#validateChildNode(Locator, String, String)
  +     * XSL/FOP Content Model: (%block;)+
  +     */
  +    protected void validateChildNode(Locator loc, String nsURI, String localName) {
  +        if (!isBlockItem(nsURI, localName)) {
  +            invalidChildError(loc, nsURI, localName);
  +        }
  +    }
  +
  +    /**
  +     * Make sure content model satisfied, if so then tell the
  +     * StructureRenderer that we are at the end of the flow.
  +     * @see org.apache.fop.fo.FONode#end
  +     */
  +    protected void end() {
  +        if (children == null) {
  +            missingChildElementError("(%block;)+");
  +        }
       }
   
       /**
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to