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]