package org.openstack.atlas.api.helpers.reflection; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openstack.atlas.docs.loadbalancers.api.management.v1.Host; import org.openstack.atlas.docs.loadbalancers.api.v1.*; import javax.xml.bind.annotation.XmlRootElement; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; public class UriClassDiscover { private static final Log LOG = LogFactory.getLog(UriClassDiscover.class); private static final List<REFCN> rList; static { rList = new ArrayList<REFCN>(); // If you don't add new URI's to the following list then customers will get a 500 response on bad JSON. getrList().add(new REFCN(".*\\d+/loadbalancers(\\.json|\\.xml)?/?$", LoadBalancer.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/\\d+(\\.json|\\.xml)?/?$", LoadBalancer.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/\\d+/accesslist(\\.json|\\.xml)?/?$", AccessList.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/\\d+/accesslist/\\d+(\\.json|\\.xml)?/?$", NetworkItem.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/\\d+/healthmonitor(\\.json|\\.xml)?/?$", HealthMonitor.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/\\d+/nodes(\\.json|\\.xml)?/?$", Nodes.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/\\d+/nodes/\\d+(\\.json|\\.xml)?/?$", Node.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/\\d+/metadata(\\.json|\\.xml)?/?$", Metadata.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/\\d+/metadata/\\d+(\\.json|\\.xml)?/?$", Meta.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/\\d+/sessionpersistence(\\.json|\\.xml)?/?$", SessionPersistence.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/\\d+/connectionthrottle(\\.json|\\.xml)?/?$", ConnectionThrottle.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/\\d+/ssltermination(\\.json|\\.xml)?/?$", SslTermination.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/\\d+/ssltermination/certificatemappings(\\.json|\\.xml)?/?$", CertificateMapping.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/\\d+/ssltermination/certificatemappings/\\d+(\\.json|\\.xml)?/?$", CertificateMapping.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/\\d+/errorpage(\\.json|\\.xml)?/?$", Errorpage.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/bounce/connectionthrottle(\\.json|\\.xml)?/?$", ConnectionThrottle.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/bounce/virtualip(\\.json|\\.xml)?/?$", VirtualIp.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/bounce/loadbalancer(\\.json|\\.xml)?/?$", LoadBalancer.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/bounce/updated(\\.json|\\.xml)?/?$", Updated.class)); getrList().add(new REFCN(".*\\d+/loadbalancers/bounce/ssltermination(\\.json|\\.xml)?/?$", SslTermination.class)); getrList().add(new REFCN(".*/management/hosts(\\.json|\\.xml)?/?$", Host.class)); } public static Class getClassForUri(String uri) { Class classForUri = null; if (uri == null) { return classForUri; } for (REFCN refcn : getrList()) { Pattern m = refcn.getPattern(); if (m.matcher(uri).find()) { classForUri = refcn.getSomeClass(); break; } } return classForUri; // If we don't know how to validate it return null. } public static List<REFCN> getrList() { return rList; } public static String getRootElementNameForClass(String someClassName) { Class someClass; try { someClass = Class.forName(someClassName); } catch (ClassNotFoundException ex) { LOG.error(ex); return null; } return getRootElementNameForClass(someClass); } public static String getRootElementNameForClass(Class someClass) { String rootElement = null; XmlRootElement xmlRootElementAnnotation; if(someClass == null) { return null; } xmlRootElementAnnotation = (XmlRootElement) someClass.getAnnotation(XmlRootElement.class); if (xmlRootElementAnnotation != null) { rootElement = xmlRootElementAnnotation.name(); } return rootElement; } public static class REFCN { private String rootElement; private Pattern pattern; private Class someClass; public REFCN() { } public REFCN(String regEx, Class someClass) { this.pattern = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE); this.someClass = someClass; this.rootElement = getRootElementNameForClass(someClass); } public Pattern getPattern() { return pattern; } public void setPattern(Pattern pattern) { this.pattern = pattern; } public Class getSomeClass() { return this.someClass; } public void setSomeClass(Class someClass) { this.someClass = someClass; } } }