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 2012/03/16 19:01:28 UTC

svn commit: r1301674 - in /myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets: ./ compiler/ impl/ tag/jsf/ tag/jsf/core/

Author: lu4242
Date: Fri Mar 16 18:01:27 2012
New Revision: 1301674

URL: http://svn.apache.org/viewvc?rev=1301674&view=rev
Log:
MYFACES-3502 components inside f:metadata are recreated when the whole view is processed

Modified:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/AbstractFacelet.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletCompositionContext.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/UIInstructionHandler.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFacelet.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFaceletContext.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFaceletFactory.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/FaceletCompositionContextImpl.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentTagHandlerDelegate.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/core/ViewMetadataHandler.java

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/AbstractFacelet.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/AbstractFacelet.java?rev=1301674&r1=1301673&r2=1301674&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/AbstractFacelet.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/AbstractFacelet.java Fri Mar 16 18:01:27 2012
@@ -91,4 +91,15 @@ public abstract class AbstractFacelet ex
             throws IOException, FacesException, FaceletException, ELException;
     
     public abstract boolean isBuildingCompositeComponentMetadata();
+    
+    /**
+     * Return an identifier used to derive an unique id per facelet instance. This
+     * value should be the same for viewMetadata and normal facelet instances.
+     * 
+     * @return 
+     */
+    public String getFaceletId()
+    {
+        return getAlias(); 
+    }
 }

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletCompositionContext.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletCompositionContext.java?rev=1301674&r1=1301673&r2=1301674&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletCompositionContext.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletCompositionContext.java Fri Mar 16 18:01:27 2012
@@ -520,7 +520,7 @@ abstract public class FaceletComposition
     }
 
     /**
-     * Check if the view
+     * Check if the facelet is building view metadata
      * 
      * since 2.1.7, 2.0.13
      * @return 
@@ -530,4 +530,46 @@ abstract public class FaceletComposition
         return FaceletViewDeclarationLanguage.isBuildingViewMetadata(
                 FacesContext.getCurrentInstance());
     }
+    
+    /**
+     * Call this method to indicate a f:metadata section is about to be processed
+     * 
+     * since 2.1.7, 2.0.13
+     * @return 
+     */
+    public void startMetadataSection()
+    {
+    }
+    
+    /**
+     * Call this method to indicate f:metadata section has been already processed
+     * 
+     * since 2.1.7, 2.0.13
+     * @return 
+     */
+    public void endMetadataSection()
+    {
+    }
+    
+    /**
+     * Check if the component is created inside f:metadata section
+     * 
+     * since 2.1.7, 2.0.13
+     * @return 
+     */
+    public boolean isInMetadataSection()
+    {
+       return false;
+    }
+    
+    /**
+     * Check if the section to be processed is being refreshed.
+     * 
+     * since 2.1.7, 2.0.13
+     * @return 
+     */
+    public boolean isRefreshingSection()
+    {
+       return isRefreshingTransientBuild() ||  (!isBuildingViewMetadata() && isInMetadataSection());
+    }
 }

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/UIInstructionHandler.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/UIInstructionHandler.java?rev=1301674&r1=1301673&r2=1301674&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/UIInstructionHandler.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/UIInstructionHandler.java Fri Mar 16 18:01:27 2012
@@ -91,7 +91,7 @@ final class UIInstructionHandler extends
             
             String componentId = mctx.generateUniqueComponentId();
             
-            if (mctx.isRefreshingTransientBuild())
+            if (mctx.isRefreshingSection())
             {
                 c = ComponentSupport.findChildByTagId(parent, id);
             }
