From 43a0c023e9b6ae42dc8aba31c1562190ffd156e9 Mon Sep 17 00:00:00 2001 From: Don McGregor Date: Tue, 4 Jul 2017 13:26:57 -0700 Subject: [PATCH] Fixed EntityMarking.java (maybe) to better handle actual content. For some reason the code generated from XML completely ignored the 11 character array of values that goes along with the string type. Copied from the DIS6 implementation. --- .../edu/nps/moves/dis7/EntityMarking.java | 84 ++++++++++++++++--- 1 file changed, 73 insertions(+), 11 deletions(-) diff --git a/src/main/java/edu/nps/moves/dis7/EntityMarking.java b/src/main/java/edu/nps/moves/dis7/EntityMarking.java index 13479a8e..797213ee 100644 --- a/src/main/java/edu/nps/moves/dis7/EntityMarking.java +++ b/src/main/java/edu/nps/moves/dis7/EntityMarking.java @@ -2,7 +2,7 @@ import java.util.*; import java.io.*; -import edu.nps.moves.disenum.*; +//import edu.nps.moves.disenum.*; import edu.nps.moves.disutil.*; @@ -12,6 +12,9 @@ * Copyright (c) 2008-2016, MOVES Institute, Naval Postgraduate School. All rights reserved. * This work is licensed under the BSD open source license, available at https://www.movesinstitute.org/licenses/bsd.html * + * Manually edited to get the correct 11 characters. Apparently some problem in code generation + * from XML. + * * @author DMcG */ public class EntityMarking extends Object implements Serializable @@ -20,7 +23,7 @@ public class EntityMarking extends Object implements Serializable protected short characterSet; /** The characters */ - protected byte characters; + protected byte[] characters = new byte[11]; /** Constructor */ @@ -33,7 +36,7 @@ public int getMarshalledSize() int marshalSize = 0; marshalSize = marshalSize + 1; // characterSet - marshalSize = marshalSize + 1; // characters + marshalSize = marshalSize + 11 * 1; // characters return marshalSize; } @@ -47,21 +50,71 @@ public short getCharacterSet() { return characterSet; } -public void setCharacters(byte pCharacters) -{ characters = pCharacters; +/** +* Ensure what is set does not go over 11 characters, and anything under +* 11 characters zero-fills. post-processing patch +* @param pCharacters an array of characters to set +*/ +public void setCharacters(byte[] pCharacters) +{ + if (pCharacters.length >= characters.length) + { + System.arraycopy(pCharacters, 0, characters, 0, characters.length); + } + else + { + int pCharactersLength = pCharacters.length; + System.arraycopy(pCharacters, 0, characters, 0, pCharactersLength); + for (int ix = pCharactersLength; ix < characters.length; ix++) + { + // Ensure all zeros in unfilled fields + characters[ix] = 0; + } + } } -public byte getCharacters() -{ return characters; +public byte[] getCharacters() +{ return characters; } + +/** + * An added conveniece method (added by patch): accepts a string, and either + * truncates or zero-fills it to fit into the 11-byte character marking field. + * @param marking the marking string, converted internally into a character array that + * is exactly 11 bytes long + */ +public void setCharactersString(String marking) +{ + byte[] buff = marking.getBytes(); + this.setCharacters(buff); } +/** + * Post-processing added convenience method. Converts the byte array of + * characters to a string. This uses the platform's default charset, + * rather than respecting the charset specified in the other field. + * For the most part this will work, unless you're in some wacky foreign + * country, in which case you should start speaking English. + * + * @return character array converted to a string + */ +public String getCharactersString() +{ + String charString = new String(characters); + + return charString; +} public void marshal(DataOutputStream dos) { try { dos.writeByte( (byte)characterSet); - dos.writeByte( (byte)characters); + + for(int idx = 0; idx < characters.length; idx++) + { + dos.writeByte(characters[idx]); + } // end of array marshaling + } // end try catch(Exception e) { @@ -73,7 +126,10 @@ public void unmarshal(DataInputStream dis) try { characterSet = (short)dis.readUnsignedByte(); - characters = dis.readByte(); + for(int idx = 0; idx < characters.length; idx++) + { + characters[idx] = dis.readByte(); + } // end of array unmarshaling } // end try catch(Exception e) { @@ -93,7 +149,10 @@ public void unmarshal(DataInputStream dis) public void marshal(java.nio.ByteBuffer buff) { buff.put( (byte)characterSet); - buff.put( (byte)characters); + for(int idx = 0; idx < 11; idx++) + { + buff.put( (byte)characters[idx]); + } } // end of marshal method /** @@ -106,7 +165,10 @@ public void marshal(java.nio.ByteBuffer buff) public void unmarshal(java.nio.ByteBuffer buff) { characterSet = (short)(buff.get() & 0xFF); - characters = buff.get(); + for(int idx = 0; idx < 11; idx++) + { + characters[idx] = buff.get(); + } } // end of unmarshal method