You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by kn...@apache.org on 2010/01/08 22:48:56 UTC

svn commit: r897330 [3/3] - in /wicket/trunk: wicket-auth-roles/src/main/java/org/apache/wicket/authentication/ wicket-examples/src/main/java/org/apache/wicket/examples/ wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/ wicket-exam...

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/LabelIconPanel.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/LabelIconPanel.java?rev=897330&r1=897329&r2=897330&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/LabelIconPanel.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/LabelIconPanel.java Fri Jan  8 21:48:50 2010
@@ -19,11 +19,11 @@
 import javax.swing.tree.TreeModel;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.ResourceReference;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.image.Image;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.ng.resource.ResourceReference;
 
 /**
  * Simple panel that contains an icon next to a label.

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/AutoLinkResolver.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/AutoLinkResolver.java?rev=897330&r1=897329&r2=897330&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/AutoLinkResolver.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/resolver/AutoLinkResolver.java Fri Jan  8 21:48:50 2010
@@ -24,16 +24,17 @@
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.Page;
-import org.apache.wicket.ResourceReference;
 import org.apache.wicket.application.IClassResolver;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.MarkupStream;
-import org.apache.wicket.markup.html.PackageResource;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.html.link.ExternalLink;
 import org.apache.wicket.markup.parser.filter.WicketLinkTagHandler;
 import org.apache.wicket.ng.request.component.PageParameters;
+import org.apache.wicket.ng.request.handler.resource.ResourceReferenceRequestHandler;
+import org.apache.wicket.ng.resource.PackageResource;
+import org.apache.wicket.ng.resource.ResourceReference;
 import org.apache.wicket.protocol.http.RequestUtils;
 import org.apache.wicket.util.lang.Packages;
 import org.apache.wicket.util.string.Strings;
@@ -594,7 +595,10 @@
 			if (resourceReference != null)
 			{
 				// Set href to link to this link's linkClicked method
-				CharSequence url = getRequestCycle().urlFor(resourceReference);
+
+				ResourceReferenceRequestHandler handler = new ResourceReferenceRequestHandler(
+					resourceReference);
+				CharSequence url = getRequestCycle().renderUrlFor(handler);
 
 				// generate the href attribute
 				tag.put(attribute, Strings.replaceAll(url, "&", "&"));

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java?rev=897330&r1=897329&r2=897330&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java Fri Jan  8 21:48:50 2010
@@ -16,6 +16,7 @@
  */
 package org.apache.wicket.ng.mock;
 
+import org.apache.wicket.Page;
 import org.apache.wicket.ng.request.component.IRequestablePage;
 import org.apache.wicket.ng.request.cycle.RequestCycle;
 import org.apache.wicket.ng.request.cycle.RequestCycleContext;
@@ -35,7 +36,7 @@
 	}
 
 	@Override
-	public Class<? extends IRequestablePage> getHomePage()
+	public Class<? extends Page> getHomePage()
 	{
 		return null;
 	}

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycle.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycle.java?rev=897330&r1=897329&r2=897330&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycle.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycle.java Fri Jan  8 21:48:50 2010
@@ -456,4 +456,9 @@
 	{
 		return new WebClientInfo(this);
 	}
