01: /*
02: * Licensed to the Apache Software Foundation (ASF) under one or more
03: * contributor license agreements. See the NOTICE file distributed with
04: * this work for additional information regarding copyright ownership.
05: * The ASF licenses this file to You under the Apache License, Version 2.0
06: * (the "License"); you may not use this file except in compliance with
07: * the License. You may obtain a copy of the License at
08: *
09: * http://www.apache.org/licenses/LICENSE-2.0
10: *
11: * Unless required by applicable law or agreed to in writing, software
12: * distributed under the License is distributed on an "AS IS" BASIS,
13: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14: * See the License for the specific language governing permissions and
15: * limitations under the License.
16: */
17: package org.apache.wicket.markup;
18:
19: import java.util.Locale;
20:
21: import org.apache.wicket.Application;
22: import org.apache.wicket.MarkupContainer;
23: import org.apache.wicket.util.resource.IResourceStream;
24: import org.apache.wicket.util.resource.locator.IResourceStreamLocator;
25: import org.slf4j.Logger;
26: import org.slf4j.LoggerFactory;
27:
28: /**
29: * Wicket default implementation for loading the markup resource stream
30: * associated with a MarkupContainer.
31: *
32: * @author Jonathan Locke
33: * @author Juergen Donnerstag
34: */
35: public class DefaultMarkupResourceStreamProvider implements
36: IMarkupResourceStreamProvider {
37: /** Log for reporting. */
38: private static final Logger log = LoggerFactory
39: .getLogger(DefaultMarkupResourceStreamProvider.class);
40:
41: /**
42: * Constructor.
43: */
44: public DefaultMarkupResourceStreamProvider() {
45: }
46:
47: /**
48: * Create a new markup resource stream for the container.
49: * <p>
50: * Note: it will only called once, the IResourceStream will be cached by
51: * MarkupCache.
52: * <p>
53: * Note: IResourceStreamLocators should be used in case the strategy to find
54: * a markup resource should be extended for ALL components of your
55: * application.
56: *
57: * @see org.apache.wicket.util.resource.locator.IResourceStreamFactory
58: * @see org.apache.wicket.markup.DefaultMarkupResourceStreamProvider
59: *
60: * @param container
61: * @param containerClass
62: * The container the markup should be associated with
63: * @return A IResourceStream if the resource was found
64: */
65: public IResourceStream getMarkupResourceStream(
66: final MarkupContainer container, Class containerClass) {
67: // Get locator to search for the resource
68: final IResourceStreamLocator locator = Application.get()
69: .getResourceSettings().getResourceStreamLocator();
70:
71: String style = container.getStyle();
72: Locale locale = container.getLocale();
73: String ext = container.getMarkupType();
74:
75: // Markup is associated with the containers class. Walk up the class
76: // hierarchy up to MarkupContainer to find the containers markup
77: // resource.
78: while (containerClass != MarkupContainer.class) {
79: String path = containerClass.getName().replace('.', '/');
80: IResourceStream resourceStream = locator.locate(container
81: .getClass(), path, style, locale, ext);
82:
83: // Did we find it already?
84: if (resourceStream != null) {
85: return new MarkupResourceStream(resourceStream,
86: new ContainerInfo(container), containerClass);
87: }
88:
89: // Walk up the class hierarchy one level, if markup has not
90: // yet been found
91: containerClass = containerClass.getSuperclass();
92: }
93:
94: return null;
95: }
96: }
|