package org.radargun.config; import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.radargun.utils.Utils; /** * Helper code for namespace-relate stuff. * * @author Radim Vansa <rvansa@redhat.com> */ public final class NamespaceHelper { private static Map<String, String> namespaceToJarMajorMinor = new HashMap<>(); private static Map<File, String> codepathToToJarMajorMinor = new HashMap<>(); private NamespaceHelper() {} public static void registerNamespace(String namespace, File[] codepaths, String jarMinorMajor) { String prev = namespaceToJarMajorMinor.put(namespace, jarMinorMajor); if (prev != null && !prev.equals(jarMinorMajor)) { throw new IllegalArgumentException("Conflict for " + namespace + ", previous=" + prev + ", new=" + jarMinorMajor); } if (codepaths != null) { for (File codepath : codepaths) { prev = codepathToToJarMajorMinor.put(codepath, jarMinorMajor); if (prev != null && !prev.equals(jarMinorMajor)) { throw new IllegalArgumentException("Conflict for " + codepath + ", previous=" + prev + ", new=" + jarMinorMajor); } } } } private static Coords getCoords(String namespaceRoot, Namespace ns, String jarMajorMinor) { if (!ns.name().startsWith(namespaceRoot)) { throw new IllegalStateException("Namespace should start with '" + namespaceRoot + "', malformed namespace '" + ns.name() + "'"); } return new Coords(ns.name(), ns.deprecatedName(), jarMajorMinor); } public static Coords getCoords(String namespaceRoot, Class<?> clazz, String omitPrefix) { String jarMajorMinor = codepathToToJarMajorMinor.get(new File(Utils.getCodePath(clazz))); Namespace ns = clazz.getAnnotation(Namespace.class); if (jarMajorMinor != null) { if (ns != null) { return getCoords(namespaceRoot, ns, jarMajorMinor); } else { return new Coords(getNamespace(namespaceRoot, jarMajorMinor, omitPrefix), Namespace.NO_DEPRECATED_NAME, jarMajorMinor); } } else { return null; } } public static Coords suggestCoordinates(String namespaceRoot, Class<?> clazz, String omitPrefix) { File jar = new File(Utils.getCodePath(clazz)); String filename = jar.toPath().getFileName().toString(); Matcher matcher = Pattern.compile("(.*[0-9]+\\.[0-9]+)\\.[0-9]+.*").matcher(filename); if (!matcher.matches()) { throw new IllegalStateException("Filename does not match to the expected pattern: " + filename); } String jarMajorMinor = matcher.group(1); Namespace ns = clazz.getAnnotation(Namespace.class); if (ns != null) { return getCoords(namespaceRoot, ns, jarMajorMinor); } else { return new Coords(getNamespace(namespaceRoot, jarMajorMinor, omitPrefix), Namespace.NO_DEPRECATED_NAME, jarMajorMinor); } } private static String getNamespace(String namespaceRoot, String jarMajorMinor, String omitPrefix) { int lastDash = jarMajorMinor.lastIndexOf("-"); int prefix = jarMajorMinor.startsWith(omitPrefix) ? omitPrefix.length() : 0; String shortNs = jarMajorMinor; if (lastDash >= 0) { shortNs = jarMajorMinor.substring(prefix, lastDash) + ":" + jarMajorMinor.substring(lastDash + 1); } else if (prefix > 0) { shortNs = jarMajorMinor.substring(prefix); } return namespaceRoot + shortNs; } public static String getJarMajorMinor(String namespace) { return namespaceToJarMajorMinor.get(namespace); } public static class Coords { public final String namespace; public final String deprecatedNamespace; public final String jarMajorMinor; public Coords(String namespace, String deprecatedNamespace, String jarMajorMinor) { this.namespace = namespace; this.deprecatedNamespace = deprecatedNamespace; this.jarMajorMinor = jarMajorMinor; } } }