001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.wicket.spring;
018:
019: import javax.servlet.ServletContext;
020:
021: import org.apache.wicket.Application;
022: import org.apache.wicket.protocol.http.WebApplication;
023: import org.apache.wicket.proxy.LazyInitProxyFactory;
024: import org.springframework.beans.BeansException;
025: import org.springframework.context.ApplicationContext;
026: import org.springframework.context.ApplicationContextAware;
027: import org.springframework.web.context.support.WebApplicationContextUtils;
028:
029: /**
030: * Base class for spring aware wicket web application object. This class has
031: * helper methods to create lazy init proxies based on spring beans, as well as
032: * an implementation of {@link ISpringContextLocator}.
033: *
034: * @author Igor Vaynberg (ivaynberg)
035: */
036: public abstract class SpringWebApplication extends WebApplication
037: implements ApplicationContextAware {
038: private ApplicationContext applicationContext;
039:
040: /**
041: * Singleton instance of spring application context locator
042: */
043: private final static ISpringContextLocator contextLocator = new ISpringContextLocator() {
044:
045: public ApplicationContext getSpringContext() {
046: Application app = Application.get();
047: return ((SpringWebApplication) app)
048: .internalGetApplicationContext();
049: }
050: };
051:
052: /**
053: * Construct.
054: */
055: public SpringWebApplication() {
056:
057: }
058:
059: /**
060: * @see org.apache.wicket.Application#internalInit()
061: */
062: protected void internalInit() {
063: super .internalInit();
064:
065: if (applicationContext == null) {
066: // this application was not created as a spring bean so we
067: // locate the app context from servlet context
068:
069: ServletContext sc = getServletContext();
070: applicationContext = WebApplicationContextUtils
071: .getRequiredWebApplicationContext(sc);
072:
073: }
074: }
075:
076: /**
077: * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
078: */
079: public final void setApplicationContext(
080: ApplicationContext applicationContext)
081: throws BeansException {
082: this .applicationContext = applicationContext;
083: }
084:
085: /**
086: * Retrieves the spring application context associated with this application
087: * object
088: *
089: * This method is protected and named internalGetApplicationContext so that
090: * the subclass can choose whether or not to add a public
091: * getApplicationContext() method
092: *
093: * @return spring application context
094: */
095: protected final ApplicationContext internalGetApplicationContext() {
096: return applicationContext;
097: }
098:
099: /**
100: * Retrieves the spring application context locator object
101: *
102: * @return spring application context locator object
103: */
104: public ISpringContextLocator getSpringContextLocator() {
105: return contextLocator;
106: }
107:
108: /**
109: * Creates a proxy for a spring bean that is safe to put into session and
110: * serialize
111: *
112: * @param clazz
113: * class of spring bean
114: * @param beanName
115: * name of spring bean
116: * @return proxy representing the spring bean
117: */
118: protected Object createSpringBeanProxy(Class clazz, String beanName) {
119: return LazyInitProxyFactory.createProxy(clazz,
120: new SpringBeanLocator(beanName, clazz,
121: getSpringContextLocator()));
122: }
123:
124: /**
125: * Creates a proxy for a spring bean that is safe to put into session and
126: * serialize
127: *
128: * @param clazz
129: * class of spring bean
130: * @return proxy representing the spring bean
131: */
132: protected Object createSpringBeanProxy(Class clazz) {
133: return LazyInitProxyFactory
134: .createProxy(clazz, new SpringBeanLocator(clazz,
135: getSpringContextLocator()));
136: }
137:
138: }
|