On the SystemEvent issue, we already know that its design causes
performance problems even when there are no listeners.
-- Blake Sullivan
On 10/26/10 2:26 PM, Andy Schwartz wrote:
On 10/26/10 4:13 PM, Ed Burns wrote:
> What are we doing with suffix/extension configuration:
>
> AS> - Enhance the DEFAULT_FACELETS_SUFFIX context parameter to allow it
> AS> to support multiple values + change the default value to ".xhtml
> AS> .view.xml". Or...
>
> AS> - Specify a default value for the FACELETS_VIEW_MAPPINGS context
> AS> parameter.
>
> AS> Either of these seem acceptable to me.
>
> EB> I am reluctant to bind .view.xml to be "Facelets". Yes, right now
> EB> Mojarra is using the Facelets VDL impl to process .view.xml but I'd
> EB> rather leave the DEFAULT_FACELETS_SUFFIX and FACELET_VIEW_MAPPINGS
> EB> unchanged for 2.1.
I find this confusing. The DEFAULT_FACELETS_SUFFIX and
FACELET_VIEW_MAPPINGS parameters control which views the Facelets VDL
will handle. How does Mojarra determine that the Facelets VDL should
process .view.xml files if this mapping isn't reflected by the default
values of these context parameters?
> SUBSECTION: derived view id changes
>
> LU> It seems, but note the algorithm required to deriveViewId() should
> LU> call ResourceResolver to check for resources, specially when suffix
> LU> mapping is used, so if it is necessary to change section 7.5.2 for
> LU> each problem, it could be good to do both changes at once.
>
> What changes are necessary to 7.5.2?
7.5.2 does not specify exactly how the deriveViewId() implementation
should check for the existence of a physical view. The wording is
generic:
> look for a physical resource with the name candidateViewId. If such a
> resource exists, candidateViewId is the correct viewId
As of 2.1, we have introduced a new method that performs this test:
ViewDeclarationLanguage.viewExists(). 7.5.2 could add a sentence that
states that this method should be used to perform the view existence
test.
> AS> 4. We need some way to wrap a specific VDL (eg. the JSP VDL). The
> AS> minimal solution would be to introduce a VDL id (eg.
> AS> ViewDeclarationLanguage.getId()) and define standard ids for the JSP
> AS> and Facelets VDLs.
>
> I'm not opposed, but can you clearly articulate, in one or two
> sentences, why we need this?
I need the ability to wrap one of the standard VDL implementations
(the JSP VDL implementation) in order to insert my own logic. (In my
case, I need to substitute my own VDL.viewExists() implementation).
While the VDLFactory contract provides a hook for this, I have no way
to distinguish between VDL implementations. The presence of an id
lets me to know which VDL is being returned from the VDLFactory and
thus allows me to target my wrapper to a single VDL.
> SUBSECTION: XML syntax
>
> CH> A user could actually nominate
http://java.sun.com/jsf/html as the
> CH> namespace without a prefix and prefix the html tags--don't know if
> CH> that's attractive to anyone.
>
> Yes, they could, but I've not seen any books or articles that do it that
> way. I assert that you can't have a proper XML Faces view without having
> exactly one of the following
>
> 1. some kind of root element on which namespaces are declared
We've got a few options here:
- <html>
- <h:html>
- <f:view>
> 2. doing what Cay suggests and just have "html" as the root element, but
> have it be the new html renderer that handles the "html" element
> rendering.
> 3. saying that your view is actually an XHTML view, in which case you
> have <html> as the root element with the XHTML namespace as the
> non-prefixed namespace.
I *think* that it should be okay to just use a plain old <html>
element even when processing mode = xml. Is there a reason why we
should disallow this?
A big concern about our current XML-centric solution: at the moment we
don't seem to have any clean way to specify a doctype. And since
<h:html> doesn't render a doctype, it looks like our XML-style
Facelets pages will be doctype-less. This seems like a very serious
shortcoming. I think that we need to address this.
> SECTION: [UIData transient] [6] [7]
> MM> - get/putTransient should be on UIComponent, or TransientStateHelper
> MM> needs to be exposed
>
> I strongly feel we shoul expose TransientStateHelper, not put these
> methods on UIComponent.
>
> MM> - no Serializable keys are necessary
>
> MM> But - I am not sure about removing the TransientStateHelper
> MM> contract... It doesn't need to extend from StateHelper, that is true
> MM> - but won't the code look funny if state-saved property handling
> MM> looks different from transient property handling?
>
> Andy's definitive patch is at [7]. Both Andy and Blake favor this patch
> because it does not introduce a top-level TransientStateHelper
> interface.
>
> MM> What I would do:
>
> MM> Double getCalculatedWeight() {
> MM> return (Double)
> getTransientStateHelper().get(PropertyKeys.weight, false);
> MM> }
> MM> void setCalculatedWeight(Double weight) {
> MM> getTransientStateHelper().put(PropertyKeys.weight, weight);
> MM> }
> MM> MM> Could TransientStateHelper not be an alternative
> implementation of the
> MM> StateHelper interface?
>
> This is completely analogous to the original design with StateHelper().
> So, in addition to Martin's assertion about the API design, it is
> consistent with our existing patterns.
>
> I'm not convinced {get/put}Transient is better. If you're going to
> quibble with that, why not quibble with getStateHelper() as well?
StateHelper is a helper class that is helps the component
implementation and its subclasses. The access modifier of
getStateHelper() reflects this - ie. this is a protected, not public.
With transient state, I was under the impression that we were trying
to address two use cases:
- Internal access from the component + subclasses.
- External access from arbitrary code (eg. Renderers, application logic)
The second use case raises the question of what an appropriate
external/public API might be. I find it awkward that external code
would be required to interact with a UIComponent's "helper" class.
I don't view this as quibbling. We're all just trying to find the
best API.
> AS> I don't see how adding a new TransientStateHelper contract improves
> AS> this situation. That's not to say that we cannot do this. The
> AS> first patch that I provided leaves TransientStateHelper in place.
> AS> Just seems like added conceptual overhead that might not be
> AS> necessary.
>
> AS> 1. Components storing transient attributes on themselves.
> AS> 2. External classes storing transient attributes on components.
>
> The existing StateHelper only addresses 1. Is it ok to allow transient
> state to be accessed for case 2 without doing the same for non-transient
> state?
Non-transient state is already accessible via public APIs on
UIComponent (eg. getAttributes(), getValueExpression(), etc...) and
its subclasses (eg. property-specific getters/setters). The fact
that UIComponent happens to store state in a StateHelper is
effectively an implementation detail of the component.
BTW, I haven't seen any comments on the questions that I raised
regarding TransientStateHolder. Who implements this besides
UIComponent? Who interacts with this contract?
> SECTION: [537-PrePostValidateEvent]
>
> AS> Does this mean that only input, UIData and UIForm components will
> AS> deliver these events?
>
> No, it does not mean that *only* those components will deliver those
> events. It means that in the case of components who are iterating
> components, the event must be published before, or after, the child
> component processing. This is true for any components that have
> children. I will revise the documentation to be as follows.
>
> PostValidateEvent
>
> Components with children must publish this event after processing their
> child nodes in processValidators. This is especially important for
> iterating components such as UIData and form components, such as UIForm.
>
Okay, though I am still a bit confused about how iterating components
are special.
As always, I also worry that the overhead of delivering these system
events through the application-level publication mechanism is going to
be a performance problem for views with large #s of components (common
case for me). I suppose time will tell.
Andy