/*
* Copyright 2012-2017 the original author or authors.
*
* 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.
*/
package org.springframework.boot.actuate.autoconfigure;
import java.util.List;
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoints;
import org.springframework.boot.actuate.endpoint.mvc.NamedMvcEndpoint;
import org.springframework.hateoas.ResourceSupport;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
/**
* Adds endpoint links to {@link ResourceSupport}.
*
* @author Dave Syer
* @author Madhura Bhave
*/
class LinksEnhancer {
private final String rootPath;
private final MvcEndpoints endpoints;
LinksEnhancer(String rootPath, MvcEndpoints endpoints) {
this.rootPath = rootPath;
this.endpoints = endpoints;
}
public void addEndpointLinks(ResourceSupport resource, String self) {
if (!resource.hasLink("self")) {
resource.add(linkTo(LinksEnhancer.class).slash(this.rootPath + self)
.withSelfRel());
}
MultiValueMap<String, String> added = new LinkedMultiValueMap<>();
for (MvcEndpoint endpoint : this.endpoints.getEndpoints()) {
if (!endpoint.getPath().equals(self)) {
String rel = getRel(endpoint);
List<String> paths = added.get(rel);
if (paths == null || !paths.contains(endpoint.getPath())) {
addEndpointLink(resource, endpoint, rel);
added.add(rel, endpoint.getPath());
}
}
}
}
private String getRel(MvcEndpoint endpoint) {
if (endpoint instanceof NamedMvcEndpoint) {
return ((NamedMvcEndpoint) endpoint).getName();
}
String path = endpoint.getPath();
return (path.startsWith("/") ? path.substring(1) : path);
}
private void addEndpointLink(ResourceSupport resource, MvcEndpoint endpoint,
String rel) {
Class<?> type = endpoint.getEndpointType();
type = (type == null ? Object.class : type);
if (StringUtils.hasText(rel)) {
String href = this.rootPath + endpoint.getPath();
resource.add(linkTo(type).slash(href).withRel(rel));
}
}
}