Index: src/java/org/apache/fop/fo/FOPropertyMapping.java
===================================================================
--- src/java/org/apache/fop/fo/FOPropertyMapping.java	(revision 1059626)
+++ src/java/org/apache/fop/fo/FOPropertyMapping.java	(working copy)
@@ -64,6 +64,7 @@
 import org.apache.fop.fo.properties.TableBorderPrecedence;
 import org.apache.fop.fo.properties.TextDecorationProperty;
 import org.apache.fop.fo.properties.ToBeImplementedProperty;
+import org.apache.fop.fo.properties.URIProperty;
 import org.apache.fop.fo.properties.VerticalAlignShorthandParser;
 import org.apache.fop.fo.properties.WhiteSpaceShorthandParser;
 import org.apache.fop.fo.properties.XMLLangShorthandParser;
@@ -79,9 +80,12 @@
     private FOPropertyMapping() {
     }
 
-    private static Map propNames = new HashMap();               // CSOK: VisibilityModifier
-    private static Map subPropNames = new HashMap();            // CSOK: VisibilityModifier
-    private static Map propIds = new HashMap();                 // CSOK: VisibilityModifier
+    private static Map<String, Integer> propNames
+            = new HashMap<String, Integer>();     // CSOK: VisibilityModifier
+    private static Map<String, Integer> subPropNames
+            = new HashMap<String, Integer>();  // CSOK: VisibilityModifier
+    private static Map<Integer, String> propIds
+            = new HashMap<Integer, String>();       // CSOK: VisibilityModifier
 
     private static PropertyMaker[] generics = null;             // CSOK: VisibilityModifier
 
@@ -246,8 +250,8 @@
      */
     private static void addPropertyMaker(String name, PropertyMaker maker) {
         generics[maker.getPropId()] = maker;
-        propNames.put(name, new Integer(maker.getPropId()));
-        propIds.put(new Integer(maker.getPropId()), name);
+        propNames.put(name, maker.getPropId());
+        propIds.put(maker.getPropId(), name);
     }
 
     /**
@@ -256,8 +260,8 @@
      * @param id   Id for the subproperty from CP_* in Constants.java.
      */
     private static void addSubpropMakerName(String name, int id) {
-        subPropNames.put(name, new Integer(id));
-        propIds.put(new Integer(id), name);
+        subPropNames.put(name, id);
+        propIds.put(id, name);
     }
 
     /**
@@ -342,9 +346,9 @@
      */
     public static int getPropertyId(String name) {
         if (name != null) {
-            Integer i = (Integer) propNames.get(name);
+            Integer i = propNames.get(name);
             if (i != null) {
-                return i.intValue();
+                return i;
             }
         }
         return -1;
@@ -357,9 +361,9 @@
      */
     public static int getSubPropertyId(String name) {
         if (name != null) {
-            Integer i = (Integer) subPropNames.get(name);
+            Integer i = subPropNames.get(name);
             if (i != null) {
-                return i.intValue();
+                return i;
             }
         }
         return -1;
@@ -373,10 +377,10 @@
     public static String getPropertyName(int id) {
         if (((id & Constants.COMPOUND_MASK) == 0)
                 || ((id & Constants.PROPERTY_MASK) == 0)) {
-            return (String) propIds.get(new Integer(id));
+            return propIds.get(id);
         } else {
-            return propIds.get(new Integer(id & Constants.PROPERTY_MASK))
-                    + "." + propIds.get(new Integer(id & Constants.COMPOUND_MASK));
+            return propIds.get(id & Constants.PROPERTY_MASK)
+                    + "." + propIds.get(id & Constants.COMPOUND_MASK);
         }
     }
 
@@ -2572,7 +2576,7 @@
         addPropertyMaker("score-spaces", m);
 
         // src
-        m  = new StringProperty.Maker(PR_SRC);
+        m  = new URIProperty.Maker(PR_SRC);
         m.setInherited(false);
         m.setDefault("");
         addPropertyMaker("src", m);
@@ -2819,6 +2823,12 @@
         m.setDatatypeParser(new XMLLangShorthandParser());
         addPropertyMaker("xml:lang", m);
 
+        // xml:base
+        m  = new URIProperty.Maker(PR_X_XML_BASE);
+        m.setInherited(true);
+        m.setDefault("");
+        addPropertyMaker("xml:base", m);
+
        }
 
 }
