001 /**
002 * Copyright (c) 2010 Yahoo! Inc. All rights reserved.
003 * Licensed under the Apache License, Version 2.0 (the "License");
004 * you may not use this file except in compliance with the License.
005 * You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software
010 * distributed under the License is distributed on an "AS IS" BASIS,
011 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 * See the License for the specific language governing permissions and
013 * limitations under the License. See accompanying LICENSE file.
014 */
015 package org.apache.oozie.servlet;
016
017 import java.io.IOException;
018 import java.util.Map;
019
020 import javax.servlet.ServletException;
021 import javax.servlet.http.HttpServletRequest;
022 import javax.servlet.http.HttpServletResponse;
023
024 import org.apache.oozie.BuildInfo;
025 import org.apache.oozie.client.rest.JsonTags;
026 import org.apache.oozie.client.rest.RestConstants;
027 import org.apache.oozie.service.AuthorizationException;
028 import org.apache.oozie.service.AuthorizationService;
029 import org.apache.oozie.service.InstrumentationService;
030 import org.apache.oozie.service.Services;
031 import org.apache.oozie.util.Instrumentation;
032 import org.json.simple.JSONArray;
033 import org.json.simple.JSONObject;
034
035 public abstract class BaseAdminServlet extends JsonRestServlet {
036
037 private static final long serialVersionUID = 1L;
038 protected String modeTag;
039
040 public BaseAdminServlet(String instrumentationName, ResourceInfo []RESOURCES_INFO ) {
041 super(instrumentationName, RESOURCES_INFO);
042 setAllowSafeModeChanges(true);
043 }
044
045 /**
046 * Change safemode state.
047 */
048 protected void doPut(HttpServletRequest request, HttpServletResponse response)
049 throws ServletException, IOException {
050 String resourceName = getResourceName(request);
051 request.setAttribute(AUDIT_OPERATION, resourceName);
052 request.setAttribute(AUDIT_PARAM, request.getParameter(modeTag));
053
054 try {
055 AuthorizationService auth = Services.get().get(AuthorizationService.class);
056 auth.authorizeForAdmin(getUser(request), true);
057 }
058 catch (AuthorizationException ex) {
059 throw new XServletException(HttpServletResponse.SC_UNAUTHORIZED, ex);
060 }
061
062 setOozieMode(request, response, resourceName);
063 /*if (resourceName.equals(RestConstants.ADMIN_STATUS_RESOURCE)) {
064 boolean safeMode = Boolean.parseBoolean(request.getParameter(RestConstants.ADMIN_SAFE_MODE_PARAM));
065 Services.get().setSafeMode(safeMode);
066 response.setStatus(HttpServletResponse.SC_OK);
067 }
068 else {
069 throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0301, resourceName);
070 }*/
071 }
072
073 /**
074 * Return safemode state, instrumentation, configuration, osEnv or javaSysProps
075 */
076 @SuppressWarnings("unchecked")
077 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
078 String resource = getResourceName(request);
079 Instrumentation instr = Services.get().get(InstrumentationService.class).get();
080
081 if (resource.equals(RestConstants.ADMIN_STATUS_RESOURCE)) {
082 JSONObject json = new JSONObject();
083 populateOozieMode(json);
084 //json.put(JsonTags.SYSTEM_SAFE_MODE, getOozeMode());
085 sendJsonResponse(response, HttpServletResponse.SC_OK, json);
086 }
087 else if (resource.equals(RestConstants.ADMIN_OS_ENV_RESOURCE)) {
088 JSONObject json = new JSONObject();
089 json.putAll(instr.getOSEnv());
090 sendJsonResponse(response, HttpServletResponse.SC_OK, json);
091 }
092 else if (resource.equals(RestConstants.ADMIN_JAVA_SYS_PROPS_RESOURCE)) {
093 JSONObject json = new JSONObject();
094 json.putAll(instr.getJavaSystemProperties());
095 sendJsonResponse(response, HttpServletResponse.SC_OK, json);
096 }
097 else if (resource.equals(RestConstants.ADMIN_CONFIG_RESOURCE)) {
098 JSONObject json = new JSONObject();
099 json.putAll(instr.getConfiguration());
100 sendJsonResponse(response, HttpServletResponse.SC_OK, json);
101 }
102 else if (resource.equals(RestConstants.ADMIN_INSTRUMENTATION_RESOURCE)) {
103 sendJsonResponse(response, HttpServletResponse.SC_OK, instrToJson(instr));
104 }
105 else if (resource.equals(RestConstants.ADMIN_BUILD_VERSION_RESOURCE)) {
106 JSONObject json = new JSONObject();
107 json.put(JsonTags.BUILD_VERSION, BuildInfo.getBuildInfo().getProperty(BuildInfo.BUILD_VERSION));
108 sendJsonResponse(response, HttpServletResponse.SC_OK, json);
109 }
110 else if (resource.equals(RestConstants.ADMIN_QUEUE_DUMP_RESOURCE)) {
111 JSONObject json = new JSONObject();
112 getQueueDump(json);
113 sendJsonResponse(response, HttpServletResponse.SC_OK, json);
114 }
115 }
116
117 @SuppressWarnings("unchecked")
118 private <T> JSONArray instrElementsToJson(Map<String, Map<String, Instrumentation.Element<T>>> instrElements) {
119 JSONArray array = new JSONArray();
120 for (Map.Entry<String, Map<String, Instrumentation.Element<T>>> group : instrElements.entrySet()) {
121 JSONObject json = new JSONObject();
122 String groupName = group.getKey();
123 json.put(JsonTags.INSTR_GROUP, groupName);
124 JSONArray dataArray = new JSONArray();
125 for (Map.Entry<String, Instrumentation.Element<T>> elementEntry : group.getValue().entrySet()) {
126 String samplerName = elementEntry.getKey();
127 JSONObject dataJson = new JSONObject();
128 dataJson.put(JsonTags.INSTR_NAME, samplerName);
129 Object value = elementEntry.getValue().getValue();
130 if (value instanceof Instrumentation.Timer) {
131 Instrumentation.Timer timer = (Instrumentation.Timer) value;
132 dataJson.put(JsonTags.INSTR_TIMER_TICKS, timer.getTicks());
133 dataJson.put(JsonTags.INSTR_TIMER_OWN_TIME_AVG, timer.getOwnAvg());
134 dataJson.put(JsonTags.INSTR_TIMER_TOTAL_TIME_AVG, timer.getTotalAvg());
135 dataJson.put(JsonTags.INSTR_TIMER_OWN_STD_DEV, timer.getOwnStdDev());
136 dataJson.put(JsonTags.INSTR_TIMER_TOTAL_STD_DEV, timer.getTotalStdDev());
137 dataJson.put(JsonTags.INSTR_TIMER_OWN_MIN_TIME, timer.getOwnMin());
138 dataJson.put(JsonTags.INSTR_TIMER_OWN_MAX_TIME, timer.getOwnMax());
139 dataJson.put(JsonTags.INSTR_TIMER_TOTAL_MIN_TIME, timer.getTotalMin());
140 dataJson.put(JsonTags.INSTR_TIMER_TOTAL_MAX_TIME, timer.getTotalMax());
141 }
142 else {
143 dataJson.put(JsonTags.INSTR_VARIABLE_VALUE, value);
144 }
145 dataArray.add(dataJson);
146 }
147 json.put(JsonTags.INSTR_DATA, dataArray);
148 array.add(json);
149 }
150 return array;
151 }
152
153 @SuppressWarnings("unchecked")
154 private JSONObject instrToJson(Instrumentation instr) {
155 JSONObject json = new JSONObject();
156 json.put(JsonTags.INSTR_VARIABLES, instrElementsToJson(instr.getVariables()));
157 json.put(JsonTags.INSTR_SAMPLERS, instrElementsToJson(instr.getSamplers()));
158 json.put(JsonTags.INSTR_COUNTERS, instrElementsToJson(instr.getCounters()));
159 json.put(JsonTags.INSTR_TIMERS, instrElementsToJson(instr.getTimers()));
160 return json;
161 }
162
163 protected abstract void populateOozieMode(JSONObject json);
164 protected abstract void setOozieMode(HttpServletRequest request, HttpServletResponse response, String resourceName) throws XServletException;
165 protected abstract void getQueueDump(JSONObject json) throws XServletException;
166
167 }