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.viewer;
17  
18  import java.lang.reflect.Method;
19  import java.util.HashMap;
20  import java.util.Map;
21  
22  import org.eclipse.swt.graphics.Image;
23  import org.seasar.framework.beans.BeanDesc;
24  import org.seasar.framework.beans.factory.BeanDescFactory;
25  import org.seasar.framework.util.MethodUtil;
26  import org.seasar.framework.util.StringUtil;
27  import org.seasar.uruma.core.UrumaConstants;
28  import org.seasar.uruma.util.AssertionUtil;
29  
30  /**
31   * POJO をテーブルのラベルプロバイダとして利用するためのアダプタクラスです。<br />
32   * <p>
33   * <dl>
34   * <dt>ラベルの取得</dt>
35   * <dd> 以下のようなメソッドをPOJO側に必要なカラムの分だけ用意します。<br />
36   * <code>public String get<i>&lt;キャピタライズされたカラムID&gt;</i>Text(Object
37   * model);</code>
38   * <br />
39   * 引数が {@link Object} 型以外の場合、呼び出し時にその型へのキャストを試みます。 </dd>
40   * 
41   * <br />
42   * 
43   * <dt>カラムイメージの取得</dt>
44   * <dd> 以下のようなメソッドをPOJO側に必要なカラムの分だけ用意します。<br />
45   * <code>public Image get<i>&lt;キャピタライズされたカラムID&gt;</i>Image(Object
46   * model);</code><br />
47   * 引数が {@link Object} 型以外の場合、呼び出し時にその型へのキャストを試みます。 </dd>
48   * </dl>
49   * 
50   * @author y-komori
51   */
52  public class PojoTableLabelProvider extends GenericTableLabelProvider implements
53          PojoLabelProvider {
54      protected Object pojo;
55  
56      protected static final String GET_PREFIX = "get";
57  
58      protected static final String TEXT_SUFFIX = "Text";
59  
60      protected static final String IMAGE_SUFFIX = "Image";
61  
62      protected Map<Integer, Method> textMethodCache = new HashMap<Integer, Method>();
63  
64      protected Map<Integer, Method> imageMethodCache = new HashMap<Integer, Method>();
65  
66      protected Map<Integer, String> columnNoToNameMap = new HashMap<Integer, String>();
67  
68      /*
69       * @see org.seasar.uruma.viewer.GenericTableLabelProvider#getColumnText(java.lang.Object,
70       *      int)
71       */
72      @Override
73      public String getColumnText(final Object element, final int columnIndex) {
74          Method method = getMethod(columnIndex, TEXT_SUFFIX, String.class,
75                  textMethodCache);
76          if (method != null) {
77              Class<?> paramType = method.getParameterTypes()[0];
78              if (paramType.isAssignableFrom(element.getClass())) {
79                  String text = (String) MethodUtil.invoke(method, pojo,
80                          new Object[] { paramType.cast(element) });
81                  if (text == null) {
82                      text = UrumaConstants.NULL_STRING;
83                  }
84  
85                  return text;
86              }
87          }
88          return super.getColumnText(element, columnIndex);
89      }
90  
91      /*
92       * @see org.seasar.uruma.viewer.GenericTableLabelProvider#getColumnImage(java.lang.Object,
93       *      int)
94       */
95      @Override
96      public Image getColumnImage(final Object element, final int columnIndex) {
97          Method method = getMethod(columnIndex, IMAGE_SUFFIX, Image.class,
98                  imageMethodCache);
99          if (method != null) {
100             Class<?> paramType = method.getParameterTypes()[0];
101             if (paramType.isAssignableFrom(element.getClass())) {
102                 Image image = (Image) MethodUtil.invoke(method, pojo,
103                         new Object[] { paramType.cast(element) });
104                 return image;
105             }
106         }
107         return super.getColumnImage(element, columnIndex);
108     }
109 
110     protected Method getMethod(final int columnIndex, final String suffix,
111             final Class<?> retClass, final Map<Integer, Method> cache) {
112         Method getMethod = cache.get(columnIndex);
113         if (getMethod == null) {
114             String columnName = columnNoToNameMap.get(columnIndex);
115             String methodName = GET_PREFIX + StringUtil.capitalize(columnName)
116                     + suffix;
117             BeanDesc desc = BeanDescFactory.getBeanDesc(pojo.getClass());
118             if (desc.hasMethod(methodName)) {
119                 Method[] methods = desc.getMethods(methodName);
120                 for (int i = 0; i < methods.length; i++) {
121                     Method method = methods[i];
122                     if ((method.getParameterTypes().length == 1)
123                             && (method.getReturnType() == retClass)) {
124                         getMethod = method;
125                         cache.put(columnIndex, getMethod);
126                     }
127                 }
128             }
129         }
130         return getMethod;
131     }
132 
133     /*
134      * @see org.seasar.uruma.viewer.PojoLabelProvider#setPojo(java.lang.Object)
135      */
136     public void setPojo(final Object pojo) {
137         AssertionUtil.assertNotNull("pojo", pojo);
138         this.pojo = pojo;
139     }
140 
141     /*
142      * @see org.seasar.uruma.viewer.GenericTableLabelProvider#addColumnMap(int,
143      *      java.lang.String)
144      */
145     @Override
146     public void addColumnMap(final int columnNo, final String columnName) {
147         super.addColumnMap(columnNo, columnName);
148         columnNoToNameMap.put(columnNo, columnName);
149     }
150 
151 }