+
+	public ClientInfo getClientInfo()
+	{
+		return newClientInfo();
+	}
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/resource/ResourceRequestHandler.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/resource/ResourceRequestHandler.java?rev=897330&r1=897329&r2=897330&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/resource/ResourceRequestHandler.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/resource/ResourceRequestHandler.java Fri Jan  8 21:48:50 2010
@@ -104,7 +104,7 @@
 	public void respond(final RequestCycle requestCycle)
 	{
 		IResource.Attributes a = new IResource.Attributes(requestCycle.getRequest(),
-			requestCycle.getResponse(), locale, style, variation, pageParameters);
+			requestCycle.getResponse(), pageParameters);
 		resource.respond(a);
 	}
 

Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/HomePageMapper.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/HomePageMapper.java?rev=897330&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/HomePageMapper.java (added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/HomePageMapper.java Fri Jan  8 21:48:50 2010
@@ -0,0 +1,56 @@
+/*
+ * 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.ng.request.mapper;
+
+import org.apache.wicket.IRequestHandler;
+import org.apache.wicket.Request;
+import org.apache.wicket.ng.request.Url;
+import org.apache.wicket.ng.request.handler.DefaultPageProvider;
+import org.apache.wicket.ng.request.handler.impl.RenderPageRequestHandler;
+
+public class HomePageMapper extends AbstractMapper
+{
+
+	public HomePageMapper()
+	{
+	}
+
+	public int getCompatibilityScore(Request request)
+	{
+		return 0;
+	}
+
+	public Url mapHandler(IRequestHandler requestHandler)
+	{
+		return null;
+	}
+
+	public IRequestHandler mapRequest(Request request)
+	{
+		if (request.getUrl().getSegments().size() == 0 &&
+			request.getUrl().getQueryParameters().size() == 0)
+		{
+			return new RenderPageRequestHandler(new DefaultPageProvider(
+				getContext().getHomePageClass()));
+		}
+		else
+		{
+			return null;
+		}
+	}
+
+}

Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/HomePageMapper.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/SystemMapper.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/SystemMapper.java?rev=897330&r1=897329&r2=897330&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/SystemMapper.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/SystemMapper.java Fri Jan  8 21:48:50 2010
@@ -30,6 +30,7 @@
 	 */
 	public SystemMapper()
 	{
+		register(new HomePageMapper());
 		register(new PageInstanceMapper());
 		register(new BookmarkableMapper());
 		register(new ResourceReferenceMapper());

Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ClassScanner.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ClassScanner.java?rev=897330&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ClassScanner.java (added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ClassScanner.java Fri Jan  8 21:48:50 2010
@@ -0,0 +1,68 @@
+/*
+ * 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.ng.resource;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+abstract class ClassScanner
+{
+	private Set<String> scannedClasses;
+
+	abstract void foundResourceReference(ResourceReference reference);
+
+	public void scanClass(Class<?> klass)
+	{
+		String className = klass.getName();
+		if (scannedClasses.contains(className) == false)
+		{
+			scannedClasses.add(className);
+
+			for (Field f : klass.getDeclaredFields())
+			{
+				if ((f.getModifiers() & Modifier.STATIC) == Modifier.STATIC)
+				{
+					f.setAccessible(true);
+					try
+					{
+						Object value = f.get(null);
+						if (value instanceof ResourceReference)
+						{
+							foundResourceReference((ResourceReference)value);
+						}
+					}
+					catch (Exception e)
+					{
+						log.warn("Error accessing object property", e);
+					}
+				}
+			}
+
+			klass = klass.getSuperclass();
+			if (klass != null)
+			{
+				scanClass(klass);
+			}
+		}
+	}
+
+	private static Logger log = LoggerFactory.getLogger(ClassScanner.class);
+}

Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ClassScanner.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/CompressedResourceReference.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/CompressedResourceReference.java?rev=897330&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/CompressedResourceReference.java (added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/CompressedResourceReference.java Fri Jan  8 21:48:50 2010
@@ -0,0 +1,34 @@
+/*
+ * 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.ng.resource;
+
+import java.util.Locale;
+
+public class CompressedResourceReference extends ResourceReference
+{
+
+	public CompressedResourceReference(Class<?> scope, String name, Locale locale, String style,
+		String variation)
+	{
+		super(scope, name, locale, style, variation);
+	}
+
+	public CompressedResourceReference(Class<?> scope, String name)
+	{
+		super(scope, name);
+	}
+}

Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/CompressedResourceReference.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/IResource.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/IResource.java?rev=897330&r1=897329&r2=897330&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/IResource.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/IResource.java Fri Jan  8 21:48:50 2010
@@ -17,7 +17,6 @@
 package org.apache.wicket.ng.resource;
 
 import java.io.Serializable;
-import java.util.Locale;
 
 import org.apache.wicket.Request;
 import org.apache.wicket.Response;
@@ -42,9 +41,6 @@
 	{
 		private final Request request;
 		private final Response response;
-		private final Locale locale;
-		private final String style;
-		private final String variation;
 		private final PageParameters parameters;
 
 		/**
@@ -53,22 +49,15 @@
 		 * @param request
 		 * 
 		 * @param response
-		 * @param locale
-		 * @param style
-		 * @param variation
 		 * @param parameters
 		 */
-		public Attributes(Request request, Response response, Locale locale, String style,
-			String variation, PageParameters parameters)
+		public Attributes(Request request, Response response, PageParameters parameters)
 		{
 			Checks.argumentNotNull(request, "request");
 			Checks.argumentNotNull(response, "response");
 
 			this.request = request;
 			this.response = response;
-			this.locale = locale;
-			this.style = style;
-			this.variation = variation;
 			this.parameters = parameters;
 		}
 
@@ -80,7 +69,7 @@
 		 */
 		public Attributes(Request request, Response response)
 		{
-			this(request, response, null, null, null, null);
+			this(request, response, null);
 		}
 
 		/**
@@ -104,36 +93,6 @@
 		}
 
 		/**
-		 * Returns requested locale. The locale is never null.
-		 * 
-		 * @return locale
-		 */
-		public Locale getLocale()
-		{
-			return locale != null ? locale : request.getLocale();
-		}
-
-		/**
-		 * If specified returns requested style. The style is optional.
-		 * 
-		 * @return style or <code>null</code>
-		 */
-		public String getStyle()
-		{
-			return style;
-		}
-
-		/**
-		 * If specified returns requested variation. The variation is optional.
-		 * 
-		 * @return variation or <code>null</code>
-		 */
-		public String getVariation()
-		{
-			return variation;
-		}
-
-		/**
 		 * Returns additional parameters extracted from the request. If resource is created mounted
 		 * {@link ResourceReference}, this method returns all (indexed and query) parameters after
 		 * the mount path. For non mounted {@link ResourceReference}s this method will only return

Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/JavascriptResourceReference.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/JavascriptResourceReference.java?rev=897330&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/JavascriptResourceReference.java (added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/JavascriptResourceReference.java Fri Jan  8 21:48:50 2010
@@ -0,0 +1,35 @@
+/*
+ * 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.ng.resource;
+
+import java.util.Locale;
+
+public class JavascriptResourceReference extends ResourceReference
+{
+
+	public JavascriptResourceReference(Class<?> scope, String name, Locale locale, String style,
+		String variation)
+	{
+		super(scope, name, locale, style, variation);
+	}
+
+	public JavascriptResourceReference(Class<?> scope, String name)
+	{
+		super(scope, name);
+	}
+
+}

Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/JavascriptResourceReference.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/PackageResource.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/PackageResource.java?rev=897330&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/PackageResource.java (added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/PackageResource.java Fri Jan  8 21:48:50 2010
@@ -0,0 +1,196 @@
+/*
+ * 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.ng.resource;
+
+import java.util.Locale;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.wicket.Application;
+import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.markup.html.IPackageResourceGuard;
+import org.apache.wicket.ng.request.cycle.RequestCycle;
+import org.apache.wicket.protocol.http.WebResponse;
+import org.apache.wicket.protocol.http.request.WebErrorCodeResponseHandler;
+import org.apache.wicket.request.target.basic.AbortRequestHandler;
+import org.apache.wicket.util.lang.Classes;
+import org.apache.wicket.util.lang.Packages;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PackageResource implements IResource
+{
+	/**
+	 * Exception thrown when the creation of a package resource is not allowed.
+	 */
+	public static final class PackageResourceBlockedException extends WicketRuntimeException
+	{
+		private static final long serialVersionUID = 1L;
+
+		/**
+		 * Construct.
+		 * 
+		 * @param message
+		 */
+		public PackageResourceBlockedException(String message)
+		{
+			super(message);
+		}
+	}
+
+	private static final long serialVersionUID = 1L;
+
+	/** The path to the resource */
+	private final String absolutePath;
+
+	/** The resource's locale */
+	private final Locale locale;
+
+	/** The path this resource was created with. */
+	private final String path;
+
+	/** The scoping class, used for class loading and to determine the package. */
+	private final String scopeName;
+
+	/** The resource's style */
+	private final String style;
+
+	/** The component's variation (of the style) */
+	private final String variation;
+
+	/**
+	 * Hidden constructor.
+	 * 
+	 * @param scope
+	 *            This argument will be used to get the class loader for loading the package
+	 *            resource, and to determine what package it is in
+	 * @param name
+	 *            The re;atove path to the resource
+	 * @param locale
+	 *            The locale of the resource
+	 * @param style
+	 *            The style of the resource
+	 * @param variation
+	 *            The component's variation (of the style)
+	 */
+	protected PackageResource(final Class<?> scope, final String name, final Locale locale,
+		final String style, final String variation)
+	{
+		// Convert resource path to absolute path relative to base package
+		absolutePath = Packages.absolutePath(scope, name);
+
+		if (!accept(scope, name))
+		{
+			throw new PackageResourceBlockedException(
+				"Access denied to (static) package resource " + absolutePath +
+					". See IPackageResourceGuard");
+		}
+
+		scopeName = scope.getName();
+		path = name;
+		this.locale = locale;
+		this.style = style;
+		this.variation = variation;
+	}
+
+	/**
+	 * Gets the scoping class, used for class loading and to determine the package.
+	 * 
+	 * @return the scoping class
+	 */
+	public final Class<?> getScope()
+	{
+		return Classes.resolveClass(scopeName);
+	}
+
+	/**
+	 * Gets the style.
+	 * 
+	 * @return the style
+	 */
+	public final String getStyle()
+	{
+		return style;
+	}
+
+
+	public void respond(Attributes attributes)
+	{
+		// Locate resource
+		IResourceStream resourceStream = Application.get()
+			.getResourceSettings()
+			.getResourceStreamLocator()
+			.locate(getScope(), absolutePath, style, variation, locale, null);
+
+		if (resourceStream == null)
+		{
+			String msg = "Unable to find package resource [path = " + absolutePath + ", style = " +
+				style + ", variation = " + variation + ", locale = " + locale + "]";
+			log.warn(msg);
+
+			if (RequestCycle.get().getResponse() instanceof WebResponse)
+			{
+				RequestCycle.get().replaceAllRequestHandlers(
+					new WebErrorCodeResponseHandler(HttpServletResponse.SC_NOT_FOUND, msg));
+			}
+			else
+			{
+				RequestCycle.get().replaceAllRequestHandlers(new AbortRequestHandler());
+			}
+		}
+
+		new ResourceStreamResource(resourceStream).respond(attributes);
+	}
+
+	private boolean accept(Class<?> scope, String path)
+	{
+		IPackageResourceGuard guard = Application.get()
+			.getResourceSettings()
+			.getPackageResourceGuard();
+
+		return guard.accept(scope, path);
+	}
+
+	private static final Logger log = LoggerFactory.getLogger(PackageResource.class);
+
+	/**
+	 * Gets whether a resource for a given set of criteria exists.
+	 * 
+	 * @param scope
+	 *            This argument will be used to get the class loader for loading the package
+	 *            resource, and to determine what package it is in. Typically this is the class in
+	 *            which you call this method
+	 * @param path
+	 *            The path to the resource
+	 * @param locale
+	 *            The locale of the resource
+	 * @param style
+	 *            The style of the resource (see {@link org.apache.wicket.Session})
+	 * @param variation
+	 *            The component's variation (of the style)
+	 * @return true if a resource could be loaded, false otherwise
+	 */
+	public static boolean exists(final Class<?> scope, final String path, final Locale locale,
+		final String style, final String variation)
+	{
+		String absolutePath = Packages.absolutePath(scope, path);
+		return Application.get().getResourceSettings().getResourceStreamLocator().locate(scope,
+			absolutePath, style, variation, locale, null) != null;
+	}
+
+}

Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/PackageResource.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ResourceReference.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ResourceReference.java?rev=897330&r1=897329&r2=897330&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ResourceReference.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ResourceReference.java Fri Jan  8 21:48:50 2010
@@ -19,6 +19,7 @@
 import java.io.Serializable;
 import java.util.Locale;
 
+import org.apache.wicket.Application;
 import org.apache.wicket.util.lang.Checks;
 import org.apache.wicket.util.lang.Classes;
 import org.apache.wicket.util.lang.Objects;
@@ -34,7 +35,7 @@
  * 
  * @author Matej Knopp
  */
-public abstract class ResourceReference implements Serializable
+public class ResourceReference implements Serializable
 {
 	private static final long serialVersionUID = 1L;
 
@@ -69,6 +70,32 @@
 	}
 
 	/**
+	 * Creates new {@link ResourceReference} instance.
+	 * 
+	 * @param scope
+	 *            mandatory parameter
+	 * @param name
+	 *            mandatory parameter
+	 * @param locale
+	 * @param style
+	 * @param variation
+	 */
+	public ResourceReference(Class<?> scope, String name)
+	{
+		this(scope, name, null, null, null);
+	}
+
+	/**
+	 * Construct.
+	 * 
+	 * @param name
+	 */
+	public ResourceReference(String name)
+	{
+		this(Application.class, name, null, null, null);
+	}
+
+	/**
 	 * @return name
 	 */
 	public String getName()
@@ -144,5 +171,8 @@
 	 * 
 	 * @return new resource instance
 	 */
-	public abstract IResource getResource();
+	public IResource getResource()
+	{
+		return new PackageResource(getScope(), getName(), getLocale(), getStyle(), getVariation());
+	}
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ResourceReferenceRegistry.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ResourceReferenceRegistry.java?rev=897330&r1=897329&r2=897330&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ResourceReferenceRegistry.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ResourceReferenceRegistry.java Fri Jan  8 21:48:50 2010
@@ -174,6 +174,15 @@
 		}
 	}
 
