blob: 95a33265456f22b6aee70b79377a256237351f1a [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 org.apache.dubbo.admin.controller;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.admin.common.exception.ParamValidationException;
import org.apache.dubbo.admin.common.exception.ResourceNotFoundException;
import org.apache.dubbo.admin.model.dto.OverrideDTO;
import org.apache.dubbo.admin.service.OverrideService;
import org.apache.dubbo.admin.model.domain.Override;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
@RequestMapping("/api/{env}/rules/override")
public class OverridesController {
private final OverrideService overrideService;
@Autowired
public OverridesController(OverrideService overrideService) {
this.overrideService = overrideService;
}
@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public boolean createOverride(@RequestBody OverrideDTO overrideDTO, @PathVariable String env) {
String serviceName = overrideDTO.getService();
String application = overrideDTO.getApplication();
if (StringUtils.isEmpty(serviceName) && StringUtils.isEmpty(application)) {
throw new ParamValidationException("serviceName and application are Empty!");
}
Override override = convertOverrideDTOtoOverride(overrideDTO);
overrideService.saveOverride(override);
return true;
}
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
public boolean updateOverride(@PathVariable String id, @RequestBody OverrideDTO overrideDTO, @PathVariable String env) {
Override old = overrideService.findOverride(id);
if (old == null) {
throw new ResourceNotFoundException("Unknown ID!");
}
Override override = convertOverrideDTOtoOverride(overrideDTO);
overrideService.updateOverride(override);
return true;
}
@RequestMapping(method = RequestMethod.GET)
public List<OverrideDTO> searchOverride(@RequestParam(required = false) String service,
@RequestParam(required = false) String application,
@PathVariable String env) {
Override override = null;
List<OverrideDTO> result = new ArrayList<>();
if (StringUtils.isNotEmpty(service)) {
override = overrideService.findOverride(service);
} else if(StringUtils.isNotEmpty(application)){
override = overrideService.findOverride(application);
}
OverrideDTO overrideDTO = convertOverrideToOverrideDTO(override);
if (overrideDTO != null) {
result.add(overrideDTO);
}
return result;
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public OverrideDTO detailOverride(@PathVariable String id, @PathVariable String env) {
Override override = overrideService.findOverride(id);
if (override == null) {
throw new ResourceNotFoundException("Unknown ID!");
}
OverrideDTO overrideDTO = convertOverrideToOverrideDTO(override);
return overrideDTO;
}
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public boolean deleteOverride(@PathVariable String id, @PathVariable String env) {
overrideService.deleteOverride(id);
return true;
}
@RequestMapping(value = "/enable/{id}", method = RequestMethod.PUT)
public boolean enableRoute(@PathVariable String id, @PathVariable String env) {
overrideService.enableOverride(id);
return true;
}
@RequestMapping(value = "/disable/{id}", method = RequestMethod.PUT)
public boolean disableRoute(@PathVariable String id, @PathVariable String env) {
overrideService.disableOverride(id);
return true;
}
private Override convertOverrideDTOtoOverride(OverrideDTO overrideDTO) {
if (overrideDTO == null) {
return null;
}
Override override = new Override();
if (overrideDTO.getApplication() != null) {
override.setScope("application");
override.setKey(overrideDTO.getApplication());
} else {
override.setScope("service");
override.setKey(overrideDTO.getService());
}
override.setEnabled(overrideDTO.isEnabled());
override.setApiVersion("v2.7");
override.setConfigs(overrideDTO.getConfigs());
return override;
}
private OverrideDTO convertOverrideToOverrideDTO(Override override) {
if (override == null) {
return null;
}
OverrideDTO overrideDTO = new OverrideDTO();
overrideDTO.setApiVersion(override.getApiVersion());
if (override.getScope().equals("application")) {
overrideDTO.setApplication(override.getKey());
} else {
overrideDTO.setService(override.getKey());
}
overrideDTO.setEnabled(override.isEnabled());
overrideDTO.setConfigs(override.getConfigs());
return overrideDTO;
}
// private void overrideDTOToParams(Override override, OverrideDTO overrideDTO) {
// Map<Object, String>[] mocks = overrideDTO.getMock();
// Map<String, Object>[] parameters = overrideDTO.getParameters();
// StringBuilder params = new StringBuilder();
// if (mocks != null) {
// for (Map<Object, String> mock : mocks) {
// for (Map.Entry<Object, String> entry : mock.entrySet()) {
// String key;
// if (entry.getKey().equals("0")) {
// key = "mock";
// } else {
// key = entry.getKey() + ".mock";
// }
// String value = key + "=" + URL.encode(entry.getValue());
// params.append(value).append("&");
// }
// }
// }
//
// if (parameters != null) {
// for (Map<String, Object> param : parameters) {
// for (Map.Entry<String, Object> entry : param.entrySet()) {
// String value = entry.getKey() + "=" + entry.getValue();
// params.append(value).append("&");
// }
// }
// }
// if (StringUtils.isNotEmpty(params)) {
// int length = params.length();
// if (params.charAt(length - 1) == '&') {
// params.deleteCharAt(length - 1);
// }
// }
// override.setParams(params.toString());
// }
//
// private void paramsToOverrideDTO(Override override, OverrideDTO overrideDTO) {
// String params = override.getParams();
// if (StringUtils.isNotEmpty(params)) {
// List<Map<Object, String>> mock = new ArrayList<>();
// List<Map<String, Object>> parameters = new ArrayList<>();
// String[] pair = params.split("&");
// for (String p : pair) {
// String key = p.split("=")[0];
// if (key.contains("mock")) {
// //mock
// String value = URL.decode(p.split("=")[1]);
// Map<Object, String> item = new HashMap<>();
// if (key.contains(".")) {
// //single method mock
// key = key.split("\\.")[0];
// item.put(key, value);
// } else {
// item.put(0, value);
// }
// mock.add(item);
// } else {
// //parameter
// String value = p.split("=")[1];
// Map<String, Object> item = new HashMap<>();
// item.put(key, value);
// parameters.add(item);
// }
// }
// Map<Object, String>[] mockArray = new Map[mock.size()];
// overrideDTO.setMock(mock.toArray(mockArray));
// Map<String, Object>[] paramArray = new Map[parameters.size()];
// overrideDTO.setParameters(parameters.toArray(paramArray));
// }
// }
}