keiron 01/09/13 00:49:32 Modified: src/org/apache/fop/fo DirectPropertyListBuilder.java FOTreeBuilder.java src/org/apache/fop/svg SVGElement.java Added: src/org/apache/fop/fo UnknownXMLObj.java XMLElement.java XMLObj.java Removed: src/org/apache/fop/svg XMLObj.java Log: handles foreign namespace elements and unknown elements better Revision Changes Path 1.2 +2 -2 xml-fop/src/org/apache/fop/fo/DirectPropertyListBuilder.java Index: DirectPropertyListBuilder.java =================================================================== RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/DirectPropertyListBuilder.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- DirectPropertyListBuilder.java 2001/09/12 09:28:13 1.1 +++ DirectPropertyListBuilder.java 2001/09/13 07:49:32 1.2 @@ -1,5 +1,5 @@ /* - * $Id: DirectPropertyListBuilder.java,v 1.1 2001/09/12 09:28:13 keiron Exp $ + * $Id: DirectPropertyListBuilder.java,v 1.2 2001/09/13 07:49:32 keiron Exp $ * Copyright (C) 2001 The Apache Software Foundation. All rights reserved. * For details on use and redistribution please refer to the * LICENSE file included with these sources. @@ -35,7 +35,7 @@ return ret; } - public class AttrPropertyList extends PropertyList { + public static class AttrPropertyList extends PropertyList { Attributes attributes; AttrPropertyList(Attributes attr) { super(null, null, null); 1.28 +15 -2 xml-fop/src/org/apache/fop/fo/FOTreeBuilder.java Index: FOTreeBuilder.java =================================================================== RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/FOTreeBuilder.java,v retrieving revision 1.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- FOTreeBuilder.java 2001/09/12 09:28:13 1.27 +++ FOTreeBuilder.java 2001/09/13 07:49:32 1.28 @@ -1,5 +1,5 @@ /* - * $Id: FOTreeBuilder.java,v 1.27 2001/09/12 09:28:13 keiron Exp $ + * $Id: FOTreeBuilder.java,v 1.28 2001/09/13 07:49:32 keiron Exp $ * Copyright (C) 2001 The Apache Software Foundation. All rights reserved. * For details on use and redistribution please refer to the * LICENSE file included with these sources. @@ -27,6 +27,7 @@ // Java import java.util.Hashtable; import java.util.Stack; +import java.util.Vector; import java.io.IOException; /** @@ -48,6 +49,8 @@ */ protected Hashtable fobjTable = new Hashtable(); + protected Vector namespaces = new Vector(); + /** * class that builds a property list for each formatting object */ @@ -99,6 +102,7 @@ public void addMapping(String namespaceURI, String localName, FObj.Maker maker) { this.fobjTable.put(namespaceURI + "^" + localName, maker); + this.namespaces.addElement(namespaceURI.intern()); } /** @@ -215,13 +219,20 @@ PropertyListBuilder currentListBuilder = (PropertyListBuilder)this.propertylistTable.get(uri); + boolean foreignXML = false; if (fobjMaker == null) { if (!this.unknownFOs.containsKey(fullName)) { this.unknownFOs.put(fullName, ""); log.error("Unknown formatting object " + fullName); + } + if(namespaces.contains(uri.intern())) { + // fall back + fobjMaker = new Unknown.Maker(); + } else { + fobjMaker = new UnknownXMLObj.Maker(uri, localName); + foreignXML = true; } - fobjMaker = new Unknown.Maker(); // fall back } try { @@ -231,6 +242,8 @@ currentListBuilder.makeList(fullName, attlist, (currentFObj == null) ? null : currentFObj.properties, currentFObj); + } else if(foreignXML) { + list = new DirectPropertyListBuilder.AttrPropertyList(attlist); } else { if(currentFObj == null) { throw new FOPException("Invalid XML or missing namespace"); 1.1 xml-fop/src/org/apache/fop/fo/UnknownXMLObj.java Index: UnknownXMLObj.java =================================================================== /* * $Id: UnknownXMLObj.java,v 1.1 2001/09/13 07:49:32 keiron Exp $ * Copyright (C) 2001 The Apache Software Foundation. All rights reserved. * For details on use and redistribution please refer to the * LICENSE file included with these sources. */ package org.apache.fop.fo; import org.apache.fop.fo.*; import org.apache.fop.layout.Area; import org.apache.fop.layout.FontState; import org.apache.fop.layout.inline.*; import org.apache.fop.apps.FOPException; import org.w3c.dom.Element; public class UnknownXMLObj extends XMLObj { String namespace; /** * inner class for making unknown xml objects. */ public static class Maker extends FObj.Maker { String space; String tag; Maker(String sp, String t) { space = sp; tag = t; } /** * make an unknown xml object. * * @param parent the parent formatting object * @param propertyList the explicit properties of this object * * @return the unknown xml object */ public FObj make(FObj parent, PropertyList propertyList) throws FOPException { return new UnknownXMLObj(parent, propertyList, space, tag); } } /** * returns the maker for this object. * * @return the maker for an unknown xml object */ public static FObj.Maker maker(String space, String tag) { return new UnknownXMLObj.Maker(space, tag); } /** * constructs an unknown xml object (called by Maker). * * @param parent the parent formatting object * @param propertyList the explicit properties of this object */ protected UnknownXMLObj(FObj parent, PropertyList propertyList, String space, String tag) { super(parent, propertyList, tag); this.namespace = space; this.name = this.namespace + ":" + tag; } public String getNameSpace() { return this.namespace; } protected void addChild(FONode child) { if(doc == null) { createBasicDocument(); } super.addChild(child); } protected void addCharacters(char data[], int start, int length) { if(doc == null) { createBasicDocument(); } super.addCharacters(data, start, length); } public Status layout(Area area) throws FOPException { //if (!(area instanceof ForeignObjectArea)) { // this is an error //throw new FOPException("Foreign XML not in fo:instream-foreign-object"); //} log.error("no handler defined for " + this.name + " foreign xml"); /* return status */ return new Status(Status.OK); } } 1.1 xml-fop/src/org/apache/fop/fo/XMLElement.java Index: XMLElement.java =================================================================== /* * $Id: XMLElement.java,v 1.1 2001/09/13 07:49:32 keiron Exp $ * Copyright (C) 2001 The Apache Software Foundation. All rights reserved. * For details on use and redistribution please refer to the * LICENSE file included with these sources. */ package org.apache.fop.fo; // FOP import org.apache.fop.fo.properties.*; import org.apache.fop.layout.Area; import org.apache.fop.layout.inline.*; import org.apache.fop.apps.FOPException; /** * class representing svg:svg pseudo flow object. */ public class XMLElement extends XMLObj { String namespace = ""; /** * inner class for making XML objects. */ public static class Maker extends FObj.Maker { String tag; Maker(String t) { tag = t; } /** * make an XML object. * * @param parent the parent formatting object * @param propertyList the explicit properties of this object * * @return the XML object */ public FObj make(FObj parent, PropertyList propertyList) throws FOPException { return new XMLElement(parent, propertyList, tag); } } /** * returns the maker for this object. * * @return the maker for XML objects */ public static FObj.Maker maker(String tag) { return new XMLElement.Maker(tag); } /** * constructs an XML object (called by Maker). * * @param parent the parent formatting object * @param propertyList the explicit properties of this object */ public XMLElement(FObj parent, PropertyList propertyList, String tag) { super(parent, propertyList, tag); init(); } /** * layout this formatting object. * * @param area the area to layout the object into * * @return the status of the layout */ public Status layout(final Area area) throws FOPException { if (!(area instanceof ForeignObjectArea)) { // this is an error throw new FOPException("XML not in fo:instream-foreign-object"); } /* return status */ return new Status(Status.OK); } private void init() { createBasicDocument(); } public String getNameSpace() { return namespace; } } 1.1 xml-fop/src/org/apache/fop/fo/XMLObj.java Index: XMLObj.java =================================================================== /* * $Id: XMLObj.java,v 1.1 2001/09/13 07:49:32 keiron Exp $ * Copyright (C) 2001 The Apache Software Foundation. All rights reserved. * For details on use and redistribution please refer to the * LICENSE file included with these sources. */ package org.apache.fop.fo; // FOP import org.apache.fop.fo.*; import org.apache.fop.layout.Area; import org.apache.fop.layout.FontState; import org.apache.fop.apps.FOPException; import org.apache.fop.layout.LinkSet; import org.apache.fop.datatypes.IDReferences; import org.w3c.dom.*; import org.xml.sax.Attributes; import java.util.*; /** * Since SVG objects are not layed out then this class checks * that this element is not being layed out inside some incorrect * element. */ public abstract class XMLObj extends FObj { protected String tagName = ""; protected Element element; protected Document doc; /** * * @param parent the parent formatting object * @param propertyList the explicit properties of this object */ public XMLObj(FObj parent, PropertyList propertyList, String tag) { super(parent, propertyList); tagName = tag; } public abstract String getNameSpace(); protected static Hashtable ns = new Hashtable(); public void addGraphic(Document doc, Element parent) { this.doc = doc; element = doc.createElementNS(getNameSpace(), tagName); if(this.properties instanceof DirectPropertyListBuilder.AttrPropertyList) { Attributes attr = ((DirectPropertyListBuilder.AttrPropertyList)this.properties).getAttributes(); for (int count = 0; count < attr.getLength(); count++) { String rf = attr.getValue(count); String qname = attr.getQName(count); if (qname.indexOf(":") == -1) { element.setAttribute(qname, rf); } else { String pref = qname.substring(0, qname.indexOf(":")); if (pref.equals("xmlns")) { ns.put(qname.substring(qname.indexOf(":") + 1), rf); } ns.put("xlink", "http://www.w3.org/1999/xlink"); element.setAttributeNS((String)ns.get(pref), qname, rf); } } } else { } parent.appendChild(element); } public void buildTopLevel(Document doc, Element svgRoot) { // build up the info for the top level element if(this.properties instanceof DirectPropertyListBuilder.AttrPropertyList) { Attributes attr = ((DirectPropertyListBuilder.AttrPropertyList)this.properties).getAttributes(); for (int count = 0; count < attr.getLength(); count++) { String rf = attr.getValue(count); String qname = attr.getQName(count); if (qname.indexOf(":") == -1) { element.setAttribute(qname, rf); } else { String pref = qname.substring(0, qname.indexOf(":")); if (pref.equals("xmlns")) { ns.put(qname.substring(qname.indexOf(":") + 1), rf); } ns.put("xlink", "http://www.w3.org/1999/xlink"); element.setAttributeNS((String)ns.get(pref), qname, rf); } } } else { } } public Document createBasicDocument() { doc = null; element = null; try { // DOMImplementation impl = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder().getDOMImplementation(); // String ns = GraphElementMapping.URI; // doc = impl.createDocument(ns, "graph", null); doc = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); Element el = doc.createElement("graph"); doc.appendChild(el); element = doc.getDocumentElement(); buildTopLevel(doc, element); } catch (Exception e) { e.printStackTrace(); } return doc; } protected void addChild(FONode child) { if (child instanceof XMLObj) { ((XMLObj)child).addGraphic(doc, element); } } protected void addCharacters(char data[], int start, int length) { String str = new String(data, start, length - start); org.w3c.dom.Text text = doc.createTextNode(str); element.appendChild(text); } /** * layout this formatting object. * * @param area the area to layout the object into * @return the status of the layout */ public Status layout(Area area) throws FOPException { /* generate a warning */ log.error("" + this.name + " outside foreign xml"); /* return status */ return new Status(Status.OK); } public void removeID(IDReferences idReferences) {} /** * These method overrides prevent problems with the different types. */ public void setIsInTableCell() {} public void forceStartOffset(int offset) {} public void forceWidth(int width) {} public void resetMarker() {} public void setLinkSet(LinkSet linkSet) {} public Vector getMarkerSnapshot(Vector snapshot) { return snapshot; } public void rollback(Vector snapshot) {} } 1.10 +4 -3 xml-fop/src/org/apache/fop/svg/SVGElement.java Index: SVGElement.java =================================================================== RCS file: /home/cvs/xml-fop/src/org/apache/fop/svg/SVGElement.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- SVGElement.java 2001/09/12 09:28:13 1.9 +++ SVGElement.java 2001/09/13 07:49:32 1.10 @@ -1,5 +1,5 @@ /* - * $Id: SVGElement.java,v 1.9 2001/09/12 09:28:13 keiron Exp $ + * $Id: SVGElement.java,v 1.10 2001/09/13 07:49:32 keiron Exp $ * Copyright (C) 2001 The Apache Software Foundation. All rights reserved. * For details on use and redistribution please refer to the * LICENSE file included with these sources. @@ -96,6 +96,7 @@ this.marker = 0; } + final Element svgRoot = element; /* create an SVG area */ /* if width and height are zero, get the bounds of the content. */ DefaultSVGContext dc = new DefaultSVGContext() { @@ -105,7 +106,7 @@ } public float getViewportWidth(Element e) throws IllegalStateException { - if(e == element) { + if(e == svgRoot) { ForeignObjectArea foa = (ForeignObjectArea)area; if(!foa.isContentWidthAuto()) { return foa.getContentWidth(); @@ -115,7 +116,7 @@ } public float getViewportHeight(Element e) throws IllegalStateException { - if(e == element) { + if(e == svgRoot) { ForeignObjectArea foa = (ForeignObjectArea)area; if(!foa.isContentHeightAuto()) { return foa.getContentHeight(); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]