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.hayabusa.report2; 017 018 import java.util.ArrayList; 019 import java.util.List; 020 021 import org.opengion.hayabusa.common.HybsSystemException; 022 023 /** 024 * シート単位?content.xmlを管?るため?クラスです? 025 * シート?ヘッ??、行?配?、フ?ー及?シート名を管?ます? 026 * 027 * @og.group 帳票シス? 028 * 029 * @version 4.0 030 * @author Hiroki.Nakamura 031 * @since JDK1.6 032 */ 033 class OdsSheet { 034 035 //======== content.xmlのパ?スで使用 ======================================== 036 037 /* 行?開始終?グ */ 038 private static final String ROW_START_TAG = "<table:table-row "; 039 private static final String ROW_END_TAG = "</table:table-row>"; 040 041 /* シート名を取得するため?開始終??*/ 042 private static final String SHEET_NAME_START = "table:name=\""; 043 private static final String SHEET_NAME_END = "\""; 044 045 /* 変数定義の開始終?字及び区???*/ 046 private static final String VAR_START = "{@"; 047 private static final String VAR_END = "}"; 048 private static final String VAR_CON = "_"; 049 050 /* ラインコピ??? 5.0.0.2 (2009/09/15) */ 051 private static final String LINE_COPY = "LINECOPY"; 052 053 private final List<String> sheetRows = new ArrayList<String>(); 054 private String sheetHeader; 055 private String sheetFooter; 056 private String sheetName; 057 private String origSheetName; 058 private String confSheetName; 059 060 /** 061 * シートを行単位に?します? 062 * 063 * @og.rev 5.0.0.2 (2009/09/15) ボディ部のカウントを引数に追?、LINECOPY機?実?? 064 * @og.rev 5.2.1.0 (2010/10/01) シート名定義対? 065 * 066 * @param sheet シート名 067 * @param bodyRowCount 行番号 068 */ 069 public void analyze( final String sheet, final int bodyRowCount ) { 070 String[] tags = TagParser.tag2Array( sheet, ROW_START_TAG, ROW_END_TAG ); 071 sheetHeader = tags[0]; 072 sheetFooter = tags[1]; 073 for( int i = 2; i < tags.length; i++ ) { 074 sheetRows.add( tags[i] ); 075 lineCopy( tags[i], bodyRowCount ); // 5.0.0.2 (2009/09/15) 076 } 077 078 sheetName = TagParser.getValueFromTag( sheetHeader, SHEET_NAME_START, SHEET_NAME_END ); 079 origSheetName = sheetName; 080 081 confSheetName = null; 082 if( sheetName != null ) { 083 int cnfIdx = sheetName.indexOf( "__" ); 084 if( cnfIdx > 0 && !sheetName.endsWith( "__" ) ) { 085 confSheetName = sheetName.substring( cnfIdx + 2 ); 086 sheetName = sheetName.substring( 0, cnfIdx ); 087 } 088 } 089 } 090 091 /** 092 * ラインコピ?に関する処?行います? 093 * 094 * {@LINE_COPY}が存在した場合に、テーブルモ??? 095 * 行をコピ?します? 096 * そ?際?{@xxx_y}のyをカウントア??してコピ?します? 097 * 098 * 整合?等?エラーハンドリングはこ?メソ?では行わず? 099 * 実際のパ?ス処?で行います? 100 * 101 * @og.rev 5.0.0.2 (2009/09/15) 追? 102 * @og.rev 5.1.8.0 (2010/07/01) パ?ス処???実?変更 103 * 104 * @param row 105 * @param rowCount 106 */ 107 private void lineCopy( final String row, final int rowCount ) { 108 // int preOffset = -1; 109 // int curOffset = -1; 110 // 111 // preOffset = row.indexOf( VAR_START + LINE_COPY ); 112 // // こ?段階で存在しなければ即終? 113 // if( preOffset < 0 ) { return; } 114 // 115 // curOffset = row.indexOf( VAR_END, preOffset ); 116 // String lcKey = row.substring( preOffset + VAR_START.length(), curOffset ); 117 // StringBuilder tmpBuf = new StringBuilder( row ); 118 // if( LINE_COPY.equals( OdsParseUtil.checkKey( lcKey, tmpBuf ) ) ) { 119 // // 存在すれば??ブルモ?行数-1回ルー?自身を除くた? 120 // for( int i = 1; i < rowCount; i++ ) { 121 // tmpBuf = new StringBuilder(); 122 // preOffset = -1; 123 // curOffset = 0; 124 // while( ( preOffset = row.indexOf( VAR_START, preOffset + 1 ) ) >= 0 ) { 125 // tmpBuf.append( row.substring( curOffset, preOffset ) ); 126 // curOffset = row.indexOf( VAR_END, preOffset + 1 ) + VAR_END.length(); 127 // 128 // // {@XXXX_XX}のXXXX_XXの部? 129 // String key = row.substring( preOffset + VAR_START.length(), curOffset - VAR_END.length() ); 130 // key = OdsParseUtil.checkKey( key, tmpBuf ); 131 // // 不整合?returnで何もしな?返しておく 132 // int keyCheck = key.indexOf( '<' ); 133 // if( keyCheck >= 0 ) { return; } 134 // tmpBuf.append( VAR_START ).append( incrementKey( key, i ) ).append( VAR_END ); 135 // } 136 // tmpBuf.append( row.substring( curOffset, row.length() ) ); 137 // 138 // sheetRows.add( tmpBuf.toString() ); // シートに追? 139 // } 140 // } 141 142 // こ?段階で存在しなければ即終? 143 int lcStrOffset = row.indexOf( VAR_START + LINE_COPY ); 144 if( lcStrOffset < 0 ) { return; } 145 int lcEndOffset = row.indexOf( VAR_END, lcStrOffset ); 146 if( lcEndOffset < 0 ) { return; } 147 148 StringBuilder lcStrBuf = new StringBuilder( row ); 149 String lcKey = TagParser.checkKey( row.substring( lcStrOffset + VAR_START.length(), lcEndOffset ), lcStrBuf ); 150 if( lcKey == null || !LINE_COPY.equals( lcKey ) ) { return; } 151 152 // 存在すれば??ブルモ?行数-1回ルー?自身を除くた? 153 for( int i = 1; i < rowCount; i++ ) { 154 final int cRow = i; 155 String rowStr = new TagParser() { 156 @Override 157 protected void exec( final String str, final StringBuilder buf, final int offset ) { 158 String key = TagParser.checkKey( str, buf ); 159 if( key.indexOf( '<' ) >= 0 ){ 160 String errMsg = "[ERROR]PARSE:{@と}の整合?が不正です?変数??特定???に書式設定がされて?可能性があります?キー=" + key; 161 throw new HybsSystemException( errMsg ); 162 } 163 buf.append( VAR_START ).append( incrementKey( key, cRow ) ).append( VAR_END ); 164 } 165 }.doParse( lcStrBuf.toString(), VAR_START, VAR_END, false ); 166 sheetRows.add( rowStr ); 167 } 168 } 169 170 /** 171 * xxx_yのy部?引数??て返します? 172 * yが数字でな??合や、_が無??合?そ?まま返します? 173 * 174 * @og.rev 5.0.0.2 LINE_COPYで利用するために追? 175 * 176 * @param key 177 * @param inc 178 * 179 * @return 変更後キー 180 */ 181 private String incrementKey( final String key, final int inc ) { 182 int conOffset = key.lastIndexOf( VAR_CON ); 183 if( conOffset < 0 ) { return key; } 184 185 String name = key.substring( 0, conOffset ); 186 int rownum = -1; 187 try { 188 rownum = Integer.valueOf( key.substring( conOffset + VAR_CON.length(), key.length() ) ); 189 } 190 // エラーが起きてもなにもしな?? 191 catch( NumberFormatException ex ) {} 192 193 // アン??スコア後が数字に変換できな??合?ヘッ??として認? 194 if( rownum < 0 ){ return key; } 195 else { return name + VAR_CON + ( rownum + inc ); } 196 } 197 198 /** 199 * シート?ヘッ??部?返します? 200 * 201 * @return ヘッ?? 202 */ 203 public String getHeader() { 204 return sheetHeader; 205 } 206 207 /** 208 * シート?フッター部?返します? 209 * 210 * @return フッター 211 */ 212 public String getFooter() { 213 return sheetFooter; 214 } 215 216 /** 217 * シート名称を返します? 218 * 219 * @return シート名称 220 */ 221 public String getSheetName() { 222 return sheetName; 223 } 224 225 /** 226 * 定義済シート名称を返します? 227 * 228 * @og.rev 5.2.1.0 (2010/10/01) シート名定義対? 229 * 230 * @return 定義済シート名称 231 */ 232 public String getConfSheetName() { 233 return confSheetName; 234 } 235 236 /** 237 * 定義名変換前?シート名称を返します? 238 * 239 * @og.rev 5.2.1.0 (2010/10/01) シート名定義対? 240 * 241 * @return 定義済シート名称 242 */ 243 public String getOrigSheetName() { 244 return origSheetName; 245 } 246 247 /** 248 * シート??を配?で返します? 249 * 250 * @og.rev 4.3.1.1 (2008/08/23) あらかじめ??な配?の長さを確保しておきます? 251 * 252 * @return シート???配? 253 */ 254 public String[] getRows() { 255 return sheetRows.toArray( new String[sheetRows.size()] ); 256 } 257 } 258