@@ -152,12 +152,12 @@ final class UIInstructionHandler extends
                 mctx.finalizeForDeletion(c);
                 if (!componentFoundInserted)
                 {
-                    if (mctx.isRefreshingTransientBuild())
+                    if (mctx.isRefreshingSection())
                     {
                         ctx.getFacesContext().setProcessingEvents(false); 
                     }
                     parent.getChildren().remove(c);
-                    if (mctx.isRefreshingTransientBuild())
+                    if (mctx.isRefreshingSection())
                     {
                         ctx.getFacesContext().setProcessingEvents(oldProcessingEvents);
                     }
@@ -165,12 +165,12 @@ final class UIInstructionHandler extends
             }
             if (!componentFoundInserted)
             {
-                if (componentFound && mctx.isRefreshingTransientBuild())
+                if (componentFound && mctx.isRefreshingSection())
                 {
                     ctx.getFacesContext().setProcessingEvents(false); 
                 }
                 this.addComponent(ctx, parent, c);
-                if (componentFound && mctx.isRefreshingTransientBuild())
+                if (componentFound && mctx.isRefreshingSection())
                 {
                     ctx.getFacesContext().setProcessingEvents(oldProcessingEvents);
                 }

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFacelet.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFacelet.java?rev=1301674&r1=1301673&r2=1301674&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFacelet.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFacelet.java Fri Mar 16 18:01:27 2012
@@ -68,6 +68,8 @@ final class DefaultFacelet extends Abstr
     private final static String APPLIED_KEY = "org.apache.myfaces.view.facelets.APPLIED";
 
     private final String _alias;
+    
+    private final String _faceletId;
 
     private final ExpressionFactory _elFactory;
 
@@ -88,28 +90,30 @@ final class DefaultFacelet extends Abstr
     private final boolean _encodingHandler;
 
     public DefaultFacelet(DefaultFaceletFactory factory, ExpressionFactory el, URL src, String alias,
-                          FaceletHandler root)
+                          String faceletId, FaceletHandler root)
     {
         _factory = factory;
         _elFactory = el;
         _src = src;
         _root = root;
         _alias = alias;
+        _faceletId = faceletId;
         _createTime = System.currentTimeMillis();
         _refreshPeriod = _factory.getRefreshPeriod();
         _relativePaths = new WeakHashMap<String, URL>();
         _isBuildingCompositeComponentMetadata = false;
         _encodingHandler = (root instanceof EncodingHandler);
     }
