Use strict String->byte[] conversion
[netconf.git] / netconf / netconf-netty-util / src / main / java / org / opendaylight / netconf / nettyutil / handler / MessageParts.java
index a077671c7f22591bc49a567ddc820ce9af0fbed4..fb21b7f8c2a956d545062e42ef75aa3d1deee04a 100644 (file)
@@ -7,8 +7,11 @@
  */
 package org.opendaylight.netconf.nettyutil.handler;
 
-import static java.nio.charset.StandardCharsets.UTF_8;
-
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.CharacterCodingException;
+import java.nio.charset.CodingErrorAction;
+import java.nio.charset.StandardCharsets;
 import org.opendaylight.netconf.util.messages.NetconfMessageConstants;
 
 /**
@@ -17,11 +20,27 @@ import org.opendaylight.netconf.util.messages.NetconfMessageConstants;
  * @author Thomas Pantelis
  */
 final class MessageParts {
-    static final byte[] END_OF_MESSAGE = NetconfMessageConstants.END_OF_MESSAGE.getBytes(UTF_8);
-    static final byte[] START_OF_CHUNK = NetconfMessageConstants.START_OF_CHUNK.getBytes(UTF_8);
-    static final byte[] END_OF_CHUNK = NetconfMessageConstants.END_OF_CHUNK.getBytes(UTF_8);
+    static final byte[] END_OF_MESSAGE = asciiBytes(NetconfMessageConstants.END_OF_MESSAGE);
+    static final byte[] START_OF_CHUNK = asciiBytes(NetconfMessageConstants.START_OF_CHUNK);
+    static final byte[] END_OF_CHUNK = asciiBytes(NetconfMessageConstants.END_OF_CHUNK);
 
     private MessageParts() {
         // Hidden on purpose
     }
+
+    private static byte[] asciiBytes(final String str) {
+        final ByteBuffer buf;
+        try {
+            buf = StandardCharsets.US_ASCII.newEncoder()
+                .onMalformedInput(CodingErrorAction.REPORT)
+                .onUnmappableCharacter(CodingErrorAction.REPORT)
+                .encode(CharBuffer.wrap(str));
+        } catch (CharacterCodingException e) {
+            throw new ExceptionInInitializerError(e);
+        }
+
+        final byte[] ret = new byte[buf.remaining()];
+        buf.get(ret);
+        return ret;
+    }
 }