aboutsummaryrefslogtreecommitdiffstats
path: root/src/sandbox/org/apache/fop/render/afp/modca/Document.java
blob: 10e5a4b312cd3b3e792ea8f53ba4144d21acb9d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
/*
 * Copyright 2006 The Apache Software Foundation.
 *
 * Licensed 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.render.afp.modca;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;


/**
 * The document is the highest level of the MO:DCA data-stream document
 * component hierarchy. Documents can be made up of pages, and the pages,
 * which are at the intermediate level, can be made up of objects. Objects
 * are at the lowest level, and can be bar codes, graphics, images, and
 * presentation text.
 *
 * At each level of the hierarchy certain sets of MO:DCA data structures,
 * called structured fields, are permissible. The document, pages and objects
 * are bounded by structured fields that define their beginnings and their ends.
 * These structured fields, called begin-end pairs, provide an envelope for the
 * data-stream components. This feature enables a processor of the data stream
 * that is not fully compliant with the architecture to bypass those objects
 * that are beyond its scope, and to process the data stream to the best of its
 * abilities.
 *
 * A presentation document is one that has been formatted and is intended for
 * presentation, usually on a printer or display device. A data stream containing
 * a presentation document should produce the same document content in the
 * same format on different printers or display devices dependent, however,
 * on the capabilities of each of the printers or display devices. A presentation
 * document can reference resources that are to be included as part of the
 * document to be presented.
 *
 */
public final class Document extends AbstractNamedAFPObject {

    /**
     * Ststic default name reference
     */
    private final static String DEFAULT_NAME = "DOC00001";

    /**
     * A list of the objects in the document
     */
    private ArrayList _objects = new ArrayList();

    /**
     * The document started state
     */
    private boolean _started = false;

    /**
     * The document completion state
     */
    private boolean _complete = false;

    /**
     * Default constructor for the document object.
     */
    public Document() {
        this(DEFAULT_NAME);
    }

    /**
     * Constructor for the document object.
     * @param name The name of the document
     */
    public Document(String name) {

        super(name);

    }

    /**
     * Adds a page to the document.
     * @param page - the Page object
     */
    public void addPage(PageObject page) {
        if (!_objects.contains(page)) {
            _objects.add(page);
        }
    }

    /**
     * Adds a PageGroup to the document.
     * @param pageGroup the PageGroup object
     */
    public void addPageGroup(PageGroup pageGroup) {
        _objects.add(pageGroup);
    }

    /**
     * Method to mark the end of the page group.
     */
    public void endDocument() {

        _complete = true;

    }

    /**
     * Returns an indication if the page group is complete
     */
    public boolean isComplete() {
        return _complete;
    }

    /**
     * Accessor method to write the AFP datastream for document.
     * @param os The stream to write to
     * @throws java.io.IOException
     */
    public void writeDataStream(OutputStream os)
        throws IOException {

        if (!_started) {
            writeStart(os);
            _started = true;
        }

        for (Iterator it = _objects.iterator(); it.hasNext(); ) {
            AbstractAFPObject ao = (AbstractAFPObject)it.next();
            if (ao instanceof PageObject && ((PageObject)ao).isComplete()
                || ao instanceof PageGroup && ((PageGroup)ao).isComplete()) {
                ao.writeDataStream(os);
                it.remove();
            } else {
                break;
            }
        }

        if (_complete) {
            writeEnd(os);
        }

    }

    /**
     * Helper method to write the start of the Document
     * @param os The stream to write to
     */
    private void writeStart(OutputStream os)
        throws IOException {

        byte[] data = new byte[17];

        data[0] = 0x5A; // Structured field identifier
        data[1] = 0x00; // Length byte 1
        data[2] = 0x10; // Length byte 2
        data[3] = (byte) 0xD3; // Structured field id byte 1
        data[4] = (byte) 0xA8; // Structured field id byte 2
        data[5] = (byte) 0xA8; // Structured field id byte 3
        data[6] = 0x00; // Flags
        data[7] = 0x00; // Reserved
        data[8] = 0x00; // Reserved

        for (int i = 0; i < _nameBytes.length; i++) {

            data[9 + i] = _nameBytes[i];

        }

        os.write(data);

    }

    /**
     * Helper method to write the end of the Document.
     * @param os The stream to write to
     */
    private void writeEnd(OutputStream os)
        throws IOException {

        byte[] data = new byte[17];

        data[0] = 0x5A; // Structured field identifier
        data[1] = 0x00; // Length byte 1
        data[2] = 0x10; // Length byte 2
        data[3] = (byte) 0xD3; // Structured field id byte 1
        data[4] = (byte) 0xA9; // Structured field id byte 2
        data[5] = (byte) 0xA8; // Structured field id byte 3
        data[6] = 0x00; // Flags
        data[7] = 0x00; // Reserved
        data[8] = 0x00; // Reserved

        for (int i = 0; i < _nameBytes.length; i++) {

            data[9 + i] = _nameBytes[i];

        }

        os.write(data);

    }

}