package org.kie.server.demo;
import java.util.Comparator;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.kie.server.router.ContainerInfo;
import org.kie.server.router.spi.ContainerResolver;
import io.undertow.server.HttpServerExchange;
public class LatestVersionContainerResolver implements ContainerResolver {
private Pattern p = Pattern.compile(".*/containers/([^/]+).*");
public String resolveContainerId(HttpServerExchange exchange, Map<String, Set<ContainerInfo>> containerInfoPerContainer) {
String relativePath = exchange.getRelativePath();
Matcher matcher = p.matcher(relativePath);
System.out.println("Custom container resolver :: Resolving for url " + relativePath);
if (matcher.find()) {
String containerId = matcher.group(1);
System.out.println("Custom container resolver :: Container id from URL " + containerId);
Set<ContainerInfo> containers = containerInfoPerContainer.get(containerId);
if (containers != null && !containers.isEmpty()) {
Optional<ContainerInfo> selected = containers.stream().sorted(new Comparator<ContainerInfo>() {
public int compare(ContainerInfo o1, ContainerInfo o2) {
String releaseId1 = o1.getReleaseId();
String releaseId2 = o2.getReleaseId();
String version1 = releaseId1.split(":")[2];
String version2 = releaseId2.split(":")[2];
Double v1 = Double.parseDouble(version1);
Double v2 = Double.parseDouble(version2);
return v1.compareTo(v2);
}
}).findFirst();
if (selected.isPresent()) {
String actualContainerId = selected.get().getContainerId();
System.out.println("Custom container resolver :: Selected container id " + actualContainerId);
return actualContainerId;
}
}
}
System.out.println("Custom container resolver :: No container resolved for url " + relativePath);
return ContainerResolver.NOT_FOUND;
}
@Override
public String toString() {
return "LatestVersionContainerResolver";
}
}