You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2012/02/23 15:48:35 UTC
git commit: WICKET-4145 Improve AutoLinkResolver
Updated Branches:
refs/heads/master d97cee38b -> f6b22863c
WICKET-4145 Improve AutoLinkResolver
Revert my fix and apply Andrea's patch because it is more efficient.
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/f6b22863
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/f6b22863
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/f6b22863
Branch: refs/heads/master
Commit: f6b22863c1743eec85ec642b16ccbdca1b3c9477
Parents: d97cee3
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Feb 23 15:47:27 2012 +0100
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Thu Feb 23 15:47:27 2012 +0100
----------------------------------------------------------------------
.../wicket/markup/resolver/AutoLinkResolver.java | 129 ++++++++------
1 files changed, 74 insertions(+), 55 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/wicket/blob/f6b22863/wicket-core/src/main/java/org/apache/wicket/markup/resolver/AutoLinkResolver.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/resolver/AutoLinkResolver.java b/wicket-core/src/main/java/org/apache/wicket/markup/resolver/AutoLinkResolver.java
index a6814b7..bf3f073 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/resolver/AutoLinkResolver.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/resolver/AutoLinkResolver.java
@@ -74,9 +74,7 @@ public final class AutoLinkResolver implements IComponentResolver
{
/**
* Creates a new auto component that references a package resource.
- *
- * @param container
- * the parent container
+ *
* @param autoId
* the automatically generated id for the auto component
* @param pathInfo
@@ -86,9 +84,11 @@ public final class AutoLinkResolver implements IComponentResolver
* @return a new auto component or null if the path was absolute
*/
protected final Component newPackageResourceReferenceAutoComponent(
- final MarkupContainer container, final String autoId, final PathInfo pathInfo,
+ final String autoId, final PathInfo pathInfo,
final String attribute)
{
+ final MarkupContainer container = pathInfo.getContainer();
+
if (!pathInfo.absolute && (pathInfo.path != null) && (pathInfo.path.length() > 0))
{
// Href is relative. Create a resource reference pointing at this file
@@ -98,7 +98,7 @@ public final class AutoLinkResolver implements IComponentResolver
// header has been added to (e.g. the Page). What we need
// however, is the component (e.g. a Panel) which
// contributed it.
- MarkupStream markupStream = new MarkupStream(container.getMarkup());
+ MarkupStream markupStream = pathInfo.getMarkupStream();
Class<? extends Component> clazz = markupStream.getContainerClass();
// However if the markup stream is a merged markup stream (inheritance), than we
@@ -208,8 +208,6 @@ public final class AutoLinkResolver implements IComponentResolver
* the autoId assigned as it's id. Should return null in case the component could not be
* created as expected and the default resolving should take place.
*
- * @param container
- * the parent container
* @param autoId
* the automatically generated id for the auto component
* @param pathInfo
@@ -217,8 +215,7 @@ public final class AutoLinkResolver implements IComponentResolver
* @return a new auto component or null in case this method couldn't resolve to a proper
* auto component
*/
- Component newAutoComponent(final MarkupContainer container, final String autoId,
- final PathInfo pathInfo);
+ Component newAutoComponent(final String autoId, final PathInfo pathInfo);
}
/**
@@ -246,15 +243,23 @@ public final class AutoLinkResolver implements IComponentResolver
/** The original reference (e.g the full value of a href attribute). */
private final String reference;
+ /** The container for this path */
+ private final MarkupContainer container;
+
+ /** Parent markup stream */
+ private final MarkupStream markupStream;
+
/**
* Construct.
*
* @param reference
* the original reference (e.g the full value of a href attribute)
*/
- public PathInfo(final String reference)
+ public PathInfo(final String reference, MarkupContainer container, MarkupStream markupStream)
{
this.reference = reference;
+ this.container = container;
+ this.markupStream = markupStream;
// If href contains URL query parameters ..
String infoPath;
// get the query string
@@ -369,6 +374,26 @@ public final class AutoLinkResolver implements IComponentResolver
{
return absolute;
}
+
+ /**
+ * Gets container.
+ *
+ * @return container
+ */
+ public MarkupContainer getContainer()
+ {
+ return container;
+ }
+
+ /**
+ * Gets markup stream
+ *
+ * @return markup stream
+ */
+ public MarkupStream getMarkupStream()
+ {
+ return markupStream;
+ }
}
/**
@@ -399,21 +424,21 @@ public final class AutoLinkResolver implements IComponentResolver
}
/**
- * @see org.apache.wicket.markup.resolver.AutoLinkResolver.IAutolinkResolverDelegate#newAutoComponent(org.apache.wicket.MarkupContainer,
- * java.lang.String, org.apache.wicket.markup.resolver.AutoLinkResolver.PathInfo)
+ * @see org.apache.wicket.markup.resolver.AutoLinkResolver.IAutolinkResolverDelegate#newAutoComponent(java.lang.String,
+ * org.apache.wicket.markup.resolver.AutoLinkResolver.PathInfo)
*/
@Override
@SuppressWarnings("unchecked")
- public Component newAutoComponent(final MarkupContainer container, final String autoId,
- PathInfo pathInfo)
+ public Component newAutoComponent(final String autoId, PathInfo pathInfo)
{
+ final MarkupContainer container = pathInfo.getContainer();
+
if ((pathInfo.extension != null) &&
supportedPageExtensions.contains(pathInfo.extension))
{
// Obviously a href like href="myPkg.MyLabel.html" will do as
// well. Wicket will not throw an exception. It accepts it.
-
Page page = container.getPage();
final IClassResolver defaultClassResolver = page.getApplication()
.getApplicationSettings()
@@ -482,8 +507,7 @@ public final class AutoLinkResolver implements IComponentResolver
{
// not a registered type for bookmarkable pages; create a link
// to a resource instead
- return newPackageResourceReferenceAutoComponent(container, autoId, pathInfo,
- attribute);
+ return newPackageResourceReferenceAutoComponent(autoId, pathInfo, attribute);
}
// fallthrough
@@ -576,24 +600,19 @@ public final class AutoLinkResolver implements IComponentResolver
this.parent = parent;
this.attribute = attribute;
- ResourceReference reference = null;
// Check whether it is a valid resource reference
- Class<?> cursor = clazz;
- // iterate all parents because the auto linked resource may come from
- // inherited markup
- while (cursor != null && cursor != Object.class)
+ if (PackageResource.exists(clazz, href, getLocale(), getStyle(), getVariation()))
{
- if (PackageResource.exists(cursor, href, getLocale(), getStyle(), getVariation()))
+ // Create the component implementing the link
+ resourceReference = new PackageResourceReference(clazz, href, getLocale(),
+ getStyle(), getVariation());
+ }
+ else
{
- // Create the component implementing the link
- reference = new PackageResourceReference(cursor, href, getLocale(), getStyle(),
- getVariation());
- break;
+ // The resource does not exist. Set to null and ignore when
+ // rendering.
+ resourceReference = null;
}
- cursor = cursor.getSuperclass();
-
- }
- resourceReference = reference;
}
/**
@@ -670,14 +689,13 @@ public final class AutoLinkResolver implements IComponentResolver
}
/**
- * @see org.apache.wicket.markup.resolver.AutoLinkResolver.IAutolinkResolverDelegate#newAutoComponent(org.apache.wicket.MarkupContainer,
- * java.lang.String, org.apache.wicket.markup.resolver.AutoLinkResolver.PathInfo)
+ * @see org.apache.wicket.markup.resolver.AutoLinkResolver.IAutolinkResolverDelegate#newAutoComponent(java.lang.String,
+ * org.apache.wicket.markup.resolver.AutoLinkResolver.PathInfo)
*/
@Override
- public Component newAutoComponent(final MarkupContainer container, final String autoId,
- final PathInfo pathInfo)
+ public Component newAutoComponent(final String autoId, final PathInfo pathInfo)
{
- return newPackageResourceReferenceAutoComponent(container, autoId, pathInfo, attribute);
+ return newPackageResourceReferenceAutoComponent(autoId, pathInfo, attribute);
}
}
@@ -809,10 +827,25 @@ public final class AutoLinkResolver implements IComponentResolver
// Must be marked as autolink tag
if (tag.isAutolinkEnabled())
{
+ // get the reference resolver
+ ITagReferenceResolver referenceResolver = tagNameToTagReferenceResolvers.get(tag.getName());
+ if (referenceResolver == null)
+ {
+ // fallback on default
+ referenceResolver = DEFAULT_ATTRIBUTE_RESOLVER;
+ }
+
+ // get the reference, which is typically the value of e.g. a href or src
+ // attribute
+ String reference = referenceResolver.getReference(tag);
+
+ // create the path info object
+ PathInfo pathInfo = new PathInfo(reference, container, markupStream);
+
// Try to find the Page matching the href
// Note: to not use tag.getId() because it will be modified while
// resolving the link and hence the 2nd render will fail.
- Component link = resolveAutomaticLink(container, WicketLinkTagHandler.AUTOLINK_ID, tag);
+ Component link = resolveAutomaticLink(pathInfo, WicketLinkTagHandler.AUTOLINK_ID, tag);
if (log.isDebugEnabled())
{
@@ -834,7 +867,7 @@ public final class AutoLinkResolver implements IComponentResolver
* <p>
* None html references are treated similar.
*
- * @param container
+ * @param pathInfo
* The container where the link is
* @param id
* the name of the component
@@ -842,9 +875,10 @@ public final class AutoLinkResolver implements IComponentResolver
* the component tag
* @return A BookmarkablePageLink<?> to handle the href
*/
- private final Component resolveAutomaticLink(final MarkupContainer container, final String id,
+ private final Component resolveAutomaticLink(final PathInfo pathInfo, final String id,
final ComponentTag tag)
{
+ final MarkupContainer container = pathInfo.getContainer();
final Page page = container.getPage();
// Make the id (page-)unique
@@ -859,28 +893,13 @@ public final class AutoLinkResolver implements IComponentResolver
{
tag.setAutoComponentTag(true);
}
- // tag.setId(autoId);
-
- // get the reference resolver
- ITagReferenceResolver referenceResolver = tagNameToTagReferenceResolvers.get(tagName);
- if (referenceResolver == null)
- {
- // fallback on default
- referenceResolver = DEFAULT_ATTRIBUTE_RESOLVER;
- }
-
- // get the reference, which is typically the value of e.g. a href or src
- // attribute
- String reference = referenceResolver.getReference(tag);
- // create the path info object
- PathInfo pathInfo = new PathInfo(reference);
// now get the resolver delegate
IAutolinkResolverDelegate autolinkResolverDelegate = tagNameToAutolinkResolverDelegates.get(tagName);
Component autoComponent = null;
if (autolinkResolverDelegate != null)
{
- autoComponent = autolinkResolverDelegate.newAutoComponent(container, autoId, pathInfo);
+ autoComponent = autolinkResolverDelegate.newAutoComponent(autoId, pathInfo);
}
if (autoComponent == null)