001    /*
002     * Copyright (c) 2009 The openGion Project.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013     * either express or implied. See the License for the specific language
014     * governing permissions and limitations under the License.
015     */
016    package org.opengion.fukurou.business;
017    
018    import org.opengion.fukurou.model.DataModel;
019    import org.opengion.fukurou.model.NativeType;
020    
021    import java.util.Map;
022    import java.util.HashMap;
023    import java.util.Arrays;
024    
025    /**
026     * 業務ロジãƒ?‚¯ã‚’å?ç?™ã‚‹ãŸã‚ã?ãƒ??ブルモãƒ?ƒ«ã§ã™ã?
027     *
028     * ã“ã?ãƒ??ブルモãƒ?ƒ«ã§ã¯ã€ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆç”Ÿæˆæ™‚ã«ã€ã‚«ãƒ©ãƒ??列ã?値é…å?ã‚’å?ã«ã€å?部ãƒ??タを生æˆã—ã€?
029     * ãã?後ã?ã€è¡Œã?追åŠ?‚„値ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“ã€?
030     *
031     * @og.rev 5.1.1.0 (2009/12/01) æ–°è¦ä½œæ?
032     * @og.group 業務ロジãƒ?‚¯
033     *
034     * @version 5.0
035     * @author Hiroki Nakamura
036     * @since JDK1.6,
037     */
038    public class ArrayTableModel implements DataModel<String> {
039            private static final String CR = System.getProperty("line.separator");          // 5.6.7.0 (2013/07/27) 追�
040    
041            private final String[] names;
042            private final String[][] vals;
043            private final String[] modTypes;
044    
045            private Map<Integer,String[]> rtnMap = null;      // 5.6.0.3 (2012/01/24) 変更ã•れãŸå?ã‚’ã?æ›¸ãæˆ»ã™ãŸã‚ã?Map<インãƒ?ƒƒã‚¯ã‚¹,値é…å?> 
046    
047            /**
048             * 引数ã«åå‰é…å?ã€å?é…å?を指定ã—ãŸã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ãƒ¼
049             *
050             * @param       nms     åå‰é…å?
051             * @param       vs      値?’é‡é…å?
052             * @throws  IllegalArgumentException 引数ã®é…å?ãŒä¸æ­£ãªå ´å?
053             */
054            public ArrayTableModel( final String[] nms, final String[][] vs ) {
055                    this( nms, vs, null );
056            }
057    
058            /**
059             * 引数ã«åå‰é…å?ã€å?é…å?ã€å¤‰æ›´åŒºåˆ??列をæŒ?®šã—ãŸã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ãƒ¼
060             *
061             * @og.rev 5.6.7.0 (2013/07/27) エラーメãƒ?‚»ãƒ¼ã‚¸ã‚’判りやã™ãã™ã‚‹ã€?
062             * @og.rev 5.7.2.3 (2014/01/31) vsã®ãƒã‚§ãƒ?‚¯æ¡ä»¶ã‚’戻ã?
063             *
064             * @param       nms     åå‰é…å?
065             * @param       vs      値?’é‡é…å?
066             * @param       ms      変更区åˆ??é…å?
067             * @throws  IllegalArgumentException 引数ã®é…å?ãŒä¸æ­£ãªå ´å?
068             */
069            public ArrayTableModel( final String[] nms, final String[][] vs, final String[] ms ) {
070                    if( nms == null || nms.length == 0 ) {
071                            String errMsg = "引数ã®åå‰é…å?ã«ã€null ã¯è¨­å®šã§ãã¾ã›ã‚“ã€?;
072                            throw new IllegalArgumentException( errMsg );
073                    }
074                    // 5.6.7.0 (2013/07/27) エラーメãƒ?‚»ãƒ¼ã‚¸ã‚’判りやã™ãã™ã‚‹ã€?
075                    // 5.7.2.3 (2014/01/31) çµæžœ?行ã§length=0ã§é€šã‚‹ã‚ˆã†ãªã®ã§vsã®ã‚¨ãƒ©ãƒ¼ãƒã‚§ãƒ?‚¯æ¡ä»¶ã‚’戻ã™ã?
076                    if( vs == null ) {
077    //      if( vs == null || vs.length == 0 || vs[0] == null || vs[0].length == 0 ) {
078                            String errMsg = "引数ã®å€¤é…å?ã«ã€null ã¯è¨­å®šã§ãã¾ã›ã‚“ã€?;
079                            throw new IllegalArgumentException( errMsg );
080                    }
081    //              if( vs.length > 0 ) {
082    //                      if( vs[0] == null || vs[0].length == 0 || nms.length != vs[0].length ) {
083                            if( nms.length != vs[0].length ) {
084    //                              String errMsg = "åå‰é…å?ã¨å€¤é…å?ã®ã‚«ãƒ©ãƒ?•°ãŒç•°ãªã‚Šã¾ã™ã?" ;
085                                    String errMsg = "åå‰é…å?ã¨å€¤é…å?ã®ã‚«ãƒ©ãƒ?•°ãŒç•°ãªã‚Šã¾ã™ã?"     + CR
086                                                    + "   nms   =" + Arrays.toString( nms   )                       + CR
087                                                    + "   vs[0] =" + Arrays.toString( vs[0] ) ;
088                                    throw new IllegalArgumentException( errMsg );
089                            }
090    //              }
091    
092                    int cols = nms.length;
093                    names = new String[cols];
094                    System.arraycopy( nms, 0, names, 0, cols );
095    
096                    int rows = vs.length;
097                    vals = new String[rows][cols];
098                    for( int i = 0; i < rows; i++ ) {
099                            System.arraycopy( vs[i], 0, vals[i], 0, cols );
100                    }
101    
102                    if( ms != null && ms.length > 0 ) {
103                            if( vs.length == ms.length ) {
104                                    modTypes = new String[rows];
105                                    System.arraycopy( ms, 0, modTypes, 0, rows );
106                            }
107                            else {
108                                    // 5.6.7.0 (2013/07/27) エラーメãƒ?‚»ãƒ¼ã‚¸ã‚’判りやã™ãã™ã‚‹ã€?
109    //                              String errMsg = "変更区åˆ?‚’æŒ?®šã™ã‚‹å?åˆã?値é…å?ã®è¡Œæ•°ã¨ä¸??ã™ã‚‹å¿?¦ãŒã‚りã¾ã™ã?";
110                                    String errMsg = "変更区åˆ?‚’æŒ?®šã™ã‚‹å?åˆã?値é…å?ã®è¡Œæ•°ã¨ä¸??ã™ã‚‹å¿?¦ãŒã‚りã¾ã™ã?"    + CR
111                                                    + "   変更区�行数 =" + ms.length         + CR
112                                                    + "   値é…å?   行数 =" + vs.length ;
113                                    throw new IllegalArgumentException( errMsg );
114                            }
115    //                      if( vs.length != ms.length ) {
116    //                              String errMsg = "変更区åˆ?‚’æŒ?®šã™ã‚‹å?åˆã?値é…å?ã®è¡Œæ•°ã¨ä¸??ã™ã‚‹å¿?¦ãŒã‚りã¾ã™ã?";
117    //                              throw new IllegalArgumentException( errMsg );
118    //                      }
119    //                      else {
120    //                              modTypes = new String[rows];
121    //                              System.arraycopy( ms, 0, modTypes, 0, rows );
122    //                      }
123                    }
124                    else {
125                            modTypes = null;
126                    }
127            }
128    
129            /**
130             * rowã§æŒ?®šã•れãŸè¡Œç•ªå·(インãƒ?ƒƒã‚¯ã‚¹ç•ªå·)ã«è¡Œã‚’追åŠ?—ã¾ã™ã?
131             * <del>(ã“ã?クラスã§ã¯ã€ã“ã®ãƒ¡ã‚½ãƒ?ƒ‰ã¯ã‚µãƒã?トã•れã¦ã?¾ã›ã‚“ã€?</del>
132             * 値é…å?ã‚’ã‚»ãƒ?ƒˆã™ã‚‹å ´åˆã?ã€ä»¥ä¸‹ã?æ¡ä»¶ã‚’æº?Ÿã™å¿?¦ãŒã‚りã¾ã™ã?
133             *   ?‘.行番å·ã¯ã€???rowCount-1) ã®ç¯?›²
134             *   ?’.å?é…å?ã¯ã€not nullã€?ã‹ã¤ ?‘件以ä¸?
135             *   ?“.å?é…å?ã®å€‹æ•°ã¯ã€å?部カラãƒ?•°ã¨åŒã˜
136             *
137             * ã“ã“ã§ç™»éŒ²ã—ãŸå€¤ã¯ã€å?部ã®å€¤é…å?ã¨åˆ¥ç®¡ç?•れã¾ã™ã?ã§ã€ã‚»ãƒ?ƒˆå¾Œã«ã€å?ã³ã‚²ãƒ?ƒˆã—ã¦ã‚?
138             * ã“ã“ã§ã‚»ãƒ?ƒˆã—ãŸå€¤ã‚’å–りå?ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“ã€?
139             * ã¾ãŸã?åŒã˜è¡Œç•ªå·ã§ã‚»ãƒ?ƒˆã—ãŸå ´åˆã?ã€å¾Œã§ã‚»ãƒ?ƒˆã—ãŸå€¤ãŒæœ‰åйã§ã™ã?
140             *
141             * ※ インãƒ?ƒƒã‚¯ã‚¹(row)ã¨ã¯ã€ã“ã®ArrayTableModel ã«æŒã¤ vals é…å?ã®è¡Œã?インãƒ?ƒƒã‚¯ã‚¹ã§ã™ã?
142             * よã£ã¦ã€ã‚ªãƒªã‚¸ãƒŠãƒ«ã®DBTableModelã®è¡Œç•ªå·ã§ã¯ã‚りã¾ã›ã‚“ã€?
143             *
144             * @og.rev 5.6.0.3 (2012/01/24) 変更ã•れãŸå?ã‚’ã?æ›¸ãæˆ»ã™æ©Ÿè?を追åŠ?—ã¾ã™ã?
145             *
146             * @param   vals  é…å?値
147             * @param   row   追åŠ?™ã‚‹ã‚¤ãƒ³ãƒ?ƒƒã‚¯ã‚¹
148             * @throws      IllegalArgumentException 引数ãŒï¼‘,2,3ã?æ¡ä»¶ã‚’æº?Ÿã•ãªã??åˆã?
149             */
150            public void setValues( final String[] vals, final int row ) {
151    //              throw new RuntimeException( "ã“ã?クラスã§ã¯ã€setValuesメソãƒ?ƒ‰ã¯ã‚µãƒã?トã•れã¦ã?¾ã›ã‚“" );
152                    if( row < 0 || row > getRowCount() ) {
153                            String errMsg = "引数ã®ã‚¤ãƒ³ãƒ?ƒƒã‚¯ã‚¹ã¯ã€??? + (getRowCount()-1) + " ã®é–“ã§æŒ?®šã—ã¦ãã ã•ã„。index=[" + row + "]";
154                            throw new IllegalArgumentException( errMsg );
155                    }
156                    else if( vals == null || vals.length == 0 ) {
157                            String errMsg = "引数ã®å€¤é…å?ã«ã€nullã€ã¾ãŸã? 0ä»¶é…å?ã¯æŒ?®šã§ãã¾ã›ã‚“。index=[" + row + "]";
158                            throw new IllegalArgumentException( errMsg );
159                    }
160                    else if( vals.length != names.length ) {
161                            String errMsg = "引数ã®å€¤é…å?ã®å€‹æ•°ã¨ã€å?部カラãƒ?•°ãŒä¸??ã—ã¾ã›ã‚“ã€?
162                                                    + " index=[" + row + "] : 引数個数=[" + vals.length + "] != å†?ƒ¨ã‚«ãƒ©ãƒ?•°=[" + names.length + "]";
163                            throw new IllegalArgumentException( errMsg );
164                    }
165    
166                    if( rtnMap == null ) { rtnMap = new HashMap<Integer,String[]>(); }
167    
168                    int cols = vals.length;
169                    String[] newVals = new String[cols];
170                    System.arraycopy( vals, 0, newVals, 0, cols );
171    
172                    rtnMap.put( Integer.valueOf( row ) , newVals );
173            }
174    
175            /**
176             * BizLogicã§ã€ãƒ‡ãƒ¼ã‚¿ãŒå¤‰æ›´ã•れãŸå?åˆã?ã€ã“ã®Mapã§å€¤ã®é…å?ã‚’è¿”ã—ã¾ã™ã?
177             * Mapã®ã‚­ãƒ¼ã¯ã€ã‚¤ãƒ³ãƒ?ƒƒã‚¯ã‚¹(row)ã®Integerオブジェクトã§ã™ã?値ã¯ã€è¨­å®šã•れ㟠Stringé…å?ã§ã™ã?
178             * ãªã«ã‚‚変更ãŒã•れã¦ã?ªã‘れã°ã€null ã‚’è¿”ã—ã¾ã™ã?
179             *
180             * ※ インãƒ?ƒƒã‚¯ã‚¹(row)ã¨ã¯ã€ã“ã®ArrayTableModel ã«æŒã¤ vals é…å?ã®è¡Œã?インãƒ?ƒƒã‚¯ã‚¹ã§ã™ã?
181             * よã£ã¦ã€ã‚ªãƒªã‚¸ãƒŠãƒ«ã®DBTableModelã®è¡Œç•ªå·ã§ã¯ã‚りã¾ã›ã‚“ã€?
182             *
183             * @og.rev 5.6.0.3 (2012/01/24) 変更ã•れãŸå?ã‚’ã?æ›¸ãæˆ»ã™ãŸã‚ã?Map<インãƒ?ƒƒã‚¯ã‚¹,値é…å?> ã‚’è¿”ã—ã¾ã™ã?
184             *
185             * @return      æ›¸ãæˆ»ã™ãŸã‚ã?Map?œã‚¤ãƒ³ãƒ?ƒƒã‚¯ã‚¹,値é…å???
186             * @see AbstractBizLogic#isRequireTable()
187             */
188            public Map<Integer,String[]> getModifyVals() {
189                    return rtnMap;
190            }
191    
192            /**
193             * カラãƒ?ã«å¯¾å¿œã™ã‚?カラãƒ?•ªå·ã‚’è¿”ã—ã¾ã™ã?
194             *
195             * 特殊ãªã‚«ãƒ©ãƒ?ŒæŒ?®šã•れãŸå ´åˆã?ã€è²??値を返ã—ã¾ã™ã?
196             * 例ãˆã°ã€[KEY.カラãƒ?]ã€[I]ã€[ROW.ID] ãªã©ã€ç‰¹å®šã?è²??値を返ã—ã¾ã™ã?
197             * ã¾ãŸã?カラãƒ?ãŒå?ã®ãƒ??タモãƒ?ƒ«ã«å­˜åœ¨ã—ãªã??åˆã‚‚ã€è²??値ã‹ã?
198             * Exception ã‚’è¿”ã—ã¾ã™ã?è²??値ãªã®ã‹ã?Exception ãªã®ã‹ã?ã€?
199             * 実è£?«ä¾å­˜ã—ã¾ã™ã?
200             *
201             * @param       columnName      値ãŒå‚ç…§ã•れるカラãƒ?
202             *
203             * @return  æŒ?®šã•れãŸã‚»ãƒ«ã®ã‚«ãƒ©ãƒ?•ªå·ã€‚存在ã—ãªã‘れã°ã€?1
204             * @throws  IllegalArgumentException 引数ã®ã‚«ãƒ©ãƒ?ã?null ã®å ´å?
205             */
206            public int getColumnNo( final String columnName ) {
207                    if( columnName == null ) {
208                            String errMsg = "引数ã®ã‚«ãƒ©ãƒ?ã«ã€null ã¯è¨­å®šã§ãã¾ã›ã‚“ã€?;
209                            throw new IllegalArgumentException( errMsg );
210                    }
211    
212                    int address = -1;
213                    for( int i = 0; i < names.length; i++ ) {
214                            if( columnName.equalsIgnoreCase( names[i] ) ) {
215                                    address = i;
216                                    break;
217                            }
218                    }
219    
220                    return address;
221            }
222    
223            /**
224             * カラãƒ?é…å?ã«å¯¾å¿œã™ã‚?カラãƒ?•ªå·é…å?ã‚’è¿”ã—ã¾ã™ã?
225             *
226             * ã“れã¯ã€?getColumnNo( String ) ã«å¯¾ã™ã‚‹ è¤?•°ã®ã‚«ãƒ©ãƒ?を検索ã—ãŸ
227             * å ´åˆã¨åŒã˜ã§ã™ã?
228             *
229             * @param       clmNms  値ãŒå‚ç…§ã•れるカラãƒ?é…å?
230             *
231             * @return  æŒ?®šã•れãŸã‚»ãƒ«ã®ã‚«ãƒ©ãƒ?•ªå·é…å?ã€?
232             */
233            public int[] getColumnNos( final String[] clmNms ) {
234                    if( clmNms == null ) { return new int[0]; }
235    
236                    int[] clmNos = new int[clmNms.length];
237                    for( int j = 0; j < clmNms.length; j++ ) {
238                            int address = -1;
239                            for( int i = 0; i < names.length; i++ ) {
240                                    if( clmNms[j].equalsIgnoreCase( names[i] ) ) {
241                                            address = i;
242                                            break;
243                                    }
244                            }
245                            clmNos[j] = address;
246                    }
247    
248                    return clmNos;
249            }
250    
251            /**
252             * カラãƒ?é…å?ã‚’è¿”ã—ã¾ã™ã?
253             *
254             * @return      カラãƒ?é…å?
255             */
256            public String[] getNames() {
257                    return names.clone();
258            }
259    
260            /**
261             * row ã«ã‚るセルã®å±žæ?値をé?列ã§è¿”ã—ã¾ã™ã?
262             *
263             * @param   row     値ãŒå‚ç…§ã•れるè¡?
264             *
265             * @return  æŒ?®šã•れãŸã‚»ãƒ«ã®å±žæ?値é…å?
266             */
267            public String[] getValues( final int row ) {
268                    return vals[row].clone();
269            }
270    
271            /**
272             * row ãŠã‚ˆã³ clm ã«ã‚るセルã®å±žæ?値をStringã«å¤‰æ›ã—ã¦è¿”ã—ã¾ã™ã?
273             *
274             * @param   row     値ãŒå‚ç…§ã•れるè¡?
275             * @param   clm     値ãŒå‚ç…§ã•れるå?
276             *
277             * @return  æŒ?®šã•れãŸã‚»ãƒ«ã®å€¤
278             *
279             */
280            public String getValue( final int row, final int clm ) {
281                    return vals[row][clm];
282            }
283    
284            /**
285             * row ãŠã‚ˆã³ clm ã«ã‚るセルã®å±žæ?値をStringã«å¤‰æ›ã—ã¦è¿”ã—ã¾ã™ã?
286             *
287             * @param   row     値ãŒå‚ç…§ã•れるè¡?
288             * @param   clm     値ãŒå‚ç…§ã•れるå?(キー)
289             *
290             * @return  æŒ?®šã•れãŸã‚»ãƒ«ã®å€¤
291             *
292             */
293            public String getValue( final int row, final String clm ) {
294                    return vals[row][getColumnNo( clm )];
295            }
296    
297            /**
298             * ãƒ??ã‚¿ãƒ??ブルå†??行ã?æ•°ã‚’è¿”ã—ã¾ã™ã?
299             *
300             * @return  モãƒ?ƒ«ã®è¡Œæ•°
301             *
302             */
303            public int getRowCount() {
304                    return vals.length;
305            }
306    
307            /**
308             * row å˜ä½ã«å¤‰æ›´ã•れãŸã‚¿ã‚¤ãƒ?追åŠ?変更/削除)ã‚’è¿”ã—ã¾ã™ã?
309             * タイプã?å§‹ã‚ã«ä¸?º¦ç™»éŒ²ã™ã‚‹ã¨ãれ以é™ã«å¤‰æ›´ã¯ã‹ã‹ã‚Šã¾ã›ã‚“ã€?
310             * ã¤ã¾ã‚Šã?å§‹ã‚㫠追åŠ?§ä½œæ?ã—ãŸãƒ??ã‚¿ã¯ã€ãã®å¾Œå¤‰æ›´ãŒã‚ã£ã¦ã‚‚追åŠ??ã¾ã¾ã§ã™ã?
311             * ãªã«ã‚‚変更ã•れã¦ã?ªã??åˆã?, ""(ゼロストリング)ã‚’è¿”ã—ã¾ã™ã?
312             *
313             * @param   row     値ãŒå‚ç…§ã•れるè¡?
314             *
315             * @return  変更ã•れãŸã‚¿ã‚¤ãƒ—ã?値
316             */
317            public String getModifyType( final int row ) {
318                    return modTypes == null ? "" : modTypes[row];
319            }
320    
321            /**
322             * clm ã®Nativeタイプを返ã—ã¾ã™ã?
323             * Nativeタイプã?org.opengion.fukurou.model.NativeTypeã§å®šç¾©ã•れã¦ã?¾ã™ã?
324             *
325             * @og.rev 5.1.8.0 (2010/07/01) NativeType#getType(String) ã®ãƒ¡ã‚½ãƒ?ƒ‰ã‚’使用ã™ã‚‹ã‚ˆã†ã«å¤‰æ›´ã€?
326             *
327             * @param  clm      値ãŒå‚ç…§ã•れるå?
328             *
329             * @return Nativeタイ�
330             * @see org.opengion.fukurou.model.NativeType
331             */
332            public NativeType getNativeType( final int clm ) {
333    //              return StringUtil.getNativeType( vals[0][clm] );
334                    return NativeType.getType( vals[0][clm] );
335            }
336    
337            /**
338             * ã“ã?オブジェクトã?æ–?­—å?表記を返ã—ã¾ã™ã?
339             * ãƒ?ƒãƒ?‚°ç”¨ã§ã™ã?
340             *
341             * @og.rev 5.6.7.0 (2013/07/27) æ–°è¦è¿½åŠ?
342             *
343             * @return æ–?­—å?表ç¾
344             * @see java.lang.Object#toString()
345             */
346            @Override
347            public String toString() {
348                    StringBuilder buf = new StringBuilder();
349    
350                    buf.append( "NAMES=" ).append( Arrays.toString( names ) ).append( CR )
351                            .append( " COL_LEN=" ).append( (names != null) ? names.length : -1 ).append( CR )
352                            .append( " ROW_LEN=" ).append( (vals  != null) ? vals.length  : -1 ).append( CR ) ;
353    
354                    return buf.toString();
355            }
356    }