You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2009/10/03 02:17:10 UTC
svn commit: r821205 - in
/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces: application/
renderkit/html/ view/facelets/ view/facelets/tag/composite/
Author: lu4242
Date: Sat Oct 3 00:17:09 2009
New Revision: 821205
URL: http://svn.apache.org/viewvc?rev=821205&view=rev
Log:
MYFACES-2259 Implement Partial State Saving feature (fix relocation problem)
Added:
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/PostBuildComponentTreeOnRestoreViewEvent.java (with props)
Modified:
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlScriptRenderer.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlStylesheetRenderer.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/InsertChildrenHandler.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/InsertFacetHandler.java
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java?rev=821205&r1=821204&r2=821205&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java Sat Oct 3 00:17:09 2009
@@ -1551,7 +1551,7 @@
{
_handleListenerFor(context, inspected, component, inspected.getClass().getAnnotation(ListenerFor.class));
- ListenersFor listeners = component.getClass().getAnnotation(ListenersFor.class);
+ ListenersFor listeners = inspected.getClass().getAnnotation(ListenersFor.class);
if (listeners != null)
{
for (ListenerFor listenerFor : listeners.value())
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlScriptRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlScriptRenderer.java?rev=821205&r1=821204&r2=821205&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlScriptRenderer.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlScriptRenderer.java Sat Oct 3 00:17:09 2009
@@ -32,6 +32,7 @@
import javax.faces.event.ComponentSystemEvent;
import javax.faces.event.ComponentSystemEventListener;
import javax.faces.event.ListenerFor;
+import javax.faces.event.ListenersFor;
import javax.faces.event.PostAddToViewEvent;
import javax.faces.render.Renderer;
@@ -40,6 +41,7 @@
import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
import org.apache.myfaces.shared_impl.renderkit.RendererUtils;
import org.apache.myfaces.shared_impl.renderkit.html.HTML;
+import org.apache.myfaces.view.facelets.PostBuildComponentTreeOnRestoreViewEvent;
/**
* Renderer used by h:outputScript component
@@ -49,7 +51,10 @@
* @version $Revision$ $Date$
*/
@JSFRenderer(renderKitId = "HTML_BASIC", family = "javax.faces.Output", type = "javax.faces.resource.Script")
-@ListenerFor(systemEventClass = PostAddToViewEvent.class)
+@ListenersFor(value={
+ @ListenerFor(systemEventClass = PostAddToViewEvent.class),
+ @ListenerFor(systemEventClass = PostBuildComponentTreeOnRestoreViewEvent.class)
+})
public class HtmlScriptRenderer extends Renderer implements
ComponentSystemEventListener
{
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlStylesheetRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlStylesheetRenderer.java?rev=821205&r1=821204&r2=821205&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlStylesheetRenderer.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlStylesheetRenderer.java Sat Oct 3 00:17:09 2009
@@ -32,6 +32,7 @@
import javax.faces.event.ComponentSystemEvent;
import javax.faces.event.ComponentSystemEventListener;
import javax.faces.event.ListenerFor;
+import javax.faces.event.ListenersFor;
import javax.faces.event.PostAddToViewEvent;
import javax.faces.render.Renderer;
@@ -40,6 +41,7 @@
import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
import org.apache.myfaces.shared_impl.renderkit.RendererUtils;
import org.apache.myfaces.shared_impl.renderkit.html.HTML;
+import org.apache.myfaces.view.facelets.PostBuildComponentTreeOnRestoreViewEvent;
/**
* Renderer used by h:outputStylesheet component
@@ -49,7 +51,10 @@
* @version $Revision$ $Date$
*/
@JSFRenderer(renderKitId = "HTML_BASIC", family = "javax.faces.Output", type = "javax.faces.resource.Stylesheet")
-@ListenerFor(systemEventClass = PostAddToViewEvent.class)
+@ListenersFor(value={
+ @ListenerFor(systemEventClass = PostAddToViewEvent.class),
+ @ListenerFor(systemEventClass = PostBuildComponentTreeOnRestoreViewEvent.class)
+})
public class HtmlStylesheetRenderer extends Renderer implements
ComponentSystemEventListener
{
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java?rev=821205&r1=821204&r2=821205&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java Sat Oct 3 00:17:09 2009
@@ -141,6 +141,7 @@
{
context.setProcessingEvents (true);
vdl.buildView (context, view);
+ _publishPostBuildComponentTreeOnRestoreViewEvent(context, view);
}
finally
{
@@ -242,6 +243,43 @@
//}
return view;
}
+
+ private static void _publishPostBuildComponentTreeOnRestoreViewEvent(FacesContext context, UIComponent component)
+ {
+ context.getApplication().publishEvent(context, PostBuildComponentTreeOnRestoreViewEvent.class, UIComponent.class, component);
+
+ if (component.getChildCount() > 0)
+ {
+ // PostAddToViewEvent could cause component relocation
+ // (h:outputScript, h:outputStylesheet, composite:insertChildren, composite:insertFacet)
+ // so we need to check if the component was relocated or not
+ List<UIComponent> children = component.getChildren();
+ UIComponent child = null;
+ UIComponent currentChild = null;
+ int i = 0;
+ while (i < children.size())
+ {
+ child = children.get(i);
+ // Iterate over the same index if the component was removed
+ // This prevents skip components when processing
+ do
+ {
+ _publishPostBuildComponentTreeOnRestoreViewEvent(context, child);
+ currentChild = child;
+ }
+ while ((i < children.size()) &&
+ ((child = children.get(i)) != currentChild) );
+ i++;
+ }
+ }
+ if (component.getFacetCount() > 0)
+ {
+ for (UIComponent child : component.getFacets().values())
+ {
+ _publishPostBuildComponentTreeOnRestoreViewEvent(context, child);
+ }
+ }
+ }
@Override
public Object saveView (FacesContext context)
Added: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/PostBuildComponentTreeOnRestoreViewEvent.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/PostBuildComponentTreeOnRestoreViewEvent.java?rev=821205&view=auto
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/PostBuildComponentTreeOnRestoreViewEvent.java (added)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/PostBuildComponentTreeOnRestoreViewEvent.java Sat Oct 3 00:17:09 2009
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets;
+
+import javax.faces.component.UIComponent;
+import javax.faces.event.ComponentSystemEvent;
+import javax.faces.event.FacesListener;
+import javax.faces.event.SystemEventListener;
+
+/**
+ *
+ * @since 2.0
+ * @author Leonardo Uribe (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+public class PostBuildComponentTreeOnRestoreViewEvent extends ComponentSystemEvent
+{
+ /**
+ * @param component
+ */
+ public PostBuildComponentTreeOnRestoreViewEvent(UIComponent component)
+ {
+ super(component);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean isAppropriateListener(FacesListener listener)
+ {
+ return listener instanceof SystemEventListener;
+ }
+}
Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/PostBuildComponentTreeOnRestoreViewEvent.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/PostBuildComponentTreeOnRestoreViewEvent.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/InsertChildrenHandler.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/InsertChildrenHandler.java?rev=821205&r1=821204&r2=821205&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/InsertChildrenHandler.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/InsertChildrenHandler.java Sat Oct 3 00:17:09 2009
@@ -32,6 +32,8 @@
import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletTag;
import org.apache.myfaces.view.facelets.AbstractFaceletContext;
+import org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage;
+import org.apache.myfaces.view.facelets.PostBuildComponentTreeOnRestoreViewEvent;
/**
* @author Leonardo Uribe (latest modification by $Author$)
@@ -54,6 +56,13 @@
parentCompositeComponent.subscribeToEvent(PostAddToViewEvent.class,
new RelocateAllChildrenListener(parent, parentCompositeComponent.getChildCount()));
+
+ if (ctx.getFacesContext().getAttributes().containsKey(
+ FaceletViewDeclarationLanguage.MARK_INITIAL_STATE_KEY))
+ {
+ parentCompositeComponent.subscribeToEvent(PostBuildComponentTreeOnRestoreViewEvent.class,
+ new RelocateAllChildrenListener(parent, parentCompositeComponent.getChildCount()));
+ }
}
public static final class RelocateAllChildrenListener
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/InsertFacetHandler.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/InsertFacetHandler.java?rev=821205&r1=821204&r2=821205&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/InsertFacetHandler.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/composite/InsertFacetHandler.java Sat Oct 3 00:17:09 2009
@@ -33,6 +33,8 @@
import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletAttribute;
import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletTag;
import org.apache.myfaces.view.facelets.AbstractFaceletContext;
+import org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage;
+import org.apache.myfaces.view.facelets.PostBuildComponentTreeOnRestoreViewEvent;
/**
* Insert or move the facet from the composite component body to the expected location.
@@ -84,6 +86,13 @@
parentCompositeComponent.subscribeToEvent(PostAddToViewEvent.class,
new RelocateFacetListener(parent, facetName));
+
+ if (ctx.getFacesContext().getAttributes().containsKey(
+ FaceletViewDeclarationLanguage.MARK_INITIAL_STATE_KEY))
+ {
+ parentCompositeComponent.subscribeToEvent(PostBuildComponentTreeOnRestoreViewEvent.class,
+ new RelocateFacetListener(parent, facetName));
+ }
}
public static final class RelocateFacetListener