Index: src/java/org/apache/fop/fo/Constants.java
===================================================================
--- src/java/org/apache/fop/fo/Constants.java	(revision 1059626)
+++ src/java/org/apache/fop/fo/Constants.java	(working copy)
@@ -778,9 +778,11 @@
      * Used for accessibility.
      */
     int PR_X_ALT_TEXT = 275;
+    /** Property constant - FOP proprietary prototype (in XSL-FO 2.0 Requirements) */
+    int PR_X_XML_BASE = 276;
 
     /** Number of property constants defined */
-    int PROPERTY_COUNT = 275;
+    int PROPERTY_COUNT = 276;
 
     // compound property constants
 
Index: src/java/org/apache/fop/fo/properties/URIProperty.java
===================================================================
--- src/java/org/apache/fop/fo/properties/URIProperty.java	(revision 0)
+++ src/java/org/apache/fop/fo/properties/URIProperty.java	(revision 0)
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.properties;
+
+import org.apache.fop.datatypes.URISpecification;
+import org.apache.fop.fo.FObj;
+import org.apache.fop.fo.PropertyList;
+import org.apache.fop.fo.expr.PropertyException;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import static org.apache.fop.fo.Constants.PR_X_XML_BASE;
+
+public class URIProperty extends Property {
+
+    private URI resolvedURI;
+
+    /**
+     * Default constructor
+     * @param uri   a {@code java.lang.String} representing the URI
+     * @param resolve flag indicating whether this URI was the result of resolution
+     */
+    protected URIProperty(String uri, boolean resolve) {
+        if (resolve && !(uri == null || "".equals(uri))) {
+            this.resolvedURI = URI.create(uri);
+        } else {
+            setSpecifiedValue(uri);
+        }
+    }
+
+    /**
+     * Alternate constructor
+     * @param uri   a resolved {@code java.net.URI}
+     */
+    protected URIProperty(URI uri) {
+        this.resolvedURI = uri;
+    }
+
+    /**
+     * Return a string representing the resolved URI, or the
+     * specified value if the resolved URI is unavailable
+     * @return a string representing the resolved URI
+     */
+    public String getString() {
+        if (resolvedURI == null) {
+            return getSpecifiedValue();
+        } else {
+            return resolvedURI.toString();
+        }
+    }
+
+    /** {@inheritDoc} */
+    public String toString() {
+        return this.getString();
+    }
+
+    public static class Maker extends PropertyMaker {
+
+        /**
+         * @param propId the id of the property for which a Maker should be created
+         */
+        public Maker(int propId) {
+            super(propId);
+        }
+
+        /**
+         * {@inheritDoc}
+         * Check if {@code xml:base} has been specified and whether the
+         * given {@code value} represents a relative URI. If so, create
+         * a property representing the resolved absolute URI.
+         * @throws PropertyException in case the given value does not
+         * represent a valid URI
+         */
+        public Property make(PropertyList propertyList, String value,
+                             FObj fo) throws PropertyException {
+
+            Property p = null;
+            //special treament for data: URIs
+            if (value.matches("(?s)^(url\\(('|\")?)?data:.*$")) {
+                p = new URIProperty(value, false);
+            } else {
+                try {
+                    URI specifiedURI = new URI(URISpecification.escapeURI(value));
+                    URIProperty xmlBase = (URIProperty)propertyList.get(PR_X_XML_BASE, true, false);
+                    if (xmlBase == null) {
+                        //xml:base undefined
+                        if (this.propId == PR_X_XML_BASE) {
+                            //if current property is xml:base, define a new one
+                            p = new URIProperty(specifiedURI);
+                        } else {
+                            //otherwise, just store the specified value
+                            p = new URIProperty(value, false);
+                        }
+                    } else {
+                        //xml:base defined, so resolve
+                        p = new URIProperty(xmlBase.resolvedURI.resolve(specifiedURI));
+                    }
+                } catch (URISyntaxException use) {
+                    //TODO: Add event handler
+                    throw new PropertyException(use);
+                }
+            }
+            return p;
+        }
+    }
+    
+}

