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