private <T> void validateInterface(Class<T> serviceInterface) { if (!serviceInterface.isInterface()) { throw new IllegalStateException("Service Interface must be an interface " + serviceInterface.getName()); } final ClassMeta<T> classMeta = ClassMeta.classMeta(serviceInterface); final Method[] declaredMethods = classMeta.cls().getDeclaredMethods(); for (Method m : declaredMethods) { if (!(m.getReturnType() == void.class || Promise.class.isAssignableFrom(m.getReturnType()))) { throw new IllegalStateException("Async interface can only return void or a Promise " + serviceInterface.getName()); } } }
public static String readServiceName(Object annotated) { final ClassMeta classMeta = ClassMeta.classMeta(annotated.getClass()); final String name = readServiceName(classMeta); if (name == null || name.isEmpty()) { return annotated.getClass().getSimpleName(); } else { return name; } }
private void registerReflectionAndJsonParser() { try { final Class<?> boonFactory = Class.forName("io.advantageous.qbit.boon.spi.RegisterBoonWithQBit"); ClassMeta.classMeta(boonFactory).invokeStatic("registerBoonWithQBit"); } catch (ClassNotFoundException e) { throw new IllegalStateException("Could not find reflection lib or JSON parser"); } }
public void addClass(final Class<?> cls) { /* Don't add void. */ if (cls == void.class || cls == Void.class) { return; } /* If it is a common built in type, don't add. */ if (mappings.containsKey(cls)) { return; } final ClassMeta<?> classMeta = ClassMeta.classMeta(cls); addClass(classMeta); }
private static boolean hasQueueCallbackAnnotations(Object service) { @SuppressWarnings("unchecked") ClassMeta<Class<?>> classMeta = (ClassMeta<Class<?>>) ClassMeta.classMeta(service.getClass()); final Iterable<MethodAccess> methods = classMeta.methods(); for (MethodAccess methodAccess : methods) { if (methodAccess.hasAnnotation(QUEUE_CALLBACK_ANNOTATION_NAME)) { return true; } } return false; } }
public void addJSendClass(final Class<?> cls) { addClass(cls); addJSendClass(ClassMeta.classMeta(cls)); }
public void addJSendArray(Class<?> cls) { addClass(cls); addJSendArray(ClassMeta.classMeta(cls)); }
@Override public void stopListening(Object listener) { final ClassMeta<?> classMeta = ClassMeta.classMeta(listener.getClass()); final Iterable<MethodAccess> methods = classMeta.methods(); for (final MethodAccess methodAccess : methods) { final AnnotationData listen = getListenAnnotation(methodAccess); if (listen == null) continue; stopListeningToMethodEventListeners(listener, methodAccess, listen); } }
public AnnotationDrivenQueueCallbackHandler(Object service) { ClassMeta<Class<?>> classMeta; //noinspection unchecked classMeta = (ClassMeta<Class<?>>) ClassMeta.classMeta(service.getClass()); this.service = service; final Iterable<MethodAccess> methods = classMeta.methods(); for (MethodAccess methodAccess : methods) { if (methodAccess.hasAnnotation(QUEUE_CALLBACK_ANNOTATION_NAME)) { processAnnotationForMethod(methodAccess); } } }
private void registerNetworkStack() { try { try { final Class<?> vertxFactory = Class.forName("io.advantageous.qbit.vertx.RegisterVertxWithQBit"); ClassMeta.classMeta(vertxFactory).invokeStatic("registerVertxWithQBit"); } catch (Exception ex) { if (debug) { System.out.println("Unable to load vertx network stack, trying Jetty" + ex); } } } catch (Exception ex) { FactorySPI.setHttpServerFactory((options, name, systemManager, serviceDiscovery, healthServiceAsync, a, b, c, d, e) -> { throw new IllegalStateException("Unable to load Vertx network libs"); }); FactorySPI.setHttpClientFactory((host, port, timeOutInMilliseconds, poolSize, autoFlush, flushRate, keepAlive, pipeLine, ssl, verifyHost, trustAll, maxWebSocketFrameSize, tryUseCompression, trustStorePath, trustStorePassword, tcpNoDelay, soLinger, errorHandler) -> { throw new IllegalStateException("Unable to load Vertx network libs"); }); } }
public ServiceBuilder setServiceObject(final Object serviceObject) { if (serviceObject == null) { throw new IllegalArgumentException("ServiceBuilder setServiceObject:: serviceObject cant be null"); } ClassMeta<?> classMeta = ClassMeta.classMeta(serviceObject.getClass()); Iterable<MethodAccess> methods = classMeta.methods(); Set<String> methodNames = new HashSet<>(); for (MethodAccess methodAccess : methods) { if (methodAccess.isPrivate() || methodAccess.method().getDeclaringClass().getName().contains("$$EnhancerByGuice$$")) { continue; } if (methodNames.contains(methodAccess.name())) { logger.error("QBit does not support method overloading methods in Service Queues" + " problem name " + methodAccess.name() + " is overloaded " + methodNames + " from class " + classMeta.longName()); } else { methodNames.add(methodAccess.name()); } } this.serviceObject = serviceObject; return this; }
private <T> Map<String, String> createMethodToChannelMap(final String channelPrefix, final Class<T> eventBusProxyInterface) { final Map<String, String> methodToChannelMap = new ConcurrentHashMap<>(20); final ClassMeta<T> classMeta = classMeta(eventBusProxyInterface); final AnnotationData classAnnotation = classMeta.annotation(AnnotationUtils.EVENT_CHANNEL_ANNOTATION_NAME); final String classEventBusName = AnnotationUtils.getClassEventChannelName(classMeta, classAnnotation); classMeta.methods().forEach(methodAccess -> { AnnotationData methodAnnotation = methodAccess.annotation(AnnotationUtils.EVENT_CHANNEL_ANNOTATION_NAME); String methodEventBusName = methodAnnotation != null && methodAnnotation.getValues().get("value") != null ? methodAnnotation.getValues().get("value").toString() : null; if (Str.isEmpty(methodEventBusName)) { methodEventBusName = methodAccess.name(); } final String channelName = createChannelName(channelPrefix, classEventBusName, methodEventBusName); methodToChannelMap.put(methodAccess.method().toString(), channelName); }); return methodToChannelMap; }
public DynamicQueueCallbackHandler(Object service) { final ClassMeta<Class<?>> classMeta; this.service = service; //noinspection unchecked classMeta = (ClassMeta<Class<?>>) ClassMeta.classMeta(service.getClass()); queueLimit = classMeta.method("queueLimit"); queueEmpty = classMeta.method("queueEmpty"); queueShutdown = classMeta.method("queueShutdown"); queueIdle = classMeta.method("queueIdle"); queueInit = classMeta.method("queueInit"); queueStartBatch = classMeta.method("queueStartBatch"); }
@Test public void shouldReturnBodyParamForParamWithoutQBitAnnotations() { final ClassMeta<?> classMeta = ClassMeta.classMeta(Foo.class); ServiceMetaBuilder serviceMetaBuilder = new ServiceMetaBuilder().setRequestPaths(Lists.list("foo")); serviceMetaBuilder.addMethods("foo", Lists.list(classMeta.methods())); ServiceMethodMeta serviceMethodMeta = Lists.filterBy(serviceMetaBuilder.getMethods(), new Predicate<ServiceMethodMeta>() { @Override public boolean test(ServiceMethodMeta serviceMethodMeta) { return "otherAnnotation".equals(serviceMethodMeta.getName()); } }).iterator().next(); assertTrue(serviceMethodMeta.getRequestEndpoints().iterator().hasNext()); assertTrue(serviceMethodMeta.getRequestEndpoints().iterator().next() .getParameters().iterator().hasNext()); assertTrue(serviceMethodMeta.getRequestEndpoints().iterator().next() .getParameters().iterator().next() .getParam() instanceof BodyParam); }
public ContextMetaBuilder addService(String alias, Class<?> serviceClass) { final ClassMeta<?> classMeta = ClassMeta.classMeta(serviceClass); String name = alias != null ? alias : getServiceName(classMeta); final List<String> requestPaths = getRequestPathsByAnnotated(classMeta, name); if (alias != null) { requestPaths.add(asPath(alias)); } final String description = getDescriptionFromRequestMapping(classMeta); final ServiceMetaBuilder serviceMetaBuilder = ServiceMetaBuilder.serviceMetaBuilder() .setRequestPaths(requestPaths).setName(name).setDescription(description) .setResponseHeaders(getResponseHeaders(classMeta)); serviceMetaBuilder.addMethods(this.getRootURI(), Lists.list(classMeta.methods())); addService(serviceMetaBuilder.build()); return this; }
@Test public void test() { final ClassMeta<?> classMeta = ClassMeta.classMeta(Foo.class); ServiceMetaBuilder serviceMetaBuilder = new ServiceMetaBuilder().setRequestPaths(Lists.list("foo")); serviceMetaBuilder.addMethods("foo", Lists.list(classMeta.methods())); final Map<String, ServiceMethodMeta> serviceMethodMetaMap = Maps.toMap("name", serviceMetaBuilder.getMethods()); final ServiceMethodMeta serviceMethodMeta = serviceMethodMetaMap.get("foo"); assertEquals(int.class, serviceMethodMeta.getReturnType()); final RequestMeta requestMeta = serviceMethodMeta.getRequestEndpoints().get(0); assertEquals("/foo", requestMeta.getRequestURI()); }
@Test public void testNoCacheWithGet() { final ClassMeta<?> classMeta = ClassMeta.classMeta(Foo.class); ServiceMetaBuilder serviceMetaBuilder = new ServiceMetaBuilder().setRequestPaths(Lists.list("foo")); serviceMetaBuilder.addMethods("/foo", Lists.list(classMeta.methods())); final Map<String, ServiceMethodMeta> serviceMethodMetaMap = Maps.toMap("name", serviceMetaBuilder.getMethods()); final ServiceMethodMeta serviceMethodMeta = serviceMethodMetaMap.get("getNoCache"); final RequestMeta requestMeta = serviceMethodMeta.getRequestEndpoints().get(0); assertEquals("/nocache", requestMeta.getRequestURI()); assertTrue(requestMeta.hasResponseHeaders()); MultiMap<String, String> headers = requestMeta.getResponseHeaders(); assertEquals(1, headers.size()); final List<String> controls = (List<String>) headers.getAll(HttpHeaders.CACHE_CONTROL); assertEquals("max-age=0", controls.get(0)); assertEquals("no-cache, no-store", controls.get(1)); }
@Test public void testNoCache() { final ClassMeta<?> classMeta = ClassMeta.classMeta(Foo.class); ServiceMetaBuilder serviceMetaBuilder = new ServiceMetaBuilder().setRequestPaths(Lists.list("foo")); serviceMetaBuilder.addMethods("/foo", Lists.list(classMeta.methods())); final Map<String, ServiceMethodMeta> serviceMethodMetaMap = Maps.toMap("name", serviceMetaBuilder.getMethods()); final ServiceMethodMeta serviceMethodMeta = serviceMethodMetaMap.get("noCache"); final RequestMeta requestMeta = serviceMethodMeta.getRequestEndpoints().get(0); assertEquals("/nocache", requestMeta.getRequestURI()); assertTrue(requestMeta.hasResponseHeaders()); MultiMap<String, String> headers = requestMeta.getResponseHeaders(); assertEquals(1, headers.size()); final List<String> controls = (List<String>) headers.getAll(HttpHeaders.CACHE_CONTROL); assertEquals("max-age=0", controls.get(0)); assertEquals("no-cache, no-store", controls.get(1)); }
@Test public void testRequestHeader() { final ClassMeta<?> classMeta = ClassMeta.classMeta(Foo.class); ServiceMetaBuilder serviceMetaBuilder = new ServiceMetaBuilder().setRequestPaths(Lists.list("foo")); serviceMetaBuilder.addMethods("/foo", Lists.list(classMeta.methods())); final Map<String, ServiceMethodMeta> serviceMethodMetaMap = Maps.toMap("name", serviceMetaBuilder.getMethods()); final ServiceMethodMeta serviceMethodMeta = serviceMethodMetaMap.get("methodWithHeaders"); final RequestMeta requestMeta = serviceMethodMeta.getRequestEndpoints().get(0); assertEquals("/headers", requestMeta.getRequestURI()); assertTrue(requestMeta.hasResponseHeaders()); MultiMap<String, String> headers = requestMeta.getResponseHeaders(); assertEquals(1, headers.size()); assertEquals("BAR", headers.getFirst("FOO")); }
@Test public void testManyRequestHeaders() { final ClassMeta<?> classMeta = ClassMeta.classMeta(Foo.class); ServiceMetaBuilder serviceMetaBuilder = new ServiceMetaBuilder().setRequestPaths(Lists.list("foo")); serviceMetaBuilder.addMethods("/foo", Lists.list(classMeta.methods())); final Map<String, ServiceMethodMeta> serviceMethodMetaMap = Maps.toMap("name", serviceMetaBuilder.getMethods()); final ServiceMethodMeta serviceMethodMeta = serviceMethodMetaMap.get("methodWithManyHeaders"); final RequestMeta requestMeta = serviceMethodMeta.getRequestEndpoints().get(0); assertEquals("/manyheaders", requestMeta.getRequestURI()); assertTrue(requestMeta.hasResponseHeaders()); MultiMap<String, String> headers = requestMeta.getResponseHeaders(); assertEquals(2, headers.size()); assertEquals("BAR", headers.getFirst("FOO")); assertEquals("BAZ", headers.getFirst("BAR")); }