aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/apache/fop
diff options
context:
space:
mode:
authorJeremias Maerki <jeremias@apache.org>2006-04-28 08:51:27 +0000
committerJeremias Maerki <jeremias@apache.org>2006-04-28 08:51:27 +0000
commite15428a90dd3e0298e30fa84aa318f527b3bbec4 (patch)
tree8ef3034ab4c1b76e331b4a682e17b7c946af9104 /src/java/org/apache/fop
parente78675dcc1066e879d99ab030bd2f5731141ce6c (diff)
downloadxmlgraphics-fop-e15428a90dd3e0298e30fa84aa318f527b3bbec4.tar.gz
xmlgraphics-fop-e15428a90dd3e0298e30fa84aa318f527b3bbec4.zip
Introduced "ignored namespaces" list on FopFactory. Attributes from ignored namespaces are not complained about. Not done for elements, yet.
Added support for foreign attributes (attributes in a non-FO namespace) on formatting objects, for example to specify additional (proprietary) hints for rendering i-f-o and e-g. First usage example is PCLRendererContext which the PCLGraphics2DAdapter uses to decide whether to paint natively using HP GL/2 or using a bitmap. PCL Renderer revived: Basic framework constructed based on the old one. Still incomplete (no border painting, incomplete Graphics2D implementation, problems with reference orientation, no kerning etc.). The PCL Renderer implements PCL5 (monochrome) and HP GL/2. Work in progress! Added UnitConv helper class which could also be useful elsewhere (Could be a candidate for Commons). git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@397806 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java/org/apache/fop')
-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
15 files changed, 481 insertions, 23 deletions
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);
+ }
+
+}