You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by jd...@apache.org on 2011/01/15 12:39:04 UTC

svn commit: r1059304 - in /wicket/trunk: wicket-core/src/main/java/org/apache/wicket/request/mapper/ wicket-core/src/main/java/org/apache/wicket/request/resource/ wicket-core/src/main/java/org/apache/wicket/util/file/ wicket-core/src/main/java/org/apac...

Author: jdonnerstag
Date: Sat Jan 15 11:39:04 2011
New Revision: 1059304

URL: http://svn.apache.org/viewvc?rev=1059304&view=rev
Log:
applied: Use "META-INF/resources" (when available: servlet 3.0) to serve static resources
Issue: WICKET-3303

Added:
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/MetaInfStaticResourceReference.java
Modified:
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/BasicResourceReferenceMapper.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/file/WebApplicationPath.java
    wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ResourceStreamLocator.java
    wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/BasicResourceReferenceMapper.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/BasicResourceReferenceMapper.java?rev=1059304&r1=1059303&r2=1059304&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/BasicResourceReferenceMapper.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/BasicResourceReferenceMapper.java Sat Jan 15 11:39:04 2011
@@ -30,6 +30,7 @@ import org.apache.wicket.request.cycle.R
 import org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler;
 import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.resource.MetaInfStaticResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.util.IProvider;
 import org.apache.wicket.util.lang.Args;
