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        @Override
049        protected void doPut(HttpServletRequest request, HttpServletResponse response) 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
075         * javaSysProps
076         */
077        @Override
078        @SuppressWarnings("unchecked")
079        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
080            String resource = getResourceName(request);
081            Instrumentation instr = Services.get().get(InstrumentationService.class).get();
082    
083            if (resource.equals(RestConstants.ADMIN_STATUS_RESOURCE)) {
084                JSONObject json = new JSONObject();
085                populateOozieMode(json);
086                // json.put(JsonTags.SYSTEM_SAFE_MODE, getOozeMode());
087                sendJsonResponse(response, HttpServletResponse.SC_OK, json);
088            }
089            else if (resource.equals(RestConstants.ADMIN_OS_ENV_RESOURCE)) {
090                JSONObject json = new JSONObject();
091                json.putAll(instr.getOSEnv());
092                sendJsonResponse(response, HttpServletResponse.SC_OK, json);
093            }
094            else if (resource.equals(RestConstants.ADMIN_JAVA_SYS_PROPS_RESOURCE)) {
095                JSONObject json = new JSONObject();
096                json.putAll(instr.getJavaSystemProperties());
097                sendJsonResponse(response, HttpServletResponse.SC_OK, json);
098            }
099            else if (resource.equals(RestConstants.ADMIN_CONFIG_RESOURCE)) {
100                JSONObject json = new JSONObject();
101                json.putAll(instr.getConfiguration());
102                sendJsonResponse(response, HttpServletResponse.SC_OK, json);
103            }
104            else if (resource.equals(RestConstants.ADMIN_INSTRUMENTATION_RESOURCE)) {
105                sendJsonResponse(response, HttpServletResponse.SC_OK, instrToJson(instr));
106            }
107            else if (resource.equals(RestConstants.ADMIN_BUILD_VERSION_RESOURCE)) {
108                JSONObject json = new JSONObject();
109                json.put(JsonTags.BUILD_VERSION, BuildInfo.getBuildInfo().getProperty(BuildInfo.BUILD_VERSION));
110                sendJsonResponse(response, HttpServletResponse.SC_OK, json);
111            }
112            else if (resource.equals(RestConstants.ADMIN_QUEUE_DUMP_RESOURCE)) {
113                JSONObject json = new JSONObject();
114                getQueueDump(json);
115                sendJsonResponse(response, HttpServletResponse.SC_OK, json);
116            }
117        }
118    
119        @Override
120        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
121                IOException {
122        }
123    
124        @SuppressWarnings("unchecked")
125        private <T> JSONArray instrElementsToJson(Map<String, Map<String, Instrumentation.Element<T>>> instrElements) {
126            JSONArray array = new JSONArray();
127            for (Map.Entry<String, Map<String, Instrumentation.Element<T>>> group : instrElements.entrySet()) {
128                JSONObject json = new JSONObject();
129                String groupName = group.getKey();
130                json.put(JsonTags.INSTR_GROUP, groupName);
131                JSONArray dataArray = new JSONArray();
132                for (Map.Entry<String, Instrumentation.Element<T>> elementEntry : group.getValue().entrySet()) {
133                    String samplerName = elementEntry.getKey();
134                    JSONObject dataJson = new JSONObject();
135                    dataJson.put(JsonTags.INSTR_NAME, samplerName);
136                    Object value = elementEntry.getValue().getValue();
137                    if (value instanceof Instrumentation.Timer) {
138                        Instrumentation.Timer timer = (Instrumentation.Timer) value;
139                        dataJson.put(JsonTags.INSTR_TIMER_TICKS, timer.getTicks());
140                        dataJson.put(JsonTags.INSTR_TIMER_OWN_TIME_AVG, timer.getOwnAvg());
141                        dataJson.put(JsonTags.INSTR_TIMER_TOTAL_TIME_AVG, timer.getTotalAvg());
142                        dataJson.put(JsonTags.INSTR_TIMER_OWN_STD_DEV, timer.getOwnStdDev());
143                        dataJson.put(JsonTags.INSTR_TIMER_TOTAL_STD_DEV, timer.getTotalStdDev());
144                        dataJson.put(JsonTags.INSTR_TIMER_OWN_MIN_TIME, timer.getOwnMin());
145                        dataJson.put(JsonTags.INSTR_TIMER_OWN_MAX_TIME, timer.getOwnMax());
146                        dataJson.put(JsonTags.INSTR_TIMER_TOTAL_MIN_TIME, timer.getTotalMin());
147                        dataJson.put(JsonTags.INSTR_TIMER_TOTAL_MAX_TIME, timer.getTotalMax());
148                    }
149                    else {
150                        dataJson.put(JsonTags.INSTR_VARIABLE_VALUE, value);
151                    }
152                    dataArray.add(dataJson);
153                }
154                json.put(JsonTags.INSTR_DATA, dataArray);
155                array.add(json);
156            }
157            return array;
158        }
159    
160        @SuppressWarnings("unchecked")
161        private JSONObject instrToJson(Instrumentation instr) {
162            JSONObject json = new JSONObject();
163            json.put(JsonTags.INSTR_VARIABLES, instrElementsToJson(instr.getVariables()));
164            json.put(JsonTags.INSTR_SAMPLERS, instrElementsToJson(instr.getSamplers()));
165            json.put(JsonTags.INSTR_COUNTERS, instrElementsToJson(instr.getCounters()));
166            json.put(JsonTags.INSTR_TIMERS, instrElementsToJson(instr.getTimers()));
167            return json;
168        }
169    
170        protected abstract void populateOozieMode(JSONObject json);
171    
172        protected abstract void setOozieMode(HttpServletRequest request, HttpServletResponse response, String resourceName)
173                throws XServletException;
174    
175        protected abstract void getQueueDump(JSONObject json) throws XServletException;
176    
177    }