/*
* 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.Date;
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.commons.field.ALDateTimeField;
import com.aimluck.eip.common.ALCsvAbstractSelectData;
import com.aimluck.eip.common.ALCsvTokenizer;
import com.aimluck.eip.common.ALDBErrorException;
import com.aimluck.eip.common.ALPageNotFoundException;
import com.aimluck.eip.fileio.util.FileIOScheduleCsvUtils;
import com.aimluck.eip.modules.actions.common.ALAction;
import com.aimluck.eip.orm.query.ResultList;
import com.aimluck.eip.services.storage.ALStorageService;
import com.aimluck.eip.util.ALLocalizationUtils;
/**
* CSV ファイルから読み込んだスケジュール情報を表示するクラス.
*
*
*/
public class FileIOScheduleCsvSelectData extends
ALCsvAbstractSelectData<FileIOScheduleCsvData, FileIOScheduleCsvData> {
/** logger */
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(FileIOScheduleCsvSelectData.class.getName());
/** 時間を表すフィールドを自動補完するか否か */
private String autotime_flg;
private Date now;
/**
* 初期化 <BR>
*/
@Override
public void init(ALAction action, RunData rundata, Context context)
throws ALPageNotFoundException, ALDBErrorException {
super.init(action, rundata, context);
now = new Date();
}
/**
* 各フィールドの初期化
*/
@Override
public void initField() {
autotime_flg = "";
super.initField();
}
/**
* スケジュール一覧を取得します。 <BR>
*
* @param rundata
* @param context
* @return
*/
@Override
protected ResultList<FileIOScheduleCsvData> selectList(RunData rundata,
Context context) {
String filepath;
try {
if (stats == ALCsvTokenizer.CSV_LIST_MODE_READ) {
return new ResultList<FileIOScheduleCsvData>(
readScheduleInfoFromCsv(rundata));
} else if (stats == ALCsvTokenizer.CSV_LIST_MODE_NO_ERROR) {
filepath =
FileIOScheduleCsvUtils.getScheduleCsvFolderName(getTempFolderIndex())
+ ALStorageService.separator()
+ FileIOScheduleCsvUtils.FOLDER_TMP_FOR_USERINFO_CSV_FILENAME;
return new ResultList<FileIOScheduleCsvData>(
readScheduleInfoFromCsvPage(rundata, filepath, (rundata
.getParameters()
.getInteger("csvpage") - 1), ALCsvTokenizer.CSV_SHOW_SIZE));
} else if (stats == ALCsvTokenizer.CSV_LIST_MODE_ERROR) {
filepath =
FileIOScheduleCsvUtils.getScheduleCsvFolderName(getTempFolderIndex())
+ ALStorageService.separator()
+ FileIOScheduleCsvUtils.FOLDER_TMP_FOR_USERINFO_CSV_TEMP_FILENAME;
return new ResultList<FileIOScheduleCsvData>(
readScheduleInfoFromCsvPage(
rundata,
filepath,
0,
ALCsvTokenizer.CSV_SHOW_ERROR_SIZE));
} else {
return null;
}
} catch (Exception ex) {
logger.error("fileio", ex);
return null;
}
}
/**
* @param rundata
* @param context
* @return
*/
@Override
protected FileIOScheduleCsvData selectDetail(RunData rundata, Context context) {
return null;
}
/**
* CSVファイルを読み込んで表示用リストを作成します <BR>
*
* @param rundata
* @return
* @throws Exception
*/
private List<FileIOScheduleCsvData> readScheduleInfoFromCsv(RunData rundata)
throws Exception {
String filepath =
FileIOScheduleCsvUtils.getScheduleCsvFolderName(getTempFolderIndex())
+ ALStorageService.separator()
+ FileIOScheduleCsvUtils.FOLDER_TMP_FOR_USERINFO_CSV_FILENAME;
String filepath_err =
FileIOScheduleCsvUtils.getScheduleCsvFolderName(getTempFolderIndex())
+ ALStorageService.separator()
+ FileIOScheduleCsvUtils.FOLDER_TMP_FOR_USERINFO_CSV_TEMP_FILENAME;
ALCsvTokenizer reader = new ALCsvTokenizer();
if (!reader.init(filepath)) {
return null;
}
List<FileIOScheduleCsvData> list = new ArrayList<FileIOScheduleCsvData>();
int ErrCount = 0;// エラーが発生した回数
String token;
int i, j;
int line = 0;
String ErrorCode = "";
while (reader.eof != -1) {
line++;
StringBuffer e_line = new StringBuffer();
List<String> errmsg = new ArrayList<String>();
FileIOScheduleCsvFormData formData = new FileIOScheduleCsvFormData();
formData.initField();
formData.setIsAutoTime(autotime_flg);
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.adjust();
formData.adjustUser(errmsg);
formData.setValidator();
formData.validate(errmsg);
try {
FileIOScheduleCsvData data = setupData(formData, errmsg, line);
if (errmsg.size() > 0) {
ErrorCode += e_line.toString();
ErrorCode += "," + Integer.toString(line) + ",false";
ErrorCode += "\n";
data.setIsError(true);
}
if (!formData.getUserFullName().toString().equals(
ALLocalizationUtils.getl10n("FILEIO_NAME"))) {
if (ErrCount == 0) {
if (errmsg.size() == 0) {
if (list.size() < ALCsvTokenizer.CSV_SHOW_SIZE) {
list.add(data);
}
} else {
// list.clear();// エラーが初めて発生した場合。
list.add(data);
ErrCount++;
}
} else {
if (errmsg.size() > 0) {
ErrCount++;
}
list.add(data);
}
} else {
if (ErrCount > 0) {
ErrCount--;
}
int lc = getLineCount();
setLineCount(lc - 1);
}
if (ErrCount >= ALCsvTokenizer.CSV_SHOW_ERROR_SIZE) {
break;
}
} catch (Exception e) {
logger.error("readError", e);
}
if (reader.eof == -1) {
break;
}
}
setErrorCount(ErrCount);
if (ErrCount > 0) {
outputErrorData(rundata, ErrorCode, filepath_err);
}
return list;
}
private FileIOScheduleCsvData setupData(FileIOScheduleCsvFormData formData,
List<String> errmsg, int line) throws Exception {
FileIOScheduleCsvData data = new FileIOScheduleCsvData();
data.initField();
ALDateTimeField date =
new ALDateTimeField(ALDateTimeField.DEFAULT_DATE_TIME_FORMAT);
data.setUserNameString(formData.getUserNameString());
data.setLoginNameString(formData.getLoginNameString());
data.setLineCount(line);
data.setName(formData.getScheduleName().getValue());
if (data.getName().toString().equals("")) {
errmsg.add("schedule title have no content");
}
data.setPlace(formData.getPlace().getValue());
data.setNote(formData.getNote().getValue());
try {
date.setValue(formData.getCreateDate().toString());
data.setUpdateDate(date.getValue());
} catch (Exception e) {
data.setUpdateDate(now);
}
try {
date.setValue(formData.getStartDateTime().toString());
data.setStartDate(date.getValue());
} catch (Exception e) {
errmsg.add("start date is null");
}
try {
date.setValue(formData.getEndDateTime().toString());
data.setEndDate(date.getValue());
} catch (Exception e) {
errmsg.add("end date is null");
}
data.setIsError(errmsg.size() > 0);
return data;
}
/**
*
* @param rundata
* @return
* @throws Exception
*/
private List<FileIOScheduleCsvData> readScheduleInfoFromCsvPage(
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<FileIOScheduleCsvData> list = new ArrayList<FileIOScheduleCsvData>();
String token;
int i, j;
int line = 0;
while (reader.eof != -1) {
boolean iserror = false;
line++;
List<String> errmsg = new ArrayList<String>();
FileIOScheduleCsvFormData formData = new FileIOScheduleCsvFormData();
formData.initField();
formData.setIsAutoTime(autotime_flg);
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);
}
}
}
if (stats == ALCsvTokenizer.CSV_LIST_MODE_ERROR) {
token = reader.nextToken();
}
while ((!reader.line) && (reader.eof != -1)) {
reader.nextToken();
}
if (formData.getUserFullName().toString().equals(
ALLocalizationUtils.getl10n("FILEIO_NAME"))) {
continue;
}
if (reader.eof == -1 && j == 0) {
break;
}
formData.adjust();
formData.adjustUser(errmsg);
formData.setValidator();
if (!formData.validate(errmsg)) {
iserror = true;
}
if (stats == ALCsvTokenizer.CSV_LIST_MODE_ERROR) {
iserror = true;
}
try {
FileIOScheduleCsvData data = setupData(formData, errmsg, line);
data.setIsError(iserror);
list.add(data);
} catch (Exception e) {
logger.error("readError", e);
}
if (reader.eof == -1) {
break;
}
}
return list;
}
/**
* 時刻を自動入力する場合はここで"1"を入力します <BR>
*
* @param flag
*/
public void setIsAutoTime(String flag) {
autotime_flg = flag;
}
public String getLineCount2() {
return ALLocalizationUtils.getl10nFormat(
"FILEIO_ERROR_NUMBER",
getLineCount(),
getErrorCount());
}
public String getLineCount3() {
return ALLocalizationUtils.getl10nFormat(
"FILEIO_REGISTER_NUMBER",
getLineCount(),
getNotErrorCount());
}
}