+	private final ClassScanner scanner = new ClassScanner()
+	{
+		@Override
+		void foundResourceReference(ResourceReference reference)
+		{
+			registerResourceReference(reference);
+		}
+	};
+
 	/**
 	 * Looks up resource reference with specified attributes. If the reference is not found and
 	 * <code>strict</code> is set to <code>false</code>, result of
@@ -200,10 +209,15 @@
 	{
 		ResourceReference reference = getResourceReference(scope, name, locale, style, variation,
 			strict, false);
+
 		if (reference == null)
 		{
-			// TODO: Check the class static member for ResourceReferences and register those
+			scanner.scanClass(scope);
 		}
+
+		// try again, it might have been registered by scanner; create default one if necessary
+		reference = getResourceReference(scope, name, locale, style, variation, strict, true);
+
 		return reference;
 	}
 
@@ -219,7 +233,6 @@
 	protected ResourceReference createDefaultResourceReference(Class<?> scope, String name,
 		Locale locale, String style, String variation)
 	{
-		// override in superclass to e.g. return PackageResourceReference if there is one
-		return null;
+		return new ResourceReference(scope, name, locale, style, variation);
 	}
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ResourceStreamResource.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ResourceStreamResource.java?rev=897330&r1=897329&r2=897330&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ResourceStreamResource.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/ResourceStreamResource.java Fri Jan  8 21:48:50 2010
@@ -67,6 +67,8 @@
 	{
 		ResourceData data = new ResourceData();
 		data.setLastModified(stream.lastModifiedTime().toDate());
+
+		// performance check; don't bother to do anything if the resource is still cached by client
 		if (!data.notModified(attributes))
 		{
 			InputStream inputStream = null;

Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/DummyRequestLogger.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/DummyRequestLogger.java?rev=897330&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/DummyRequestLogger.java (added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/DummyRequestLogger.java Fri Jan  8 21:48:50 2010
@@ -0,0 +1,88 @@
+/*
+ * 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.protocol.http;
+
+import java.util.List;
+
+import org.apache.wicket.IRequestHandler;
+
+// TODO (NG) DO something useful here
+public class DummyRequestLogger implements IRequestLogger
+{
+
+	public DummyRequestLogger()
+	{
+	}
+
+	public int getCurrentActiveRequestCount()
+	{
+		return 0;
+	}
+
+	public SessionData[] getLiveSessions()
+	{
+		return null;
+	}
+
+	public int getPeakSessions()
+	{
+		return 0;
+	}
+
+	public List<RequestData> getRequests()
+	{
+		return null;
+	}
+
+	public int getTotalCreatedSessions()
+	{
+		return 0;
+	}
+
+	public void logEventTarget(IRequestHandler target)
+	{
+	}
+
+	public void logResponseTarget(IRequestHandler target)
+	{
+	}
+
+	public void objectCreated(Object value)
+	{
+	}
+
+	public void objectRemoved(Object value)
+	{
+	}
+
+	public void objectUpdated(Object value)
+	{
+	}
+
+	public void requestTime(long timeTaken)
+	{
+	}
+
+	public void sessionCreated(String id)
+	{
+	}
+
+	public void sessionDestroyed(String sessionId)
+	{
+	}
+
+}

Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/DummyRequestLogger.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/IRequestLogger.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/IRequestLogger.java?rev=897330&r1=897329&r2=897330&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/IRequestLogger.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/IRequestLogger.java Fri Jan  8 21:48:50 2010
@@ -16,12 +16,14 @@
  */
 package org.apache.wicket.protocol.http;
 
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
+import org.apache.wicket.IClusterable;
 import org.apache.wicket.IRequestHandler;
