You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by ad...@apache.org on 2011/02/01 21:20:03 UTC
svn commit: r1066190 - in /xmlgraphics/fop/trunk: ./
src/java/org/apache/fop/fo/ src/java/org/apache/fop/fo/properties/
test/fotree/testcases/
Author: adelmelle
Date: Tue Feb 1 20:20:02 2011
New Revision: 1066190
URL: http://svn.apache.org/viewvc?rev=1066190&view=rev
Log:
Bugzilla 48334: Added implementation for xml:base
Added:
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/properties/URIProperty.java (with props)
xmlgraphics/fop/trunk/test/fotree/testcases/xml_base.fo (with props)
Modified:
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/Constants.java
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOPropertyMapping.java
xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/PropertyList.java
xmlgraphics/fop/trunk/status.xml
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/Constants.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/Constants.java?rev=1066190&r1=1066189&r2=1066190&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/Constants.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/Constants.java Tue Feb 1 20:20:02 2011
@@ -778,9 +778,11 @@ public interface Constants {
* 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
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOPropertyMapping.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOPropertyMapping.java?rev=1066190&r1=1066189&r2=1066190&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOPropertyMapping.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOPropertyMapping.java Tue Feb 1 20:20:02 2011
@@ -64,6 +64,7 @@ import org.apache.fop.fo.properties.Stri
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;
@@ -2572,7 +2573,7 @@ public final class FOPropertyMapping imp
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 +2820,12 @@ public final class FOPropertyMapping imp
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);
+
}
}
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/PropertyList.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/PropertyList.java?rev=1066190&r1=1066189&r2=1066190&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/PropertyList.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/PropertyList.java Tue Feb 1 20:20:02 2011
@@ -312,7 +312,8 @@ public abstract class PropertyList {
attributeName = attributes.getQName(i);
attributeValue = attributes.getValue(i);
if (attributeNS == null || attributeNS.length() == 0
- || "xml:lang".equals(attributeName)) {
+ || "xml:lang".equals(attributeName)
+ || "xml:base".equals(attributeName)) {
convertAttributeToProperty(attributes, attributeName, attributeValue);
} else if (!factory.isNamespaceIgnored(attributeNS)) {
ElementMapping mapping = factory.getElementMappingRegistry().getElementMapping(
Added: xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/properties/URIProperty.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/properties/URIProperty.java?rev=1066190&view=auto
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/properties/URIProperty.java (added)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/properties/URIProperty.java Tue Feb 1 20:20:02 2011
@@ -0,0 +1,148 @@
+/*
+ * 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;
+
+/**
+ * Class modeling a property that has a value of type <uri-specification>.
+ * The purpose is mainly to support resolution of a specified
+ * relative URI against a specified or inherited <code>xml:base</code>
+ * during the property refinement stage.
+ * If no <code>xml:base</code> has been specified, only the original URI, as
+ * it appears in the source document, is stored as the property's specified
+ * value.
+ */
+public class URIProperty extends Property {
+
+ /** will be null if the URI is not resolved against an xml:base */
+ private URI resolvedURI;
+
+ /**
+ * Default constructor, to create a {@link URIProperty} from a
+ * {@code java.net.URI} directly.
+ * @param uri a resolved {@code java.net.URI}
+ */
+ protected URIProperty(URI uri) {
+ this.resolvedURI = uri;
+ }
+
+ /**
+ * Alternate constructor, to create a {@link URIProperty} from a
+ * string representation.
+ * @param uri a {@code java.lang.String} representing the URI
+ * @param resolve flag indicating whether this URI was the result of resolution
+ * @throws IllegalArgumentException if the URI should be resolved, but is not valid.
+ */
+ private URIProperty(String uri, boolean resolve) {
+ if (resolve && !(uri == null || "".equals(uri))) {
+ this.resolvedURI = URI.create(uri);
+ } else {
+ setSpecifiedValue(uri);
+ }
+ }
+
+ /**
+ * Return a string representing the resolved URI, or the
+ * specified value if the URI is not resolved against
+ * an <code>xml:base</code>
+ * @return a string representing the URI
+ */
+ @Override
+ public String getString() {
+ if (resolvedURI == null) {
+ return getSpecifiedValue();
+ } else {
+ return resolvedURI.toString();
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public String toString() {
+ return this.getString();
+ }
+
+ /**
+ * Inner {@link PropertyMaker} subclass responsible
+ * for making instances of this type.
+ */
+ public static class Maker extends PropertyMaker {
+
+ /**
+ * Create a maker for the given property id
+ *
+ * @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 URI.
+ */
+ @Override
+ 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);
+ p.setSpecifiedValue(value);
+ } else {
+ //otherwise, just store the specified value (for backward compatibility)
+ p = new URIProperty(value, false);
+ }
+ } else {
+ //xml:base defined, so resolve
+ p = new URIProperty(xmlBase.resolvedURI.resolve(specifiedURI));
+ p.setSpecifiedValue(value);
+ }
+ } catch (URISyntaxException use) {
+ // Let PropertyList propagate the exception
+ throw new PropertyException("Invalid URI specified");
+ }
+ }
+ return p;
+ }
+ }
+
+}
Propchange: xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/properties/URIProperty.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/properties/URIProperty.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: xmlgraphics/fop/trunk/status.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/status.xml?rev=1066190&r1=1066189&r2=1066190&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/status.xml (original)
+++ xmlgraphics/fop/trunk/status.xml Tue Feb 1 20:20:02 2011
@@ -59,6 +59,10 @@
documents. Example: the fix of marks layering will be such a case when it's done.
-->
<release version="FOP Trunk" date="TBD">
+ <action context="Code" dev="AD" type="add" fixes-bug="48334">
+ Added support for resolution of relative URIs against a specified xml:base during
+ property refinement.
+ </action>
<action context="Renderers" dev="JM" type="add">
Allow afp:no-operation to also appear under fo:page-sequence and fo:declarations.
</action>
Added: xmlgraphics/fop/trunk/test/fotree/testcases/xml_base.fo
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/test/fotree/testcases/xml_base.fo?rev=1066190&view=auto
==============================================================================
--- xmlgraphics/fop/trunk/test/fotree/testcases/xml_base.fo (added)
+++ xmlgraphics/fop/trunk/test/fotree/testcases/xml_base.fo Tue Feb 1 20:20:02 2011
@@ -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>
+
Propchange: xmlgraphics/fop/trunk/test/fotree/testcases/xml_base.fo
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/fop/trunk/test/fotree/testcases/xml_base.fo
------------------------------------------------------------------------------
svn:keywords = Id
---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org