1 /*
2  * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 package sun.management.jdp;
26 
27 import java.io.ByteArrayOutputStream;
28 import java.io.DataOutputStream;
29 import java.io.IOException;
30 
31 /**
32  * JdpPacketWriter responsible for writing a packet
33  * <p>This class assembles a set of key/value pairs to valid JDP packet,
34  * ready to be sent across a Net</p>
35  */
36 public final class JdpPacketWriter {
37 
38     private final ByteArrayOutputStream baos;
39     private final DataOutputStream pkt;
40 
41     /**
42      * Create a JDP packet, add mandatory magic and version headers
43      *
44      * @throws IOException
45      */
JdpPacketWriter()46     public JdpPacketWriter()
47             throws IOException {
48         baos = new ByteArrayOutputStream();
49         pkt = new DataOutputStream(baos);
50 
51         pkt.writeInt(JdpGenericPacket.getMagic());
52         pkt.writeShort(JdpGenericPacket.getVersion());
53     }
54 
55     /**
56      * Put string entry to packet
57      *
58      * @param entry - string to put (utf-8 encoded)
59      * @throws IOException
60      */
addEntry(String entry)61     public void addEntry(String entry)
62             throws IOException {
63         /* DataOutputStream.writeUTF() do essentially
64          *  the same as:
65          *    pkt.writeShort(entry.getBytes("UTF-8").length);
66          *    pkt.write(entry.getBytes("UTF-8"));
67          */
68         pkt.writeUTF(entry);
69     }
70 
71     /**
72      * Put key/value pair to packet
73      *
74      * @param key - key to put (utf-8 encoded)
75      * @param val - value to put (utf-8 encoded)
76      * @throws IOException
77      */
addEntry(String key, String val)78     public void addEntry(String key, String val)
79             throws IOException {
80         /* Silently skip key if value is null.
81          * We don't need to distinguish between key missing
82          * and key has no value cases
83          */
84         if (val != null) {
85             addEntry(key);
86             addEntry(val);
87         }
88     }
89 
90     /**
91      * Return assembled packet as a byte array
92      *
93      * @return packet bytes
94      */
getPacketBytes()95     public byte[] getPacketBytes() {
96         return baos.toByteArray();
97     }
98 }
99