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;
}
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);
}
Aggregations