001: /*
002: * $Id: SharedResourceRequestTarget.java,v 1.3 2005/12/30 20:20:17 jonathanlocke
003: * Exp $ $Revision: 460927 $ $Date: 2006-06-05 06:32:15 +0200 (Mon, 05 Jun 2006) $
004: *
005: * ==============================================================================
006: * Licensed under the Apache License, Version 2.0 (the "License"); you may not
007: * use this file except in compliance with the License. You may obtain a copy of
008: * the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
014: * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
015: * License for the specific language governing permissions and limitations under
016: * the License.
017: */
018: package wicket.request.target.resource;
019:
020: import javax.servlet.http.HttpServletResponse;
021:
022: import org.apache.commons.logging.Log;
023: import org.apache.commons.logging.LogFactory;
024:
025: import wicket.Application;
026: import wicket.RequestCycle;
027: import wicket.Resource;
028: import wicket.Response;
029: import wicket.SharedResources;
030: import wicket.WicketRuntimeException;
031: import wicket.application.IClassResolver;
032: import wicket.markup.html.PackageResource;
033: import wicket.protocol.http.WebResponse;
034: import wicket.request.RequestParameters;
035:
036: /**
037: * Default implementation of {@link ISharedResourceRequestTarget}. Target that
038: * denotes a shared {@link wicket.Resource}.
039: *
040: * @author Eelco Hillenius
041: */
042: public class SharedResourceRequestTarget implements
043: ISharedResourceRequestTarget {
044: /** Logging object */
045: private static final Log log = LogFactory
046: .getLog(SharedResourceRequestTarget.class);
047:
048: private final RequestParameters requestParameters;
049:
050: /**
051: * Construct.
052: *
053: * @param requestParameters
054: * the request parameters
055: */
056: public SharedResourceRequestTarget(
057: RequestParameters requestParameters) {
058: this .requestParameters = requestParameters;
059: if (requestParameters == null) {
060: throw new IllegalArgumentException(
061: "requestParameters may not be null");
062: } else if (requestParameters.getResourceKey() == null) {
063: throw new IllegalArgumentException(
064: "requestParameters.getResourceKey() "
065: + "may not be null");
066: }
067: }
068:
069: /**
070: * @see wicket.IRequestTarget#detach(wicket.RequestCycle)
071: */
072: public void detach(RequestCycle requestCycle) {
073: }
074:
075: /**
076: * @see java.lang.Object#equals(java.lang.Object)
077: */
078: public boolean equals(Object obj) {
079: if (obj instanceof SharedResourceRequestTarget) {
080: SharedResourceRequestTarget that = (SharedResourceRequestTarget) obj;
081: return getRequestParameters().getResourceKey().equals(
082: that.getRequestParameters().getResourceKey());
083: }
084: return false;
085: }
086:
087: /**
088: * @see wicket.IRequestTarget#getLock(RequestCycle)
089: */
090: public Object getLock(RequestCycle requestCycle) {
091: return null;
092: }
093:
094: /**
095: * @see wicket.request.target.resource.ISharedResourceRequestTarget#getRequestParameters()
096: */
097: public final RequestParameters getRequestParameters() {
098: return requestParameters;
099: }
100:
101: /**
102: * @see wicket.request.target.resource.ISharedResourceRequestTarget#getResourceKey()
103: */
104: public final String getResourceKey() {
105: return requestParameters.getResourceKey();
106: }
107:
108: /**
109: * @see java.lang.Object#hashCode()
110: */
111: public int hashCode() {
112: int result = "SharedResourceRequestTarget".hashCode();
113: result += getRequestParameters().getResourceKey().hashCode();
114: return 17 * result;
115: }
116:
117: /**
118: * Respond by looking up the shared resource and delegating the actual
119: * response to that resource.
120: *
121: * @see wicket.IRequestTarget#respond(wicket.RequestCycle)
122: */
123: public void respond(RequestCycle requestCycle) {
124: Application application = requestCycle.getApplication();
125: SharedResources sharedResources = application
126: .getSharedResources();
127: final String resourceKey = getRequestParameters()
128: .getResourceKey();
129: Resource resource = sharedResources.get(resourceKey);
130:
131: // try to lazily register
132: if (resource == null) {
133: int ix = resourceKey.indexOf('/');
134: if (ix != -1) {
135: String className = resourceKey.substring(0, ix);
136: IClassResolver resolver = application
137: .getApplicationSettings().getClassResolver();
138: Class scope = null;
139: try {
140: scope = resolver.resolveClass(className);
141: String path = resourceKey.substring(ix + 1);
142:
143: PackageResource packageResource = PackageResource
144: .get(scope, path);
145: if (sharedResources.get(resourceKey) == null) {
146: sharedResources.add(resourceKey,
147: packageResource);
148: }
149: resource = packageResource;
150: } catch (Exception e) {
151: // besides logging, ignore exception; after this an error
152: // will be returned that the resource could not be retrieved
153: log
154: .error("unable to lazily register shared resource "
155: + resourceKey
156: + ", exception="
157: + e.getMessage());
158: }
159: }
160: }
161:
162: // if resource is still null, it doesn't exist
163: if (resource == null) {
164: Response response = requestCycle.getResponse();
165: if (response instanceof WebResponse) {
166: ((WebResponse) response).getHttpServletResponse()
167: .setStatus(HttpServletResponse.SC_NOT_FOUND);
168: log.error("shared resource " + resourceKey
169: + " not found");
170: return;
171: } else {
172: throw new WicketRuntimeException("shared resource "
173: + resourceKey + " not found");
174: }
175: }
176:
177: // set request parameters if there are any
178: if (requestParameters != null) {
179: resource.setParameters(requestParameters.getParameters());
180: }
181:
182: // let the resource handle the request
183: resource.onResourceRequested();
184: }
185:
186: /**
187: * @see java.lang.Object#toString()
188: */
189: public String toString() {
190: return "[SharedResourceRequestTarget@" + hashCode()
191: + ", resourceKey="
192: + getRequestParameters().getResourceKey() + "]";
193: }
194: }
|