Package com.google.gerrit.server
Class DynamicOptions
- java.lang.Object
-
- com.google.gerrit.server.DynamicOptions
-
- All Implemented Interfaces:
AutoCloseable
public class DynamicOptions extends Object implements AutoCloseable
Helper class to define and parse options from plugins on ssh and RestAPI commands.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interfaceDynamicOptions.BeanParseListenerImplement this if your DynamicBean needs an opportunity to act on the Bean directly before or after argument parsing.static interfaceDynamicOptions.BeanProviderstatic interfaceDynamicOptions.BeanReceiverThe entity which provided additional options may need a way to receive a reference to the DynamicBean it provided.static interfaceDynamicOptions.ClassNameProviderTo provide additional options to a command in another classloader, bind a ClassNameProvider which provides the name of your DynamicBean in the other classLoader.static interfaceDynamicOptions.DynamicBeanTo provide additional options, bind a DynamicBean.static interfaceDynamicOptions.ModulesClassNamesProviderTo provide additional Guice bindings for options to a command in another classloader, bind a ModulesClassNamesProvider which provides the name of your Modules needed for your DynamicBean in the other classLoader.
-
Field Summary
Fields Modifier and Type Field Description protected Objectbeanprotected Map<String,DynamicOptions.DynamicBean>beansByPluginprotected DynamicMap<DynamicOptions.DynamicBean>dynamicBeansprotected com.google.inject.Injectorinjectorprotected com.google.gerrit.lifecycle.LifecycleManagerlifecycleManagerprotected static Map<ClassLoader,Map<ClassLoader,WeakReference<ClassLoader>>>mergedClByClsMergedClassloaders allow us to load classes from both plugin classloaders.
-
Constructor Summary
Constructors Constructor Description DynamicOptions(com.google.inject.Injector injector, DynamicMap<DynamicOptions.DynamicBean> dynamicBeans)Internal: For Gerrit to include options from DynamicBeans, setup a DynamicMap and instantiate this class so the following methods can be called if desired:
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidclose()DynamicOptions.DynamicBeangetDynamicBean(Object bean, DynamicOptions.DynamicBean dynamicBean)protected ClassLoadergetMergedClassLoader(ClassLoader beanCl, ClassLoader dynamicBeanCl)voidonBeanParseEnd()voidonBeanParseStart()voidparseDynamicBeans(com.google.gerrit.util.cli.CmdLineParser clp)voidsetBean(Object bean)voidsetDynamicBeans()voidstartLifecycleListeners()voidstopLifecycleListeners()
-
-
-
Field Detail
-
mergedClByCls
protected static Map<ClassLoader,Map<ClassLoader,WeakReference<ClassLoader>>> mergedClByCls
MergedClassloaders allow us to load classes from both plugin classloaders. Store the merged classloaders in a Map to avoid creating a new classloader for each invocation. Use a WeakHashMap to avoid leaking these MergedClassLoaders once either plugin is unloaded. Since the WeakHashMap only takes care of ensuring the Keys can get garbage collected, use WeakReferences to store the MergedClassloaders in the WeakHashMap.Outter keys are the bean plugin's classloaders (the plugin being extended)
Inner keys are the dynamicBeans plugin's classloaders (the extending plugin)
The value is the MergedClassLoader representing the merging of the outter and inner key classloaders.
-
bean
protected Object bean
-
beansByPlugin
protected Map<String,DynamicOptions.DynamicBean> beansByPlugin
-
injector
protected com.google.inject.Injector injector
-
dynamicBeans
protected DynamicMap<DynamicOptions.DynamicBean> dynamicBeans
-
lifecycleManager
protected com.google.gerrit.lifecycle.LifecycleManager lifecycleManager
-
-
Constructor Detail
-
DynamicOptions
public DynamicOptions(com.google.inject.Injector injector, DynamicMap<DynamicOptions.DynamicBean> dynamicBeans)Internal: For Gerrit to include options from DynamicBeans, setup a DynamicMap and instantiate this class so the following methods can be called if desired:DynamicOptions pluginOptions = new DynamicOptions(injector, dynamicBeans); pluginOptions.setBean(bean); pluginOptions.startLifecycleListeners(); pluginOptions.parseDynamicBeans(clp); pluginOptions.setDynamicBeans(); pluginOptions.onBeanParseStart(); // parse arguments here: clp.parseArgument(argv); pluginOptions.onBeanParseEnd();
-
-
Method Detail
-
setBean
public void setBean(Object bean)
-
getDynamicBean
public DynamicOptions.DynamicBean getDynamicBean(Object bean, DynamicOptions.DynamicBean dynamicBean)
-
getMergedClassLoader
protected ClassLoader getMergedClassLoader(ClassLoader beanCl, ClassLoader dynamicBeanCl)
-
parseDynamicBeans
public void parseDynamicBeans(com.google.gerrit.util.cli.CmdLineParser clp)
-
setDynamicBeans
public void setDynamicBeans()
-
startLifecycleListeners
public void startLifecycleListeners()
-
stopLifecycleListeners
public void stopLifecycleListeners()
-
onBeanParseStart
public void onBeanParseStart()
-
onBeanParseEnd
public void onBeanParseEnd()
-
close
public void close()
- Specified by:
closein interfaceAutoCloseable
-
-