You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by jw...@apache.org on 2008/03/17 21:37:04 UTC
svn commit: r638058 - in
/myfaces/trinidad/trunk_1.2.x/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin:
RequestSkinWrapper.java SkinImpl.java SkinUtils.java
Author: jwaldman
Date: Mon Mar 17 13:36:53 2008
New Revision: 638058
URL: http://svn.apache.org/viewvc?rev=638058&view=rev
Log:
TRINIDAD-1009 ReferenceIcon referring to declarative icon not resolved
on trunk_1.2.x
patch provided by Andy Schwartz
Modified:
myfaces/trinidad/trunk_1.2.x/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/RequestSkinWrapper.java
myfaces/trinidad/trunk_1.2.x/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/SkinImpl.java
myfaces/trinidad/trunk_1.2.x/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/SkinUtils.java
Modified: myfaces/trinidad/trunk_1.2.x/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/RequestSkinWrapper.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk_1.2.x/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/RequestSkinWrapper.java?rev=638058&r1=638057&r2=638058&view=diff
==============================================================================
--- myfaces/trinidad/trunk_1.2.x/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/RequestSkinWrapper.java (original)
+++ myfaces/trinidad/trunk_1.2.x/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/RequestSkinWrapper.java Mon Mar 17 13:36:53 2008
@@ -31,6 +31,7 @@
import org.apache.myfaces.trinidad.skin.SkinAddition;
import org.apache.myfaces.trinidadinternal.renderkit.core.CoreRenderingContext;
import org.apache.myfaces.trinidadinternal.skin.icon.NullIcon;
+import org.apache.myfaces.trinidadinternal.skin.icon.ReferenceIcon;
import org.apache.myfaces.trinidadinternal.style.StyleContext;
import org.apache.myfaces.trinidadinternal.style.StyleProvider;
import org.apache.myfaces.trinidadinternal.style.xml.parse.StyleSheetDocument;
@@ -180,19 +181,24 @@
if (icon == null)
{
- icon = _skin.getIcon(iconName, resolveIcon);
-
- // We ended up having to do two lookups for icons
- // which are not available in the StyleProvider
- // icon map. To avoid having to do two lookups
- // the next time this icon is requested, we promote
- // the icon up from the wrapped skin into the
- // StyleProvider icon map.
- //
- // resolveIcon should always be true here, but just
- // to be totally safe, avoid caching unresolved icons
+ icon = _skin.getIcon(iconName, false);
+
+ // Resolve ReferenceIcons if necessary
if (resolveIcon)
+ {
+ if (icon instanceof ReferenceIcon)
+ icon = SkinUtils.resolveReferenceIcon(this, (ReferenceIcon)icon);
+
+ // We ended up having to do two lookups for icons
+ // which are not available in the StyleProvider
+ // icon map. To avoid having to do two lookups
+ // the next time this icon is requested, we promote
+ // the icon up from the wrapped skin into the
+ // StyleProvider icon map. Note that we only cache
+ // resolved icons in this way - we don't want to
+ // pollute our cache with unresolved ReferenceIcons.
registerIcon(iconName, icon);
+ }
}
return (icon == _NULL_ICON) ? null : icon;
Modified: myfaces/trinidad/trunk_1.2.x/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/SkinImpl.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk_1.2.x/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/SkinImpl.java?rev=638058&r1=638057&r2=638058&view=diff
==============================================================================
--- myfaces/trinidad/trunk_1.2.x/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/SkinImpl.java (original)
+++ myfaces/trinidad/trunk_1.2.x/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/SkinImpl.java Mon Mar 17 13:36:53 2008
@@ -28,7 +28,6 @@
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.Set;
-import java.util.Stack;
import java.util.concurrent.ConcurrentHashMap;
@@ -223,8 +222,7 @@
if (icon instanceof ReferenceIcon)
{
// find the true icon, not a ReferenceIcon
- icon = _resolveReferenceIcon((ReferenceIcon)icon,
- null);
+ icon = SkinUtils.resolveReferenceIcon(this, (ReferenceIcon)icon);
}
}
@@ -492,56 +490,6 @@
* value expression. If they do, then the bundleName takes precedence.
*/
abstract protected ValueExpression getTranslationSourceValueExpression();
-
- /**
- * Find the actual icon
- * @param refIcon a ReferenceIcon instance
- * @param referencedIconStack The stack of reference icon names which have
- * already been visited. Used to detect circular dependencies.
- * @return icon which is resolved. i.e., it is not a ReferenceIcon.
- */
- private Icon _resolveReferenceIcon(
- ReferenceIcon refIcon,
- Stack<String> referencedIconStack)
- {
- String refName = refIcon.getName();
-
- // make sure we don't have a circular dependency
- if ( _stackContains(referencedIconStack, refName))
- {
- if (_LOG.isWarning())
- _LOG.warning("CANNOT_GET_SKIN_FROM_SKINFACTORY", refName);
- return null;
- }
-
- if (referencedIconStack == null)
- {
- referencedIconStack = new Stack<String>();
- }
-
- referencedIconStack.push(refName);
-
- Icon icon = getIcon(refName, false);
-
- if ((icon instanceof ReferenceIcon) && (icon != null))
- {
-
- return _resolveReferenceIcon((ReferenceIcon)icon,
- referencedIconStack);
-
- }
-
- return icon;
- }
-
- // Tests whether the value is present in the (possibly null) stack.
- private static boolean _stackContains(Stack<String> stack, Object value)
- {
- if (stack == null)
- return false;
-
- return stack.contains(value);
- }
// Checks to see whether any of our style sheets have been updated
private boolean _checkStylesModified(
Modified: myfaces/trinidad/trunk_1.2.x/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/SkinUtils.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk_1.2.x/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/SkinUtils.java?rev=638058&r1=638057&r2=638058&view=diff
==============================================================================
--- myfaces/trinidad/trunk_1.2.x/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/SkinUtils.java (original)
+++ myfaces/trinidad/trunk_1.2.x/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/SkinUtils.java Mon Mar 17 13:36:53 2008
@@ -31,6 +31,8 @@
import java.util.Iterator;
import java.util.List;
+import java.util.Stack;
+
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
@@ -42,6 +44,7 @@
import org.apache.myfaces.trinidad.logging.TrinidadLogger;
+import org.apache.myfaces.trinidad.skin.Icon;
import org.apache.myfaces.trinidad.skin.Skin;
import org.apache.myfaces.trinidad.skin.SkinAddition;
import org.apache.myfaces.trinidadinternal.config.LazyValueExpression;
@@ -64,6 +67,7 @@
import org.apache.myfaces.trinidadinternal.share.xml.XMLProvider;
import org.apache.myfaces.trinidadinternal.share.xml.XMLUtils;
+import org.apache.myfaces.trinidadinternal.skin.icon.ReferenceIcon;
import org.apache.myfaces.trinidadinternal.skin.parse.XMLConstants;
import org.apache.myfaces.trinidadinternal.skin.parse.SkinAdditionNode;
import org.apache.myfaces.trinidadinternal.skin.parse.SkinNode;
@@ -124,6 +128,65 @@
_registerSkinExtensionsAndAdditions(context, skinFactory);
+ }
+
+ /**
+ * Returns the actual Icon referenced by the ReferenceIcon.
+ * @param skin the Skin to use when resolving the ReferenceIcon
+ * @param refIcon a ReferenceIcon instance
+ * @return icon which is resolved. i.e., it is not a ReferenceIcon.
+ */
+ static public Icon resolveReferenceIcon(
+ Skin skin,
+ ReferenceIcon refIcon)
+ {
+ return _resolveReferenceIcon(skin, refIcon, null);
+ }
+
+ /**
+ * Helper for resolveReferenceIcon which uses a Stack of icon names
+ * to detect circular dependencies.
+ *
+ * @param skin the Skin to use when resolving the ReferenceIcon
+ * @param refIcon a ReferenceIcon instance
+ * @param referencedIconStack The stack of reference icon names which have
+ * already been visited. Used to detect circular dependencies.
+ * @return icon which is resolved. i.e., it is not a ReferenceIcon.
+ */
+ static private Icon _resolveReferenceIcon(
+ Skin skin,
+ ReferenceIcon refIcon,
+ Stack<String> referencedIconStack)
+ {
+ String refName = refIcon.getName();
+
+ // make sure we don't have a circular dependency
+ if ((referencedIconStack != null) && referencedIconStack.contains(refName))
+ {
+ if (_LOG.isWarning())
+ _LOG.warning("SKIN_CIRCULAR_INCLUDE_ERROR", refName);
+ return null;
+ }
+
+ if (referencedIconStack == null)
+ {
+ referencedIconStack = new Stack<String>();
+ }
+
+ referencedIconStack.push(refName);
+
+ Icon icon = skin.getIcon(refName, false);
+
+ if ((icon instanceof ReferenceIcon) && (icon != null))
+ {
+
+ return _resolveReferenceIcon(skin,
+ (ReferenceIcon)icon,
+ referencedIconStack);
+
+ }
+
+ return icon;
}
/**