admin@glassfish.java.net

Re: HK2 / v3 Issues related to admingui pluggability infrastructure

From: Ken Paulsen <Ken.Paulsen_at_Sun.COM>
Date: Tue, 26 Feb 2008 19:56:58 -0800

Hi Jerome / Shing Wai,

Thanks for providing the Habitat via the ServletContext. This is now
working for us and we're able to get the ConsolePluginService which
gives us the IntegrationPoint's that are specified in various modules
w/o doing anything funny at server startup.

However.... since I am using multiple classloaders, I cannot cast
ConsolePluginService to ConsolePluginService within our web app code. I
am currently using reflection to invoke the method I need on the
ConsolePluginService provider to avoid the ClassCastException. What is
the preferred way to handle this? Can I set the context classloader on
the thread before I access each object from a different classloader?

Thanks,

Ken

Jerome Dochez wrote:
> ok for now, it's stored in your servlet context and the attribute name
> is com.sun.appserv.jsf.habitat
>
> that should get you going...
>
> jerome
>
> Ken Paulsen wrote:
>>
>> Hi Jerome,
>>
>> Hmm... I realized I can't init on startup b/c a module's classloader
>> is different than my web app's. So I get a different instance. So I
>> think I'm stuck until I have a way to Inject the Habitat, or my
>> @Service directly in my web app. Let me know if you have any other
>> ideas.
>>
>> Thanks,
>>
>> Ken
>>
>> Ken Paulsen wrote:
>>>
>>> Jerome Dochez wrote:
>>>>
>>>> so far, admin gui is a plain war file, right ?
>>> Yes.
>>>> looks like I need to extend @Startup service to have an Application
>>>> scope. Applications could optionally implement it and that would be
>>>> called when applications are started... that would be enough right ?
>>> Yes, that sounds like it would work well. Any idea on how much
>>> effort that will take / when it will be available? In the mean
>>> time, I think I'll initialize on server startup so I can keep working.
>>>
>>> Thanks!
>>>
>>> Ken
>>>> jerome
>>>>
>>>
>>>
>>>
>>>> On Feb 25, 2008, at 11:39 AM, Ken Paulsen wrote:
>>>>
>>>>>
>>>>>
>>>>> Jerome Dochez wrote:
>>>>>>
>>>>>> On Feb 25, 2008, at 10:43 AM, Ken Paulsen wrote:
>>>>>>
>>>>>>>
>>>>>>> Hi Jerome,
>>>>>>>
>>>>>>> Thanks for the quick reply.
>>>>>>>
>>>>>>> With plain apt, my annotations work. In the meantime, I was
>>>>>>> able to add extra checks in my annotation processors to keep
>>>>>>> them from processing annotation they aren't meant to process.
>>>>>>> In looking into this issue, it seems that HK2's use of
>>>>>>> CompositeAnnotationProcessors may be the
>>>>>>
>>>>>>> cause. In any case, I'm no longer blocked.
>>>>>> ok, I will look into that when I have some time...
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> As for the configuration info... I would like to have
>>>>>>> @Configured objects populated from XML files which describe gui
>>>>>>> integration points. Here's a small example of one of the XML
>>>>>>> files:
>>>>>>>
>>>>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>>>>>
>>>>>>> <console-config id="myIntegration">
>>>>>>> <integration-point id="myTab" type="webApplicationTab"
>>>>>>> priority="22" parentId="webApplicationTab" uri="/myTab.jsf" />
>>>>>>> <integration-point id="jbiRootNode" type="tree"
>>>>>>> priority="840" parentId="rootNode" uri="/myTreeNode.jsf"
>>>>>>> content="test2"/>
>>>>>>> </console-config>
>>>>>>>
>>>>>>> I have this working... as long as the XML file is in the same
>>>>>>> module as my Service which parses them (using HK2's
>>>>>>> ConfigParser). I need a way to search all modules for these
>>>>>>> files. I will also need a way to read resources (images, other
>>>>>>> files text files, classes, etc.) from the same modules which
>>>>>>> contain these files.
>>>>>>
>>>>>> looks like you need to define a Contract for that, something like
>>>>>> @Contract
>>>>>> public interface GuiProvider {
>>>>>> /**
>>>>>> * @Return a URL for its configuration (xml file).
>>>>>> URL getConfiguration();
>>>>>> }
>>>>>>
>>>>>> then each module implements this GuiProvider with their own XML
>>>>>> configuration.
>>>>>>
>>>>>> when you need them you can just look up for all GuiProvider
>>>>>> implementations : @Inject
>>>>>> GuiProvider[] providers
>>>>>>
>>>>>> .... later in the code ...
>>>>>>
>>>>>> for (GuidProvider provider : providers) {
>>>>>> ConfigParser.parse(... provider.getConfiguration() ...);
>>>>>>
>>>>>> for accessing resources, you should use the implementation class
>>>>>> loader so for instance...
>>>>>>
>>>>>> for (GuiProvider provider : providers) {
>>>>>>
>>>>>> provider.getClass().getClassLoader().loadResource("META-INF/default-icon.gif);
>>>>>>
>>>>>>
>>>>>> }
>>>>>>
>>>>>> does that answer your question ?
>>>>> Yes. I was hoping to avoid needing to require people to create a
>>>>> Java class, but it's an easy step to do and will make things "just
>>>>> work" better. I'll do this.
>>>> this is the easiest for now, we might want to revisit this once we
>>>> have switched to OSGi
>>>>>
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> New question: How can I get the default Habitat? I tried
>>>>>>> "Globals.getGlobals().getDefaultHabitat()", but getGlobals()
>>>>>>> returned (null). To back up, I am simply trying to get a
>>>>>>> @Service implementation via Java code. I was trying via
>>>>>>> habitat.getByType(...), but can't seem to get a valid Habitat.
>>>>>> so you need to do this lookup in code that never had access to
>>>>>> injection ? can't you get the habitat injected when you
>>>>>> initialize and save it in your runtime for this kind of use later
>>>>>> on your code paths ?
>>>>> Ok, I can do that... if you can tell me how I should be
>>>>> initializing. I can make a @Service which implements Populator
>>>>> and store it... but I don't think I should be doing this on Server
>>>>> Startup.
>>>> no that would be wrong...
>>>>> Is there another interface or technique I can use to only
>>>>> initialize this when the Admin GUI is accessed for the first time?
>>>> so far, admin gui is a plain war file, right ?
>>>>
>>>> looks like I need to extend @Startup service to have an Application
>>>> scope. Applications could optionally implement it and that would be
>>>> called when applications are started... that would be enough right ?
>>>>
>>>> jerome
>>>>>
>>>>>
>>>>> Thanks!!
>>>>>
>>>>> Ken
>>>>>>
>>>>>> Jerome
>>>>>>>
>>>>>>>
>>>>>>> Thanks!
>>>>>>>
>>>>>>> Ken
>>>>>>>
>>>>>>> Jerome Dochez wrote:
>>>>>>>>
>>>>>>>> On Feb 24, 2008, at 8:13 PM, Ken Paulsen wrote:
>>>>>>>>
>>>>>>>>>
>>>>>>>>> Hi Kohsuke / Jerome,
>>>>>>>>>
>>>>>>>>> I have attempted to implement the admin gui pluggability code
>>>>>>>>> and have run into some issues and questions. Here they are:
>>>>>>>>>
>>>>>>>>> * When creating a @Configured element with an
>>>>>>>>> @Attribute(required=true), the "required=true" does not
>>>>>>>>> seem to do anything. I noticed the generated
>>>>>>>>> ObjectNameInjector.java file did not have any check in it
>>>>>>>>> for (null). (not critical, but doesn't validate the data)
>>>>>>>>>
>>>>>>>> ok I will let Kohsuke fix that later...
>>>>>>>>>
>>>>>>>>> *
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> * In the admin-gui module when compiling w/ JSFTemplating's
>>>>>>>>> @annotations, it does a couple strange things (*this is
>>>>>>>>> blocking me*):
>>>>>>>>>
>>>>>>>>> 1) It generates the FormatDefinition.map &
>>>>>>>>> UIComponentFactory.map files when these do not exist when
>>>>>>>>> compiling as we did in v2 (ant).
>>>>>>>>> 2) It throws a NPE when an HK2 annotation is present w/
>>>>>>>>> JSFTemplating anntations in the same build:
>>>>>>>>>
>>>>>>>>> java.lang.NullPointerException
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> com.sun.jsftemplating.annotation.HandlerAP.process(HandlerAP.java:121)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> com.sun.mirror.apt.AnnotationProcessors$CompositeAnnotationProcessor.process(AnnotationProcessors.java:60)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> com.sun.mirror.apt.AnnotationProcessors$CompositeAnnotationProcessor.process(AnnotationProcessors.java:60)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> com.sun.mirror.apt.AnnotationProcessors$CompositeAnnotationProcessor.process(AnnotationProcessors.java:60)
>>>>>>>>>
>>>>>>>>> at com.sun.tools.apt.comp.Apt.main(Apt.java:454)
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> com.sun.tools.apt.main.JavaCompiler.compile(JavaCompiler.java:258)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>> com.sun.tools.apt.main.Main.compile(Main.java:1102)
>>>>>>>>> at com.sun.tools.apt.main.Main.compile(Main.java:964)
>>>>>>>>> at com.sun.tools.apt.Main.processing(Main.java:95)
>>>>>>>>> at com.sun.tools.apt.Main.process(Main.java:85)
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> com.sun.enterprise.module.maven.HK2CompileMojo$1.compileInProcess(HK2CompileMojo.java:87)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> com.sun.enterprise.module.maven.AptCompiler.compile(AptCompiler.java:67)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> org.apache.maven.plugin.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:485)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> com.sun.enterprise.module.maven.CompilerMojo.execute(CompilerMojo.java:113)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> com.sun.enterprise.module.maven.HK2CompileMojo.execute(HK2CompileMojo.java:101)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:443)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:539)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:480)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:459)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:311)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:278)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:143)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:334)
>>>>>>>>> at
>>>>>>>>> org.apache.maven.DefaultMaven.execute(DefaultMaven.java:125)
>>>>>>>>> at
>>>>>>>>> org.apache.maven.cli.MavenCli.main(MavenCli.java:280)
>>>>>>>>> at
>>>>>>>>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>>>>>>>>
>>>>>>>>> at java.lang.reflect.Method.invoke(Method.java:597)
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>> org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
>>>>>>>>> at
>>>>>>>>>
>>>>>>>>> org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
>>>>>>>>>
>>>>>>>>> at
>>>>>>>>> org.codehaus.classworlds.Launcher.main(Launcher.java:375)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> I have 3 different Annotation processor factories. In each
>>>>>>>>> of them I return the supported types, which I believe
>>>>>>>>> should limit the annotations which are processed by the
>>>>>>>>> AnnotationProcessor created by the factory. However, based
>>>>>>>>> on the above errors, and tests that I've done, I think they
>>>>>>>>> are getting called for more than that. For example, my
>>>>>>>>> FormatDefinitionAPFactory is getting called for my @Handler
>>>>>>>>> annotations... this shouldn't happen. Perhaps the
>>>>>>>>> HK2Compiler is doing things differently than the normal apt
>>>>>>>>> compiler?
>>>>>>>>>
>>>>>>>> have you tried to just use the plain APT invocation from the
>>>>>>>> command line ? does your processors also get called with HK2
>>>>>>>> annotations ? I don't remember doing anything special in the
>>>>>>>> APT invocation from maven...
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> * I need to find out how I should be finding configuration
>>>>>>>>> information for the admin console plugin data. There is
>>>>>>>>> no Java file (currently) which I can annotate to provide
>>>>>>>>> this. I am currently using @Configured Pojo's for
>>>>>>>>> storing this information... so I need a way to find these
>>>>>>>>> XML files, or an alternative approach.
>>>>>>>>>
>>>>>>>> which configuration data are u trying to access ?
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>>
>>>>>>>>> Ken
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>
>>>>
>