]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Bugzilla#48954: Support for character encoding of TLEs in AFP output. Submitted by PH.
authorMehdi Houshmand <mehdi@apache.org>
Fri, 24 Aug 2012 14:50:54 +0000 (14:50 +0000)
committerMehdi Houshmand <mehdi@apache.org>
Fri, 24 Aug 2012 14:50:54 +0000 (14:50 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1376950 13f79535-47bb-0310-9956-ffa450edef68

14 files changed:
src/documentation/content/xdocs/trunk/output.xml
src/java/org/apache/fop/afp/DataStream.java
src/java/org/apache/fop/afp/Factory.java
src/java/org/apache/fop/afp/modca/AbstractPageObject.java
src/java/org/apache/fop/afp/modca/PageGroup.java
src/java/org/apache/fop/afp/modca/TagLogicalElement.java
src/java/org/apache/fop/afp/modca/TagLogicalElementBean.java [deleted file]
src/java/org/apache/fop/afp/modca/triplets/EncodingTriplet.java [new file with mode: 0644]
src/java/org/apache/fop/fo/FONode.java
src/java/org/apache/fop/render/afp/AFPDocumentHandler.java
src/java/org/apache/fop/render/afp/extensions/AFPExtensionHandler.java
src/java/org/apache/fop/render/afp/extensions/AFPPageSetup.java
src/java/org/apache/fop/render/afp/extensions/AFPPageSetupElement.java
status.xml

index 7c4ace72e676634bfc82dbbb71a8cfc116deabd5..4f792971b04d4b30aa10d8bdac2785c02c2ae323 100644 (file)
@@ -971,7 +971,8 @@ Note that the value of the encoding attribute in the example is the double-byte
      xmlns:afp="http://xmlgraphics.apache.org/fop/extensions/afp">
       <fo:layout-master-set>
         <fo:simple-page-master master-name="simple">
-          <afp:tag-logical-element name="The TLE Name" value="The TLE Value" />
+          <afp:tag-logical-element name="The TLE Name" value="The TLE Value"
+            encoding="500" />
           <fo:region-body/>
         </fo:simple-page-master>
       </fo:layout-master-set>
@@ -985,7 +986,7 @@ Note that the value of the encoding attribute in the example is the double-byte
           The tag-logical-element extension element can appear within a simple-page-master
           (page level) or it can appear as child of page-sequence (page group level).
           Multiple tag-logical-element extension elements within a simple-page-master or
-          page-sequence are allowed. The name and value attributes are mandatory.
+          page-sequence are allowed. The name and value attributes are mandatory.  The encoding attribute specifying a CCSID encoding is optional.  
         </p>
       </section>
       <section id="afp-no-operation">
index 2794ae932ee346df12df2f41ddab0023de6f268f..9225df79687c1a7764c3d3edec2a84f9451ab03d 100644 (file)
@@ -40,7 +40,7 @@ import org.apache.fop.afp.modca.Overlay;
 import org.apache.fop.afp.modca.PageGroup;
 import org.apache.fop.afp.modca.PageObject;
 import org.apache.fop.afp.modca.ResourceGroup;
-import org.apache.fop.afp.modca.TagLogicalElementBean;
+import org.apache.fop.afp.modca.TagLogicalElement;
 import org.apache.fop.afp.modca.triplets.FullyQualifiedNameTriplet;
 import org.apache.fop.afp.ptoca.PtocaBuilder;
 import org.apache.fop.afp.ptoca.PtocaProducer;
@@ -90,7 +90,7 @@ public class DataStream {
 
     /** The MO:DCA interchange set in use (default to MO:DCA-P IS/2 set) */
     private InterchangeSet interchangeSet
-        = InterchangeSet.valueOf(InterchangeSet.MODCA_PRESENTATION_INTERCHANGE_SET_2);
+    = InterchangeSet.valueOf(InterchangeSet.MODCA_PRESENTATION_INTERCHANGE_SET_2);
 
     private final Factory factory;
 
@@ -544,17 +544,19 @@ public class DataStream {
         currentPage.createIncludePageSegment(name, xOrigin, yOrigin, createHardPageSegments);
     }
 
+
+
     /**
      * Creates a TagLogicalElement on the current page.
      *
      * @param attributes
      *            the array of key value pairs.
      */
-    public void createPageTagLogicalElement(TagLogicalElementBean[] attributes) {
+
+    public void createPageTagLogicalElement(TagLogicalElement.State[] attributes) {
         for (int i = 0; i < attributes.length; i++) {
-            String name = attributes[i].getKey();
-            String value = attributes[i].getValue();
-            currentPage.createTagLogicalElement(name, value, tleSequence++);
+
+            currentPage.createTagLogicalElement(attributes[i], tleSequence++);
         }
     }
 
@@ -564,11 +566,9 @@ public class DataStream {
      * @param attributes
      *            the array of key value pairs.
      */
-    public void createPageGroupTagLogicalElement(TagLogicalElementBean[] attributes) {
+    public void createPageGroupTagLogicalElement(TagLogicalElement.State[] attributes) {
         for (int i = 0; i < attributes.length; i++) {
-            String name = attributes[i].getKey();
-            String value = attributes[i].getValue();
-            currentPageGroup.createTagLogicalElement(name, value);
+            currentPageGroup.createTagLogicalElement(attributes[i]);
         }
     }
 
@@ -579,12 +579,17 @@ public class DataStream {
      *            The tag name
      * @param value
      *            The tag value
+     * @param encoding The CCSID character set encoding
      */
-    public void createTagLogicalElement(String name, String value) {
+    public void createTagLogicalElement(String name, String value, int encoding) {
+
+        TagLogicalElement.State tleState = new  TagLogicalElement.State(name, value, encoding);
         if (currentPage != null) {
-            currentPage.createTagLogicalElement(name, value, tleSequence++);
+
+            currentPage.createTagLogicalElement(tleState, tleSequence++);
+
         } else {
-            currentPageGroup.createTagLogicalElement(name, value);
+            currentPageGroup.createTagLogicalElement(tleState);
         }
     }
 
index ef68a22fb3d02c123cf11263ace6c57d76f782ae..a1cfbc66e3013e2043938b91d92e3d6a7f0ed095 100644 (file)
@@ -374,13 +374,13 @@ public class Factory {
     /**
      * Creates a MO:DCA {@link TagLogicalElement}
      *
-     * @param name name of the element
-     * @param value value of the element
+     * @param state the attribute state for the TLE
      * @param tleSequence current start tle sequence number within stream*
      * @return a new {@link TagLogicalElement}
      */
-    public TagLogicalElement createTagLogicalElement(String name, String value, int tleSequence) {
-        TagLogicalElement tle = new TagLogicalElement(name, value, tleSequence);
+    public TagLogicalElement createTagLogicalElement(TagLogicalElement.State state,
+            int tleSequence) {
+        TagLogicalElement tle = new TagLogicalElement(state, tleSequence);
         return tle;
     }
 
index e8b8bc1df792ed2ac41beae60d5d4b5c84ff458d..11b5f98b5e970d333d2e29e7be1e13c6fcef8095 100644 (file)
@@ -223,19 +223,16 @@ public abstract class AbstractPageObject extends AbstractNamedAFPObject implemen
     /**
      * Creates a TagLogicalElement on the page.
      *
-     * @param name
-     *            the name of the tag
-     * @param value
-     *            the value of the tag
-     * @param tleID
-     *            unique ID within AFP stream
+     * @param state the state of the TLE
+     * @param tleID the id of the TLE
      */
-    public void createTagLogicalElement(String name, String value, int tleID) {
-        TagLogicalElement tle = new TagLogicalElement(name, value, tleID);
+    public void createTagLogicalElement(TagLogicalElement.State state, int tleID) {
+        TagLogicalElement tle = new TagLogicalElement(state, tleID);
         List list = getTagLogicalElements();
         list.add(tle);
     }
 
+
     /**
      * Creates a NoOperation on the page.
      *
index e7c18d72b49a73cf31443b83920726874dc545a0..50f7ecde6718a245a92e590de35c32ba720e7862 100644 (file)
@@ -55,13 +55,11 @@ public class PageGroup extends AbstractResourceEnvironmentGroupContainer {
     /**
      * Creates a TagLogicalElement on the page.
      *
-     * @param name
-     *            the name of the tag
-     * @param value
-     *            the value of the tag
+     * @param state
+     *              the state of the TLE
      */
-    public void createTagLogicalElement(String name, String value) {
-        TagLogicalElement tle = factory.createTagLogicalElement(name, value, tleSequence);
+    public void createTagLogicalElement(TagLogicalElement.State state) {
+        TagLogicalElement tle = factory.createTagLogicalElement(state, tleSequence);
         if (!getTagLogicalElements().contains(tle)) {
             getTagLogicalElements().add(tle);
             tleSequence++;
index 706ceae3b411a3bc189377338925b3277e3f7336..c5efa13e6acb62526cfb043d4ffcddd0cc238cd7 100644 (file)
@@ -24,6 +24,7 @@ import java.io.OutputStream;
 
 import org.apache.fop.afp.modca.triplets.AttributeQualifierTriplet;
 import org.apache.fop.afp.modca.triplets.AttributeValueTriplet;
+import org.apache.fop.afp.modca.triplets.EncodingTriplet;
 import org.apache.fop.afp.modca.triplets.FullyQualifiedNameTriplet;
 import org.apache.fop.afp.util.BinaryUtils;
 
@@ -49,15 +50,9 @@ import org.apache.fop.afp.util.BinaryUtils;
 public class TagLogicalElement extends AbstractTripletStructuredObject {
 
     /**
-     * Name of the key, used within the TLE
+     * the params of the TLE
      */
-    private String name = null;
-
-    /**
-     * Value returned by the key
-     */
-    private String value = null;
-
+    private State state;
     /**
      * Sequence of TLE within document
      */
@@ -66,25 +61,26 @@ public class TagLogicalElement extends AbstractTripletStructuredObject {
     /**
      * Construct a tag logical element with the name and value specified.
      *
-     * @param name the name of the tag logical element
-     * @param value the value of the tag logical element
+     * @param state the state of the tag logical element
      * @param tleID unique identifier for TLE within AFP stream
      */
-    public TagLogicalElement(String name, String value, int tleID) {
-        this.name = name;
-        this.value = value;
+
+    public TagLogicalElement(State state, int tleID) {
+        this.state = state;
+
         this.tleID = tleID;
     }
 
-    /**
-     * Sets the attribute value of this structured field
-     *
-     * @param value the attribute value
-     */
-    public void setAttributeValue(String value) {
+    private void setAttributeValue(String value) {
         addTriplet(new AttributeValueTriplet(value));
     }
 
+    private void setEncoding(int encoding) {
+        if (encoding != State.ENCODING_NONE) {
+            addTriplet(new EncodingTriplet(encoding));
+        }
+    }
+
     /**
      * Sets the attribute qualifier of this structured field
      *
@@ -100,8 +96,9 @@ public class TagLogicalElement extends AbstractTripletStructuredObject {
         setFullyQualifiedName(
                 FullyQualifiedNameTriplet.TYPE_ATTRIBUTE_GID,
                 FullyQualifiedNameTriplet.FORMAT_CHARSTR,
-                name);
-        setAttributeValue(value);
+                state.key);
+        setAttributeValue(state.value);
+        setEncoding(state.encoding);
         setAttributeQualifier(tleID, 1);
 
         byte[] data = new byte[SF_HEADER_LENGTH];
@@ -115,4 +112,51 @@ public class TagLogicalElement extends AbstractTripletStructuredObject {
 
         writeTriplets(os);
     }
+
+    /**
+     *
+     * Holds the attribute state of a TLE
+     *
+     */
+    public static class State {
+
+        /**
+         *  value  interpreted as no encoding
+         */
+        public static final int ENCODING_NONE = -1;
+        /** The key attribute */
+        private String key;
+
+        /** The value attribute */
+        private String value;
+
+        /** The CCSID character et encoding attribute */
+        private int encoding =  ENCODING_NONE;
+
+
+        /**
+         * Constructor
+         *
+         * @param key the key attribute
+         * @param value the value attribute
+         */
+        public State(String key, String value) {
+            this.key = key;
+            this.value = value;
+        }
+
+        /**
+         *
+         * @param key the key attribute
+         * @param value the value attribute
+         * @param encoding the CCSID character set encoding attribute
+         */
+        public State(String key, String value, int encoding) {
+            this.key = key;
+            this.value = value;
+            this.encoding = encoding;
+        }
+
+
+    }
 }
diff --git a/src/java/org/apache/fop/afp/modca/TagLogicalElementBean.java b/src/java/org/apache/fop/afp/modca/TagLogicalElementBean.java
deleted file mode 100644 (file)
index 923a5d5..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * 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.afp.modca;
-
-/**
- * The TagLogicalElementBean provides a bean for holding the attributes of
- * a tag logical element as key value pairs.
- * <p/>
- */
-public class TagLogicalElementBean {
-
-    /** The key attribute */
-    private String key;
-
-    /** The value attribute */
-    private String value;
-
-    /**
-     * Constructor for the TagLogicalElementBean.
-     *
-     * @param key the key attribute
-     * @param value the value attribute
-     */
-    public TagLogicalElementBean(String key, String value) {
-        this.key = key;
-        this.value = value;
-    }
-
-    /**
-     * Getter for the key attribute.
-     *
-     * @return the key
-     */
-    public String getKey() {
-        return key;
-    }
-
-    /**
-     * Getter for the value attribute.
-     *
-     * @return the value
-     */
-    public String getValue() {
-        return value;
-    }
-
-}
diff --git a/src/java/org/apache/fop/afp/modca/triplets/EncodingTriplet.java b/src/java/org/apache/fop/afp/modca/triplets/EncodingTriplet.java
new file mode 100644 (file)
index 0000000..05e56e5
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * 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.afp.modca.triplets;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.apache.fop.afp.util.BinaryUtils;
+/**
+ *
+ * Represents a CCSID encoding triplet.
+ *
+ */
+public class EncodingTriplet extends AbstractTriplet {
+
+
+    private int encoding;
+    /**
+     * @param encoding the CCSID character set encoding
+     */
+    public EncodingTriplet( int encoding) {
+        super(CODED_GRAPHIC_CHARACTER_SET_GLOBAL_IDENTIFIER);
+        this.encoding = encoding;
+    }
+    /** {@inheritDoc} */
+    public void writeToStream(OutputStream os) throws IOException {
+
+        // [len,id,0,0,0,0]
+        byte[] data = getData();
+
+        byte[] encodingBytes = BinaryUtils.convert(encoding, 2);
+
+        // [len,id,0,0,0,0] -> [len.id,0,0,encodingBytes[0],encodingBytes[1]]
+        System.arraycopy(encodingBytes, 0, data, 4, encodingBytes.length);
+
+        os.write(data);
+
+    }
+
+    /** {@inheritDoc} */
+    public int getDataLength() {
+        //len(1b) + id(1b) + 0x0000 (2b) + encoding (2b) = 6b
+        return 6;
+    }
+
+}
index c66259f11c76f1b82c57fa3eee1a18e6acd735be..8b55e6d301ab01799b6e5c2b2f808e30640cb8ff 100644 (file)
@@ -38,6 +38,7 @@ import org.apache.fop.accessibility.StructureTreeElement;
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.complexscripts.bidi.DelimitedTextRange;
+import org.apache.fop.fo.expr.PropertyException;
 import org.apache.fop.fo.extensions.ExtensionAttachment;
 import org.apache.fop.fo.extensions.ExtensionElementMapping;
 import org.apache.fop.fo.extensions.InternalElementMapping;
@@ -601,6 +602,22 @@ public abstract class FONode implements Cloneable {
         getFOValidationEventProducer().missingProperty(this, getName(), propertyName, locator);
     }
 
+
+
+    /**
+     * Helper function to throw an error caused by an invalid property
+     *
+     * @param propertyName the name of the property.
+     * @param propertyValue the value of the property.
+     * * @param e optional property parsing exception.
+     * @throws ValidationException the validation error provoked by the method call
+     */
+    protected void invalidPropertyValueError(String propertyName, String propertyValue, Exception e)
+                throws ValidationException {
+        getFOValidationEventProducer().invalidPropertyValue(this, getName(), propertyName,
+                propertyValue,  new PropertyException(e), locator);
+    }
+
     /**
      * Helper function to return "Error(line#/column#)" string for
      * above exception messages
index a0b1e99db9afa037a4cd4885b5bb561a29cbcf19..35db42ac465f557633a85be671e4451b330a7947 100644 (file)
@@ -318,7 +318,8 @@ public class AFPDocumentHandler extends AbstractBinaryWritingIFDocumentHandler
                 case IN_PAGE_HEADER:
                     String name = aps.getName();
                     String value = aps.getValue();
-                    dataStream.createTagLogicalElement(name, value);
+                    int encoding = aps.getEncoding();
+                    dataStream.createTagLogicalElement(name, value, encoding);
                     break;
                 default:
                     throw new IFException(
index 14a34a0b385fe4a766c4869f6354709b45673ae3..abf6e359ed59c78f668d2f40778e8f5b44ab87f9 100644 (file)
@@ -144,6 +144,12 @@ public class AFPExtensionHandler extends DefaultHandler
                 if (placement != null && placement.length() > 0) {
                     pageSetupExtn.setPlacement(ExtensionPlacement.fromXMLValue(placement));
                 }
+
+                String encoding =  lastAttributes.getValue("encoding");
+                if (encoding != null && pageSetupExtn != null) {
+                    pageSetupExtn.setEncoding(Integer.parseInt(encoding));
+                }
+
                 if (content.length() > 0 && pageSetupExtn != null) {
                     pageSetupExtn.setContent(content.toString());
                     content.setLength(0); //Reset text buffer (see characters())
index 2d30f3ae8afd6e2ac7bb8a3c5ef6cc220a499760..27db41d39a4116990a2c65a8eb580b7625da53d0 100644 (file)
@@ -23,6 +23,8 @@ import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.AttributesImpl;
 
+import org.apache.fop.afp.modca.TagLogicalElement;
+
 /**
  * This is the pass-through value object for the AFP extension.
  */
@@ -47,6 +49,27 @@ public class AFPPageSetup extends AFPExtensionAttachment {
     /** defines where to place the extension in the generated file */
     protected ExtensionPlacement placement = ExtensionPlacement.DEFAULT;
 
+    /**
+     * the CCSID character set encoding
+     */
+    protected int encoding = TagLogicalElement.State.ENCODING_NONE;
+
+    /**
+     *
+     * @return CCSID character set encoding
+     */
+    public int getEncoding() {
+        return encoding;
+    }
+
+    /**
+     *
+     * @param encoding CCSID character set encoding
+     */
+    public void setEncoding(int encoding) {
+        this.encoding = encoding;
+    }
+
     /**
      * Default constructor.
      *
index 42be9bfe0136033f5de279d7e3915c163cb55d24..9b325c5cd80a1b4124bad4af9dc66499318d110e 100644 (file)
@@ -35,6 +35,7 @@ import org.apache.fop.fo.extensions.ExtensionAttachment;
  */
 public class AFPPageSetupElement extends AbstractAFPExtensionObject {
 
+    private static final String ATT_ENCODING = "encoding";
     private static final String ATT_SRC = "src";
 
     /**
@@ -105,6 +106,16 @@ public class AFPPageSetupElement extends AbstractAFPExtensionObject {
             } else {
                 missingPropertyError(AFPPageSetup.ATT_VALUE);
             }
+            attr = attlist.getValue(ATT_ENCODING);
+            if (attr != null) {
+                try {
+                    pageSetup.setEncoding(Integer.parseInt(attr));
+                } catch (NumberFormatException nfe) {
+                    invalidPropertyValueError(ATT_ENCODING, attr, nfe);
+                }
+
+            }
+
         }
         String placement = attlist.getValue(AFPPageSetup.ATT_PLACEMENT);
         if (placement != null && placement.length() > 0) {
index 270496f59ea8895ad28c5d53722c7e8252b3535a..aa9b0d5c1a1524b7a4e93670671ddfa743f7e782 100644 (file)
@@ -62,6 +62,9 @@
       documents. Example: the fix of marks layering will be such a case when it's done.
     -->
     <release version="FOP Trunk" date="TBD">
+      <action context="Renderers" dev="MH" type="fix" fixes-bug="48954" due-to="PH">
+         Support for character encoding of TLEs in AFP output
+      </action>
       <action context="Renderers" dev="VH" type="fix" fixes-bug="53778">
         When PDF accessibility is enabled, the contents for the different regions must appear in the 
         proper order in the structure tree.