/*
* 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.common;
import java.util.List;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.turbine.util.ParameterParser;
import org.apache.turbine.util.RunData;
import org.apache.turbine.util.upload.FileItem;
import org.apache.velocity.context.Context;
import com.aimluck.commons.field.ALStringField;
import com.aimluck.eip.modules.actions.common.ALAction;
import com.aimluck.eip.services.storage.ALStorageService;
import com.aimluck.eip.util.ALLocalizationUtils;
/**
* CSVデータを管理するための抽象クラスです。 <br />
*
*/
public abstract class ALCsvAbstractUploadFormData extends ALAbstractFormData {
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(ALCsvAbstractUploadFormData.class.getName());
/** 添付ファイル名の最大文字数 */
private final int FIELD_ATTACHMENT_MAX_LEN = 128;
/** 受信した添付ファイル */
private FileItem attachmentItem = null;
/** 添付ファイル名 */
private ALStringField attachmentName = null;
/** データを分割表示する際の分割数 */
protected int page_count;
/** CSVファイルの行数 */
protected int line_count;
@Override
public void init(ALAction action, RunData rundata, Context context)
throws ALPageNotFoundException, ALDBErrorException {
super.init(action, rundata, context);
page_count = 0;
line_count = 0;
}
/**
* 一時フォルダを指定します。 <br />
*
* @return
*/
public abstract String getTempFilePath();
/**
* データに値を設定します。 <br />
*
* @param rundata
* @param context
* @param msgList
* エラーメッセージのリスト
* @return TRUE 成功 FALSE 失敗
*/
@Override
protected boolean setFormData(RunData rundata, Context context,
List<String> msgList) throws ALPageNotFoundException, ALDBErrorException {
// Itemの取得
ParameterParser parser = rundata.getParameters();
attachmentItem = parser.getFileItem("attachment");
if (attachmentItem != null) {
if (attachmentItem.getSize() > 0) {
attachmentName.setValue(attachmentItem.getName());
return true;
} else {
msgList.add(ALLocalizationUtils.getl10n("COMMON_NOT_ADD_FILE_ZERO_KB"));
return false;
}
} else {
msgList.add(ALLocalizationUtils.getl10n("COMMON_NO_FILE"));
return false;
}
}
/**
*
*/
@Override
protected void setValidator() {
attachmentName.setNotNull(true);
attachmentName.limitMaxLength(FIELD_ATTACHMENT_MAX_LEN);
attachmentName.setCharacterType(ALStringField.TYPE_ALL);
}
/**
*
* @param msgList
* @return
*/
@Override
protected boolean validate(List<String> msgList) {
attachmentName.validate(msgList);
return (msgList.size() == 0);
}
/**
*
* @param rundata
* @param context
* @param msgList
* @return
*/
@Override
protected boolean loadFormData(RunData rundata, Context context,
List<String> msgList) {
return true;
}
/**
*
* @param rundata
* @param context
* @param msgList
* @return
*/
@Override
protected boolean insertFormData(RunData rundata, Context context,
List<String> msgList) {
return false;
}
/**
*
* @param rundata
* @param context
* @param msgList
* @return
*/
@Override
protected boolean updateFormData(RunData rundata, Context context,
List<String> msgList) {
try {
String filepath = getTempFilePath();
ALStorageService.createNewFile(attachmentItem.getInputStream(), filepath);
ALCsvTokenizer reader = new ALCsvTokenizer();
if (!reader.init(filepath)) {
return false;
}
try {
page_count = 0;
line_count = 0;
while (reader.eof != -1) {
for (int i = 0; i < ALCsvTokenizer.CSV_SHOW_SIZE; i++) {
while (reader.eof != -1) {
reader.nextToken();
if (reader.eof == -1) {
break;
}
if (reader.line) {
break;
}
}
if (reader.eof == -1) {
break;
}
line_count++;
}
page_count++;
}
} catch (Exception e) {
}
} catch (Exception ex) {
logger.error("ALCsvAbstractUploadFormData.updateFormData", ex);
return false;
}
return true;
}
/**
*
* @param rundata
* @param context
* @param msgList
* @return
*/
@Override
protected boolean deleteFormData(RunData rundata, Context context,
List<String> msgList) {
try {
ALStorageService.deleteFile(getTempFilePath());
} catch (Exception ex) {
logger.error("ALCsvAbstractUploadFormData.deleteFormData", ex);
return false;
}
return true;
}
/**
*
*/
@Override
public void initField() {
attachmentName = new ALStringField();
attachmentName.setFieldName(ALLocalizationUtils
.getl10n("COMMON_CSV_FILE_NAME"));
attachmentName.setTrim(true);
}
public int getPageCount() {
return page_count;
}
public int getLineCount() {
return line_count;
}
}