/** * Copyright 2016 vip.com. * <p> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * </p> */ package com.vip.saturn.job.console.controller; import java.io.IOException; import java.text.ParseException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.vip.saturn.job.console.SaturnEnvProperties; import com.vip.saturn.job.console.domain.RegistryCenterClient; import com.vip.saturn.job.console.domain.RegistryCenterConfiguration; import com.vip.saturn.job.console.service.ExecutorService; import com.vip.saturn.job.console.service.JobDimensionService; import com.vip.saturn.job.console.service.RegistryCenterService; import com.vip.saturn.job.console.service.impl.RegistryCenterServiceImpl; import com.vip.saturn.job.console.utils.ConsoleUtil; @Controller @RequestMapping("/") public class HomeController extends AbstractController { protected static Logger LOGGER = LoggerFactory.getLogger(HomeController.class); @Resource private RegistryCenterService registryCenterService; @Resource private JobDimensionService jobDimensionService; @Resource private ExecutorService executorService; @RequestMapping(method = RequestMethod.GET) public String homepage(final ModelMap model, HttpServletRequest request) { RegistryCenterClient client = getClientInSession(request.getSession()); if (null != client && client.isConnected()) { String ns = client.getCuratorClient().getNamespace(); model.addAttribute("ns", ns); } else { model.addAttribute("ns", ""); } model.put("version", version); model.put("dashboard_on", ConsoleUtil.isDashboardOn() ? "show" : "hide"); return "home"; } @RequestMapping(value = "dashboard", method = RequestMethod.GET) public String dashboard(final ModelMap model, HttpServletRequest request) { return "dashboard"; } @RequestMapping(value = "registry_center_page", method = RequestMethod.GET) public String registryCenterPage(final ModelMap model, HttpServletRequest request) { return "registry_center"; } @RequestMapping(value = "404", method = RequestMethod.GET) public String notFoundPage(final ModelMap model) { return "404"; } @RequestMapping(value = "500", method = RequestMethod.GET) public String errorPage(final ModelMap model, HttpServletRequest req) { String code = null, message = null, type = null; Object codeObj, messageObj, typeObj; Throwable throwable; //todo handle org.springframework.web.bind.MissingServletRequestParameterException codeObj = req.getAttribute("javax.servlet.error.status_code"); messageObj = req.getAttribute("javax.servlet.error.message"); typeObj = req.getAttribute("javax.servlet.error.exception_type"); throwable = (Throwable) req.getAttribute("javax.servlet.error.exception"); // Convert the attributes to string values if (codeObj != null) code = codeObj.toString(); if (messageObj != null) message = messageObj.toString(); if (typeObj != null) type = typeObj.toString(); // The error reason is either the status code or exception type String reason = (code != null ? code : type); model.addAttribute("message", "<H4>" + reason + "</H4>" + "<H4>" + message + "</H4>" + "<P>" + ((throwable != null) ? getStackTrace(throwable) : "") + "</P>"); return "500"; } @RequestMapping(value = "job_detail", method = RequestMethod.GET) public String jobDetail(@RequestParam final String jobName, final ModelMap model, final String nns, final HttpSession session, HttpServletRequest request) { model.put("jobName", jobName); setJobStatusAndIsEnabled(model, jobName); setSession(registryCenterService.connect(nns), session); String jobRate = jobDimensionService.geJobRunningInfo(jobName); String jobType = jobDimensionService.getJobType(jobName); model.put("jobRate", jobRate); model.put("regname", nns); model.put("jobType", jobType); return "job_detail"; } @RequestMapping(value = "overview", method = RequestMethod.GET) public String overview(String name, final ModelMap model, HttpServletRequest request, final HttpSession session) { model.put("containerType", SaturnEnvProperties.CONTAINER_TYPE); if (StringUtils.isNoneEmpty(name)) { setSession(registryCenterService.connect(name), session); renderShellExecutorInfos(model); return "overview"; } RegistryCenterConfiguration config = (RegistryCenterConfiguration) request.getSession().getAttribute(AbstractController.ACTIVATED_CONFIG_SESSION_KEY); if(config == null) { return "redirect:registry_center_page"; } else { setSession(registryCenterService.connect(config.getNameAndNamespace()), session); renderShellExecutorInfos(model); return "overview"; } } private void renderShellExecutorInfos(final ModelMap model) { List<String> aliveExecutorNames = executorService.getAliveExecutorNames(); if (aliveExecutorNames != null && !aliveExecutorNames.isEmpty()) { model.put("aliveExecutors", aliveExecutorNames.toString()); } else { model.put("aliveExecutors", ""); } } @RequestMapping(value = "loadZks", method = RequestMethod.GET) @ResponseBody public Map<String, Object> loadZks(final HttpSession session) throws IOException, ParseException { Map<String, Object> model = new HashMap<>(); model.put("clusters", RegistryCenterServiceImpl.ZKADDR_TO_ZKCLUSTER_MAP.values()); model.put("currentZk", getCurrentZkAddr(session)); return model; } }