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 interface
DynamicOptions.BeanParseListener
Implement this if your DynamicBean needs an opportunity to act on the Bean directly before or after argument parsing.static interface
DynamicOptions.BeanProvider
static interface
DynamicOptions.BeanReceiver
The entity which provided additional options may need a way to receive a reference to the DynamicBean it provided.static interface
DynamicOptions.ClassNameProvider
To provide additional options to a command in another classloader, bind a ClassNameProvider which provides the name of your DynamicBean in the other classLoader.static interface
DynamicOptions.DynamicBean
To provide additional options, bind a DynamicBean.static interface
DynamicOptions.ModulesClassNamesProvider
To 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 Object
bean
protected Map<String,DynamicOptions.DynamicBean>
beansByPlugin
protected DynamicMap<DynamicOptions.DynamicBean>
dynamicBeans
protected com.google.inject.Injector
injector
protected com.google.gerrit.lifecycle.LifecycleManager
lifecycleManager
protected static Map<ClassLoader,Map<ClassLoader,WeakReference<ClassLoader>>>
mergedClByCls
MergedClassloaders 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 void
close()
DynamicOptions.DynamicBean
getDynamicBean(Object bean, DynamicOptions.DynamicBean dynamicBean)
protected ClassLoader
getMergedClassLoader(ClassLoader beanCl, ClassLoader dynamicBeanCl)
void
onBeanParseEnd()
void
onBeanParseStart()
void
parseDynamicBeans(com.google.gerrit.util.cli.CmdLineParser clp)
void
setBean(Object bean)
void
setDynamicBeans()
void
startLifecycleListeners()
void
stopLifecycleListeners()
-
-
-
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:
close
in interfaceAutoCloseable
-
-