View Javadoc

1   package org.seasar.uruma.container.warmdeploy;
2   
3   import org.seasar.framework.container.ComponentCreator;
4   import org.seasar.framework.container.ComponentDef;
5   import org.seasar.framework.container.S2Container;
6   import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
7   import org.seasar.framework.container.impl.S2ContainerBehavior.DefaultProvider;
8   import org.seasar.framework.container.util.S2ContainerUtil;
9   import org.seasar.framework.convention.NamingConvention;
10  import org.seasar.framework.log.Logger;
11  
12  /**
13   * Uruma WARM deploy時にコンポーネントを自動登録する{@link
14   * org.seasar.framework.container.factory.S2ContainerFactory.Provider}の実装です。
15   * 
16   * @author higa
17   * @author y.sugigami
18   */
19  public class UrumaWarmdeployBehavior extends DefaultProvider {
20  
21      private static final Logger logger = Logger
22              .getLogger(UrumaWarmdeployBehavior.class);
23  
24      private NamingConvention namingConvention;
25  
26      private ComponentCreator[] creators = new ComponentCreator[0];
27  
28      /**
29       * 命名規則を返します。
30       * 
31       * @return 命名規則
32       */
33      public NamingConvention getNamingConvention() {
34          return namingConvention;
35      }
36  
37      /**
38       * 命名規則を設定します。
39       * 
40       * @param namingConvention
41       *      命名規則
42       */
43      public void setNamingConvention(final NamingConvention namingConvention) {
44          this.namingConvention = namingConvention;
45      }
46  
47      /**
48       * コンポーネントクリエータの配列を返します。
49       * 
50       * @return コンポーネントクリエータの配列
51       */
52      public ComponentCreator[] getCreators() {
53          return creators;
54      }
55  
56      /**
57       * コンポーネントクリエータの配列を設定します。
58       * 
59       * @param creators
60       *      コンポーネントクリエータの配列
61       */
62      public void setCreators(final ComponentCreator[] creators) {
63          this.creators = creators;
64      }
65  
66      @Override
67      protected ComponentDef getComponentDef(final S2Container container,
68              final Object key) {
69          synchronized (container.getRoot()) {
70              ComponentDef cd = super.getComponentDef(container, key);
71              if (cd != null) {
72                  return cd;
73              }
74              if (container != container.getRoot()) {
75                  return null;
76              }
77  
78              if (key instanceof Class) {
79                  cd = createComponentDef((Class) key);
80              } else if (key instanceof String) {
81                  cd = createComponentDef((String) key);
82                  if (cd != null && !key.equals(cd.getComponentName())) {
83                      logger.log("WSSR0011", new Object[] { key,
84                              cd.getComponentClass().getName(),
85                              cd.getComponentName() });
86                      cd = null;
87                  }
88              } else {
89                  throw new IllegalArgumentException("key");
90              }
91              if (cd != null) {
92                  SingletonS2ContainerFactory.getContainer().register(cd);
93                  S2ContainerUtil.putRegisterLog(cd);
94                  cd.init();
95              }
96              return cd;
97          }
98      }
99  
100     /**
101      * コンポーネント定義を作成します。
102      * <p>
103      * コンポーネントクリエータを順次呼び出し、コンポーネント定義が作成された場合はそれを返します。
104      * どのコンポーネントクリエータからもコンポーネント定義が作成されなかった場合は<code>null</code>を返します。
105      * </p>
106      * 
107      * @param componentClass
108      *      コンポーネントのクラス
109      * @return コンポーネント定義
110      */
111     protected ComponentDef createComponentDef(final Class componentClass) {
112         for (int i = 0; i < creators.length; ++i) {
113             ComponentCreator creator = creators[i];
114             ComponentDef cd = creator.createComponentDef(componentClass);
115             if (cd != null) {
116                 return cd;
117             }
118         }
119         return null;
120     }
121 
122     /**
123      * コンポーネント定義を作成します。
124      * <p>
125      * コンポーネントクリエータを順次呼び出し、コンポーネント定義が作成された場合はそれを返します。
126      * どのコンポーネントクリエータからもコンポーネント定義が作成されなかった場合は<code>null</code>を返します。
127      * </p>
128      * 
129      * @param componentName
130      *      コンポーネント名
131      * @return コンポーネント定義
132      */
133     protected ComponentDef createComponentDef(final String componentName) {
134         for (int i = 0; i < creators.length; ++i) {
135             ComponentCreator creator = creators[i];
136             ComponentDef cd = creator.createComponentDef(componentName);
137             if (cd != null) {
138                 return cd;
139             }
140         }
141         return null;
142     }
143 
144 }