123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- /*
- * 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.AFPConstants;
- import org.apache.fop.afp.modca.Registry.ObjectType;
- import org.apache.fop.afp.util.StringUtils;
-
- /**
- * The Object Classification is used to classify and identify object data.
- * The object data may or may not be defined by an IBM presentation architecture
- */
- public class ObjectClassificationTriplet extends AbstractTriplet {
-
- /**
- * The scope of this object is the including page or overlay
- */
- public static final byte CLASS_TIME_INVARIANT_PAGINATED_PRESENTATION_OBJECT = 0x01;
-
- /**
- * The scope of this object is not defined
- */
- public static final byte CLASS_TIME_VARIANT_PRESENTATION_OBJECT = 0x10;
-
- /**
- * This is not a presentation object, the scope of this object is not defined
- */
- public static final byte CLASS_EXECUTABLE_PROGRAM = 0x20;
-
- /**
- * Setup information file, document level. This is not a presentation object,
- */
- public static final byte CLASS_SETUP_FILE = 0x30;
-
- /**
- * This is a resource used by a presentation object that may itself be a resource.
- * The scope of the resource is the object that uses the resource.
- */
- public static final byte CLASS_SECONDARY_RESOURCE = 0x40;
-
- /**
- * Data object font. This is a non-FOCA font resource used to present
- * text in a data object. The scope of the resource is the object that
- * uses the resource.
- */
- public static final byte CLASS_DATA_OBJECT_FONT = 0x41;
-
- /** the object class */
- private final byte objectClass;
-
- /** the object type */
- private final ObjectType objectType;
-
- /** whether the container has an object environment group */
- private final boolean containerHasOEG;
-
- /** whether the data resides within the container */
- private final boolean dataInContainer;
-
- /** whether the data resides within the object container data */
- private final boolean dataInOCD;
-
- /** the object level (version) */
- private final String objectLevel;
-
- /** the company/organization name */
- private final String companyName;
-
-
- /**
- * Main constructor
- *
- * @param objectClass the object class type
- * @param objectType the object type registry entry
- * @param dataInContainer whether the data resides in the container
- * @param containerHasOEG whether the container has an object environment group
- * @param dataInOCD whether the data resides in a object container data structured field
- */
- public ObjectClassificationTriplet(byte objectClass, ObjectType objectType,
- boolean dataInContainer, boolean containerHasOEG, boolean dataInOCD) {
- // no object level or company name specified
- this(objectClass, objectType, dataInContainer, containerHasOEG, dataInOCD, null, null);
- }
-
- /**
- * Fully parameterized constructor
- *
- * @param objectClass the object class type
- * @param objectType the object type registry entry
- * @param dataInContainer whether the data resides in the container
- * @param containerHasOEG whether the container has an object environment group
- * @param dataInOCD whether the data resides in a object container data structured field
- * @param objLev the release level or version number of the object type
- * @param compName the name of the company or organization that owns the object definition
- */
- public ObjectClassificationTriplet(byte objectClass, ObjectType objectType,
- boolean dataInContainer, boolean containerHasOEG, boolean dataInOCD,
- String objLev, String compName) {
- super(OBJECT_CLASSIFICATION);
-
- this.objectClass = objectClass;
- if (objectType == null) {
- throw new IllegalArgumentException("MO:DCA Registry object type is null");
- }
- this.objectType = objectType;
- this.dataInContainer = dataInContainer;
- this.containerHasOEG = containerHasOEG;
- this.dataInOCD = dataInOCD;
- this.objectLevel = objLev;
- this.companyName = compName;
- }
-
- /**
- * Returns the structured field flags
- *
- * @param dataInContainer true if the object data in carried in the object container
- * @param containerHasOEG true if the object container has an object environment group
- * @param dataInOCD true if the object container data carries the object data
- *
- * @return the byte value of this structure
- */
- public byte[] getStructureFlagsAsBytes(boolean dataInContainer, boolean containerHasOEG,
- boolean dataInOCD) {
- byte[] strucFlgs = new byte[2];
- // Object Container (BOC/EOC)
- if (dataInContainer) {
- strucFlgs[0] |= 3 << 6;
- } else {
- strucFlgs[0] |= 1 << 6;
- }
- // Object Environment Group (OEG)
- if (containerHasOEG) {
- strucFlgs[0] |= 3 << 4;
- } else {
- strucFlgs[0] |= 1 << 4;
- }
- // Object Container Data (OCD) structured fields
- if (dataInOCD) {
- strucFlgs[0] |= 3 << 2;
- } else {
- strucFlgs[0] |= 1 << 2;
- }
- strucFlgs[1] = 0x00;
- return strucFlgs;
- }
-
- /** {@inheritDoc} */
- public int getDataLength() {
- return 96;
- }
-
- private static final int OBJECT_LEVEL_LEN = 8;
- private static final int OBJECT_TYPE_NAME_LEN = 32;
- private static final int COMPANY_NAME_LEN = 32;
-
- /** {@inheritDoc} */
- public void writeToStream(OutputStream os) throws IOException {
- byte[] data = getData();
- data[2] = 0x00; // reserved (must be zero)
- data[3] = objectClass; // ObjClass
- data[4] = 0x00; // reserved (must be zero)
- data[5] = 0x00; // reserved (must be zero)
-
- // StrucFlgs - Information on the structure of the object container
- byte[] structureFlagsBytes
- = getStructureFlagsAsBytes(dataInContainer, containerHasOEG, dataInOCD);
- data[6] = structureFlagsBytes[0];
- data[7] = structureFlagsBytes[1];
-
- byte[] objectIdBytes = objectType.getOID();
- // RegObjId - MOD:CA-registered ASN.1 OID for object type (8-23)
- System.arraycopy(objectIdBytes, 0, data, 8, objectIdBytes.length);
-
- // ObjTpName - name of object type (24-55)
- byte[] objectTypeNameBytes;
- objectTypeNameBytes
- = StringUtils.rpad(objectType.getName(), ' ', OBJECT_TYPE_NAME_LEN).getBytes(
- AFPConstants.EBCIDIC_ENCODING);
- System.arraycopy(objectTypeNameBytes, 0, data, 24, objectTypeNameBytes.length);
-
- // ObjLev - release level or version number of object type (56-63)
- byte[] objectLevelBytes;
- objectLevelBytes = StringUtils.rpad(objectLevel, ' ', OBJECT_LEVEL_LEN).getBytes(
- AFPConstants.EBCIDIC_ENCODING);
- System.arraycopy(objectLevelBytes, 0, data, 56, objectLevelBytes.length);
-
- // CompName - name of company or organization that owns object definition (64-95)
- byte[] companyNameBytes;
- companyNameBytes = StringUtils.rpad(companyName, ' ', COMPANY_NAME_LEN).getBytes(
- AFPConstants.EBCIDIC_ENCODING);
- System.arraycopy(companyNameBytes, 0, data, 64, companyNameBytes.length);
-
- os.write(data);
- }
- }
|