Hi guys,

I just uploaded a patch for a FacesConfigurationMerger SPI:
MYFACES-2945-FacesConfigurationMerger.patch

Furthermore I added a quick code sample as comment on the MYFACES-2945
issue about how Geronimo can use this new SPI.

Please take a look at the patch and if there are no objections, I will
commit it soon!

Regards,
Jakob

2010/12/9 Jakob Korherr <jakob.korh...@gmail.com>:
> Hi,
>
> I called it ugly, because of its implementation code in
> DefaultFacesConfigurationProvider: The method is already inside of a
> FacesConfigurationProvider, but it does this:
>
> FacesConfigurationProvider provider = FacesConfigurationProviderFactory.
>            getFacesConfigurationProviderFactory(_externalContext).
>                getFacesConfigurationProvider(_externalContext);
>
> ...and then calls all the other methods of FacesConfigurationProvider
> on this provider instance.
>
> As I said, I know this is this way, because FacesConfigurationProvider
> can be wrapped, but IMHO it is really ugly.
>
>
> The method used on MYFACES-2998 was a first approach to solve this
> problem in a better way. However, I really like those two of your
> suggestions:
>
> 1) Leo #2: Create another SPI interface for getFacesConfigData()
> (please suggest a name for it, maybe
> FacesConfigurationMergerProvider?) and remove this method form
> FacesConfigurationProvider.
> 2) Ivan: In a few words: let getFacesConfigData() on
> FacesConfigurationProvider, but provide an
> AbstractFacesConfigurationProvider which implements the merging and
> sorting to let custom SPI impls take advantage of it.
>
> At first, I really liked Ivan's proposal, but after thinking more
> about it, it is not consistent with what we have right now (we do not
> provide any other Abstract-SPI impl) and we would have the huge
> merging and sorting code all in the SPI(-api) package, but IMO it
> should really go into o.a.m.config.
>
> Thus I think that a new FacesConfigurationMergerProvider-SPI as Leo
> proposed is the best choice here. Note that for this SPI it is good
> practice to use other SPI impls.
>
> I will provide a patch for it soon and then we can discuss it further!
>
> Regards,
> Jakob
>
> 2010/12/9 Ivan <xhh...@gmail.com>:
>> my 2 cents, it seems for me less urgly ...
>> a. For the FacesConfigurationProvider , it is better to have only one method
>> getFacesConfigData()
>> b. Create another abstract class AbstractFacesConfigurationProvider which
>> extends FacesConfigurationProvider, and define those proctected methods of
>> get***, also place those sorting/merging codes there.
>> c. In the DefaultFacesConfigurationProvider, it only implements those get***
>> methods.
>> thanks.
>>
>> 2010/12/9 Leonardo Uribe <lu4...@gmail.com>
>>>
>>> Hi
>>>
>>> I agree with Jakob about faces-config merging and ordering algorithm
>>> should not be exposed by MyFaces. Why is it not enough?. At this point it is
>>> not clear the reasons. Note in this moment ordering and sorting algoritm it
>>> is not being exposed by FacesConfigurationProvider interface.
>>>
>>> Other different thing is FacesConfigurationProvider.getFacesConfigData().
>>> The intention of this method is provide a way to get a Serializable object
>>> that represents all config information required to initialize MyFaces and
>>> allow container to store it temporally somewere. In this way it is possible
>>> to deploy and undeploy an application more quickly, because if "nothing
>>> changes"(no added dependencies, no update from faces-config.xml files or
>>> classes) this information is always the same.
>>>
>>> On MYFACES-2945 and previous discussions it was proposed two different
>>> options:
>>>
>>> 1. Add getFacesConfigData()
>>> 2. Add a set of methods to retrieve FacesConfig objects instead.
>>>
>>>     public abstract FacesConfig getStandardFacesConfig(ExternalContext
>>> ectx);
>>>     public abstract FacesConfig
>>> getMetaInfServicesFacesConfig(ExternalContext ectx);
>>>     public abstract FacesConfig getAnnotationsFacesConfig(ExternalContext
>>> ectx, boolean metadataComplete);
>>>     public abstract List<FacesConfig>
>>> getClassloaderFacesConfig(ExternalContext ectx);
>>>     public abstract List<FacesConfig>
>>> getContextSpecifiedFacesConfig(ExternalContext ectx);
>>>     public abstract FacesConfig getWebAppFacesConfig(ExternalContext
>>> ectx);
>>>
>>> The first option has the advantage that it fill the initial requeriment
>>> without add more complexity to the problem. The second one seems to be more
>>> structured and opens the possibility to do other things like how override
>>> MyFaces parsing for faces-config.xml files like it is being discussed. If
>>> the container parse faces-config.xml files, with the previous methods it is
>>> possible to prevent parse the same files twice.
>>>
>>> My first intention, as is shown on MYFACES-2945 was that
>>> FacesConfigurationProvider does not included getFacesConfigData(), because
>>> it is possible to fill the initial objective with these methods, but finally
>>> it was agreed the first option looks better, right?
>>>
>>> Now I see that on MYFACES-2998 that fact is questioned:
>>>
>>> JK>> Unfortunately it also provides a method that should combine all these
>>> data: getFacesConfigData().
>>> JK>> This method is here due to refactorings, but IMHO this is the last
>>> place where it should be put,
>>> JK>> because it gets "its own implementation" via its Factory and then
>>> calls all of the above methods on
>>> JK>> it. I know this was introduced to support wrapping the default impl,
>>> but it really is very, very ugly.
>>>
>>> In few words, why does it looks ugly? or with other words, what can we do
>>> to make it cleaner? remove it? or just provide another SPI interface and put
>>> that method there? In practice, getFacesConfigData() merges all FacesConfig
>>> information, and "on the way" it does order applicationFacesConfig files
>>> (the ones obtained from getClassloaderFacesConfig() and
>>> getContextSpecifiedFacesConfig() ) . To do that it requires to call all six
>>> methods from FacesConfigurationProvider, there is no other way, so I don't
>>> see why do that is considered ugly.
>>>
>>> At this moment we have the following courses of action:
>>>
>>> 1. Remove FacesConfigurationResource interface partially, because it is
>>> still too inmature and let it for myfaces core 2.0.4.
>>> 2. Create another SPI interface for getFacesConfigData() (please suggest a
>>> name for it, maybe FacesConfigurationMergerProvider?) and remove this method
>>> form FacesConfigurationResource. Apply the patch on MYFACES-2998 seems to be
>>> in this direction, but forget the reason why it is wanted to expose
>>> getFacesConfigData() to the container.
>>> 3. Apply something like MYFACES-2998 patch, and refactor this one later in
>>> myfaces core 2.0.4
>>>
>>> Suggestions are welcome.
>>>
>>> regards,
>>>
>>> Leonardo Uribe
>>>
>>>
>>>
>>>
>>
>>
>>
>> --
>> Ivan
>>
>
>
>
> --
> Jakob Korherr
>
> blog: http://www.jakobk.com
> twitter: http://twitter.com/jakobkorherr
> work: http://www.irian.at
>



-- 
Jakob Korherr

blog: http://www.jakobk.com
twitter: http://twitter.com/jakobkorherr
work: http://www.irian.at

Reply via email to