Search in sources :

Example 1 with Reference

use of org.apache.karaf.shell.api.action.lifecycle.Reference in project karaf by apache.

the class ManagerImpl method instantiate.

public <T> T instantiate(Class<? extends T> clazz, Registry registry) throws Exception {
    if (!allowCustomServices) {
        Service reg = clazz.getAnnotation(Service.class);
        if (reg == null) {
            throw new IllegalArgumentException("Class " + clazz.getName() + " is not annotated with @Service");
        }
    }
    T instance = clazz.newInstance();
    // Inject services
    for (Class<?> cl = clazz; cl != Object.class; cl = cl.getSuperclass()) {
        for (Field field : cl.getDeclaredFields()) {
            Reference ref = field.getAnnotation(Reference.class);
            if (ref != null) {
                GenericType type = new GenericType(field.getGenericType());
                Object value;
                if (type.getRawClass() == List.class) {
                    Set<Object> set = new HashSet<>();
                    set.addAll(registry.getServices(type.getActualTypeArgument(0).getRawClass()));
                    if (registry != this.dependencies) {
                        set.addAll(this.dependencies.getServices(type.getActualTypeArgument(0).getRawClass()));
                    }
                    value = new ArrayList<>(set);
                } else {
                    value = registry.getService(type.getRawClass());
                    if (value == null && registry != this.dependencies) {
                        value = this.dependencies.getService(type.getRawClass());
                    }
                }
                if (!allowCustomServices && value == null && !ref.optional()) {
                    throw new IllegalStateException("No service matching " + field.getType().getName());
                }
                field.setAccessible(true);
                field.set(instance, value);
            }
        }
    }
    for (Method method : clazz.getDeclaredMethods()) {
        Init ann = method.getAnnotation(Init.class);
        if (ann != null && method.getParameterTypes().length == 0 && method.getReturnType() == void.class) {
            method.setAccessible(true);
            method.invoke(instance);
        }
    }
    return instance;
}
Also used : GenericType(org.apache.karaf.shell.support.converter.GenericType) Reference(org.apache.karaf.shell.api.action.lifecycle.Reference) Service(org.apache.karaf.shell.api.action.lifecycle.Service) Method(java.lang.reflect.Method) Field(java.lang.reflect.Field) Init(org.apache.karaf.shell.api.action.lifecycle.Init) HashSet(java.util.HashSet)

Example 2 with Reference

use of org.apache.karaf.shell.api.action.lifecycle.Reference in project karaf by apache.

the class CommandExtension method inspectClass.

private void inspectClass(final Class<?> clazz) throws Exception {
    Service reg = clazz.getAnnotation(Service.class);
    if (reg == null) {
        return;
    }
    // Create trackers
    for (Class<?> cl = clazz; cl != Object.class; cl = cl.getSuperclass()) {
        for (Field field : cl.getDeclaredFields()) {
            Reference ref = field.getAnnotation(Reference.class);
            if (ref != null) {
                GenericType type = new GenericType(field.getGenericType());
                Class clazzRef = type.getRawClass() == List.class ? type.getActualTypeArgument(0).getRawClass() : type.getRawClass();
                if (clazzRef != BundleContext.class && clazzRef != Session.class && clazzRef != Terminal.class && clazzRef != History.class && clazzRef != Registry.class && clazzRef != SessionFactory.class && !registry.hasService(clazzRef)) {
                    track(type, ref.optional());
                }
            }
        }
    }
    classes.add(clazz);
}
Also used : Field(java.lang.reflect.Field) GenericType(org.apache.karaf.shell.support.converter.GenericType) Reference(org.apache.karaf.shell.api.action.lifecycle.Reference) Service(org.apache.karaf.shell.api.action.lifecycle.Service) ArrayList(java.util.ArrayList) List(java.util.List) Registry(org.apache.karaf.shell.api.console.Registry) Terminal(org.apache.karaf.shell.api.console.Terminal)

Aggregations

Field (java.lang.reflect.Field)2 Reference (org.apache.karaf.shell.api.action.lifecycle.Reference)2 Service (org.apache.karaf.shell.api.action.lifecycle.Service)2 GenericType (org.apache.karaf.shell.support.converter.GenericType)2 Method (java.lang.reflect.Method)1 ArrayList (java.util.ArrayList)1 HashSet (java.util.HashSet)1 List (java.util.List)1 Init (org.apache.karaf.shell.api.action.lifecycle.Init)1 Registry (org.apache.karaf.shell.api.console.Registry)1 Terminal (org.apache.karaf.shell.api.console.Terminal)1