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

Reply via email to