-import org.apache.wicket.protocol.http.RequestLogger.RequestData;
-import org.apache.wicket.protocol.http.RequestLogger.SessionData;
 import org.apache.wicket.session.ISessionStore;
+import org.apache.wicket.util.string.AppendingStringBuffer;
 
 
 /**
@@ -128,4 +130,298 @@
 	 */
 	public abstract void logEventTarget(IRequestHandler target);
 
+	/**
+	 * This class hold the information one request of a session has.
+	 * 
+	 * @author jcompagner
+	 */
+	public static class SessionData implements IClusterable, Comparable<SessionData>
+	{
+		private static final long serialVersionUID = 1L;
+
+		private final String sessionId;
+		private final long startDate;
+		private long lastActive;
+		private long numberOfRequests;
+		private long totalTimeTaken;
+		private long sessionSize;
+		private Object sessionInfo;
+
+		/**
+		 * Construct.
+		 * 
+		 * @param sessionId
+		 */
+		public SessionData(String sessionId)
+		{
+			this.sessionId = sessionId;
+			startDate = System.currentTimeMillis();
+			numberOfRequests = 1;
+		}
+
+		/**
+		 * @return The last active date.
+		 */
+		public Date getLastActive()
+		{
+			return new Date(lastActive);
+		}
+
+		/**
+		 * @return The start date of this session
+		 */
+		public Date getStartDate()
+		{
+			return new Date(startDate);
+		}
+
+		/**
+		 * @return The number of request for this session
+		 */
+		public long getNumberOfRequests()
+		{
+			return numberOfRequests;
+		}
+
+		/**
+		 * @return Returns the session size.
+		 */
+		public long getSessionSize()
+		{
+			return sessionSize;
+		}
+
+		/**
+		 * @return Returns the total time this session has spent.
+		 */
+		public long getTotalTimeTaken()
+		{
+			return totalTimeTaken;
+		}
+
+		/**
+		 * @return The session info object given by the {@link ISessionLogInfo#getSessionInfo()}
+		 *         session method.
+		 */
+		public Object getSessionInfo()
+		{
+			return sessionInfo;
+		}
+
+		/**
+		 * @return The session id
+		 */
+		public String getSessionId()
+		{
+			return sessionId;
+		}
+
+		void addTimeTaken(long time)
+		{
+			lastActive = System.currentTimeMillis();
+			numberOfRequests++;
+			totalTimeTaken += time;
+		}
+
+		void setSessionInfo(Object sessionInfo)
+		{
+			this.sessionInfo = sessionInfo;
+		}
+
+		void setSessionSize(long size)
+		{
+			sessionSize = size;
+		}
+
+		public int compareTo(SessionData sd)
+		{
+			return (int)(sd.lastActive - lastActive);
+		}
+
+	}
+
+
+	/**
+	 * This class hold the information one request of a session has.
+	 * 
+	 * @author jcompagner
+	 */
+	public static class RequestData implements IClusterable
+	{
+		private static final long serialVersionUID = 1L;
+
+		private long startDate;
+		private long timeTaken;
+		private final List<String> entries = new ArrayList<String>(5);
+		private String eventTarget;
+		private String responseTarget;
+
+		private String sessionId;
+
+		private long totalSessionSize;
+
+		private Object sessionInfo;
+
+		private int activeRequest;
+
+		/**
+		 * @return The time taken for this request
+		 */
+		public Long getTimeTaken()
+		{
+			return new Long(timeTaken);
+		}
+
+		/**
+		 * @param activeRequest
+		 *            The number of active request when this request happened
+		 */
+		public void setActiveRequest(int activeRequest)
+		{
+			this.activeRequest = activeRequest;
+		}
+
+		/**
+		 * @return The number of active request when this request happened
+		 */
+		public int getActiveRequest()
+		{
+			return activeRequest;
+		}
+
+		/**
+		 * @return The session object info, created by {@link ISessionLogInfo#getSessionInfo()}
+		 */
+		public Object getSessionInfo()
+		{
+			return sessionInfo;
+		}
+
+		/**
+		 * Set the session info object of the session for this request.
+		 * 
+		 * @param sessionInfo
+		 */
+		public void setSessionInfo(Object sessionInfo)
+		{
+			this.sessionInfo = sessionInfo;
+		}
+
+		/**
+		 * @param sizeInBytes
+		 */
+		public void setSessionSize(long sizeInBytes)
+		{
+			totalSessionSize = sizeInBytes;
+		}
+
+		/**
+		 * @param id
+		 */
+		public void setSessionId(String id)
+		{
+			sessionId = id;
+		}
+
+		/**
+		 * @return The time taken for this request
+		 */
+		public Date getStartDate()
+		{
+			return new Date(startDate);
+		}
+
+		/**
+		 * @return The event target string
+		 */
+		public String getEventTarget()
+		{
+			return eventTarget;
+		}
+
+		/**
+		 * @return The response target string
+		 */
+		public String getResponseTarget()
+		{
+			return responseTarget;
+		}
+
+		/**
+		 * @param target
+		 */
+		public void addResponseTarget(String target)
+		{
+			responseTarget = target;
+		}
+
+		/**
+		 * @param target
+		 */
+		public void addEventTarget(String target)
+		{
+			eventTarget = target;
+		}
+
+		/**
+		 * @param timeTaken
+		 */
+		public void setTimeTaken(long timeTaken)
+		{
+			this.timeTaken = timeTaken;
+			startDate = System.currentTimeMillis() - timeTaken;
+		}
+
+		/**
+		 * @param string
+		 */
+		public void addEntry(String string)
+		{
+			entries.add(string);
+		}
+
+		/**
+		 * @return All entries of the objects that are created/updated or removed in this request
+		 */
+		public String getAlteredObjects()
+		{
+			AppendingStringBuffer sb = new AppendingStringBuffer();
+			for (int i = 0; i < entries.size(); i++)
+			{
+				String element = entries.get(i);
+				sb.append(element);
+				if (entries.size() != i + 1)
+				{
+					sb.append("<br/>");
+				}
+			}
+			return sb.toString();
+		}
+
+		/**
+		 * @return The session id for this request
+		 */
+		public String getSessionId()
+		{
+			return sessionId;
+		}
+
+		/**
+		 * @return The total session size.
+		 */
+		public Long getSessionSize()
+		{
+			return new Long(totalSessionSize);
+		}
+
+		@Override
+		public String toString()
+		{
+			return "Request[timetaken=" + getTimeTaken() + ",sessioninfo=" + sessionInfo +
+				",sessionid=" + sessionId + ",sessionsize=" + totalSessionSize + ",request=" +
+				eventTarget + ",response=" + responseTarget + ",alteredobjects=" +
+				getAlteredObjects() + ",activerequest=" + activeRequest + "]";
+		}
+	}
+
 }
