159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/*
259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Copyright (c) 2009-2010 jMonkeyEngine
359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * All rights reserved.
459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Redistribution and use in source and binary forms, with or without
659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * modification, are permitted provided that the following conditions are
759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * met:
859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions of source code must retain the above copyright
1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   notice, this list of conditions and the following disclaimer.
1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions in binary form must reproduce the above copyright
1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   notice, this list of conditions and the following disclaimer in the
1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   documentation and/or other materials provided with the distribution.
1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   may be used to endorse or promote products derived from this software
1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   without specific prior written permission.
1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */
3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.export.binary;
3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.OutputCapsule;
3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.Savable;
3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.util.IntMap;
3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.util.IntMap.Entry;
3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.ByteArrayOutputStream;
4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.IOException;
4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.ByteBuffer;
4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.FloatBuffer;
4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.IntBuffer;
4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.ShortBuffer;
4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.ArrayList;
4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.Arrays;
4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.BitSet;
4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.Map;
4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/**
5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Joshua Slack
5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */
5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartafinal class BinaryOutputCapsule implements OutputCapsule {
5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public static final int NULL_OBJECT = -1;
5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public static final int DEFAULT_OBJECT = -2;
5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public static byte[] NULL_BYTES = new byte[] { (byte) -1 };
5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public static byte[] DEFAULT_BYTES = new byte[] { (byte) -2 };
6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected ByteArrayOutputStream baos;
6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected byte[] bytes;
6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected BinaryExporter exporter;
6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected BinaryClassObject cObj;
6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public BinaryOutputCapsule(BinaryExporter exporter, BinaryClassObject bco) {
6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.baos = new ByteArrayOutputStream();
6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.exporter = exporter;
6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.cObj = bco;
7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(byte value, String name, byte defVal) throws IOException {
7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.BYTE);
7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(byte[] value, String name, byte[] defVal)
8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.BYTE_1D);
8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(byte[][] value, String name, byte[][] defVal)
8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.BYTE_2D);
9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(int value, String name, int defVal) throws IOException {
9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.INT);
9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(int[] value, String name, int[] defVal)
10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.INT_1D);
10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(int[][] value, String name, int[][] defVal)
11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.INT_2D);
11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(float value, String name, float defVal)
11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.FLOAT);
12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(float[] value, String name, float[] defVal)
12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.FLOAT_1D);
13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(float[][] value, String name, float[][] defVal)
13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.FLOAT_2D);
13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(double value, String name, double defVal)
14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.DOUBLE);
14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(double[] value, String name, double[] defVal)
15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.DOUBLE_1D);
15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(double[][] value, String name, double[][] defVal)
15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.DOUBLE_2D);
16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(long value, String name, long defVal) throws IOException {
16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.LONG);
17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(long[] value, String name, long[] defVal)
17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.LONG_1D);
17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(long[][] value, String name, long[][] defVal)
18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.LONG_2D);
18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(short value, String name, short defVal)
19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.SHORT);
19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(short[] value, String name, short[] defVal)
19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.SHORT_1D);
20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(short[][] value, String name, short[][] defVal)
20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.SHORT_2D);
21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(boolean value, String name, boolean defVal)
21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.BOOLEAN);
21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(boolean[] value, String name, boolean[] defVal)
22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.BOOLEAN_1D);
22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(boolean[][] value, String name, boolean[][] defVal)
23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.BOOLEAN_2D);
23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(String value, String name, String defVal)
23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null ? defVal == null : value.equals(defVal))
24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.STRING);
24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(String[] value, String name, String[] defVal)
24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.STRING_1D);
25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(String[][] value, String name, String[][] defVal)
25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.STRING_2D);
25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(BitSet value, String name, BitSet defVal)
26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.BITSET);
26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(Savable object, String name, Savable defVal)
27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (object == defVal)
27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.SAVABLE);
27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(object);
27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(Savable[] objects, String name, Savable[] defVal)
27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (objects == defVal)
28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.SAVABLE_1D);
28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(objects);
28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(Savable[][] objects, String name, Savable[][] defVal)
28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (objects == defVal)
28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
28959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.SAVABLE_2D);
29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(objects);
29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
29259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
29359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(FloatBuffer value, String name, FloatBuffer defVal)
29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
29559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
29659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
29759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.FLOATBUFFER);
29859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
29959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
30059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
30159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(IntBuffer value, String name, IntBuffer defVal)
30259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
30359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
30459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
30559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.INTBUFFER);
30659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
30759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
30859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
30959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(ByteBuffer value, String name, ByteBuffer defVal)
31059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
31159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
31259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
31359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.BYTEBUFFER);
31459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
31559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
31659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
31759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(ShortBuffer value, String name, ShortBuffer defVal)
31859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
31959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
32059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
32159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.SHORTBUFFER);
32259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value);
32359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
32459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
32559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void writeFloatBufferArrayList(ArrayList<FloatBuffer> array,
32659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            String name, ArrayList<FloatBuffer> defVal) throws IOException {
32759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (array == defVal)
32859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
32959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.FLOATBUFFER_ARRAYLIST);
33059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeFloatBufferArrayList(array);
33159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
33259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
33359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void writeByteBufferArrayList(ArrayList<ByteBuffer> array,
33459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            String name, ArrayList<ByteBuffer> defVal) throws IOException {
33559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (array == defVal)
33659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
33759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.BYTEBUFFER_ARRAYLIST);
33859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeByteBufferArrayList(array);
33959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
34059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
34159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void writeSavableArrayList(ArrayList array, String name,
34259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            ArrayList defVal) throws IOException {
34359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (array == defVal)
34459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
34559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.SAVABLE_ARRAYLIST);
34659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeSavableArrayList(array);
34759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
34859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
34959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void writeSavableArrayListArray(ArrayList[] array, String name,
35059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            ArrayList[] defVal) throws IOException {
35159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (array == defVal)
35259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
35359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.SAVABLE_ARRAYLIST_1D);
35459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeSavableArrayListArray(array);
35559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
35659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
35759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void writeSavableArrayListArray2D(ArrayList[][] array, String name,
35859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            ArrayList[][] defVal) throws IOException {
35959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (array == defVal)
36059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
36159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.SAVABLE_ARRAYLIST_2D);
36259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeSavableArrayListArray2D(array);
36359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
36459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
36559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void writeSavableMap(Map<? extends Savable, ? extends Savable> map,
36659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            String name, Map<? extends Savable, ? extends Savable> defVal)
36759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
36859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (map == defVal)
36959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
37059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.SAVABLE_MAP);
37159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeSavableMap(map);
37259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
37359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
37459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void writeStringSavableMap(Map<String, ? extends Savable> map,
37559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            String name, Map<String, ? extends Savable> defVal)
37659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
37759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (map == defVal)
37859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
37959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.STRING_SAVABLE_MAP);
38059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeStringSavableMap(map);
38159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
38259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
38359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void writeIntSavableMap(IntMap<? extends Savable> map,
38459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            String name, IntMap<? extends Savable> defVal)
38559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
38659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (map == defVal)
38759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
38859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeAlias(name, BinaryClassField.INT_SAVABLE_MAP);
38959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeIntSavableMap(map);
39059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
39159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
39259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void writeAlias(String name, byte fieldType) throws IOException {
39359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (cObj.nameFields.get(name) == null)
39459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            generateAlias(name, fieldType);
39559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
39659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        byte alias = cObj.nameFields.get(name).alias;
39759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(alias);
39859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
39959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
40059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // XXX: The generation of aliases is limited to 256 possible values.
40159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // If we run into classes with more than 256 fields, we need to expand this.
40259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // But I mean, come on...
40359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void generateAlias(String name, byte type) {
40459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        byte alias = (byte) cObj.nameFields.size();
40559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        cObj.nameFields.put(name, new BinaryClassField(name, alias, type));
40659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
40759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
40859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
40959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public boolean equals(Object arg0) {
41059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (!(arg0 instanceof BinaryOutputCapsule))
41159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return false;
41259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
41359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        byte[] other = ((BinaryOutputCapsule) arg0).bytes;
41459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (bytes.length != other.length)
41559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return false;
41659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return Arrays.equals(bytes, other);
41759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
41859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
41959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
42059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public int hashCode() {
42159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int hash = 7;
42259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        hash = 23 * hash + Arrays.hashCode(this.bytes);
42359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return hash;
42459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
42559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
42659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void finish() {
42759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // renamed to finish as 'finalize' in java.lang.Object should not be
42859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // overridden like this
42959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // - finalize should not be called directly but is called by garbage
43059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // collection!!!
43159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        bytes = baos.toByteArray();
43259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        baos = null;
43359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
43459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
43559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // byte primitive
43659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
43759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(byte value) throws IOException {
43859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        baos.write(value);
43959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
44059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
44159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void writeForBuffer(byte value) throws IOException {
44259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        baos.write(value);
44359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
44459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
44559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(byte[] value) throws IOException {
44659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
44759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
44859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
44959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
45059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.length);
45159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        baos.write(value);
45259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
45359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
45459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(byte[][] value) throws IOException {
45559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
45659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
45759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
45859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
45959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.length);
46059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < value.length; x++)
46159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value[x]);
46259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
46359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
46459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // int primitive
46559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
46659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(int value) throws IOException {
46759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        baos.write(deflate(ByteUtils.convertToBytes(value)));
46859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
46959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
47059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void writeForBuffer(int value) throws IOException {
47159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        byte[] byteArray = new byte[4];
47259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        byteArray[0] = (byte) value;
47359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        byteArray[1] = (byte) (value >> 8);
47459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        byteArray[2] = (byte) (value >> 16);
47559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        byteArray[3] = (byte) (value >> 24);
47659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        baos.write(byteArray);
47759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
47859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
47959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(int[] value) throws IOException {
48059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
48159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
48259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
48359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
48459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.length);
48559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < value.length; x++)
48659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value[x]);
48759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
48859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
48959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(int[][] value) throws IOException {
49059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
49159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
49259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
49359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
49459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.length);
49559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < value.length; x++)
49659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value[x]);
49759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
49859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
49959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // float primitive
50059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
50159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(float value) throws IOException {
50259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        baos.write(ByteUtils.convertToBytes(value));
50359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
50459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
50559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void writeForBuffer(float value) throws IOException {
50659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int integer = Float.floatToIntBits(value);
50759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        writeForBuffer(integer);
50859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
50959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
51059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(float[] value) throws IOException {
51159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
51259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
51359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
51459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
51559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.length);
51659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < value.length; x++)
51759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value[x]);
51859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
51959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
52059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(float[][] value) throws IOException {
52159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
52259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
52359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
52459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
52559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.length);
52659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < value.length; x++)
52759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value[x]);
52859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
52959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
53059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // double primitive
53159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
53259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(double value) throws IOException {
53359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        baos.write(ByteUtils.convertToBytes(value));
53459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
53559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
53659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(double[] value) throws IOException {
53759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
53859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
53959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
54059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
54159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.length);
54259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < value.length; x++)
54359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value[x]);
54459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
54559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
54659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(double[][] value) throws IOException {
54759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
54859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
54959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
55059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
55159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.length);
55259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < value.length; x++)
55359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value[x]);
55459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
55559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
55659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // long primitive
55759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
55859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(long value) throws IOException {
55959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        baos.write(deflate(ByteUtils.convertToBytes(value)));
56059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
56159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
56259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(long[] value) throws IOException {
56359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
56459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
56559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
56659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
56759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.length);
56859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < value.length; x++)
56959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value[x]);
57059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
57159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
57259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(long[][] value) throws IOException {
57359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
57459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
57559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
57659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
57759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.length);
57859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < value.length; x++)
57959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value[x]);
58059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
58159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
58259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // short primitive
58359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
58459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(short value) throws IOException {
58559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        baos.write(ByteUtils.convertToBytes(value));
58659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
58759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
58859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void writeForBuffer(short value) throws IOException {
58959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        byte[] byteArray = new byte[2];
59059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        byteArray[0] = (byte) value;
59159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        byteArray[1] = (byte) (value >> 8);
59259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        baos.write(byteArray);
59359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
59459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
59559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(short[] value) throws IOException {
59659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
59759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
59859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
59959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
60059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.length);
60159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < value.length; x++)
60259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value[x]);
60359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
60459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
60559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(short[][] value) throws IOException {
60659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
60759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
60859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
60959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
61059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.length);
61159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < value.length; x++)
61259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value[x]);
61359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
61459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
61559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // boolean primitive
61659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
61759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(boolean value) throws IOException {
61859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        baos.write(ByteUtils.convertToBytes(value));
61959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
62059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
62159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(boolean[] value) throws IOException {
62259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
62359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
62459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
62559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
62659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.length);
62759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < value.length; x++)
62859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value[x]);
62959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
63059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
63159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(boolean[][] value) throws IOException {
63259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
63359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
63459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
63559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
63659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.length);
63759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < value.length; x++)
63859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value[x]);
63959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
64059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
64159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // String
64259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
64359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(String value) throws IOException {
64459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
64559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
64659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
64759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
64859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // write our output as UTF-8. Java misspells UTF-8 as UTF8 for official use in java.lang
64959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        byte[] bytes = value.getBytes("UTF8");
65059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(bytes.length);
65159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        baos.write(bytes);
65259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
65359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
65459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(String[] value) throws IOException {
65559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
65659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
65759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
65859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
65959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.length);
66059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < value.length; x++)
66159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value[x]);
66259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
66359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
66459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(String[][] value) throws IOException {
66559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
66659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
66759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
66859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
66959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.length);
67059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < value.length; x++)
67159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value[x]);
67259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
67359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
67459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // BitSet
67559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
67659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(BitSet value) throws IOException {
67759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
67859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
67959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
68059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
68159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(value.size());
68259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // TODO: MAKE THIS SMALLER
68359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0, max = value.size(); x < max; x++)
68459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value.get(x));
68559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
68659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
68759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // DEFLATOR for int and long
68859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
68959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected static byte[] deflate(byte[] bytes) {
69059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int size = bytes.length;
69159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (size == 4) {
69259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            int possibleMagic = ByteUtils.convertIntFromBytes(bytes);
69359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (possibleMagic == NULL_OBJECT)
69459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return NULL_BYTES;
69559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            else if (possibleMagic == DEFAULT_OBJECT)
69659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return DEFAULT_BYTES;
69759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
69859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < bytes.length; x++) {
69959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (bytes[x] != 0)
70059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
70159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            size--;
70259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
70359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (size == 0)
70459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return new byte[1];
70559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
70659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        byte[] rVal = new byte[1 + size];
70759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        rVal[0] = (byte) size;
70859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 1; x < rVal.length; x++)
70959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            rVal[x] = bytes[bytes.length - size - 1 + x];
71059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
71159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return rVal;
71259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
71359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
71459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // BinarySavable
71559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
71659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(Savable object) throws IOException {
71759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (object == null) {
71859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
71959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
72059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
72159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int id = exporter.processBinarySavable(object);
72259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(id);
72359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
72459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
72559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // BinarySavable array
72659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
72759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(Savable[] objects) throws IOException {
72859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (objects == null) {
72959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
73059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
73159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
73259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(objects.length);
73359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < objects.length; x++) {
73459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(objects[x]);
73559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
73659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
73759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
73859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(Savable[][] objects) throws IOException {
73959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (objects == null) {
74059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
74159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
74259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
74359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(objects.length);
74459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < objects.length; x++) {
74559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(objects[x]);
74659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
74759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
74859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
74959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // ArrayList<BinarySavable>
75059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
75159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void writeSavableArrayList(ArrayList array) throws IOException {
75259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (array == null) {
75359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
75459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
75559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
75659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(array.size());
75759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (Object bs : array) {
75859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write((Savable) bs);
75959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
76059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
76159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
76259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void writeSavableArrayListArray(ArrayList[] array)
76359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
76459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (array == null) {
76559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
76659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
76759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
76859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(array.length);
76959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (ArrayList bs : array) {
77059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            writeSavableArrayList(bs);
77159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
77259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
77359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
77459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void writeSavableArrayListArray2D(ArrayList[][] array)
77559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
77659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (array == null) {
77759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
77859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
77959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
78059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(array.length);
78159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (ArrayList[] bs : array) {
78259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            writeSavableArrayListArray(bs);
78359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
78459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
78559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
78659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // Map<BinarySavable, BinarySavable>
78759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
78859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void writeSavableMap(
78959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            Map<? extends Savable, ? extends Savable> array) throws IOException {
79059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (array == null) {
79159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
79259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
79359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
79459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(array.size());
79559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (Savable key : array.keySet()) {
79659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(new Savable[] { key, array.get(key) });
79759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
79859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
79959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
80059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void writeStringSavableMap(Map<String, ? extends Savable> array)
80159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
80259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (array == null) {
80359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
80459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
80559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
80659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(array.size());
80759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
80859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // write String array for keys
80959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        String[] keys = array.keySet().toArray(new String[] {});
81059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(keys);
81159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
81259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // write Savable array for values
81359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Savable[] values = array.values().toArray(new Savable[] {});
81459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(values);
81559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
81659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
81759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void writeIntSavableMap(IntMap<? extends Savable> array)
81859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
81959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (array == null) {
82059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
82159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
82259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
82359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(array.size());
82459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
82559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int[] keys = new int[array.size()];
82659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Savable[] values = new Savable[keys.length];
82759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int i = 0;
82859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (Entry<? extends Savable> entry : array){
82959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            keys[i] = entry.getKey();
83059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            values[i] = entry.getValue();
83159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            i++;
83259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
83359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
83459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // write String array for keys
83559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(keys);
83659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
83759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        // write Savable array for values
83859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(values);
83959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
84059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
84159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // ArrayList<FloatBuffer>
84259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
84359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void writeFloatBufferArrayList(ArrayList<FloatBuffer> array)
84459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
84559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (array == null) {
84659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
84759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
84859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
84959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(array.size());
85059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (FloatBuffer buf : array) {
85159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(buf);
85259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
85359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
85459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
85559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // ArrayList<FloatBuffer>
85659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
85759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void writeByteBufferArrayList(ArrayList<ByteBuffer> array)
85859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throws IOException {
85959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (array == null) {
86059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
86159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
86259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
86359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(array.size());
86459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (ByteBuffer buf : array) {
86559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(buf);
86659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
86759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
86859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
86959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // NIO BUFFERS
87059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // float buffer
87159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
87259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(FloatBuffer value) throws IOException {
87359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
87459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
87559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
87659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
87759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        value.rewind();
87859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int length = value.limit();
87959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(length);
88059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < length; x++) {
88159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            writeForBuffer(value.get());
88259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
88359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        value.rewind();
88459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
88559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
88659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // int buffer
88759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
88859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(IntBuffer value) throws IOException {
88959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
89059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
89159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
89259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
89359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        value.rewind();
89459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int length = value.limit();
89559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(length);
89659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
89759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < length; x++) {
89859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            writeForBuffer(value.get());
89959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
90059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        value.rewind();
90159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
90259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
90359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // byte buffer
90459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
90559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(ByteBuffer value) throws IOException {
90659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
90759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
90859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
90959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
91059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        value.rewind();
91159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int length = value.limit();
91259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(length);
91359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < length; x++) {
91459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            writeForBuffer(value.get());
91559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
91659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        value.rewind();
91759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
91859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
91959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    // short buffer
92059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
92159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void write(ShortBuffer value) throws IOException {
92259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
92359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(NULL_OBJECT);
92459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
92559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
92659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        value.rewind();
92759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int length = value.limit();
92859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        write(length);
92959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int x = 0; x < length; x++) {
93059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            writeForBuffer(value.get());
93159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
93259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        value.rewind();
93359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
93459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
93559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(Enum value, String name, Enum defVal) throws IOException {
93659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == defVal)
93759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
93859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (value == null) {
93959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
94059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        } else {
94159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            write(value.name(), name, null);
94259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
94359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
94459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta}