/*
* Copyright 2011 Alibaba.com All right reserved. This software is the
* confidential and proprietary information of Alibaba.com ("Confidential
* Information"). You shall not disclose such Confidential Information and shall
* use it only in accordance with the terms of the license agreement you entered
* into with Alibaba.com.
*/
package com.alibaba.dubbo.governance.web.governance.module.screen;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import com.alibaba.dubbo.common.utils.StringUtils;
import com.alibaba.dubbo.governance.service.OverrideService;
import com.alibaba.dubbo.governance.service.ProviderService;
import com.alibaba.dubbo.governance.web.common.module.screen.Restful;
import com.alibaba.dubbo.registry.common.domain.Override;
import com.alibaba.dubbo.registry.common.domain.Provider;
import com.alibaba.dubbo.registry.common.route.OverrideUtils;
import com.alibaba.dubbo.registry.common.util.Tool;
/**
* <p>Providers.</p>
* URI: <br>
* GET /providers 全部提供者列表<br>
* GET /providers/add 新增提供者表单<br>
* POST /providers 创建提供者<br>
* GET /providers/$id 查看提供者详细<br>
* GET /providers/$id/edit 编辑提供者表单<br>
* POST /providers/$id 更新提供者<br>
* GET /providers/$id/delete 删除提供者<br>
* GET /providers/$id/tostatic 转为静态<br>
* GET /providers/$id/todynamic 转为动态<br>
* GET /providers/$id/enable 启用<br>
* GET /providers/$id/disable 禁用<br>
* GET /providers/$id/reconnect 重连<br>
* GET /providers/$id/recover 恢复<br>
* <br>
* GET /services/$service/providers 指定服务的提供者列表<br>
* GET /services/$service/providers/add 新增提供者表单<br>
* POST /services/$service/providers 创建提供者<br>
* GET /services/$service/providers/$id 查看提供者详细<br>
* GET /services/$service/providers/$id/edit 编辑提供者表单<br>
* POST /services/$service/providers/$id 更新提供者<br>
* GET /services/$service/providers/$id/delete 删除提供者<br>
* GET /services/$service/providers/$id/tostatic 转为静态<br>
* GET /services/$service/providers/$id/todynamic 转为动态<br>
* GET /services/$service/providers/$id/enable 启用<br>
* GET /services/$service/providers/$id/disable 禁用<br>
* GET /services/$service/providers/$id/reconnect 重连<br>
* GET /services/$service/providers/$id/recover 恢复<br>
*
* @author william.liangf
*/
public class Providers extends Restful {
@Autowired
private ProviderService providerService;
@Autowired
private OverrideService overrideService;
@Autowired
private HttpServletResponse response;
@Autowired
private HttpServletRequest request;
public void index(Provider provider, Map<String, Object> context) {
String service = (String) context.get("service");
String application = (String) context.get("application");
String address = (String)context.get("address");
String value = "";
String separators = "....";
List<Provider> providers = null;
// service
if (service != null && service.length() > 0) {
providers = providerService.findByService(service);
value = service + separators + request.getRequestURI();
}
// address
else if (address != null && address.length() > 0) {
providers = providerService.findByAddress(address);
value = address + separators + request.getRequestURI();
}
// application
else if (application != null && application.length() > 0) {
providers = providerService.findByApplication(application);
value = application + separators + request.getRequestURI();
}
// all
else {
providers = providerService.findAll();
}
context.put("providers", providers);
// 设置搜索结果到cookie中
setSearchHistroy(context, value);
}
/**
* 设置search记录到cookie中,操作步骤:
* 检查加入的记录是否已经存在cookie中,如果存在,则更新列表次序;如果不存在,则插入到最前面
* @param context
* @param value
*/
private void setSearchHistroy(Map<String, Object> context, String value) {
//分析已有的cookie
String separatorsB = "\\.\\.\\.\\.\\.\\.";
String newCookiev = value;
Cookie[] cookies = request.getCookies();
for(Cookie c:cookies){
if(c.getName().equals("HISTORY")){
String cookiev = c.getValue();
String[] values = cookiev.split(separatorsB);
int count = 1;
for(String v : values){
if(count<=10){
if(!value.equals(v)){
newCookiev = newCookiev + separatorsB + v;
}
}
count ++;
}
break;
}
}
Cookie _cookie=new Cookie("HISTORY", newCookiev);
_cookie.setMaxAge(60*60*24*7); // 设置Cookie的存活时间为30分钟
_cookie.setPath("/");
response.addCookie(_cookie); // 写入客户端硬盘
}
public void show(Long id, Map<String, Object> context) {
Provider provider = providerService.findProvider(id);
if (provider != null && provider.isDynamic()) {
List<Override> overrides = overrideService.findByServiceAndAddress(provider.getService(), provider.getAddress());
OverrideUtils.setProviderOverrides(provider, overrides);
}
context.put("provider", provider);
}
/**
* 装载新增服务页面,获取所有的服务名称
* @param context
*/
public void add(Long id, Map<String, Object> context) {
if (context.get("service") == null) {
List<String> serviceList = Tool.sortSimpleName(new ArrayList<String>(providerService.findServices()));
context.put("serviceList", serviceList);
}
if (id != null) {
Provider p = providerService.findProvider(id);
if (p != null) {
context.put("provider", p);
String parameters = p.getParameters();
if (parameters != null && parameters.length() > 0) {
Map<String, String> map = StringUtils.parseQueryString(parameters);
map.put("timestamp", String.valueOf(System.currentTimeMillis()));
map.remove("pid");
p.setParameters(StringUtils.toQueryString(map));
}
}
}
}
public void edit(Long id, Map<String, Object> context) {
show(id, context);
}
public boolean create(Provider provider, Map<String, Object> context) {
String service = provider.getService();
if (!super.currentUser.hasServicePrivilege(service)) {
context.put("message", getMessage("HaveNoServicePrivilege", service));
return false;
}
if (provider.getParameters() == null) {
String url = provider.getUrl();
if (url != null) {
int i = url.indexOf('?');
if (i > 0) {
provider.setUrl(url.substring(0, i));
provider.setParameters(url.substring(i + 1));
}
}
}
provider.setDynamic(false); // 页面上添加的一定是静态的Provider
providerService.create(provider);
return true;
}
public boolean update(Provider newProvider, Map<String, Object> context) {
Long id = newProvider.getId();
String parameters = newProvider.getParameters();
Provider provider = providerService.findProvider(id);
if (provider == null) {
context.put("message", getMessage("NoSuchOperationData", id));
return false;
}
String service = provider.getService();
if (!super.currentUser.hasServicePrivilege(service)) {
context.put("message", getMessage("HaveNoServicePrivilege", service));
return false;
}
Map<String, String> oldMap = StringUtils.parseQueryString(provider.getParameters());
Map<String, String> newMap = StringUtils.parseQueryString(parameters);
for (Map.Entry<String, String> entry : oldMap.entrySet()) {
if (entry.getValue().equals(newMap.get(entry.getKey()))) {
newMap.remove(entry.getKey());
}
}
if (provider.isDynamic()) {
String address = provider.getAddress();
List<Override> overrides = overrideService.findByServiceAndAddress(provider.getService(), provider.getAddress());
OverrideUtils.setProviderOverrides(provider, overrides);
Override override = provider.getOverride();
if (override != null) {
if (newMap.size() > 0) {
override.setParams(StringUtils.toQueryString(newMap));
override.setEnabled(true);
override.setOperator(operator);
override.setOperatorAddress(operatorAddress);
overrideService.updateOverride(override);
} else {
overrideService.deleteOverride(override.getId());
}
} else {
override = new Override();
override.setService(service);
override.setAddress(address);
override.setParams(StringUtils.toQueryString(newMap));
override.setEnabled(true);
override.setOperator(operator);
override.setOperatorAddress(operatorAddress);
overrideService.saveOverride(override);
}
} else {
provider.setParameters(parameters);
providerService.updateProvider(provider);
}
return true;
}
public boolean delete(Long[] ids, Map<String, Object> context) {
for (Long id : ids) {
Provider provider = providerService.findProvider(id);
if (provider == null) {
context.put("message", getMessage("NoSuchOperationData", id));
return false;
} else if (provider.isDynamic()) {
context.put("message", getMessage("CanNotDeleteDynamicData", id));
return false;
} else if (! super.currentUser.hasServicePrivilege(provider.getService())) {
context.put( "message", getMessage("HaveNoServicePrivilege", provider.getService()));
return false;
}
}
for (Long id : ids) {
providerService.deleteStaticProvider(id);
}
return true;
}
public boolean enable(Long[] ids, Map<String, Object> context) {
Map<Long, Provider> id2Provider = new HashMap<Long, Provider>();
for (Long id : ids) {
Provider provider = providerService.findProvider(id);
if (provider == null) {
context.put("message", getMessage("NoSuchOperationData", id));
return false;
} else if (! super.currentUser.hasServicePrivilege(provider.getService())) {
context.put("message", getMessage("HaveNoServicePrivilege", provider.getService()));
return false;
}
id2Provider.put(id, provider);
}
for (Long id : ids) {
providerService.enableProvider(id);
}
return true;
}
public boolean disable(Long[] ids, Map<String, Object> context) {
for (Long id : ids) {
Provider provider = providerService.findProvider(id);
if (provider == null) {
context.put("message", getMessage("NoSuchOperationData", id));
return false;
} else if (! super.currentUser.hasServicePrivilege(provider.getService())) {
context.put("message", getMessage("HaveNoServicePrivilege", provider.getService()));
return false;
}
}
for (Long id : ids) {
providerService.disableProvider(id);
}
return true;
}
public boolean doubling(Long[] ids, Map<String, Object> context) {
for (Long id : ids) {
Provider provider = providerService.findProvider(id);
if (provider == null) {
context.put("message", getMessage("NoSuchOperationData", id));
return false;
} else if (! super.currentUser.hasServicePrivilege(provider.getService())) {
context.put("message", getMessage("HaveNoServicePrivilege", provider.getService()));
return false;
}
}
for (Long id : ids) {
providerService.doublingProvider(id);
}
return true;
}
public boolean halving(Long[] ids, Map<String, Object> context) {
for (Long id : ids) {
Provider provider = providerService.findProvider(id);
if (provider == null) {
context.put("message", getMessage("NoSuchOperationData", id));
return false;
} else if (! super.currentUser.hasServicePrivilege(provider.getService())) {
context.put("message", getMessage("HaveNoServicePrivilege", provider.getService()));
return false;
}
}
for (Long id : ids) {
providerService.halvingProvider(id);
}
return true;
}
}