History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/sun/management/ConnectorAddressLink.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/management/ConnectorAddressLink.java+181−0
@@ -0,0 +1,181 @@
1/*
2 * Copyright (c) 2004, 2008, 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
26package sun.management;
27
28import java.io.IOException;
29import java.nio.ByteBuffer;
30import java.util.HashMap;
31import java.util.Iterator;
32import java.util.List;
33import java.util.Map;
34import java.util.concurrent.atomic.AtomicInteger;
35
36import sun.misc.Perf;
37import sun.management.counter.Units;
38import sun.management.counter.Counter;
39import sun.management.counter.perf.PerfInstrumentation;
40
41/**
42 * A utility class to support the exporting and importing of the address
43 * of a connector server using the instrumentation buffer.
44 *
45 * @since 1.5
46 */
47public class ConnectorAddressLink {
48
49 private static final String CONNECTOR_ADDRESS_COUNTER =
50 "sun.management.JMXConnectorServer.address";
51
52 /*
53 * The format of the jvmstat counters representing the properties of
54 * a given out-of-the-box JMX remote connector will be as follows:
55 *
56 * sun.management.JMXConnectorServer.<counter>.<key>=<value>
57 *
58 * where:
59 *
60 * counter = index computed by this class which uniquely identifies
61 * an out-of-the-box JMX remote connector running in this
62 * Java virtual machine.
63 * key/value = a given key/value pair in the map supplied to the
64 * exportRemote() method.
65 *
66 * For example,
67 *
68 * sun.management.JMXConnectorServer.0.remoteAddress=service:jmx:rmi:///jndi/rmi://myhost:5000/jmxrmi
69 * sun.management.JMXConnectorServer.0.authenticate=false
70 * sun.management.JMXConnectorServer.0.ssl=false
71 * sun.management.JMXConnectorServer.0.sslRegistry=false
72 * sun.management.JMXConnectorServer.0.sslNeedClientAuth=false
73 */
74 private static final String REMOTE_CONNECTOR_COUNTER_PREFIX =
75 "sun.management.JMXConnectorServer.";
76
77 /*
78 * JMX remote connector counter (it will be incremented every
79 * time a new out-of-the-box JMX remote connector is created).
80 */
81 private static AtomicInteger counter = new AtomicInteger();
82
83 /**
84 * Exports the specified connector address to the instrumentation buffer
85 * so that it can be read by this or other Java virtual machines running
86 * on the same system.
87 *
88 * @param address The connector address.
89 */
90 public static void export(String address) {
91 if (address == null || address.length() == 0) {
92 throw new IllegalArgumentException("address not specified");
93 }
94 Perf perf = Perf.getPerf();
95 perf.createString(
96 CONNECTOR_ADDRESS_COUNTER, 1, Units.STRING.intValue(), address);
97 }
98
99 /**
100 * Imports the connector address from the instrument buffer
101 * of the specified Java virtual machine.
102 *
103 * @param vmid an identifier that uniquely identifies a local Java virtual
104 * machine, or <code>0</code> to indicate the current Java virtual machine.
105 *
106 * @return the value of the connector address, or <code>null</code> if the
107 * target VM has not exported a connector address.
108 *
109 * @throws IOException An I/O error occurred while trying to acquire the
110 * instrumentation buffer.
111 */
112 public static String importFrom(int vmid) throws IOException {
113 Perf perf = Perf.getPerf();
114 ByteBuffer bb;
115 try {
116 bb = perf.attach(vmid, "r");
117 } catch (IllegalArgumentException iae) {
118 throw new IOException(iae.getMessage());
119 }
120 List counters =
121 new PerfInstrumentation(bb).findByPattern(CONNECTOR_ADDRESS_COUNTER);
122 Iterator i = counters.iterator();
123 if (i.hasNext()) {
124 Counter c = (Counter) i.next();
125 return (String) c.getValue();
126 } else {
127 return null;
128 }
129 }
130
131 /**
132 * Exports the specified remote connector address and associated
133 * configuration properties to the instrumentation buffer so that
134 * it can be read by this or other Java virtual machines running
135 * on the same system.
136 *
137 * @param properties The remote connector address properties.
138 */
139 public static void exportRemote(Map<String, String> properties) {
140 final int index = counter.getAndIncrement();
141 Perf perf = Perf.getPerf();
142 for (Map.Entry<String, String> entry : properties.entrySet()) {
143 perf.createString(REMOTE_CONNECTOR_COUNTER_PREFIX + index + "." +
144 entry.getKey(), 1, Units.STRING.intValue(), entry.getValue());
145 }
146 }
147
148 /**
149 * Imports the remote connector address and associated
150 * configuration properties from the instrument buffer
151 * of the specified Java virtual machine.
152 *
153 * @param vmid an identifier that uniquely identifies a local Java virtual
154 * machine, or <code>0</code> to indicate the current Java virtual machine.
155 *
156 * @return a map containing the remote connector's properties, or an empty
157 * map if the target VM has not exported the remote connector's properties.
158 *
159 * @throws IOException An I/O error occurred while trying to acquire the
160 * instrumentation buffer.
161 */
162 public static Map<String, String> importRemoteFrom(int vmid) throws IOException {
163 Perf perf = Perf.getPerf();
164 ByteBuffer bb;
165 try {
166 bb = perf.attach(vmid, "r");
167 } catch (IllegalArgumentException iae) {
168 throw new IOException(iae.getMessage());
169 }
170 List counters = new PerfInstrumentation(bb).getAllCounters();
171 Map<String, String> properties = new HashMap<String, String>();
172 for (Object c : counters) {
173 String name = ((Counter) c).getName();
174 if (name.startsWith(REMOTE_CONNECTOR_COUNTER_PREFIX) &&
175 !name.equals(CONNECTOR_ADDRESS_COUNTER)) {
176 properties.put(name, ((Counter) c).getValue().toString());
177 }
178 }
179 return properties;
180 }
181}