View Javadoc

1   /*
2    * Copyright 2004-2009 the Seasar Foundation and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  package org.seasar.cubby.internal.controller.impl;
17  
18  import java.util.Iterator;
19  
20  import javax.servlet.http.HttpServletRequest;
21  import javax.servlet.http.HttpServletResponse;
22  
23  import org.seasar.cubby.action.ActionContext;
24  import org.seasar.cubby.action.ActionResult;
25  import org.seasar.cubby.internal.controller.ActionResultWrapper;
26  import org.seasar.cubby.plugin.ActionResultInvocation;
27  import org.seasar.cubby.plugin.Plugin;
28  import org.seasar.cubby.plugin.PluginRegistry;
29  
30  /**
31   * {@link org.seasar.cubby.action.ActionResult} のラッパの実装です。
32   * 
33   * @author baba
34   */
35  class ActionResultWrapperImpl implements ActionResultWrapper {
36  
37  	/** アクションの実行結果。 */
38  	private final ActionResult actionResult;
39  
40  	/** アクションコンテキスト。 */
41  	private final ActionContext actionContext;
42  
43  	/**
44  	 * 指定されたアクションの実行結果をラップしたインスタンスを生成します。
45  	 * 
46  	 * @param actionResult
47  	 *            アクションの実行結果
48  	 * @param actionContext
49  	 *            アクションコンテキスト
50  	 */
51  	public ActionResultWrapperImpl(final ActionResult actionResult,
52  			final ActionContext actionContext) {
53  		super();
54  		this.actionResult = actionResult;
55  		this.actionContext = actionContext;
56  	}
57  
58  	/**
59  	 * {@inheritDoc}
60  	 */
61  	public void execute(final HttpServletRequest request,
62  			final HttpServletResponse response) throws Exception {
63  		final ActionResultInvocation actionResultInvocation = new ActionResultInvocationImpl(
64  				request, response, actionContext, actionResult);
65  		actionResultInvocation.proceed();
66  	}
67  
68  	/**
69  	 * {@inheritDoc}
70  	 */
71  	public ActionResult getActionResult() {
72  		return actionResult;
73  	}
74  
75  	/**
76  	 * アクションの実行結果の実行情報の実装です。
77  	 * 
78  	 * @author baba
79  	 */
80  	static class ActionResultInvocationImpl implements ActionResultInvocation {
81  
82  		/** 要求。 */
83  		private final HttpServletRequest request;
84  
85  		/** 応答。 */
86  		private final HttpServletResponse response;
87  
88  		/** アクションのコンテキスト。 */
89  		private final ActionContext actionContext;
90  
91  		/** アクションの実行結果。 */
92  		private final ActionResult actionResult;
93  
94  		/** プラグインのイテレータ。 */
95  		private final Iterator<Plugin> pluginsIterator;
96  
97  		/**
98  		 * インスタンス化します。
99  		 * 
100 		 * @param request
101 		 *            要求
102 		 * @param response
103 		 *            応答
104 		 * @param actionContext
105 		 *            アクションのコンテキスト
106 		 * @param actionResult
107 		 *            アクションの実行結果
108 		 */
109 		public ActionResultInvocationImpl(final HttpServletRequest request,
110 				final HttpServletResponse response,
111 				final ActionContext actionContext,
112 				final ActionResult actionResult) {
113 			this.request = request;
114 			this.response = response;
115 			this.actionContext = actionContext;
116 			this.actionResult = actionResult;
117 
118 			final PluginRegistry pluginRegistry = PluginRegistry.getInstance();
119 			this.pluginsIterator = pluginRegistry.getPlugins().iterator();
120 		}
121 
122 		/**
123 		 * {@inheritDoc}
124 		 */
125 		public Void proceed() throws Exception {
126 			if (pluginsIterator.hasNext()) {
127 				final Plugin plugin = pluginsIterator.next();
128 				plugin.invokeActionResult(this);
129 			} else {
130 				final ActionResult actionResult = getActionResult();
131 				actionResult.execute(actionContext, request, response);
132 			}
133 			return null;
134 		}
135 
136 		/**
137 		 * {@inheritDoc}
138 		 */
139 		public HttpServletRequest getRequest() {
140 			return request;
141 		}
142 
143 		/**
144 		 * {@inheritDoc}
145 		 */
146 		public HttpServletResponse getResponse() {
147 			return response;
148 		}
149 
150 		/**
151 		 * {@inheritDoc}
152 		 */
153 		public ActionContext getActionContext() {
154 			return actionContext;
155 		}
156 
157 		/**
158 		 * {@inheritDoc}
159 		 */
160 		public ActionResult getActionResult() {
161 			return actionResult;
162 		}
163 	}
164 
165 }