-    
+
     public DefaultFacelet(DefaultFaceletFactory factory, ExpressionFactory el, URL src, String alias,
-            FaceletHandler root, boolean isBuildingCompositeComponentMetadata)
+            String faceletId, FaceletHandler root, boolean isBuildingCompositeComponentMetadata)
     {
         _factory = factory;
         _elFactory = el;
         _src = src;
         _root = root;
         _alias = alias;
+        _faceletId = faceletId;
         _createTime = System.currentTimeMillis();
         _refreshPeriod = _factory.getRefreshPeriod();
         _relativePaths = new WeakHashMap<String, URL>();
@@ -309,6 +313,11 @@ final class DefaultFacelet extends Abstr
     {
         return _alias;
     }
+    
+    public String getFaceletId()
+    {
+        return _faceletId;
+    }
 
     /**
      * Return this Facelet's ExpressionFactory instance

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFaceletContext.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFaceletContext.java?rev=1301674&r1=1301673&r2=1301674&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFaceletContext.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFaceletContext.java Fri Mar 16 18:01:27 2012
@@ -295,7 +295,7 @@ final class DefaultFaceletContext extend
             for (int i = 0; i < _faceletHierarchy.size(); i++)
             {
                 AbstractFacelet facelet = _faceletHierarchy.get(i);
-                builder.append(facelet.getAlias());
+                builder.append(facelet.getFaceletId());
             }
 
             // Integer prefixInt = new Integer(builder.toString().hashCode());
@@ -321,8 +321,17 @@ final class DefaultFaceletContext extend
             getFaceletCompositionContext().generateUniqueId(_uniqueIdBuilder);
             _uniqueIdBuilder.append("_");
             _uniqueIdBuilder.append(_prefix);
-            _uniqueIdBuilder.append("_");
-            _uniqueIdBuilder.append(base);
+            // Since two different facelets are used to build the metadata, it is necessary
+            // to trim the "base" part from the returned unique id, to ensure the components will be
+            // refreshed properly. Note the "base" part is the one that allows to ensure
+            // uniqueness between two different facelets with the same <f:metadata>, but since by 
+            // spec view metadata sections cannot live on template client facelets, this case is
+            // just not possible. 
+            if (!getFaceletCompositionContext().isInMetadataSection())
+            {
+                _uniqueIdBuilder.append("_");
+                _uniqueIdBuilder.append(base);
+            }
             uniqueIdFromIterator = _uniqueIdBuilder.toString();
             getFaceletCompositionContext().addUniqueId(uniqueIdFromIterator);
             return uniqueIdFromIterator;

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFaceletFactory.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFaceletFactory.java?rev=1301674&r1=1301673&r2=1301674&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFaceletFactory.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFaceletFactory.java Fri Mar 16 18:01:27 2012
@@ -306,7 +306,7 @@ public final class DefaultFaceletFactory
         try
         {
             FaceletHandler h = _compiler.compile(url, alias);
-            DefaultFacelet f = new DefaultFacelet(this, _compiler.createExpressionFactory(), url, alias, h);
+            DefaultFacelet f = new DefaultFacelet(this, _compiler.createExpressionFactory(), url, alias, alias, h);
             return f;
         }
         catch (FileNotFoundException fnfe)
@@ -334,11 +334,13 @@ public final class DefaultFaceletFactory
 
         // The alias is used later for informative purposes, so we append 
         // some prefix to identify later where the errors comes from.
-        String alias = "/viewMetadata/" + _removeFirst(url.getFile(), _baseUrl.getFile());
+        String faceletId = "/"+ _removeFirst(url.getFile(), _baseUrl.getFile());
+        String alias = "/viewMetadata" + faceletId;
         try
         {
             FaceletHandler h = _compiler.compileViewMetadata(url, alias);
-            DefaultFacelet f = new DefaultFacelet(this, _compiler.createExpressionFactory(), url, alias, h);
+            DefaultFacelet f = new DefaultFacelet(this, _compiler.createExpressionFactory(), url, alias, 
+                    faceletId, h);
             return f;
         }
         catch (FileNotFoundException fnfe)
@@ -371,7 +373,8 @@ public final class DefaultFaceletFactory
         try
         {
             FaceletHandler h = _compiler.compileCompositeComponentMetadata(url, alias);
-            DefaultFacelet f = new DefaultFacelet(this, _compiler.createExpressionFactory(), url, alias, h, true);
+            DefaultFacelet f = new DefaultFacelet(this, _compiler.createExpressionFactory(), url, alias,
+                    alias, h, true);
             return f;
         }
         catch (FileNotFoundException fnfe)

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/FaceletCompositionContextImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/FaceletCompositionContextImpl.java?rev=1301674&r1=1301673&r2=1301674&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/FaceletCompositionContextImpl.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/FaceletCompositionContextImpl.java Fri Mar 16 18:01:27 2012
@@ -131,6 +131,12 @@ public class FaceletCompositionContextIm
     private Iterator<String> _uniqueIdsIterator;
     private int _level;
     
+    private int _isInMetadataSection;
+    private SectionUniqueIdCounter _sectionUniqueMetadataIdCounter;
+    private SectionUniqueIdCounter _sectionUniqueNormalIdCounter;
+    private SectionUniqueIdCounter _sectionUniqueComponentMetadataIdCounter;
+    private SectionUniqueIdCounter _sectionUniqueComponentNormalIdCounter;
+    
     public FaceletCompositionContextImpl(FaceletFactory factory, FacesContext facesContext)
     {
         super();
@@ -160,9 +166,12 @@ public class FaceletCompositionContextIm
         {
             _sectionUniqueComponentIdCounter = new SectionUniqueIdCounter("_");
         }
+        _sectionUniqueNormalIdCounter = _sectionUniqueIdCounter;
+        _sectionUniqueComponentNormalIdCounter = _sectionUniqueComponentIdCounter;
         _uniqueIdsList = null;
         _uniqueIdsIterator = null;
         _level = 0;
+        _isInMetadataSection = 0;
     }
     
     @Override
@@ -182,7 +191,7 @@ public class FaceletCompositionContextIm
     @Override
     public void addUniqueId(String uniqueId)
     {
-        if (_uniqueIdsList != null && _level == 0)
+        if (_uniqueIdsList != null && _level == 0 && !(_isInMetadataSection > 0))
         {
             _uniqueIdsList.add(uniqueId);
         }
@@ -191,7 +200,8 @@ public class FaceletCompositionContextIm
     @Override
     public String getUniqueIdFromIterator()
     {
-        if (_uniqueIdsIterator != null && _uniqueIdsIterator.hasNext() && _level == 0)
+        if (_uniqueIdsIterator != null && _uniqueIdsIterator.hasNext() && 
+                _level == 0 && !(_isInMetadataSection > 0))
         {
             return _uniqueIdsIterator.next();
         }
@@ -891,6 +901,50 @@ public class FaceletCompositionContextIm
         _sectionUniqueComponentIdCounter.endUniqueIdSection();
     }
     
+    @Override
+    public void startMetadataSection()
+    {
+        if (_isInMetadataSection == 0)
+        {
+            if (_sectionUniqueMetadataIdCounter == null)
+            {
+                _sectionUniqueMetadataIdCounter = new SectionUniqueIdCounter("__md_");
+            }
+            if (_sectionUniqueComponentMetadataIdCounter == null)
+            {
+                _sectionUniqueComponentMetadataIdCounter = new SectionUniqueIdCounter("__md_");
+            }
+            //Replace the counter with metadata counter
+            _sectionUniqueIdCounter = _sectionUniqueMetadataIdCounter;
+            _sectionUniqueComponentIdCounter = _sectionUniqueComponentMetadataIdCounter;
+        }
+        _isInMetadataSection++;
+    }
+    
+    @Override
+    public void endMetadataSection()
+    {
+        _isInMetadataSection--;
+        if (_isInMetadataSection == 0)
+        {
+            //Use normal id counter again
+            _sectionUniqueIdCounter = _sectionUniqueNormalIdCounter;
+            _sectionUniqueComponentIdCounter = _sectionUniqueComponentNormalIdCounter;
+        }
+    }
+    
+    @Override
+    public boolean isInMetadataSection()
+    {
+       return _isInMetadataSection > 0;
+    }
+    
+    @Override
+    public boolean isRefreshingSection()
+    {
+       return isRefreshingTransientBuild() ||  (!isBuildingViewMetadata() && isInMetadataSection());
+    }
+    
     private static class KeyEntryIterator<K, V> implements Iterator<K>
     {
         private Iterator<Map.Entry<K, V>> _delegateIterator;

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentTagHandlerDelegate.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentTagHandlerDelegate.java?rev=1301674&r1=1301673&r2=1301674&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentTagHandlerDelegate.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentTagHandlerDelegate.java Fri Mar 16 18:01:27 2012
@@ -203,7 +203,7 @@ public class ComponentTagHandlerDelegate
         //another component.
         UIComponent oldParent = parent;
         
-        if (mctx.isRefreshingTransientBuild())
+        if (mctx.isRefreshingSection())
         {
             if (_relocatableResourceHandler != null)
             {
@@ -298,7 +298,7 @@ public class ComponentTagHandlerDelegate
 
             //if (!componentFoundInserted)
             //{
-                if (mctx.isRefreshingTransientBuild())
+                if (mctx.isRefreshingSection())
                 {
                     facesContext.setProcessingEvents(false);
                     if (_relocatableResourceHandler != null &&
@@ -316,7 +316,7 @@ public class ComponentTagHandlerDelegate
                 {
                     ComponentSupport.removeFacet(ctx, parent, c, facetName);
                 }
-                if (mctx.isRefreshingTransientBuild())
+                if (mctx.isRefreshingSection())
                 {
                     facesContext.setProcessingEvents(oldProcessingEvents);
                 }
@@ -348,7 +348,7 @@ public class ComponentTagHandlerDelegate
         
         _delegate.onComponentPopulated(ctx, c, oldParent);
 
-        if (componentFound && mctx.isRefreshingTransientBuild())
+        if (componentFound && mctx.isRefreshingSection())
         {
             facesContext.setProcessingEvents(false);
         }
@@ -360,7 +360,7 @@ public class ComponentTagHandlerDelegate
         {
             ComponentSupport.addFacet(ctx, parent, c, facetName);
         }
-        if (componentFound && mctx.isRefreshingTransientBuild())
+        if (componentFound && mctx.isRefreshingSection())
         {
             facesContext.setProcessingEvents(oldProcessingEvents);
         }

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/core/ViewMetadataHandler.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/core/ViewMetadataHandler.java?rev=1301674&r1=1301673&r2=1301674&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/core/ViewMetadataHandler.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/core/ViewMetadataHandler.java Fri Mar 16 18:01:27 2012
@@ -29,7 +29,7 @@ import javax.faces.view.facelets.TagExce
 import javax.faces.view.facelets.TagHandler;
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletTag;
-import org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage;
+import org.apache.myfaces.view.facelets.FaceletCompositionContext;
 import org.apache.myfaces.view.facelets.tag.jsf.ComponentSupport;
 
 /**
@@ -59,8 +59,8 @@ public final class ViewMetadataHandler e
         {
             throw new TagException(this.tag, "Parent UIComponent "+parent.getId()+" should be instance of UIViewRoot");
         }
-        if (FaceletViewDeclarationLanguage.
-                isBuildingViewMetadata(ctx.getFacesContext()))
+        FaceletCompositionContext mctx = FaceletCompositionContext.getCurrentInstance(ctx);
+        if (mctx.isBuildingViewMetadata())
         {
             UIComponent metadataFacet = parent.getFacet(UIViewRoot.METADATA_FACET_NAME);
             if (metadataFacet == null)
@@ -77,12 +77,14 @@ public final class ViewMetadataHandler e
         // (The only tag that needs to do something special is f:event, because in this case
         // ComponentHandler.isNew(parent) does not work for UIViewRoot.)
         parent.getAttributes().put(FacetHandler.KEY, UIViewRoot.METADATA_FACET_NAME);
+        mctx.startMetadataSection();
         try
         {
             this.nextHandler.apply(ctx, parent);
         }
         finally
         {
+            mctx.endMetadataSection();
             parent.getAttributes().remove(FacetHandler.KEY);
         }
     }