aboutsummaryrefslogtreecommitdiffstats
path: root/src/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java')
-rw-r--r--src/java/META-INF/services/org.apache.fop.fo.ElementMapping1
-rw-r--r--src/java/org/apache/fop/apps/FopFactory.java45
-rw-r--r--src/java/org/apache/fop/area/Area.java62
-rw-r--r--src/java/org/apache/fop/area/RegionViewport.java7
-rw-r--r--src/java/org/apache/fop/fo/ElementMappingRegistry.java8
-rw-r--r--src/java/org/apache/fop/fo/FOTreeBuilder.java9
-rw-r--r--src/java/org/apache/fop/fo/FObj.java41
-rw-r--r--src/java/org/apache/fop/fo/PropertyList.java17
-rw-r--r--src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java13
-rw-r--r--src/java/org/apache/fop/fo/extensions/OldExtensionElementMapping.java36
-rw-r--r--src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java10
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/AbstractGraphicsLayoutManager.java1
-rw-r--r--src/java/org/apache/fop/render/RendererContextConstants.java6
-rw-r--r--src/java/org/apache/fop/render/xml/XMLRenderer.java18
-rw-r--r--src/java/org/apache/fop/util/QName.java113
-rw-r--r--src/java/org/apache/fop/util/UnitConv.java118
16 files changed, 482 insertions, 23 deletions
diff --git a/src/java/META-INF/services/org.apache.fop.fo.ElementMapping b/src/java/META-INF/services/org.apache.fop.fo.ElementMapping
index b182c3a99..58bae87a3 100644
--- a/src/java/META-INF/services/org.apache.fop.fo.ElementMapping
+++ b/src/java/META-INF/services/org.apache.fop.fo.ElementMapping
@@ -2,6 +2,7 @@ org.apache.fop.fo.FOElementMapping
org.apache.fop.fo.extensions.svg.SVGElementMapping
org.apache.fop.fo.extensions.svg.BatikExtensionElementMapping
org.apache.fop.fo.extensions.ExtensionElementMapping
+org.apache.fop.fo.extensions.OldExtensionElementMapping
org.apache.fop.fo.extensions.xmp.XMPElementMapping
org.apache.fop.fo.extensions.xmp.RDFElementMapping
org.apache.fop.render.ps.extensions.PSExtensionElementMapping \ No newline at end of file
diff --git a/src/java/org/apache/fop/apps/FopFactory.java b/src/java/org/apache/fop/apps/FopFactory.java
index a0acb36a3..152d75829 100644
--- a/src/java/org/apache/fop/apps/FopFactory.java
+++ b/src/java/org/apache/fop/apps/FopFactory.java
@@ -22,17 +22,23 @@ import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
-import java.util.List;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;
+import org.xml.sax.SAXException;
+
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.apache.fop.fo.ElementMapping;
import org.apache.fop.fo.ElementMappingRegistry;
import org.apache.fop.hyphenation.HyphenationTreeResolver;
@@ -41,7 +47,6 @@ import org.apache.fop.layoutmgr.LayoutManagerMaker;
import org.apache.fop.render.RendererFactory;
import org.apache.fop.render.XMLHandlerRegistry;
import org.apache.fop.util.ContentHandlerFactoryRegistry;
-import org.xml.sax.SAXException;
/**
* Factory class which instantiates new Fop and FOUserAgent instances. This class also holds
@@ -110,6 +115,8 @@ public class FopFactory {
/** Optional overriding LayoutManagerMaker */
private LayoutManagerMaker lmMakerOverride = null;
+
+ private Set ignoredNamespaces = new java.util.HashSet();
/**
* Main constructor.
@@ -431,6 +438,40 @@ public class FopFactory {
this.pageWidth = pageWidth;
}
+ /**
+ * Adds a namespace to the set of ignored namespaces.
+ * If FOP encounters a namespace which it cannot handle, it issues a warning except if this
+ * namespace is in the ignored set.
+ * @param namespaceURI the namespace URI
+ */
+ public void ignoreNamespace(String namespaceURI) {
+ this.ignoredNamespaces.add(namespaceURI);
+ }
+
+ /**
+ * Adds a collection of namespaces to the set of ignored namespaces.
+ * If FOP encounters a namespace which it cannot handle, it issues a warning except if this
+ * namespace is in the ignored set.
+ * @param namespaceURIs the namespace URIs
+ */
+ public void ignoreNamespaces(Collection namespaceURIs) {
+ this.ignoredNamespaces.addAll(namespaceURIs);
+ }
+
+ /**
+ * Indicates whether a namespace URI is on the ignored list.
+ * @param namespaceURI the namespace URI
+ * @return true if the namespace is ignored by FOP
+ */
+ public boolean isNamespaceIgnored(String namespaceURI) {
+ return this.ignoredNamespaces.contains(namespaceURI);
+ }
+
+ /** @return the set of namespaces that are ignored by FOP */
+ public Set getIgnoredNamespace() {
+ return Collections.unmodifiableSet(this.ignoredNamespaces);
+ }
+
//------------------------------------------- Configuration stuff
/**
diff --git a/src/java/org/apache/fop/area/Area.java b/src/java/org/apache/fop/area/Area.java
index b0916abda..51c95f0ca 100644
--- a/src/java/org/apache/fop/area/Area.java
+++ b/src/java/org/apache/fop/area/Area.java
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2005 The Apache Software Foundation.
+ * Copyright 1999-2006 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.
@@ -20,13 +20,15 @@ package org.apache.fop.area;
import java.io.Serializable;
+import java.util.Collections;
+import java.util.Iterator;
import java.util.Map;
-import java.util.HashMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.fop.datatypes.ColorType;
import org.apache.fop.traits.BorderProps;
+import org.apache.fop.util.QName;
// If the area appears more than once in the output
// or if the area has external data it is cached
@@ -129,8 +131,11 @@ public class Area implements Serializable {
/**
* Traits for this area stored in a HashMap
*/
- protected HashMap props = null;
+ protected Map props = null;
+ /** Foreign attributes */
+ protected Map foreignAttributes = null;
+
/**
* logging instance
*/
@@ -462,6 +467,57 @@ public class Area implements Serializable {
}
}
+ /**
+ * Sets a foreign attribute.
+ * @param name the qualified name of the attribute
+ * @param value the attribute value
+ */
+ public void setForeignAttribute(QName name, String value) {
+ if (this.foreignAttributes == null) {
+ this.foreignAttributes = new java.util.HashMap();
+ }
+ this.foreignAttributes.put(name, value);
+ }
+
+ /**
+ * Set foreign attributes from a Map.
+ * @param atts a Map with attributes (keys: QName, values: String)
+ */
+ public void setForeignAttributes(Map atts) {
+ if (atts.size() == 0) {
+ return;
+ }
+ Iterator iter = atts.keySet().iterator();
+ while (iter.hasNext()) {
+ QName qName = (QName)iter.next();
+ String value = (String)atts.get(qName);
+ //The casting is only to ensure type safety (too bad we can't use generics, yet)
+ setForeignAttribute(qName, value);
+ }
+ }
+
+ /**
+ * Returns the value of a foreign attribute on the area.
+ * @param name the qualified name of the attribute
+ * @return the attribute value or null if it isn't set
+ */
+ public String getForeignAttributeValue(QName name) {
+ if (this.foreignAttributes != null) {
+ return (String)this.foreignAttributes.get(name);
+ } else {
+ return null;
+ }
+ }
+
+ /** @return the foreign attributes associated with this area */
+ public Map getForeignAttributes() {
+ if (this.foreignAttributes != null) {
+ return Collections.unmodifiableMap(this.foreignAttributes);
+ } else {
+ return Collections.EMPTY_MAP;
+ }
+ }
+
/** @see java.lang.Object#toString() */
public String toString() {
StringBuffer sb = new StringBuffer(super.toString());
diff --git a/src/java/org/apache/fop/area/RegionViewport.java b/src/java/org/apache/fop/area/RegionViewport.java
index ff3146e17..23017fded 100644
--- a/src/java/org/apache/fop/area/RegionViewport.java
+++ b/src/java/org/apache/fop/area/RegionViewport.java
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2006 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.
@@ -115,7 +115,10 @@ public class RegionViewport extends Area implements Cloneable {
RegionViewport rv = new RegionViewport((Rectangle2D)viewArea.clone());
rv.regionReference = (RegionReference)regionReference.clone();
if (props != null) {
- rv.props = (HashMap)props.clone();
+ rv.props = new HashMap(props);
+ }
+ if (foreignAttributes != null) {
+ rv.foreignAttributes = new HashMap(foreignAttributes);
}
return rv;
}
diff --git a/src/java/org/apache/fop/fo/ElementMappingRegistry.java b/src/java/org/apache/fop/fo/ElementMappingRegistry.java
index 8ab5a3d98..9bb0ab19b 100644
--- a/src/java/org/apache/fop/fo/ElementMappingRegistry.java
+++ b/src/java/org/apache/fop/fo/ElementMappingRegistry.java
@@ -163,4 +163,12 @@ public class ElementMappingRegistry {
return mapping.getDOMImplementation();
}
+ /**
+ * Indicates whether a namespace is known to FOP.
+ * @param namespaceURI the namespace URI
+ * @return true if the namespace is known.
+ */
+ public boolean isKnownNamespace(String namespaceURI) {
+ return this.namespaces.containsKey(namespaceURI);
+ }
}
diff --git a/src/java/org/apache/fop/fo/FOTreeBuilder.java b/src/java/org/apache/fop/fo/FOTreeBuilder.java
index 2711bd169..f64bae87a 100644
--- a/src/java/org/apache/fop/fo/FOTreeBuilder.java
+++ b/src/java/org/apache/fop/fo/FOTreeBuilder.java
@@ -304,6 +304,10 @@ public class FOTreeBuilder extends DefaultHandler {
try {
foNode = fobjMaker.make(currentFObj);
+ if (rootFObj == null) {
+ rootFObj = (Root) foNode;
+ rootFObj.setFOEventHandler(foEventHandler);
+ }
propertyList = foNode.createPropertyList(currentPropertyList, foEventHandler);
foNode.processNode(localName, getEffectiveLocator(), attlist, propertyList);
foNode.startOfNode();
@@ -325,10 +329,7 @@ public class FOTreeBuilder extends DefaultHandler {
delegate = subHandler;
}
- if (rootFObj == null) {
- rootFObj = (Root) foNode;
- rootFObj.setFOEventHandler(foEventHandler);
- } else {
+ if (currentFObj != null) {
currentFObj.addChildNode(foNode);
}
diff --git a/src/java/org/apache/fop/fo/FObj.java b/src/java/org/apache/fop/fo/FObj.java
index af45735e6..44da27900 100644
--- a/src/java/org/apache/fop/fo/FObj.java
+++ b/src/java/org/apache/fop/fo/FObj.java
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2005 The Apache Software Foundation.
+ * Copyright 1999-2006 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.
@@ -19,6 +19,7 @@
package org.apache.fop.fo;
import java.util.Collections;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
@@ -29,6 +30,7 @@ import org.apache.fop.apps.FOPException;
import org.apache.fop.fo.extensions.ExtensionAttachment;
import org.apache.fop.fo.flow.Marker;
import org.apache.fop.fo.properties.PropertyMaker;
+import org.apache.fop.util.QName;
import org.xml.sax.Attributes;
import org.xml.sax.Locator;
@@ -46,6 +48,9 @@ public abstract class FObj extends FONode implements Constants {
/** The list of extension attachments, null if none */
private List extensionAttachments = null;
+ /** The map of foreign attributes, null if none */
+ private Map foreignAttributes = null;
+
/** Used to indicate if this FO is either an Out Of Line FO (see rec)
or a descendant of one. Used during validateChildNode() FO
validation.
@@ -473,6 +478,40 @@ public abstract class FObj extends FONode implements Constants {
return extensionAttachments;
}
}
+
+ /**
+ * Adds a foreign attribute to this FObj.
+ * @param uri the namespace URI
+ * @param qName the fully qualified name
+ * @param value the attribute value
+ * @todo Handle this over FOP's property mechanism so we can use inheritance.
+ */
+ public void addForeignAttribute(String uri,
+ String qName, String value) {
+ if (qName == null) {
+ throw new NullPointerException("Parameter qName must not be null");
+ }
+ if (foreignAttributes == null) {
+ foreignAttributes = new java.util.HashMap();
+ }
+ String localName = qName;
+ String prefix = null;
+ int p = localName.indexOf(':');
+ if (p > 0) {
+ prefix = localName.substring(0, p);
+ localName = localName.substring(p + 1);
+ }
+ foreignAttributes.put(new QName(uri, prefix, localName), value);
+ }
+
+ /** @return the map of foreign attributes */
+ public Map getForeignAttributes() {
+ if (foreignAttributes == null) {
+ return Collections.EMPTY_MAP;
+ } else {
+ return foreignAttributes;
+ }
+ }
}
diff --git a/src/java/org/apache/fop/fo/PropertyList.java b/src/java/org/apache/fop/fo/PropertyList.java
index 7d4b0132d..5bf00346a 100644
--- a/src/java/org/apache/fop/fo/PropertyList.java
+++ b/src/java/org/apache/fop/fo/PropertyList.java
@@ -24,7 +24,7 @@ import org.xml.sax.Attributes;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.fop.apps.FOPException;
+import org.apache.fop.apps.FopFactory;
import org.apache.fop.fo.expr.PropertyException;
import org.apache.fop.fo.properties.CommonAbsolutePosition;
import org.apache.fop.fo.properties.CommonAccessibility;
@@ -295,13 +295,20 @@ public abstract class PropertyList {
}
String attributeNS;
+ FopFactory factory = getFObj().getUserAgent().getFactory();
for (int i = 0; i < attributes.getLength(); i++) {
/* convert all attributes with the same namespace as the fo element for this fObj */
- attributeNS = attributes.getURI(i);
- if (attributeNS.length() == 0 || attributeNS.equals(fobj.getNamespaceURI())) {
- attributeName = attributes.getQName(i);
- attributeValue = attributes.getValue(i);
+ attributeNS = attributes.getURI(i);
+ attributeName = attributes.getQName(i);
+ attributeValue = attributes.getValue(i);
+ if (attributeNS.length() == 0) {
convertAttributeToProperty(attributes, attributeName, attributeValue);
+ } else if (!factory.isNamespaceIgnored(attributeNS)) {
+ if (factory.getElementMappingRegistry().isKnownNamespace(attributeNS)) {
+ getFObj().addForeignAttribute(attributeNS, attributeName, attributeValue);
+ } else {
+ handleInvalidProperty(attributeName);
+ }
}
}
}
diff --git a/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java b/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java
index 310b61550..5f823d2a3 100644
--- a/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java
+++ b/src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2006 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.
@@ -19,16 +19,17 @@
package org.apache.fop.fo.extensions;
import org.apache.fop.fo.ElementMapping;
+import org.apache.fop.fo.UnknownXMLObj;
import java.util.HashMap;
/**
- * Element mapping for the pdf bookmark extension.
- * This sets up the mapping for the classes that handle the
- * pdf bookmark extension.
+ * Element mapping for FOP's proprietary extension to XSL-FO.
*/
public class ExtensionElementMapping extends ElementMapping {
- public static String URI = "http://xml.apache.org/fop/extensions";
+
+ /** The FOP extension namespace URI */
+ public static final String URI = "http://xmlgraphics.apache.org/fop/extensions";
/**
* Constructor.
@@ -43,6 +44,8 @@ public class ExtensionElementMapping extends ElementMapping {
protected void initialize() {
if (foObjs == null) {
foObjs = new HashMap();
+ foObjs.put("outline", new UnknownXMLObj.Maker(URI));
+ foObjs.put("label", new UnknownXMLObj.Maker(URI));
}
}
}
diff --git a/src/java/org/apache/fop/fo/extensions/OldExtensionElementMapping.java b/src/java/org/apache/fop/fo/extensions/OldExtensionElementMapping.java
new file mode 100644
index 000000000..40ff485e5
--- /dev/null
+++ b/src/java/org/apache/fop/fo/extensions/OldExtensionElementMapping.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 1999-2006 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$ */
+
+package org.apache.fop.fo.extensions;
+
+/**
+ * Element mapping for the old FOP extension namespace. It is simply mapped to the new namespace.
+ */
+public class OldExtensionElementMapping extends ExtensionElementMapping {
+
+ /** The old FOP extension namespace URI (FOP 0.20.5 and earlier) */
+ public static final String URI = "http://xml.apache.org/fop/extensions";
+
+ /**
+ * Constructor.
+ */
+ public OldExtensionElementMapping() {
+ namespaceURI = URI;
+ }
+
+}
diff --git a/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java b/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
index 5fc39972a..d8ded23fe 100644
--- a/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2005 The Apache Software Foundation.
+ * Copyright 1999-2006 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.
@@ -373,4 +373,12 @@ public abstract class AbstractLayoutManager extends AbstractBaseLayoutManager
&& isFinished());
}
+ /**
+ * Transfers foreign attributes from the formatting object to the area.
+ * @param targetArea the area to set the attributes on
+ */
+ protected void transferForeignAttributes(Area targetArea) {
+ Map atts = getFObj().getForeignAttributes();
+ targetArea.setForeignAttributes(atts);
+ }
}
diff --git a/src/java/org/apache/fop/layoutmgr/inline/AbstractGraphicsLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/AbstractGraphicsLayoutManager.java
index a02e2363d..cfe74ae4f 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/AbstractGraphicsLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/AbstractGraphicsLayoutManager.java
@@ -209,6 +209,7 @@ public abstract class AbstractGraphicsLayoutManager extends LeafNodeLayoutManage
Area viewportArea = getChildArea();
TraitSetter.setProducerID(viewportArea, fobj.getId());
+ transferForeignAttributes(viewportArea);
Viewport vp = new Viewport(viewportArea);
TraitSetter.setProducerID(vp, fobj.getId());
diff --git a/src/java/org/apache/fop/render/RendererContextConstants.java b/src/java/org/apache/fop/render/RendererContextConstants.java
index c744a82a1..742d56f68 100644
--- a/src/java/org/apache/fop/render/RendererContextConstants.java
+++ b/src/java/org/apache/fop/render/RendererContextConstants.java
@@ -44,4 +44,10 @@ public interface RendererContextConstants {
/** The configuration for the XMLHandler. */
String HANDLER_CONFIGURATION = "cfg";
+ /**
+ * An optional Map (keys: QName, values: String) with attributes containing additional hints
+ * for rendering.
+ */
+ String FOREIGN_ATTRIBUTES = "foreign-attributes";
+
}
diff --git a/src/java/org/apache/fop/render/xml/XMLRenderer.java b/src/java/org/apache/fop/render/xml/XMLRenderer.java
index 00b204ee0..e97068968 100644
--- a/src/java/org/apache/fop/render/xml/XMLRenderer.java
+++ b/src/java/org/apache/fop/render/xml/XMLRenderer.java
@@ -45,6 +45,7 @@ import org.apache.fop.render.PrintRenderer;
import org.apache.fop.render.Renderer;
import org.apache.fop.render.RendererContext;
import org.apache.fop.render.XMLHandler;
+import org.apache.fop.util.QName;
import org.apache.fop.util.XMLizable;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.FOPException;
@@ -279,6 +280,16 @@ public class XMLRenderer extends PrintRenderer {
* @param name name of the attribute
* @param value value of the attribute
*/
+ protected void addAttribute(QName name, String value) {
+ atts.addAttribute(name.getNamespaceURI(), name.getLocalName(), name.getQName(),
+ CDATA, value);
+ }
+
+ /**
+ * Adds a new attribute to the protected member variable "atts".
+ * @param name name of the attribute
+ * @param value value of the attribute
+ */
protected void addAttribute(String name, int value) {
addAttribute(name, Integer.toString(value));
}
@@ -376,6 +387,13 @@ public class XMLRenderer extends PrintRenderer {
}
}
}
+
+ //Transfer foreign attributes
+ Iterator iter = area.getForeignAttributes().entrySet().iterator();
+ while (iter.hasNext()) {
+ Map.Entry entry = (Map.Entry)iter.next();
+ addAttribute((QName)entry.getKey(), (String)entry.getValue());
+ }
}
private String createString(Rectangle2D rect) {
diff --git a/src/java/org/apache/fop/util/QName.java b/src/java/org/apache/fop/util/QName.java
new file mode 100644
index 000000000..ccfe05638
--- /dev/null
+++ b/src/java/org/apache/fop/util/QName.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2006 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$ */
+
+package org.apache.fop.util;
+
+import java.io.Serializable;
+
+/**
+ * Represents a qualified name of an XML element or an XML attribute.
+ * <p>
+ * Note: This class allows to carry a namespace prefix but it is not used in the equals() and
+ * hashCode() methods.
+ */
+public class QName implements Serializable {
+
+ private static final long serialVersionUID = -5225376740044770690L;
+
+ private String namespaceURI;
+ private String localName;
+ private String prefix;
+ private int hashCode;
+
+ /**
+ * Main constructor.
+ * @param namespaceURI the namespace URI
+ * @param prefix the namespace prefix, may be null
+ * @param localName the local name
+ */
+ public QName(String namespaceURI, String prefix, String localName) {
+ if (localName == null) {
+ throw new NullPointerException("Parameter localName must not be null");
+ }
+ if (localName.length() == 0) {
+ throw new IllegalArgumentException("Parameter localName must not be empty");
+ }
+ this.namespaceURI = namespaceURI;
+ this.prefix = prefix;
+ this.localName = localName;
+ this.hashCode = toHashString().hashCode();
+ }
+
+ /** @return the namespace URI */
+ public String getNamespaceURI() {
+ return this.namespaceURI;
+ }
+
+ /** @return the namespace prefix */
+ public String getPrefix() {
+ return this.prefix;
+ }
+
+ /** @return the local name */
+ public String getLocalName() {
+ return this.localName;
+ }
+
+ /** @return the fully qualified name */
+ public String getQName() {
+ return getPrefix() != null ? getPrefix() + ':' + getLocalName() : getLocalName();
+ }
+
+ /** @see java.lang.Object#hashCode() */
+ public int hashCode() {
+ return this.hashCode;
+ }
+
+ /** @see java.lang.Object#equals(java.lang.Object) */
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ } else if (obj == this) {
+ return true;
+ } else {
+ if (obj instanceof QName) {
+ QName other = (QName)obj;
+ if ((getNamespaceURI() == null && other.getNamespaceURI() == null)
+ || getNamespaceURI().equals(other.getNamespaceURI())) {
+ return getLocalName().equals(other.getLocalName());
+ }
+ }
+ }
+ return false;
+ }
+
+ /** @see java.lang.Object#toString() */
+ public String toString() {
+ return prefix != null
+ ? (prefix + ":" + localName)
+ : toHashString();
+ }
+
+ private String toHashString() {
+ return (namespaceURI != null
+ ? ("{" + namespaceURI + "}" + localName)
+ : localName);
+ }
+
+}
diff --git a/src/java/org/apache/fop/util/UnitConv.java b/src/java/org/apache/fop/util/UnitConv.java
new file mode 100644
index 000000000..0c16cdc3f
--- /dev/null
+++ b/src/java/org/apache/fop/util/UnitConv.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2006 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: FixedLength.java 279656 2005-09-08 22:06:48Z pietsch $ */
+
+package org.apache.fop.util;
+
+/**
+ * Utility class for unit conversions.
+ */
+public final class UnitConv {
+
+ /** conversion factory from millimeters to inches. */
+ public static final float IN2MM = 25.4f;
+
+ /** conversion factory from centimeters to inches. */
+ public static final float IN2CM = 2.54f;
+
+ /** conversion factory from inches to points. */
+ public static final int IN2PT = 72;
+
+ /**
+ * Converts millimeters (mm) to points (pt)
+ * @param mm the value in mm
+ * @return the value in pt
+ */
+ public static double mm2pt(double mm) {
+ return mm * IN2PT / IN2MM;
+ }
+
+ /**
+ * Converts millimeters (mm) to millipoints (mpt)
+ * @param mm the value in mm
+ * @return the value in mpt
+ */
+ public static double mm2mpt(double mm) {
+ return mm * 1000 * IN2PT / IN2MM;
+ }
+
+ /**
+ * Converts points (pt) to millimeters (mm)
+ * @param pt the value in pt
+ * @return the value in mm
+ */
+ public static double pt2mm(double pt) {
+ return pt * IN2MM / IN2PT;
+ }
+
+ /**
+ * Converts millimeters (mm) to inches (in)
+ * @param mm the value in mm
+ * @return the value in inches
+ */
+ public static double mm2in(double mm) {
+ return mm / IN2MM;
+ }
+
+ /**
+ * Converts inches (in) to millimeters (mm)
+ * @param in the value in inches
+ * @return the value in mm
+ */
+ public static double in2mm(double in) {
+ return in * IN2MM;
+ }
+
+ /**
+ * Converts inches (in) to millipoints (mpt)
+ * @param in the value in inches
+ * @return the value in mpt
+ */
+ public static double in2mpt(double in) {
+ return in * IN2PT * 1000;
+ }
+
+ /**
+ * Converts millipoints (mpt) to inches (in)
+ * @param mpt the value in mpt
+ * @return the value in inches
+ */
+ public static double mpt2in(double mpt) {
+ return mpt / IN2PT / 1000;
+ }
+
+ /**
+ * Converts millimeters (mm) to pixels (px)
+ * @param mm the value in mm
+ * @param resolution the resolution in dpi (dots per inch)
+ * @return the value in pixels
+ */
+ public static int mm2px(double mm, int resolution) {
+ return (int)Math.round(mm2in(mm) * resolution);
+ }
+
+ /**
+ * Converts millipoints (mpt) to pixels (px)
+ * @param mpt the value in mpt
+ * @param resolution the resolution in dpi (dots per inch)
+ * @return the value in pixels
+ */
+ public static int mpt2px(double mpt, int resolution) {
+ return (int)Math.round(mpt2in(mpt) * resolution);
+ }
+
+}