/* * Aipo is a groupware program developed by TOWN, Inc. * Copyright (C) 2004-2015 TOWN, Inc. * http://www.aipo.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.aimluck.eip.fileio; import java.util.ArrayList; import java.util.List; import org.apache.jetspeed.services.logging.JetspeedLogFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogger; import org.apache.turbine.util.RunData; import org.apache.velocity.context.Context; import com.aimluck.eip.common.ALCsvAbstractSelectData; import com.aimluck.eip.common.ALCsvTokenizer; import com.aimluck.eip.fileio.util.FileIOAccountCsvUtils; import com.aimluck.eip.orm.query.ResultList; import com.aimluck.eip.services.storage.ALStorageService; import com.aimluck.eip.util.ALLocalizationUtils; /** * CSV ファイルから読み込んだ部署情報を表示するクラス. * */ public class FileIOAccountPostCsvSelectData extends ALCsvAbstractSelectData<FileIOAccountPostCsvData, FileIOAccountPostCsvData> { /** logger */ private static final JetspeedLogger logger = JetspeedLogFactoryService .getLogger(FileIOAccountPostCsvSelectData.class.getName()); /** * CSVファイルから部署情報を取得します <BR> */ @Override protected ResultList<FileIOAccountPostCsvData> selectList(RunData rundata, Context context) { String filepath; try { if (stats == ALCsvTokenizer.CSV_LIST_MODE_READ) { return new ResultList<FileIOAccountPostCsvData>( readAccountInfoFromCsv(rundata)); } else if (stats == ALCsvTokenizer.CSV_LIST_MODE_NO_ERROR) { filepath = FileIOAccountCsvUtils .getAccountPostCsvFolderName(getTempFolderIndex()) + ALStorageService.separator() + FileIOAccountCsvUtils.CSV_ACCOUNT_POST_TEMP_FILENAME; return new ResultList<FileIOAccountPostCsvData>( readAccountInfoFromCsvPage(rundata, filepath, (rundata .getParameters() .getInteger("csvpage") - 1), ALCsvTokenizer.CSV_SHOW_SIZE)); } else if (stats == ALCsvTokenizer.CSV_LIST_MODE_ERROR) { if (this.error_count > 0) { filepath = FileIOAccountCsvUtils .getAccountPostCsvFolderName(getTempFolderIndex()) + ALStorageService.separator() + FileIOAccountCsvUtils.CSV_ACCOUNT_POST_TEMP_ERROR_FILENAME; } else { return null; } return new ResultList<FileIOAccountPostCsvData>( readAccountInfoFromCsvPage( rundata, filepath, 0, ALCsvTokenizer.CSV_SHOW_ERROR_SIZE)); } else { return null; } } catch (Exception ex) { logger.error("fileio", ex); return null; } } /** * CSVファイルを読み込んで表示用リストを作成します <BR> * * @param rundata * @return * @throws Exception */ private List<FileIOAccountPostCsvData> readAccountInfoFromCsv(RunData rundata) throws Exception { String filepath = FileIOAccountCsvUtils.getAccountPostCsvFolderName(getTempFolderIndex()) + ALStorageService.separator() + FileIOAccountCsvUtils.CSV_ACCOUNT_POST_TEMP_FILENAME; String filepath_err = FileIOAccountCsvUtils.getAccountPostCsvFolderName(getTempFolderIndex()) + ALStorageService.separator() + FileIOAccountCsvUtils.CSV_ACCOUNT_POST_TEMP_ERROR_FILENAME; ALCsvTokenizer reader = new ALCsvTokenizer(); if (!reader.init(filepath)) { return null; } List<FileIOAccountPostCsvData> list = new ArrayList<FileIOAccountPostCsvData>(); int ErrCount = 0;// エラーが発生した回数 String token; int i, j, k; int line = 0; String ErrorCode = ""; List<FileIOAccountPostCsvData> collectList = new ArrayList<FileIOAccountPostCsvData>(); while (reader.eof != -1) { line++; StringBuffer e_line = new StringBuffer(); boolean b_err = false; List<String> errmsg = new ArrayList<String>(); FileIOAccountPostCsvFormData formData = new FileIOAccountPostCsvFormData(); formData.initField(); e_line.append(""); for (j = 0; j < sequency.size(); j++) { token = reader.nextToken(); if (j > 0) { e_line.append(","); } e_line.append("\""); e_line.append(makeOutputItem(token)); e_line.append("\""); i = Integer.parseInt((String) sequency.get(j)); formData.addItemToken(token, i); if (reader.eof == -1) { break; } if (reader.line) { break; } } while ((!reader.line) && (reader.eof != -1)) { reader.nextToken(); } if (reader.eof == -1 && j == 0) { break; } // カンマ不足対策 for (j++; j < sequency.size(); j++) { i = Integer.parseInt((String) sequency.get(j)); formData.addItemToken("", i); e_line.append(",\"\""); } formData.setValidator(); if (!formData.validate(errmsg)) { b_err = true; } if (reader.eof == -1) { break; } try { FileIOAccountPostCsvData data = new FileIOAccountPostCsvData(); data.initField(); data.setLineCount(line); data.setPostName(formData.getPostName().getValue()); data.setSamePost(formData.getSamePost()); data.setZipcode(formData.getZipcode().getValue()); data.setAddress(formData.getAddress().getValue()); data.setOutTelephone(formData.getOutTelephone().getValue()); data.setInTelephone(formData.getInTelephone().getValue()); data.setFaxNumber(formData.getFaxNumber().getValue()); FileIOAccountPostCsvData pdata; // 同じデータがないか判別 for (k = 0; k < collectList.size(); k++) { pdata = collectList.get(k); if (data.getPostName().getValue().equals( pdata.getPostName().getValue())) { data.setSamePost(true); b_err = true; } } /** 部署名が空白の場合はエラー */ if (data.getPostName().toString().equals("")) { b_err = true; } data.setIsError(b_err); if (b_err) { ErrorCode += e_line.toString(); ErrorCode += "," + Integer.toString(line); ErrorCode += "\n"; } else { collectList.add(data); } if (!formData.getPostName().toString().equals( ALLocalizationUtils.getl10n("FILIIO_UNIT_NAME"))) { if (ErrCount == 0) { if (!b_err) { if (list.size() < ALCsvTokenizer.CSV_SHOW_SIZE) { list.add(data); } } else { // list.clear();// エラーが初めて発生した場合。 list.add(data); ErrCount++; } } else { if (b_err) { ErrCount++; } list.add(data); } } else { if (ErrCount > 0) { ErrCount--; } int lc = getLineCount(); setLineCount(lc - 1); } if (ErrCount >= ALCsvTokenizer.CSV_SHOW_ERROR_SIZE) { break; } } catch (RuntimeException e) { logger.error("readError"); } catch (Exception e) { logger.error("readError"); } if (reader.eof == -1) { break; } } collectList.clear(); collectList = null; setErrorCount(ErrCount); if (ErrCount > 0) { outputErrorData(rundata, ErrorCode, filepath_err); } return list; } /** * CSVファイルを読み込んでページ毎の表示用リストを作成します <BR> * * @param rundata * @param filepath * @param StartLine * @param LineLimit * @return * @throws Exception */ private List<FileIOAccountPostCsvData> readAccountInfoFromCsvPage( RunData rundata, String filepath, int StartLine, int LineLimit) throws Exception { int line_index = StartLine * ALCsvTokenizer.CSV_SHOW_SIZE; ALCsvTokenizer reader = new ALCsvTokenizer(); if (!reader.setStartLine(filepath, line_index)) { return null; } List<FileIOAccountPostCsvData> list = new ArrayList<FileIOAccountPostCsvData>(); String token; int i, j; int line = 0; while (reader.eof != -1) { line++; if (line > LineLimit) { break; } List<String> errmsg = new ArrayList<String>(); FileIOAccountPostCsvFormData formData = new FileIOAccountPostCsvFormData(); formData.initField(); for (j = 0; j < sequency.size(); j++) { token = reader.nextToken(); i = Integer.parseInt((String) sequency.get(j)); formData.addItemToken(token, i); if (reader.eof == -1) { break; } if (reader.line) { break; } if (j == sequency.size() - 1) { if (stats == ALCsvTokenizer.CSV_LIST_MODE_ERROR) { token = reader.nextToken(); line = Integer.parseInt(token); } } } while ((!reader.line) && (reader.eof != -1)) { reader.nextToken(); } formData.setValidator(); boolean iserror = !(formData.validate(errmsg)); if (reader.eof == -1) { break; } try { FileIOAccountPostCsvData data = new FileIOAccountPostCsvData(); data.initField(); data.setLineCount(line + line_index); data.setPostName(formData.getPostName().getValue()); data.setSamePost(formData.getSamePost()); data.setZipcode(formData.getZipcode().getValue()); data.setAddress(formData.getAddress().getValue()); data.setOutTelephone(formData.getOutTelephone().getValue()); data.setInTelephone(formData.getInTelephone().getValue()); data.setFaxNumber(formData.getFaxNumber().getValue()); data.setIsError(iserror); if (!formData.getPostName().toString().equals( ALLocalizationUtils.getl10n("FILIIO_UNIT_NAME"))) { list.add(data); } } catch (Exception e) { logger.error("readError"); } if (reader.eof == -1) { break; } } return list; } public String getLineCount2() { return ALLocalizationUtils.getl10nFormat( "FILEIO_ERROR_NUMBER", getLineCount(), getErrorCount()); } public String getLineCount3() { return ALLocalizationUtils.getl10nFormat( "FILEIO_REGISTER_NUMBER", getLineCount(), getNotErrorCount()); } }