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    }