/** * 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. */ package org.apache.jute; import java.io.DataInput; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; /** * */ public class BinaryInputArchive implements InputArchive { static public final String UNREASONBLE_LENGTH= "Unreasonable length = "; private DataInput in; static public BinaryInputArchive getArchive(InputStream strm) { return new BinaryInputArchive(new DataInputStream(strm)); } static private class BinaryIndex implements Index { private int nelems; BinaryIndex(int nelems) { this.nelems = nelems; } public boolean done() { return (nelems <= 0); } public void incr() { nelems--; } } /** Creates a new instance of BinaryInputArchive */ public BinaryInputArchive(DataInput in) { this.in = in; } public byte readByte(String tag) throws IOException { return in.readByte(); } public boolean readBool(String tag) throws IOException { return in.readBoolean(); } public int readInt(String tag) throws IOException { return in.readInt(); } public long readLong(String tag) throws IOException { return in.readLong(); } public float readFloat(String tag) throws IOException { return in.readFloat(); } public double readDouble(String tag) throws IOException { return in.readDouble(); } public String readString(String tag) throws IOException { int len = in.readInt(); if (len == -1) return null; checkLength(len); byte b[] = new byte[len]; in.readFully(b); return new String(b, "UTF8"); } static public final int maxBuffer = Integer.getInteger("jute.maxbuffer", 0xfffff); public byte[] readBuffer(String tag) throws IOException { int len = readInt(tag); if (len == -1) return null; checkLength(len); byte[] arr = new byte[len]; in.readFully(arr); return arr; } public void readRecord(Record r, String tag) throws IOException { r.deserialize(this, tag); } public void startRecord(String tag) throws IOException {} public void endRecord(String tag) throws IOException {} public Index startVector(String tag) throws IOException { int len = readInt(tag); if (len == -1) { return null; } return new BinaryIndex(len); } public void endVector(String tag) throws IOException {} public Index startMap(String tag) throws IOException { return new BinaryIndex(readInt(tag)); } public void endMap(String tag) throws IOException {} // Since this is a rough sanity check, add some padding to maxBuffer to // make up for extra fields, etc. (otherwise e.g. clients may be able to // write buffers larger than we can read from disk!) private void checkLength(int len) throws IOException { if (len < 0 || len > maxBuffer + 1024) { throw new IOException(UNREASONBLE_LENGTH + len); } } }