use of io.gravitee.resource.api.Resource in project gravitee-gateway by gravitee-io.
the class DefaultPolicyManager method initialize.
private void initialize() {
PolicyPluginManager ppm = applicationContext.getBean(PolicyPluginManager.class);
PolicyClassLoaderFactory pclf = applicationContext.getBean(PolicyClassLoaderFactory.class);
ReactorHandler rh = applicationContext.getBean(ReactorHandler.class);
ResourceLifecycleManager rm = applicationContext.getBean(ResourceLifecycleManager.class);
Reactable reactable = rh.reactable();
Set<Policy> requiredPlugins = reactable.dependencies(Policy.class);
requiredPlugins.forEach(policy -> {
final PolicyPlugin policyPlugin = ppm.get(policy.getName());
if (policyPlugin == null) {
logger.error("Policy [{}] can not be found in policy registry", policy.getName());
throw new IllegalStateException("Policy [" + policy.getName() + "] can not be found in policy registry");
}
PluginClassLoader policyClassLoader = null;
// Load dependant resources to enhance policy classloader
Collection<? extends Resource> resources = rm.getResources();
if (!resources.isEmpty()) {
ClassLoader[] resourceClassLoaders = rm.getResources().stream().map(new Function<Resource, ClassLoader>() {
@Override
public ClassLoader apply(Resource resource) {
return resource.getClass().getClassLoader();
}
}).toArray(ClassLoader[]::new);
DelegatingClassLoader parentClassLoader = new DelegatingClassLoader(rh.classloader(), resourceClassLoaders);
policyClassLoader = pclf.getOrCreateClassLoader(policyPlugin, parentClassLoader);
} else {
policyClassLoader = pclf.getOrCreateClassLoader(policyPlugin, rh.classloader());
}
logger.debug("Loading policy {} for {}", policy.getName(), rh);
PolicyMetadataBuilder builder = new PolicyMetadataBuilder();
builder.setId(policyPlugin.id());
try {
// Prepare metadata
Class<?> policyClass = ClassUtils.forName(policyPlugin.policy().getName(), policyClassLoader);
builder.setPolicy(policyClass).setMethods(new PolicyMethodResolver().resolve(policyClass));
if (policyPlugin.configuration() != null) {
builder.setConfiguration((Class<? extends PolicyConfiguration>) ClassUtils.forName(policyPlugin.configuration().getName(), policyClassLoader));
}
// Prepare context if defined
if (policyPlugin.context() != null) {
Class<? extends PolicyContext> policyContextClass = (Class<? extends PolicyContext>) ClassUtils.forName(policyPlugin.context().getName(), policyClassLoader);
// Create policy context instance and initialize context provider (if used)
PolicyContext context = new PolicyContextFactory(reactable).create(policyContextClass);
builder.setContext(context);
}
RegisteredPolicy registeredPolicy = new RegisteredPolicy();
registeredPolicy.classLoader = policyClassLoader;
registeredPolicy.metadata = builder.build();
policies.put(policy.getName(), registeredPolicy);
} catch (Exception ex) {
logger.error("Unable to load policy metadata", ex);
if (policyClassLoader != null) {
try {
policyClassLoader.close();
} catch (IOException ioe) {
logger.error("Unable to close classloader for policy", ioe);
}
}
}
});
}
use of io.gravitee.resource.api.Resource in project gravitee-gateway by gravitee-io.
the class ResourceFactory method createResource.
private Resource createResource(Class<? extends Resource> resourceClass, Map<Class<?>, Object> injectables) {
Resource resourceInst = null;
Constructor<? extends Resource> constr = lookingForConstructor(resourceClass);
if (constr != null) {
try {
// if (constr.getParameterCount() > 0) {
// resourceInst = constr.newInstance(injectables.get(policyMetadata.configuration()));
// } else {
resourceInst = constr.newInstance();
// }
} catch (IllegalAccessException | InstantiationException | InvocationTargetException ex) {
LOGGER.error("Unable to instantiate resource {}", resourceClass, ex);
}
}
if (resourceInst != null) {
Set<Field> fields = lookingForInjectableFields(resourceClass);
if (fields != null) {
for (Field field : fields) {
boolean accessible = field.isAccessible();
Class<?> type = field.getType();
Optional<?> value = injectables.values().stream().filter(o -> type.isAssignableFrom(o.getClass())).findFirst();
if (value.isPresent()) {
LOGGER.debug("Inject value into field {} [{}] in {}", field.getName(), type.getName(), resourceClass);
try {
field.setAccessible(true);
field.set(resourceInst, value.get());
} catch (IllegalAccessException iae) {
LOGGER.error("Unable to set field value for {} in {}", field.getName(), resourceClass, iae);
} finally {
field.setAccessible(accessible);
}
}
}
}
}
return resourceInst;
}
Aggregations