View Javadoc

1   /*
2    * Copyright 2004-2010 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  
17  package org.seasar.cubby.plugins.s2;
18  
19  import javax.el.ELResolver;
20  import javax.servlet.ServletContext;
21  import javax.servlet.jsp.JspApplicationContext;
22  import javax.servlet.jsp.JspFactory;
23  
24  import org.seasar.cubby.plugin.AbstractPlugin;
25  import org.seasar.cubby.plugins.s2.el.S2BeanELResolver;
26  import org.seasar.cubby.spi.BeanDescProvider;
27  import org.seasar.cubby.spi.ContainerProvider;
28  import org.seasar.cubby.spi.ConverterProvider;
29  import org.seasar.cubby.spi.PathResolverProvider;
30  import org.seasar.cubby.spi.Provider;
31  import org.seasar.cubby.spi.RequestParserProvider;
32  import org.seasar.framework.container.S2Container;
33  import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
34  import org.seasar.framework.log.Logger;
35  
36  /**
37   * Cubby を <a href="http://s2container.seasar.org/2.4/ja/">S2Container</a>
38   * に統合するためのプラグインです。
39   * <p>
40   * このプラグインが提供するプロバイダは以下の通りです。
41   * <ul>
42   * <li>{@link BeanDescProvider}</li>
43   * <li>{@link ContainerProvider}</li>
44   * <li>{@link RequestParserProvider}</li>
45   * <li>{@link PathResolverProvider}</li>
46   * <li>{@link ConverterProvider}</li>
47   * </ul>
48   * </p>
49   * 
50   * @see <a href="http://s2container.seasar.org/2.4/ja/">S2Container</a>
51   * @author baba
52   */
53  public class S2ContainerPlugin extends AbstractPlugin {
54  
55  	/** ロガー。 */
56  	private static final Logger logger = Logger
57  			.getLogger(S2ContainerPlugin.class);
58  
59  	static {
60  		// HACK
61  		// In "mvn tomcat:run", JspFactory.getDefaultFactory() returns null.
62  		// because static initializer of "JspRuntimeContext" has not been
63  		// executed yet.
64  		// Like "JasperListener" in "server.xml"
65  		try {
66  			Class.forName("org.apache.jasper.compiler.JspRuntimeContext");
67  		} catch (final Exception e) {
68  			if (logger.isDebugEnabled()) {
69  				logger.debug(e.getMessage());
70  			}
71  		}
72  	}
73  
74  	/**
75  	 * インスタンス化します。
76  	 */
77  	public S2ContainerPlugin() {
78  		support(BeanDescProvider.class);
79  		support(ContainerProvider.class);
80  		support(RequestParserProvider.class);
81  		support(PathResolverProvider.class);
82  		support(ConverterProvider.class);
83  	}
84  
85  	/** サーブレットコンテキスト。 */
86  	private ServletContext servletContext;
87  
88  	/**
89  	 * {@inheritDoc}
90  	 */
91  	@Override
92  	public void initialize(final ServletContext servletContext)
93  			throws Exception {
94  		super.initialize(servletContext);
95  		this.servletContext = servletContext;
96  	}
97  
98  	/**
99  	 * {@inheritDoc}
100 	 * <p>
101 	 * {@link S2BeanELResolver} を {@link JspApplicationContext} に登録します。
102 	 * </p>
103 	 */
104 	@Override
105 	public void ready() {
106 		final JspFactory jspFactory = JspFactory.getDefaultFactory();
107 		if (jspFactory != null) {
108 			final JspApplicationContext jspApplicationContext = jspFactory
109 					.getJspApplicationContext(servletContext);
110 			final S2Container container = SingletonS2ContainerFactory
111 					.getContainer();
112 			final ELResolver[] elResolvers = (ELResolver[]) container
113 					.findAllComponents(ELResolver.class);
114 			for (final ELResolver elResolver : elResolvers) {
115 				jspApplicationContext.addELResolver(elResolver);
116 				logger.log("ICUB0001", new Object[] { elResolver });
117 			}
118 		}
119 	}
120 
121 	/**
122 	 * {@inheritDoc}
123 	 */
124 	@Override
125 	public <S extends Provider> S getProvider(final Class<S> service) {
126 		if (this.isSupport(service)) {
127 			final S2Container container = SingletonS2ContainerFactory
128 					.getContainer();
129 			return service.cast(container.getComponent(service));
130 		} else {
131 			return null;
132 		}
133 	}
134 
135 }