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:
018: package org.apache.poi.hssf.record;
019:
020: import org.apache.poi.util.LittleEndian;
021:
022: import java.util.ArrayList;
023:
024: /**
025: * Title: Extern Sheet <P>
026: * Description: A List of Inndexes to SupBook <P>
027: * REFERENCE: <P>
028: * @author Libin Roman (Vista Portal LDT. Developer)
029: * @version 1.0-pre
030: */
031:
032: public class ExternSheetRecord extends Record {
033: public final static short sid = 0x17;
034: private short field_1_number_of_REF_sturcutres;
035: private ArrayList field_2_REF_structures;
036:
037: public ExternSheetRecord() {
038: field_2_REF_structures = new ArrayList();
039: }
040:
041: /**
042: * Constructs a Extern Sheet record and sets its fields appropriately.
043: * @param in the RecordInputstream to read the record from
044: */
045:
046: public ExternSheetRecord(RecordInputStream in) {
047: super (in);
048: }
049:
050: /**
051: * called by constructor, should throw runtime exception in the event of a
052: * record passed with a differing ID.
053: *
054: * @param id alleged id for this record
055: */
056: protected void validateSid(short id) {
057: if (id != sid) {
058: throw new RecordFormatException("NOT An ExternSheet RECORD");
059: }
060: }
061:
062: /**
063: * called by the constructor, should set class level fields. Should throw
064: * runtime exception for bad/icomplete data.
065: *
066: * @param in the RecordInputstream to read the record from
067: */
068: protected void fillFields(RecordInputStream in) {
069: field_2_REF_structures = new ArrayList();
070:
071: field_1_number_of_REF_sturcutres = in.readShort();
072:
073: for (int i = 0; i < field_1_number_of_REF_sturcutres; ++i) {
074: ExternSheetSubRecord rec = new ExternSheetSubRecord(in);
075:
076: field_2_REF_structures.add(rec);
077: }
078: }
079:
080: /**
081: * sets the number of the REF structors , that is in Excel file
082: * @param numStruct number of REF structs
083: */
084: public void setNumOfREFStructures(short numStruct) {
085: field_1_number_of_REF_sturcutres = numStruct;
086: }
087:
088: /**
089: * return the number of the REF structors , that is in Excel file
090: * @return number of REF structs
091: */
092: public short getNumOfREFStructures() {
093: return field_1_number_of_REF_sturcutres;
094: }
095:
096: /**
097: * adds REF struct (ExternSheetSubRecord)
098: * @param rec REF struct
099: */
100: public void addREFRecord(ExternSheetSubRecord rec) {
101: field_2_REF_structures.add(rec);
102: }
103:
104: /** returns the number of REF Records, which is in model
105: * @return number of REF records
106: */
107: public int getNumOfREFRecords() {
108: return field_2_REF_structures.size();
109: }
110:
111: /** returns the REF record (ExternSheetSubRecord)
112: * @param elem index to place
113: * @return REF record
114: */
115: public ExternSheetSubRecord getREFRecordAt(int elem) {
116: ExternSheetSubRecord result = (ExternSheetSubRecord) field_2_REF_structures
117: .get(elem);
118:
119: return result;
120: }
121:
122: public String toString() {
123: StringBuffer buffer = new StringBuffer();
124:
125: buffer.append("[EXTERNSHEET]\n");
126: buffer.append(" numOfRefs = ").append(
127: getNumOfREFStructures()).append("\n");
128: for (int k = 0; k < this .getNumOfREFRecords(); k++) {
129: buffer.append("refrec #").append(k).append('\n');
130: buffer.append(getREFRecordAt(k).toString());
131: buffer.append("----refrec #").append(k).append('\n');
132: }
133: buffer.append("[/EXTERNSHEET]\n");
134:
135: return buffer.toString();
136: }
137:
138: /**
139: * called by the class that is responsible for writing this sucker.
140: * Subclasses should implement this so that their data is passed back in a
141: * byte array.
142: *
143: * @param offset to begin writing at
144: * @param data byte array containing instance data
145: * @return number of bytes written
146: */
147: public int serialize(int offset, byte[] data) {
148: LittleEndian.putShort(data, 0 + offset, sid);
149: LittleEndian.putShort(data, 2 + offset,
150: (short) (2 + (getNumOfREFRecords() * 6)));
151:
152: LittleEndian
153: .putShort(data, 4 + offset, getNumOfREFStructures());
154:
155: int pos = 6;
156:
157: for (int k = 0; k < getNumOfREFRecords(); k++) {
158: ExternSheetSubRecord record = getREFRecordAt(k);
159: System.arraycopy(record.serialize(), 0, data, pos + offset,
160: 6);
161:
162: pos += 6;
163: }
164: return getRecordSize();
165: }
166:
167: public int getRecordSize() {
168: return 4 + 2 + getNumOfREFRecords() * 6;
169: }
170:
171: /**
172: * return the non static version of the id for this record.
173: */
174: public short getSid() {
175: return sid;
176: }
177: }
|