001: /*
002: * Copyright 2002-2005 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.web.struts;
018:
019: import java.io.File;
020:
021: import javax.servlet.ServletContext;
022:
023: import org.apache.struts.action.ActionServlet;
024: import org.apache.struts.actions.LookupDispatchAction;
025:
026: import org.springframework.context.support.MessageSourceAccessor;
027: import org.springframework.web.context.WebApplicationContext;
028: import org.springframework.web.util.WebUtils;
029:
030: /**
031: * Convenience class for Spring-aware Struts 1.1+ LookupDispatchActions.
032: *
033: * <p>Provides a reference to the current Spring application context, e.g.
034: * for bean lookup or resource loading. Auto-detects a ContextLoaderPlugIn
035: * context, falling back to the root WebApplicationContext. For typical
036: * usage, i.e. accessing middle tier beans, use a root WebApplicationContext.
037: *
038: * <p>For classic Struts Actions, DispatchActions or MappingDispatchActions,
039: * use the analogous {@link ActionSupport ActionSupport} or
040: * {@link DispatchActionSupport DispatchActionSupport} /
041: * {@link MappingDispatchActionSupport MappingDispatchActionSupport} class.
042: *
043: * <p>As an alternative approach, you can wire your Struts Actions themselves
044: * as Spring beans, passing references to them via IoC rather than looking
045: * up references in a programmatic fashion. Check out
046: * {@link DelegatingActionProxy DelegatingActionProxy} and
047: * {@link DelegatingRequestProcessor DelegatingRequestProcessor}.
048: *
049: * @author Juergen Hoeller
050: * @since 1.1
051: * @see ContextLoaderPlugIn#SERVLET_CONTEXT_PREFIX
052: * @see WebApplicationContext#ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE
053: * @see org.springframework.web.context.ContextLoaderListener
054: * @see org.springframework.web.context.ContextLoaderServlet
055: * @see ActionSupport
056: * @see DispatchActionSupport
057: * @see MappingDispatchActionSupport
058: * @see DelegatingActionProxy
059: * @see DelegatingRequestProcessor
060: */
061: public abstract class LookupDispatchActionSupport extends
062: LookupDispatchAction {
063:
064: private WebApplicationContext webApplicationContext;
065:
066: private MessageSourceAccessor messageSourceAccessor;
067:
068: /**
069: * Initialize the WebApplicationContext for this Action.
070: * Invokes onInit after successful initialization of the context.
071: * @see #initWebApplicationContext
072: * @see #onInit
073: */
074: public void setServlet(ActionServlet actionServlet) {
075: super .setServlet(actionServlet);
076: if (actionServlet != null) {
077: this .webApplicationContext = initWebApplicationContext(actionServlet);
078: this .messageSourceAccessor = new MessageSourceAccessor(
079: this .webApplicationContext);
080: onInit();
081: } else {
082: onDestroy();
083: }
084: }
085:
086: /**
087: * Fetch ContextLoaderPlugIn's WebApplicationContext from the ServletContext,
088: * falling back to the root WebApplicationContext (the usual case).
089: * @param actionServlet the associated ActionServlet
090: * @return the WebApplicationContext
091: * @throws IllegalStateException if no WebApplicationContext could be found
092: * @see DelegatingActionUtils#findRequiredWebApplicationContext
093: */
094: protected WebApplicationContext initWebApplicationContext(
095: ActionServlet actionServlet) throws IllegalStateException {
096:
097: return DelegatingActionUtils.findRequiredWebApplicationContext(
098: actionServlet, null);
099: }
100:
101: /**
102: * Return the current Spring WebApplicationContext.
103: */
104: protected final WebApplicationContext getWebApplicationContext() {
105: return this .webApplicationContext;
106: }
107:
108: /**
109: * Return a MessageSourceAccessor for the application context
110: * used by this object, for easy message access.
111: */
112: protected final MessageSourceAccessor getMessageSourceAccessor() {
113: return this .messageSourceAccessor;
114: }
115:
116: /**
117: * Return the current ServletContext.
118: */
119: protected final ServletContext getServletContext() {
120: return this .webApplicationContext.getServletContext();
121: }
122:
123: /**
124: * Return the temporary directory for the current web application,
125: * as provided by the servlet container.
126: * @return the File representing the temporary directory
127: */
128: protected final File getTempDir() {
129: return WebUtils.getTempDir(getServletContext());
130: }
131:
132: /**
133: * Callback for custom initialization after the context has been set up.
134: * @see #setServlet
135: */
136: protected void onInit() {
137: }
138:
139: /**
140: * Callback for custom destruction when the ActionServlet shuts down.
141: * @see #setServlet
142: */
143: protected void onDestroy() {
144: }
145:
146: }
|