1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.http.jmx;
19
20 import java.io.IOException;
21 import java.io.PrintWriter;
22 import java.lang.management.ManagementFactory;
23
24 import javax.management.MBeanServer;
25 import javax.management.MalformedObjectNameException;
26 import javax.management.ObjectName;
27 import javax.management.ReflectionException;
28 import javax.management.RuntimeErrorException;
29 import javax.management.RuntimeMBeanException;
30 import javax.management.openmbean.CompositeData;
31 import javax.management.openmbean.TabularData;
32 import javax.servlet.ServletException;
33 import javax.servlet.http.HttpServlet;
34 import javax.servlet.http.HttpServletRequest;
35 import javax.servlet.http.HttpServletResponse;
36
37 import org.apache.commons.logging.Log;
38 import org.apache.commons.logging.LogFactory;
39 import org.apache.hadoop.hbase.http.HttpServer;
40 import org.apache.hadoop.hbase.util.JSONBean;
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116 public class JMXJsonServlet extends HttpServlet {
117 private static final Log LOG = LogFactory.getLog(JMXJsonServlet.class);
118
119 private static final long serialVersionUID = 1L;
120
121 private static final String CALLBACK_PARAM = "callback";
122
123
124
125
126
127 private static final String INCLUDE_DESCRIPTION = "description";
128
129
130
131
132 protected transient MBeanServer mBeanServer;
133
134 protected transient JSONBean jsonBeanWriter;
135
136
137
138
139 @Override
140 public void init() throws ServletException {
141
142 mBeanServer = ManagementFactory.getPlatformMBeanServer();
143 this.jsonBeanWriter = new JSONBean();
144 }
145
146
147
148
149
150
151
152
153
154 @Override
155 public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
156 try {
157 if (!HttpServer.isInstrumentationAccessAllowed(getServletContext(), request, response)) {
158 return;
159 }
160 String jsonpcb = null;
161 PrintWriter writer = null;
162 JSONBean.Writer beanWriter = null;
163 try {
164 jsonpcb = checkCallbackName(request.getParameter(CALLBACK_PARAM));
165 writer = response.getWriter();
166 beanWriter = this.jsonBeanWriter.open(writer);
167
168 if (jsonpcb != null) {
169 response.setContentType("application/javascript; charset=utf8");
170 writer.write(jsonpcb + "(");
171 } else {
172 response.setContentType("application/json; charset=utf8");
173 }
174
175 String tmpStr = request.getParameter(INCLUDE_DESCRIPTION);
176 boolean description = tmpStr != null && tmpStr.length() > 0;
177
178
179 String getmethod = request.getParameter("get");
180 if (getmethod != null) {
181 String[] splitStrings = getmethod.split("\\:\\:");
182 if (splitStrings.length != 2) {
183 beanWriter.write("result", "ERROR");
184 beanWriter.write("message", "query format is not as expected.");
185 beanWriter.flush();
186 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
187 return;
188 }
189 if (beanWriter.write(this.mBeanServer, new ObjectName(splitStrings[0]),
190 splitStrings[1], description) != 0) {
191 beanWriter.flush();
192 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
193 }
194 return;
195 }
196
197
198 String qry = request.getParameter("qry");
199 if (qry == null) {
200 qry = "*:*";
201 }
202 if (beanWriter.write(this.mBeanServer, new ObjectName(qry), null, description) != 0) {
203 beanWriter.flush();
204 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
205 }
206 } finally {
207 if (beanWriter != null) beanWriter.close();
208 if (jsonpcb != null) {
209 writer.write(");");
210 }
211 if (writer != null) {
212 writer.close();
213 }
214 }
215 } catch (IOException e) {
216 LOG.error("Caught an exception while processing JMX request", e);
217 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
218 } catch (MalformedObjectNameException e) {
219 LOG.error("Caught an exception while processing JMX request", e);
220 response.sendError(HttpServletResponse.SC_BAD_REQUEST);
221 }
222 }
223
224
225
226
227
228
229
230
231
232
233 private String checkCallbackName(String callbackName) throws IOException {
234 if (null == callbackName) {
235 return null;
236 }
237 if (callbackName.matches("[A-Za-z0-9_]+")) {
238 return callbackName;
239 }
240 throw new IOException("'callback' must be alphanumeric");
241 }
242 }