blob: adf04d37bbcc27ae8d7f7f0d2dbb0cbf1f34b0b6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package com.alibaba.dubboadmin.web.mvc;
import java.lang.reflect.Method;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.dubboadmin.SpringUtil;
import com.alibaba.dubboadmin.governance.util.WebConstants;
import com.alibaba.dubboadmin.web.mvc.governance.ServicesController;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class RouterController {
@Autowired
ServicesController servicesController;
private boolean isPrimitive(Class<?> cls) {
return cls.isPrimitive() || cls == Boolean.class || cls == Byte.class
|| cls == Character.class || cls == Short.class || cls == Integer.class
|| cls == Long.class || cls == Float.class || cls == Double.class
|| cls == String.class;
}
private Object convertPrimitive(Class<?> cls, String value) {
if (cls == boolean.class || cls == Boolean.class) {
return value == null || value.length() == 0 ? false : Boolean.valueOf(value);
} else if (cls == byte.class || cls == Byte.class) {
return value == null || value.length() == 0 ? 0 : Byte.valueOf(value);
} else if (cls == char.class || cls == Character.class) {
return value == null || value.length() == 0 ? '\0' : value.charAt(0);
} else if (cls == short.class || cls == Short.class) {
return value == null || value.length() == 0 ? 0 : Short.valueOf(value);
} else if (cls == int.class || cls == Integer.class) {
return value == null || value.length() == 0 ? 0 : Integer.valueOf(value);
} else if (cls == long.class || cls == Long.class) {
return value == null || value.length() == 0 ? 0 : Long.valueOf(value);
} else if (cls == float.class || cls == Float.class) {
return value == null || value.length() == 0 ? 0 : Float.valueOf(value);
} else if (cls == double.class || cls == Double.class) {
return value == null || value.length() == 0 ? 0 : Double.valueOf(value);
}
return value;
}
//address mapping
@RequestMapping("/governance/addresses/{ip:[0-9.]+:?[0-9]+}/{type}")
public String addressRouter(@PathVariable("ip") String ip, @PathVariable("type") String type,
HttpServletRequest request, HttpServletResponse response, Model model) {
model.addAttribute("address", ip);
return appRouter(null, "addresses", ip, type, request, response, model);
}
@RequestMapping("/governance/addresses/{ip:[0-9.]+:?[0-9]+}/{type}/{action}")
public String addresswithIDRouter(@RequestParam Map<String, String> params, @PathVariable("ip") String ip, @PathVariable("type") String type,
@PathVariable("action") String action, HttpServletRequest request,
HttpServletResponse response, Model model) {
model.addAttribute("address", ip);
return appAction(params, null, "addresses",ip, type, action, request, response, model);
}
@RequestMapping("/governance/addresses/{ip:[0-9.]+:?[0-9]+}/{type}/{id}/{action}")
public String addressWithIDandAction(@PathVariable("ip") String ip, @PathVariable("type") String type,
@PathVariable("id") String id, @PathVariable("action") String action,
HttpServletRequest request, HttpServletResponse response, Model model) {
model.addAttribute("address", ip);
return appActionWithIdandAction(null, null, type, id, action, request, response, model);
}
// service mapping
@RequestMapping("/governance/services/{service}/{type}")
public String servicerRouter(@PathVariable("service") String service, @PathVariable("type") String type,
HttpServletRequest request, HttpServletResponse response, Model model) {
model.addAttribute("service", service);
return appRouter(null, "services", service, type, request, response, model);
}
@RequestMapping("/governance/services/{service}/{type}/{action}")
public String serviceAction(@RequestParam Map<String, String> param,
@PathVariable("service") String service, @PathVariable("type") String type,
@PathVariable("action") String action, HttpServletRequest request,
HttpServletResponse response, Model model) {
for (Map.Entry<String, String> entry : param.entrySet()) {
System.out.println("key: " + entry.getKey());
System.out.println("value: " + entry.getValue());
}
model.addAttribute("service", service);
return appAction(param, null, "services", service, type, action, request, response, model);
}
@RequestMapping("/governance/services/{service}/{type}/{id}/{action}")
public String serviceActionWithId(@RequestParam Map<String, Object> param,
@PathVariable("service") String service,
@PathVariable("type") String type, @PathVariable("id") String id,
@PathVariable("action") String action, HttpServletRequest request, HttpServletResponse response, Model model) {
String method = request.getMethod();
String app = null;
System.out.println("type: " + type);
System.out.println("action: " + action);
System.out.println("method: " + method);
for (Map.Entry<String, Object> entry : param.entrySet()) {
if (entry.getKey().equals("application")) {
app = (String)entry.getValue();
}
System.out.println("key: " + entry.getKey());
System.out.println("value: " + entry.getValue());
}
return appActionWithIdandAction(app, service, type, id, action, request, response, model);
}
// app mapping all execute goes here
//@RequestMapping("/governance/applications/{app}/services/{ids}/{action}")
//public String serviceActionWithApp(@PathVariable("app") String app, @PathVariable("ids") String ids,
// @PathVariable("type") String type, HttpServletRequest request,
// HttpServletResponse response, Model model) {
// return "";
//}
@RequestMapping("/governance/applications/{app}/{elements}/{element}/{type}")
public String appRouter(@PathVariable("app") String app, @PathVariable("elements") String elements,
@PathVariable("element") String element, @PathVariable("type") String type,
HttpServletRequest request,
HttpServletResponse response, Model model) {
if (app != null) {
model.addAttribute("app", app);
}
if (StringUtils.isNumeric(element)) {
//service action, shield, recover..
Long[] ids = new Long[1];
ids[0] = Long.valueOf(element);
model.addAttribute("service", request.getParameter("service"));
try {
Method m = servicesController.getClass().getDeclaredMethod(type, Long[].class, HttpServletRequest.class,
HttpServletResponse.class, Model.class);
Object result = m.invoke(servicesController, ids, request, response, model);
return (String) result;
} catch (Exception e) {
e.printStackTrace();
}
}
if (elements.equals("services")) {
model.addAttribute("service", element);
} else if (elements.equals("addresses")) {
model.addAttribute("address", element);
}
String name = WebConstants.mapper.get(type);
if (name != null) {
Object controller = SpringUtil.getBean(name);
if (controller != null) {
try {
Method index = controller.getClass().getDeclaredMethod("index", HttpServletRequest.class, HttpServletResponse.class,
Model.class);
Object result = index.invoke(controller, request, response, model);
return (String)result;
} catch (Exception e) {
e.printStackTrace();
}
}
}
return "";
}
@RequestMapping("/governance/applications/{app}/{type}")
public String appWithService(@PathVariable("app") String app, @PathVariable("type") String type,
HttpServletRequest request,
HttpServletResponse response,
Model model) {
model.addAttribute("app", app);
String name = WebConstants.mapper.get(type);
if (name != null) {
Object controller = SpringUtil.getBean(name);
try {
Method index = controller.getClass().getDeclaredMethod("index", HttpServletRequest.class,
HttpServletResponse.class, Model.class);
Object result = index.invoke(controller, request, response, model);
return (String) result;
} catch (Exception e) {
e.printStackTrace();
}
}
return "";
}
@RequestMapping("/governance/applications/{app}/{elements}/{element}/{type}/{action}")
public String appAction(@RequestParam Map<String, String> params, @PathVariable("app") String app,
@PathVariable("elements") String elements, @PathVariable("element") String element,
@PathVariable("type") String type, @PathVariable("action") String action,
HttpServletRequest request, HttpServletResponse response, Model model) {
if (app != null) {
model.addAttribute("app", app);
}
if (elements.equals("services")) {
model.addAttribute("service", element);
} else if (elements.equals("addresses")) {
model.addAttribute("address", element);
}
String name = WebConstants.mapper.get(type);
if (name != null) {
Object controller = SpringUtil.getBean(name);
if (controller != null) {
if (request.getMethod().equals("POST")) {
Method[] methods = controller.getClass().getDeclaredMethods();
for (Method method : methods) {
if (method.getName().equals(action)) {
Class<?> param = method.getParameterTypes()[0];
try {
if (!param.isAssignableFrom(HttpServletRequest.class)) {
Object value = param.newInstance();
Method[] mms = param.getDeclaredMethods();
for (Method m : mms) {
if (m.getName().toLowerCase().startsWith("set")) {
String methodName = m.getName();
String key = methodName.substring(3).toLowerCase();
String tmp = params.get(key);
Object obj = tmp;
if (tmp != null) {
Class<?> t = m.getParameterTypes()[0];
if (isPrimitive(t)) {
obj = convertPrimitive(t, tmp);
}
m.invoke(value, obj);
}
}
}
return (String)method.invoke(controller, value, request, response, model);
} else {
return (String)method.invoke(controller, request, response, model);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
} else {
try {
if (StringUtils.isNumeric(action)) {
// action is id, call show method
Method show = controller.getClass().getDeclaredMethod("show", Long.class, HttpServletRequest.class, HttpServletResponse.class,
Model.class);
Object result = show.invoke(controller, Long.valueOf(action), request, response, model);
return (String)result;
} else {
Method m = controller.getClass().getDeclaredMethod(action, HttpServletRequest.class,
HttpServletResponse.class,
Model.class);
Object result = m.invoke(controller, request, response, model);
return (String)result;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return "";
}
@RequestMapping("/governance/applications/{app}/services/{service}/{type}/{id}/{action}")
public String appActionWithIdandAction(@PathVariable("app") String app, @PathVariable("service") String service,
@PathVariable("type") String type, @PathVariable("id") String id,
@PathVariable("action") String action,
HttpServletRequest request, HttpServletResponse response, Model model) {
if (app != null) {
model.addAttribute("app", app);
}
model.addAttribute("service", service);
String name = WebConstants.mapper.get(type);
if (name != null) {
Object controller = SpringUtil.getBean(name);
if (controller != null) {
try {
Object result = null;
if (StringUtils.isNumeric(id)) {
//single id
Method m = null;
try {
m = controller.getClass().getDeclaredMethod(action, Long.class, HttpServletRequest.class,
HttpServletResponse.class, Model.class);
result = m.invoke(controller, Long.valueOf(id), request, response, model);
} catch (NoSuchMethodException e) {
m = controller.getClass().getDeclaredMethod(action, Long[].class, HttpServletRequest.class,
HttpServletResponse.class, Model.class);
result = m.invoke(controller, new Long[]{Long.valueOf(id)}, request, response, model);
}
} else {
//id array
String[] array = id.split(",");
Long[] ids = new Long[array.length];
for (int i = 0; i < array.length; i ++) {
ids[i] = Long.valueOf(array[i]);
}
Method m = controller.getClass().getDeclaredMethod(action, Long[].class, HttpServletRequest.class,
HttpServletResponse.class, Model.class);
result = m.invoke(controller, ids, request, response, model);
}
return (String)result;
} catch (Exception e) {
e.printStackTrace();
}
}
}
return "";
}
}