@@ -56,8 +57,7 @@ import org.apache.wicket.util.time.Time;
 class BasicResourceReferenceMapper extends AbstractResourceReferenceMapper
 {
 	/** timestamp cache stored in request cycle meta data */
-	protected static final MetaDataKey<Map<ResourceReference, Time>> TIMESTAMP_KEY =
-		new MetaDataKey<Map<ResourceReference, Time>>()
+	protected static final MetaDataKey<Map<ResourceReference, Time>> TIMESTAMP_KEY = new MetaDataKey<Map<ResourceReference, Time>>()
 	{
 		private static final long serialVersionUID = 1L;
 	};
@@ -195,7 +195,20 @@ class BasicResourceReferenceMapper exten
 			ResourceReferenceRequestHandler referenceRequestHandler = (ResourceReferenceRequestHandler)requestHandler;
 			ResourceReference reference = referenceRequestHandler.getResourceReference();
 
-			Url url = new Url();
+			Url url;
+
+			if (reference instanceof MetaInfStaticResourceReference)
+			{
+				url = ((MetaInfStaticResourceReference)reference).mapHandler(referenceRequestHandler);
+				// if running on Servlet 3.0 engine url is not null
+				if (url != null)
+				{
+					return url;
+				}
+				// otherwise it has to be served by the standard wicket way
+			}
+
+			url = new Url();
 
 			List<String> segments = url.getSegments();
 			segments.add(getContext().getNamespace());

Added: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/MetaInfStaticResourceReference.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/MetaInfStaticResourceReference.java?rev=1059304&view=auto
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/MetaInfStaticResourceReference.java (added)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/MetaInfStaticResourceReference.java Sat Jan 15 11:39:04 2011
@@ -0,0 +1,105 @@
+/*
+ * 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.wicket.request.resource;
+
+import java.util.List;
+
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.util.lang.Packages;
+
+/**
+ * Resource reference for static files. The resource must reside under the "/META-INF/resources/"
+ * directory. So if you have a foo.bar.Component and want to have a static icon.gif belonging to it
+ * the image must be available on the "META-INF/resources/foo/bar/icon.gif" classpath inside a jar
+ * file.
+ * 
+ * If run under a Servlet 3.0 environment "foo/bar/icon.gif" like resource urls will be made and
+ * served by the servlet container instead of wicket (which is faster).
+ * 
+ * If run under a non Servlet 3.0 environment (like 2.5) resources will be served by wicket (urls
+ * will look like "wicket/resource/foo/bar/icon.gif").
+ * 
+ * @author akiraly
+ */
+public class MetaInfStaticResourceReference extends PackageResourceReference
+{
+	private static final long serialVersionUID = -1858339228780709471L;
+
+	private static Boolean META_INF_RESOURCES_SUPPORTED = null;
+
+	/**
+	 * Construct.
+	 * 
+	 * @param scope
+	 *            mandatory parameter
+	 * @param name
+	 *            mandatory parameter
+	 */
+	public MetaInfStaticResourceReference(Class<?> scope, String name)
+	{
+		super(scope, name);
+	}
+
+	/**
+	 * Returns the {@link Url} for given {@link IRequestHandler} if "/META-INF/resources" Servlet
+	 * 3.0 feature is supported or <code>null</code> if not (so standard url mapping can take
+	 * place).
+	 * 
+	 * @param requestHandler
+	 *            mandatory parameter
+	 * @return Url instance or <code>null</code>.
+	 */
+	public Url mapHandler(IRequestHandler requestHandler)
+	{
+		if (!isMetaInfResourcesSupported())
+		{
+			return null;
+		}
+
+		Url url = new Url();
+
+		List<String> segments = url.getSegments();
+
+		String[] parts = Packages.extractPackageName(getScope()).split("\\.");
+		for (String p : parts)
+		{
+			segments.add(p);
+		}
+
+		parts = getName().split("/");
+		for (String p : parts)
+		{
+			segments.add(p);
+		}
+
+		return url;
+	}
+
+	protected boolean isMetaInfResourcesSupported()
+	{
+		if (META_INF_RESOURCES_SUPPORTED == null)
+		{
+			int majorVersion = WebApplication.get().getServletContext().getMajorVersion();
+			META_INF_RESOURCES_SUPPORTED = majorVersion >= 3;
+		}
+
+		return META_INF_RESOURCES_SUPPORTED.booleanValue();
+	}
+
+}

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/file/WebApplicationPath.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/file/WebApplicationPath.java?rev=1059304&r1=1059303&r2=1059304&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/file/WebApplicationPath.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/file/WebApplicationPath.java Sat Jan 15 11:39:04 2011
@@ -58,6 +58,9 @@ public final class WebApplicationPath im
 	public WebApplicationPath(final ServletContext servletContext)
 	{
 		this.servletContext = servletContext;
+
+		// adding root so servlet context resources are always checked
+		webappPaths.add("/");
 	}
 
 	/**

Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ResourceStreamLocator.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ResourceStreamLocator.java?rev=1059304&r1=1059303&r2=1059304&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ResourceStreamLocator.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ResourceStreamLocator.java Sat Jan 15 11:39:04 2011
@@ -201,7 +201,13 @@ public class ResourceStreamLocator imple
 		}
 
 		// Try loading path using classloader
-		final URL url = classLoader.getResource(path);
+		URL url = classLoader.getResource(path);
+		if (url == null)
+		{
+			// maybe it is in the Servlet 3.0 like directory
+			url = classLoader.getResource("META-INF/resources/" + path);
+		}
+
 		if (url != null)
 		{
 			return new UrlResourceStream(url);

Modified: wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java?rev=1059304&r1=1059303&r2=1059304&view=diff
==============================================================================
--- wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java (original)
+++ wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java Sat Jan 15 11:39:04 2011
@@ -94,13 +94,6 @@ public class UploadProgressBar extends P
 
 	private final FileUploadField uploadField;
 
-	@Override
-	protected void onInitialize()
-	{
-		super.onInitialize();
-		form.getRootForm().setOutputMarkupId(true);
-	}
-
 	/**
 	 * Constructor that will display the upload progress bar for every submit of the given form.
 	 * 
@@ -155,6 +148,16 @@ public class UploadProgressBar extends P
 	}
 
 	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	protected void onInitialize()
+	{
+		super.onInitialize();
+		form.getRootForm().setOutputMarkupId(true);
+	}
+
+	/**
 	 * Override this to provide your own CSS, or return null to avoid including the default.
 	 * 
 	 * @return ResourceReference for your CSS.
@@ -164,6 +167,9 @@ public class UploadProgressBar extends P
 		return CSS;
 	}
 
+	/**
+	 * {@inheritDoc}
+	 */
 	@Override
 	public void renderHead(IHeaderResponse response)
 	{
@@ -201,6 +207,5 @@ public class UploadProgressBar extends P
 		js.close();
 
 		response.renderOnDomReadyJavaScript(new String(out.toByteArray()));
-
 	}
 }