Property changes on: src/java/org/apache/fop/fo/properties/URIProperty.java
___________________________________________________________________
Added: svn:keywords
   + Id
Added: svn:eol-style
   + native

Index: test/fotree/testcases/xml_base.fo
===================================================================
--- test/fotree/testcases/xml_base.fo	(revision 0)
+++ test/fotree/testcases/xml_base.fo	(revision 0)
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You 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$ -->
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:test="http://xmlgraphics.apache.org/fop/test">
+  <fo:layout-master-set>
+    <fo:simple-page-master master-name="simple" page-width="5in" page-height="5in">
+      <fo:region-body />
+    </fo:simple-page-master>
+  </fo:layout-master-set>
+  <fo:page-sequence master-reference="simple" id="simple-cases">
+    <fo:flow flow-name="xsl-region-body">
+      <fo:block xml:base="http://foo.bar.com/resources/index.html?p=1">
+        <fo:external-graphic src="url(images/image-1.png)">
+          <!-- should be resolved against xml:base of the parent -->
+          <test:assert property="src" expected="http://foo.bar.com/resources/images/image-1.png" />
+        </fo:external-graphic>
+        <fo:block xml:base="images/">
+          <fo:external-graphic src="image-1.png">
+            <!-- should be resolved against resolved xml:base of the parent -->
+            <test:assert property="src" expected="http://foo.bar.com/resources/images/image-1.png" />
+          </fo:external-graphic>
+        </fo:block>
+        <fo:block xml:base="/resources/images/">
+          <fo:external-graphic src="image-1.png">
+            <!-- xml:base is a relative URI starting at the root, should resolve to the same as the above two -->
+            <test:assert property="src" expected="http://foo.bar.com/resources/images/image-1.png" />
+          </fo:external-graphic>
+        </fo:block>
+      </fo:block>
+      <fo:block>
+        <fo:external-graphic src="images/image-1.png">
+          <!-- no xml:base, so should stay a relative URI -->
+          <test:assert property="src" expected="images/image-1.png" />
+        </fo:external-graphic>
+      </fo:block>
+      <fo:block xml:base="./resources/">
+        <fo:external-graphic src="images/image-1.png">
+          <!-- relative xml:base without inherited value, should stay a relative URI -->
+          <test:assert property="src" expected="resources/images/image-1.png" />
+        </fo:external-graphic>
+      </fo:block>
+      <fo:block xml:base="http://foo.bar.com/resources with spaces/images/index.html?p=1">
+        <fo:external-graphic src="image-1.png">
+          <!-- resolved absolute URI with spaces, should yield the normalized string representation -->
+          <test:assert property="src" expected="http://foo.bar.com/resources%20with%20spaces/images/image-1.png" />
+        </fo:external-graphic>
+      </fo:block>
+      <fo:block xml:base="./resources with spaces/images/">
+        <fo:external-graphic src="image-1.png">
+          <!-- resolved relative URI with spaces, should yield the normalized string representation -->
+          <test:assert property="src" expected="resources%20with%20spaces/images/image-1.png" />
+        </fo:external-graphic>
+      </fo:block>
+      <fo:block>
+        <fo:external-graphic src="http://foo.bar.com/resources with spaces/images/image-1.png">
+          <!-- unresolved URI with spaces, should yield the specified value (for backward compatibility) -->
+          <test:assert property="src" expected="http://foo.bar.com/resources with spaces/images/image-1.png" />
+        </fo:external-graphic>
+        <fo:external-graphic src="url('./resources with spaces/images/image-1.png')">
+          <!-- unresolved URI with spaces, should yield the specified value (for backward compatibility) -->
+          <test:assert property="src" expected="url('./resources with spaces/images/image-1.png')" />
+        </fo:external-graphic>
+      </fo:block>
+    </fo:flow>
+  </fo:page-sequence>
+</fo:root>
+

Property changes on: test/fotree/testcases/xml_base.fo
___________________________________________________________________
Added: svn:keywords
   + Id
Added: svn:eol-style
   + native

