/* * 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); } }