001: /* ====================================================================
002: Licensed to the Apache Software Foundation (ASF) under one or more
003: contributor license agreements. See the NOTICE file distributed with
004: this work for additional information regarding copyright ownership.
005: The ASF licenses this file to You under the Apache License, Version 2.0
006: (the "License"); you may not use this file except in compliance with
007: the License. You may obtain a copy of the License at
008:
009: http://www.apache.org/licenses/LICENSE-2.0
010:
011: Unless required by applicable law or agreed to in writing, software
012: distributed under the License is distributed on an "AS IS" BASIS,
013: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: See the License for the specific language governing permissions and
015: limitations under the License.
016: ==================================================================== */
017: package org.apache.poi.hdgf.streams;
018:
019: import java.io.IOException;
020:
021: import org.apache.poi.hdgf.chunks.ChunkFactory;
022: import org.apache.poi.hdgf.pointers.Pointer;
023: import org.apache.poi.hdgf.pointers.PointerFactory;
024: import org.apache.poi.hdgf.exceptions.HDGFException;
025:
026: /**
027: * Base of all Streams within a HDGF document.
028: * Streams are what hold the data (the metadata of a stream
029: * is held in the pointer that points to the stream).
030: * A stream may be stored compressed or un-compressed on the
031: * disk, but that doesn't appear to change their use.
032: */
033: public abstract class Stream {
034: private Pointer pointer;
035: private StreamStore store;
036:
037: public Pointer getPointer() {
038: return pointer;
039: }
040:
041: protected StreamStore getStore() {
042: return store;
043: }
044:
045: public StreamStore _getStore() {
046: return store;
047: }
048:
049: public int _getContentsLength() {
050: return store.getContents().length;
051: }
052:
053: /**
054: * Creates a new Stream, having already used the pointer
055: * to build a store
056: */
057: protected Stream(Pointer pointer, StreamStore store) {
058: this .pointer = pointer;
059: this .store = store;
060: }
061:
062: /**
063: * Uses the pointer to locate a Stream within the document
064: * data, and creates it.
065: * @param pointer The Pointer to create a stream for
066: * @param documentData The raw document data
067: */
068: public static Stream createStream(Pointer pointer,
069: byte[] documentData, ChunkFactory chunkFactory,
070: PointerFactory pointerFactory) {
071: // Create the store
072: StreamStore store;
073: if (pointer.destinationCompressed()) {
074: try {
075: store = new CompressedStreamStore(documentData, pointer
076: .getOffset(), pointer.getLength());
077: } catch (IOException e) {
078: // Should never occur
079: throw new HDGFException(e);
080: }
081: } else {
082: store = new StreamStore(documentData, pointer.getOffset(),
083: pointer.getLength());
084: }
085:
086: // Figure out what sort of Stream to create, create and return it
087: if (pointer.getType() == 20) {
088: return new TrailerStream(pointer, store, chunkFactory,
089: pointerFactory);
090: } else if (pointer.destinationHasPointers()) {
091: return new PointerContainingStream(pointer, store,
092: chunkFactory, pointerFactory);
093: } else if (pointer.destinationHasChunks()) {
094: return new ChunkStream(pointer, store, chunkFactory);
095: } else if (pointer.destinationHasStrings()) {
096: return new StringsStream(pointer, store, chunkFactory);
097: }
098:
099: // Give up and return a generic one
100: return new UnknownStream(pointer, store);
101: }
102: }
|