use of io.gravitee.plugin.core.api.PluginClassLoader 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.plugin.core.api.PluginClassLoader in project gravitee-gateway by gravitee-io.
the class ResourceManagerImpl method initialize.
private void initialize() {
ResourcePluginManager rpm = applicationContext.getBean(ResourcePluginManager.class);
ResourceClassLoaderFactory rclf = applicationContext.getBean(ResourceClassLoaderFactory.class);
ResourceConfigurationFactory rcf = applicationContext.getBean(ResourceConfigurationFactory.class);
ReactorHandler rh = applicationContext.getBean(ReactorHandler.class);
Reactable reactable = rh.reactable();
Set<Resource> resourceDeps = reactable.dependencies(Resource.class);
resourceDeps.forEach(resource -> {
final ResourcePlugin resourcePlugin = rpm.get(resource.getType());
if (resourcePlugin == null) {
logger.error("Resource [{}] can not be found in plugin registry", resource.getType());
throw new IllegalStateException("Resource [" + resource.getType() + "] can not be found in plugin registry");
}
PluginClassLoader resourceClassLoader = rclf.getOrCreateClassLoader(resourcePlugin, rh.classloader());
logger.debug("Loading resource {} for {}", resource.getName(), rh);
try {
Class<? extends io.gravitee.resource.api.Resource> resourceClass = (Class<? extends io.gravitee.resource.api.Resource>) ClassUtils.forName(resourcePlugin.resource().getName(), resourceClassLoader);
Map<Class<?>, Object> injectables = new HashMap<>();
if (resourcePlugin.configuration() != null) {
Class<? extends ResourceConfiguration> resourceConfigurationClass = (Class<? extends ResourceConfiguration>) ClassUtils.forName(resourcePlugin.configuration().getName(), resourceClassLoader);
injectables.put(resourceConfigurationClass, rcf.create(resourceConfigurationClass, resource.getConfiguration()));
}
io.gravitee.resource.api.Resource resourceInstance = new ResourceFactory().create(resourceClass, injectables);
if (resourceInstance instanceof ApplicationContextAware) {
((ApplicationContextAware) resourceInstance).setApplicationContext(applicationContext);
}
resources.put(resource.getName(), resourceInstance);
} catch (Exception ex) {
logger.error("Unable to create resource", ex);
if (resourceClassLoader != null) {
try {
resourceClassLoader.close();
} catch (IOException ioe) {
logger.error("Unable to close classloader for resource", ioe);
}
}
}
});
}
use of io.gravitee.plugin.core.api.PluginClassLoader in project gravitee-gateway by gravitee-io.
the class DefaultPolicyManager method doStop.
@Override
protected void doStop() throws Exception {
// Deactivate policy context
policies.values().stream().filter(registeredPolicy -> registeredPolicy.metadata.context() != null).forEach(registeredPolicy -> {
try {
logger.info("De-activating context for {} [{}]", registeredPolicy.metadata.id(), registeredPolicy.metadata.context().getClass().getName());
registeredPolicy.metadata.context().onDeactivation();
} catch (Exception ex) {
logger.error("Unable to deactivate policy context", ex);
}
});
// Close policy classloaders
policies.values().forEach(policy -> {
ClassLoader policyClassLoader = policy.classLoader;
if (policyClassLoader instanceof PluginClassLoader) {
try {
((PluginClassLoader) policyClassLoader).close();
} catch (IOException e) {
logger.error("Unable to close policy classloader for policy {}", policy.metadata.id());
}
}
});
// Be sure to remove all references to policies
policies.clear();
}
use of io.gravitee.plugin.core.api.PluginClassLoader in project gravitee-gateway by gravitee-io.
the class ResourceManagerImpl method doStop.
@Override
protected void doStop() throws Exception {
// Stop resources
resources.entrySet().stream().forEach(resource -> {
try {
logger.info("Stop resource {} [{}]", resource.getKey(), resource.getValue().getClass());
resource.getValue().stop();
} catch (Exception ex) {
logger.error("Unable to stop resource", ex);
}
});
// Close resource classLoaders
resources.values().forEach(resource -> {
ClassLoader resourceClassLoader = resource.getClass().getClassLoader();
if (resourceClassLoader instanceof PluginClassLoader) {
try {
((PluginClassLoader) resourceClassLoader).close();
} catch (IOException ioe) {
logger.error("Unable to close classloader for resource {}", resource.getClass(), ioe);
}
}
});
// Be sure to remove all references to resources
resources.clear();
}
Aggregations