\ No newline at end of file

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/IRequestCycleSettings.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/IRequestCycleSettings.java?rev=897330&r1=897329&r2=897330&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/IRequestCycleSettings.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/IRequestCycleSettings.java Fri Jan  8 21:48:50 2010
@@ -22,8 +22,6 @@
 import org.apache.wicket.Session;
 import org.apache.wicket.markup.html.pages.BrowserInfoPage;
 import org.apache.wicket.ng.request.cycle.RequestCycle;
-import org.apache.wicket.protocol.http.WebRequestCycle;
-import org.apache.wicket.request.target.component.BookmarkableListenerInterfaceRequestTarget;
 import org.apache.wicket.settings.IExceptionSettings.UnexpectedExceptionDisplay;
 import org.apache.wicket.util.time.Duration;
 

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/IResourceSettings.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/IResourceSettings.java?rev=897330&r1=897329&r2=897330&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/IResourceSettings.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/settings/IResourceSettings.java Fri Jan  8 21:48:50 2010
@@ -22,7 +22,6 @@
 import org.apache.wicket.Localizer;
 import org.apache.wicket.javascript.IJavascriptCompressor;
 import org.apache.wicket.markup.html.IPackageResourceGuard;
-import org.apache.wicket.markup.html.JavascriptPackageResource;
 import org.apache.wicket.markup.html.PackageResourceGuard;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.resource.IPropertiesFactory;

Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/WebResponseExceptionsTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/WebResponseExceptionsTest.java?rev=897330&r1=897329&r2=897330&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/WebResponseExceptionsTest.java (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/WebResponseExceptionsTest.java Fri Jan  8 21:48:50 2010
@@ -81,7 +81,7 @@
 		tester.getWicketSession().invalidateNow();
 
 		// Invoke the call back URL of the ajax event behavior
-		String callbackUrl = ((AjaxEventBehavior)link.getBehaviors().get(0)).getCallbackUrl(true)
+		String callbackUrl = ((AjaxEventBehavior)link.getBehaviors().get(0)).getCallbackUrl()
 			.toString();
 		tester.getServletRequest().setURL(callbackUrl);