View Javadoc

1   /*
2    * Copyright 2004-2008 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.uruma.util;
17  
18  import org.seasar.framework.beans.BeanDesc;
19  import org.seasar.framework.beans.PropertyDesc;
20  import org.seasar.framework.beans.factory.BeanDescFactory;
21  import org.seasar.framework.container.ComponentDef;
22  import org.seasar.framework.container.S2Container;
23  import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
24  
25  /**
26   * {@link S2Container} を利用するためのユーティリティクラスです。<br />
27   * 
28   * @author y-komori
29   */
30  public class S2ContainerUtil {
31      private S2ContainerUtil() {
32  
33      }
34  
35      /**
36       * 指定された名前に対応するコンポーネントを {@link S2Container} から取得して返します。<br />
37       * <p>
38       * コンポーネントが存在しない場合は例外をスローせず、<code>null</code> を返します。
39       * </p>
40       * 
41       * @param componentName
42       *            コンポーネント名称
43       * @return コンポーネントオブジェクト
44       */
45      public static Object getComponentNoException(final String componentName) {
46          S2Container container = SingletonS2ContainerFactory.getContainer();
47          return getComponentNoException(componentName, container);
48      }
49  
50      /**
51       * 指定された名前に対応するコンポーネントを {@link S2Container} から取得して返します。<br />
52       * <p>
53       * コンポーネントが存在しない場合は例外をスローせず、<code>null</code> を返します。
54       * </p>
55       * 
56       * @param componentName
57       *            コンポーネント名称
58       * @param container
59       *            検索対象の {@link S2Container}
60       * @return コンポーネントオブジェクト
61       */
62      public static Object getComponentNoException(final String componentName,
63              final S2Container container) {
64          if (container.hasComponentDef(componentName)) {
65              return container.getComponentDef(componentName).getComponent();
66          } else {
67              return null;
68          }
69      }
70  
71      /**
72       * 指定されたクラスに対応するコンポーネントを {@link S2Container} から取得して返します。<br />
73       * コンポーネントが存在しない場合は例外をスローせず、 <code>null</code> を返します。
74       * 
75       * @param componentClass
76       *            コンポーネントのクラス
77       * @param container
78       *            {@link S2Container}
79       * @return コンポーネントオブジェクト
80       */
81      public static Object getComponentNoException(final Class<?> componentClass,
82              final S2Container container) {
83          if (container.hasComponentDef(componentClass)) {
84              return container.getComponent(componentClass);
85          } else {
86              return null;
87          }
88      }
89  
90      /**
91       * 指定されたクラスに対応するコンポーネントを {@link S2Container} から取得して返します。<br />
92       * コンポーネントが存在しない場合は例外をスローせず、 <code>null</code> を返します。
93       * 
94       * @param componentClass
95       *            コンポーネントのクラス
96       * @return コンポーネントオブジェクト
97       */
98      public static Object getComponentNoException(final Class<?> componentClass) {
99          return getComponentNoException(componentClass,
100                 SingletonS2ContainerFactory.getContainer());
101     }
102 
103     /**
104      * 指定された名前に対応するコンポーネントを {@link S2Container} から取得して返します。<br />
105      * コンポーネントが存在しない場合は例外をスローせず、 <code>null</code> を返します。
106      * 
107      * @param componentName
108      *            コンポーネント名称
109      * @return コンポーネントオブジェクト
110      */
111     public static ComponentDef getComponentDefNoException(
112             final String componentName) {
113         S2Container container = SingletonS2ContainerFactory.getContainer();
114         if (container.hasComponentDef(componentName)) {
115             return container.getComponentDef(componentName);
116         } else {
117             return null;
118         }
119     }
120 
121     /**
122      * 指定されたクラスに対応するコンポーネントを {@link S2Container} から取得して返します。<br />
123      * コンポーネントが存在しない場合は例外をスローせず、 <code>null</code> を返します。
124      * 
125      * @param componentClass
126      *            コンポーネントクラス
127      * @return コンポーネントオブジェクト
128      */
129     public static ComponentDef getComponentNoExceptionDef(
130             final Class<?> componentClass) {
131         S2Container container = SingletonS2ContainerFactory.getContainer();
132         if (container.hasComponentDef(componentClass)) {
133             return container.getComponentDef(componentClass);
134         } else {
135             return null;
136         }
137     }
138 
139     /**
140      * 指定された名前に対応するコンポーネントを {@link S2Container} から取得して返します。<br />
141      * 
142      * @param componentName
143      *            コンポーネント名称
144      * @return コンポーネントオブジェクト
145      */
146     public static ComponentDef getComponentDef(final String componentName) {
147         S2Container container = SingletonS2ContainerFactory.getContainer();
148         return container.getComponentDef(componentName);
149     }
150 
151     /**
152      * 指定されたクラスに対応するコンポーネントを {@link S2Container} から取得して返します。<br />
153      * 
154      * @param componentClass
155      *            コンポーネントクラス
156      * @return コンポーネントオブジェクト
157      */
158     public static ComponentDef getComponentDef(final Class<?> componentClass) {
159         S2Container container = SingletonS2ContainerFactory.getContainer();
160         return container.getComponentDef(componentClass);
161     }
162 
163     /**
164      * 指定されたクラスに対応するコンポーネントを {@link S2Container} から取得して返します。<br />
165      * 
166      * @param componentClass
167      *            コンポーネントクラス
168      * @return コンポーネントオブジェクト
169      */
170     public static Object getComponent(final Class<?> componentClass) {
171         return getComponent(componentClass, SingletonS2ContainerFactory
172                 .getContainer());
173     }
174 
175     /**
176      * 指定されたクラスに対応するコンポーネントを {@link S2Container} から取得して返します。<br />
177      * 
178      * @param componentClass
179      *            コンポーネントクラス
180      * @param container
181      *            検索対象の {@link S2Container}
182      * @return コンポーネントオブジェクト
183      */
184     public static Object getComponent(final Class<?> componentClass,
185             final S2Container container) {
186         return container.getComponent(componentClass);
187     }
188 
189     /**
190      * 指定されたオブジェクトに対して {@link S2Container} からコンポーネントをインジェクションします。<br />
191      * <p>
192      * <code>target</code> で指定されたオブジェクトに対して、<code>container</code> で指定された
193      * {@link S2Container} からコンポーネントをインジェクションします。<br />
194      * </p>
195      * 
196      * @param target
197      *            ターゲットオブジェクト
198      * @param container
199      *            {@link S2Container} オブジェクト
200      */
201     public static void injectDependency(final Object target,
202             final S2Container container) {
203         AssertionUtil.assertNotNull("target", target);
204         AssertionUtil.assertNotNull("container", container);
205 
206         BeanDesc desc = BeanDescFactory.getBeanDesc(target.getClass());
207 
208         int pdSize = desc.getPropertyDescSize();
209         for (int i = 0; i < pdSize; i++) {
210             PropertyDesc pd = desc.getPropertyDesc(i);
211 
212             Class<?> clazz = pd.getPropertyType();
213             Object component = getComponentNoException(clazz);
214             if (component != null && pd.isWritable()) {
215                 pd.setValue(target, component);
216             }
217         }
218     }
219 }