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);
}
}