169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara/*
269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara * Copyright 2015 Google Inc. All rights reserved.
369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara *
469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara * Licensed under the Apache License, Version 2.0 (the "License");
569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara * you may not use this file except in compliance with the License.
669a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara * You may obtain a copy of the License at
769a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara *
869a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara *     http://www.apache.org/licenses/LICENSE-2.0
969a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara *
1069a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara * Unless required by applicable law or agreed to in writing, software
1169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara * distributed under the License is distributed on an "AS IS" BASIS,
1269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara * See the License for the specific language governing permissions and
1469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara * limitations under the License.
1569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara */
1669a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
1769a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara// Run this file with the `java_sample.sh` script.
1869a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
1969a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klaraimport MyGame.Sample.Color;
2069a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klaraimport MyGame.Sample.Equipment;
2169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klaraimport MyGame.Sample.Monster;
2269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klaraimport MyGame.Sample.Vec3;
2369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klaraimport MyGame.Sample.Weapon;
2469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
2569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klaraimport com.google.flatbuffers.FlatBufferBuilder;
2669a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
2769a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klaraimport java.nio.ByteBuffer;
2869a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
2969a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klaraclass SampleBinary {
3069a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara  // Example how to use FlatBuffers to create and read binary buffers.
3169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara  public static void main(String[] args) {
3269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    FlatBufferBuilder builder = new FlatBufferBuilder(0);
3369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
3469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    // Create some weapons for our Monster ('Sword' and 'Axe').
3569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    int weaponOneName = builder.createString("Sword");
3669a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    short weaponOneDamage = 3;
3769a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    int weaponTwoName = builder.createString("Axe");
3869a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    short weaponTwoDamage = 5;
3969a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
4069a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    // Use the `createWeapon()` helper function to create the weapons, since we set every field.
4169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    int[] weaps = new int[2];
4269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    weaps[0] = Weapon.createWeapon(builder, weaponOneName, weaponOneDamage);
4369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    weaps[1] = Weapon.createWeapon(builder, weaponTwoName, weaponTwoDamage);
4469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
4569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    // Serialize the FlatBuffer data.
4669a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    int name = builder.createString("Orc");
4769a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    byte[] treasure = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
4869a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    int inv = Monster.createInventoryVector(builder, treasure);
4969a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    int weapons = Monster.createWeaponsVector(builder, weaps);
5069a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    int pos = Vec3.createVec3(builder, 1.0f, 2.0f, 3.0f);
5169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
5269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    Monster.startMonster(builder);
5369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    Monster.addPos(builder, pos);
5469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    Monster.addName(builder, name);
5569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    Monster.addColor(builder, Color.Red);
5669a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    Monster.addHp(builder, (short)300);
5769a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    Monster.addInventory(builder, inv);
5869a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    Monster.addWeapons(builder, weapons);
5969a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    Monster.addEquippedType(builder, Equipment.Weapon);
6069a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    Monster.addEquipped(builder, weaps[1]);
6169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    int orc = Monster.endMonster(builder);
6269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
6369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    builder.finish(orc); // You could also call `Monster.finishMonsterBuffer(builder, orc);`.
6469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
6569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    // We now have a FlatBuffer that can be stored on disk or sent over a network.
6669a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
6769a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    // ...Code to store to disk or send over a network goes here...
6869a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
6969a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    // Instead, we are going to access it right away, as if we just received it.
7069a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
7169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    ByteBuffer buf = builder.dataBuffer();
7269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
7369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    // Get access to the root:
7469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    Monster monster = Monster.getRootAsMonster(buf);
7569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
7669a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    // Note: We did not set the `mana` field explicitly, so we get back the default value.
7769a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    assert monster.mana() == (short)150;
7869a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    assert monster.hp() == (short)300;
7969a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    assert monster.name().equals("Orc");
8069a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    assert monster.color() == Color.Red;
8169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    assert monster.pos().x() == 1.0f;
8269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    assert monster.pos().y() == 2.0f;
8369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    assert monster.pos().z() == 3.0f;
8469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
8569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    // Get and test the `inventory` FlatBuffer `vector`.
8669a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    for (int i = 0; i < monster.inventoryLength(); i++) {
8769a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara      assert monster.inventory(i) == (byte)i;
8869a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    }
8969a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
9069a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    // Get and test the `weapons` FlatBuffer `vector` of `table`s.
9169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    String[] expectedWeaponNames = {"Sword", "Axe"};
9269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    int[] expectedWeaponDamages = {3, 5};
9369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    for (int i = 0; i < monster.weaponsLength(); i++) {
9469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara      assert monster.weapons(i).name().equals(expectedWeaponNames[i]);
9569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara      assert monster.weapons(i).damage() == expectedWeaponDamages[i];
9669a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    }
9769a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
9869a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    // Get and test the `equipped` FlatBuffer `union`.
9969a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    assert monster.equippedType() == Equipment.Weapon;
10069a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    Weapon equipped = (Weapon)monster.equipped(new Weapon());
10169a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    assert equipped.name().equals("Axe");
10269a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    assert equipped.damage() == 5;
10369a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara
10469a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara    System.out.println("The FlatBuffer was successfully created and verified!");
10569a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara  }
10669a31b807a85e9a5ca4efb839f37ecb6dcf3eed5Mark Klara}
107