/**
* Project: dubbo.registry-1.1.0-SNAPSHOT
*
* File Created at 2010-4-15
* $Id: RouteServiceImpl.java 182851 2012-06-28 09:39:16Z tony.chenl $
*
* Copyright 2008 Alibaba.com Croporation Limited.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* Alibaba Company. ("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.service.impl;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.dubbo.common.Constants;
import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.governance.service.RouteService;
import com.alibaba.dubbo.governance.sync.util.Pair;
import com.alibaba.dubbo.governance.sync.util.SyncUtils;
import com.alibaba.dubbo.registry.common.domain.Route;
/**
* IbatisRouteService
*
* @author william.liangf
*/
public class RouteServiceImpl extends AbstractService implements RouteService {
public void createRoute(Route route) {
registryService.register(route.toUrl());
}
public void updateRoute(Route route) {
Long id = route.getId();
if(id == null) {
throw new IllegalStateException("no route id");
}
URL oldRoute = findRouteUrl(id);
if(oldRoute == null) {
throw new IllegalStateException("Route was changed!");
}
registryService.unregister(oldRoute);
registryService.register(route.toUrl());
}
public void deleteRoute(Long id) {
URL oldRoute = findRouteUrl(id);
if(oldRoute == null) {
throw new IllegalStateException("Route was changed!");
}
registryService.unregister(oldRoute);
}
public void enableRoute(Long id) {
if(id == null) {
throw new IllegalStateException("no route id");
}
URL oldRoute = findRouteUrl(id);
if(oldRoute == null) {
throw new IllegalStateException("Route was changed!");
}
if(oldRoute.getParameter("enabled", true)) {
return;
}
registryService.unregister(oldRoute);
URL newRoute= oldRoute.addParameter("enabled", true);
registryService.register(newRoute);
}
public void disableRoute(Long id) {
if(id == null) {
throw new IllegalStateException("no route id");
}
URL oldRoute = findRouteUrl(id);
if(oldRoute == null) {
throw new IllegalStateException("Route was changed!");
}
if(!oldRoute.getParameter("enabled", true)) {
return;
}
URL newRoute = oldRoute.addParameter("enabled", false);
registryService.unregister(oldRoute);
registryService.register(newRoute);
}
public List<Route> findAll() {
return SyncUtils.url2RouteList(findAllUrl());
}
private Map<Long, URL> findAllUrl() {
Map<String, String> filter = new HashMap<String, String>();
filter.put(Constants.CATEGORY_KEY, Constants.ROUTERS_CATEGORY);
return SyncUtils.filterFromCategory(getRegistryCache(), filter);
}
public Route findRoute(Long id) {
return SyncUtils.url2Route(findRouteUrlPair(id));
}
public Pair<Long, URL> findRouteUrlPair(Long id) {
return SyncUtils.filterFromCategory(getRegistryCache(), Constants.ROUTERS_CATEGORY, id);
}
private URL findRouteUrl(Long id){
return findRoute(id).toUrl();
}
private Map<Long, URL> findRouteUrl(String service, String address, boolean force) {
Map<String, String> filter = new HashMap<String, String>();
filter.put(Constants.CATEGORY_KEY, Constants.ROUTERS_CATEGORY);
if (service != null && service.length() > 0) {
filter.put(SyncUtils.SERVICE_FILTER_KEY, service);
}
if (address != null && address.length() > 0) {
filter.put(SyncUtils.ADDRESS_FILTER_KEY, address);
}
if (force) {
filter.put("force", "true");
}
return SyncUtils.filterFromCategory(getRegistryCache(), filter);
}
public List<Route> findByService(String serviceName) {
return SyncUtils.url2RouteList(findRouteUrl(serviceName, null, false));
}
public List<Route> findByAddress(String address) {
return SyncUtils.url2RouteList(findRouteUrl(null, address, false));
}
public List<Route> findByServiceAndAddress(String service, String address) {
return SyncUtils.url2RouteList(findRouteUrl(service, address, false));
}
public List<Route> findForceRouteByService(String service) {
return SyncUtils.url2RouteList(findRouteUrl(service, null, true));
}
public List<Route> findForceRouteByAddress(String address) {
return SyncUtils.url2RouteList(findRouteUrl(null, address, true));
}
public List<Route> findForceRouteByServiceAndAddress(String service, String address) {
return SyncUtils.url2RouteList(findRouteUrl(service, address, true));
}
public List<Route> findAllForceRoute() {
return SyncUtils.url2RouteList(findRouteUrl(null, null, true));
}
}