/*
* 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.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.jar.Attributes;
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.cayenne.om.security.TurbineUser;
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.FileIOAccountCsvUtils;
import com.aimluck.eip.modules.actions.common.ALAction;
import com.aimluck.eip.orm.Database;
import com.aimluck.eip.orm.query.ResultList;
import com.aimluck.eip.orm.query.SelectQuery;
import com.aimluck.eip.services.storage.ALStorageService;
import com.aimluck.eip.util.ALEipUtils;
import com.aimluck.eip.util.ALLocalizationUtils;
/**
* CSV ファイルから読み込んだアカウント情報を表示するクラス.
*
*/
public class FileIOAccountCsvSelectData
extends
ALCsvAbstractSelectData<FileIOAccountCsvResultData, FileIOAccountCsvResultData> {
/** logger */
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(FileIOAccountCsvSelectData.class.getName());
/** 最大登録可能数を超えているかのフラグ */
private boolean overMaxUser = false;
/**
* 初期化
*/
@Override
public void init(ALAction action, RunData rundata, Context context)
throws ALPageNotFoundException, ALDBErrorException {
super.init(action, rundata, context);
}
/**
* アカウント一覧を取得します。 ただし、論理削除されているアカウントは取得しません。
*
* @param rundata
* @param context
* @return
*/
@Override
protected ResultList<FileIOAccountCsvResultData> selectList(RunData rundata,
Context context) {
String filepath;
try {
if (stats == ALCsvTokenizer.CSV_LIST_MODE_READ) {
return new ResultList<FileIOAccountCsvResultData>(
readAccountInfoFromCsv(rundata));
} else if (stats == ALCsvTokenizer.CSV_LIST_MODE_NO_ERROR) {
filepath =
FileIOAccountCsvUtils.getAccountCsvFolderName(getTempFolderIndex())
+ ALStorageService.separator()
+ FileIOAccountCsvUtils.CSV_ACCOUNT_TEMP_FILENAME;
return new ResultList<FileIOAccountCsvResultData>(
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.getAccountCsvFolderName(getTempFolderIndex())
+ ALStorageService.separator()
+ FileIOAccountCsvUtils.CSV_ACCOUNT_TEMP_ERROR_FILENAME;
} else {
return null;
}
return new ResultList<FileIOAccountCsvResultData>(
readAccountInfoFromCsvPage(
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 FileIOAccountCsvResultData selectDetail(RunData rundata,
Context context) {
return null;
}
/**
* CSVファイルを読み込んで表示用リストを作成します <BR>
*
* @param rundata
* @return
* @throws Exception
*/
private List<FileIOAccountCsvResultData> readAccountInfoFromCsv(
RunData rundata) throws Exception {
String filepath =
FileIOAccountCsvUtils.getAccountCsvFolderName(getTempFolderIndex())
+ ALStorageService.separator()
+ FileIOAccountCsvUtils.CSV_ACCOUNT_TEMP_FILENAME;
String filepath_err =
FileIOAccountCsvUtils.getAccountCsvFolderName(getTempFolderIndex())
+ ALStorageService.separator()
+ FileIOAccountCsvUtils.CSV_ACCOUNT_TEMP_ERROR_FILENAME;
ALCsvTokenizer reader = new ALCsvTokenizer();
if (!reader.init(filepath)) {
return null;
}
List<FileIOAccountCsvResultData> list =
new ArrayList<FileIOAccountCsvResultData>();
Map<String, TurbineUser> existedUserMap = getAllUsersFromDB();
List<String> existedCodeList = getAllUsersCodeFromDB();
if (existedUserMap == null) {
existedUserMap = new LinkedHashMap<String, TurbineUser>();
}
int ErrCount = 0;
// 同一ユーザ, 社員コードの存在を確認するために,ユーザ名と社員コードのリストを保持する.
List<String> usernameList = new ArrayList<String>();
List<String> codeList = new ArrayList<String>();
int i, j;
String token;
int line = 0;
String ErrorCode = "";
// 最終行まで読み込む
while (reader.eof != -1) {
line++;
StringBuilder e_line = new StringBuilder();
boolean same_user = false;
boolean same_code = false;
boolean b_err = false;
List<String> errmsg = new ArrayList<String>();
FileIOAccountCsvFormData formData = new FileIOAccountCsvFormData();
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(",\"\"");
}
if (formData.getUserName().toString().equals(
ALLocalizationUtils.getl10n("FILEIO_USER_NAME"))) {
setLineCount(getLineCount() - 1);
ErrorCode += e_line.toString();
ErrorCode += "," + Integer.toString(line) + ",false";
ErrorCode += "\n";
continue;
}
if (usernameList.contains(formData.getUserName().getValue())) {
// repeatUsers = true;
same_user = true;
b_err = true;
} else {
usernameList.add(formData.getUserName().getValue());
}
if (codeList.contains(formData.getCode().getValue())) {
same_code = true;
b_err = true;
} else {
if (!(formData.getCode().getValue().equals(""))) {
codeList.add(formData.getCode().getValue());
}
}
formData.setValidator();
if (!formData.validate(errmsg)) {
b_err = true;
}
try {
String username = formData.getUserName().getValue();
String code = formData.getCode().getValue();
FileIOAccountCsvResultData data = new FileIOAccountCsvResultData();
TurbineUser user = new TurbineUser();
if (existedUserMap.containsKey(username)) {
TurbineUser tmpuser2 = existedUserMap.get(username);
// same_user = true;
if ("F".equals(tmpuser2.getDisabled())) {
user.setLoginName(username);
if (!(tmpuser2.getCode().equals(code))) {
if (existedCodeList.contains(code)) {
same_code = true;
b_err = true;
} else {
// ユーザーを上書きする場合, DBから持ってきている社員コードを更新する.
if (code != null && !code.equals("")) {
existedCodeList.set(existedCodeList.indexOf(tmpuser2
.getCode()), code);
}
}
}
} else {
user.setLoginName(null);
b_err = true;
}
} else {
user.setLoginName(username);
TurbineUser newuser = new TurbineUser();
newuser.setLoginName(username);
newuser.setDisabled("F");
existedUserMap.put(username, newuser);
if (existedCodeList.contains(code)) {
same_code = true;
b_err = true;
}
}
user.setPasswordValue(formData.getPassword().getValue());
user.setFirstName(formData.getFirstName().getValue());
user.setLastName(formData.getLastName().getValue());
user.setFirstNameKana(formData.getFirstNameKana().getValue());
user.setLastNameKana(formData.getLastNameKana().getValue());
user.setEmail(formData.getEmail().getValue());
user.setOutTelephone(formData.getOutTelephone().getValue());
user.setInTelephone(formData.getInTelephone().getValue());
user.setCellularPhone(formData.getCellularPhone().getValue());
user.setCellularMail(formData.getCellularMail().getValue());
user.setCode(code);
data.initField();
data.setLineCount(line);
data.setUser(user);
data.setPostNotFound(formData.getPostNotFound());
List<String> postnames = new ArrayList<String>();
String[] st = formData.getPostName().toString().split("/");
for (int k = 0; k < st.length; k++) {
postnames.add((st[k]));
}
data.setPostName(formData.getPostName().getValue());
data.setPostNameList(postnames);
data.setPositionNotFound(formData.getPositionNotFound());
data.setPositionName(formData.getPositionName().getValue());
data.setSameUser(same_user);
data.setSameCode(same_code);
data.setIsError(b_err);
if (b_err) {
ErrorCode += e_line.toString();
ErrorCode +=
"," + Integer.toString(line) + "," + Boolean.toString(same_user);
ErrorCode += "\n";
}
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);
}
if (ErrCount >= ALCsvTokenizer.CSV_SHOW_ERROR_SIZE) {
break;
}
} catch (RuntimeException ex) {
throw ex;
} catch (Exception e) {
logger.error(e);
}
}
TurbineUser tmpuser2 = null;
int count_legitimate_user = 0;
Collection<TurbineUser> coll = existedUserMap.values();
Iterator<TurbineUser> iter = coll.iterator();
while (iter.hasNext()) {
tmpuser2 = iter.next();
if (!"T".equals(tmpuser2.getDisabled())) {
count_legitimate_user++;
}
}
int max_user = ALEipUtils.getLimitUsers();
if ((max_user > 0) && (count_legitimate_user > max_user + 2)) {
overMaxUser = true;
}
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<FileIOAccountCsvResultData> 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;
}
Map<String, TurbineUser> existedUserMap = getAllUsersFromDB();
if (existedUserMap == null) {
existedUserMap = new LinkedHashMap<String, TurbineUser>();
}
List<String> existedCodeList = getAllUsersCodeFromDB();
List<FileIOAccountCsvResultData> list =
new ArrayList<FileIOAccountCsvResultData>();
String token;
int i, j;
int line = 0;
while (reader.eof != -1) {
boolean iserror = false;
boolean same_user = false;
boolean same_code = false;
line++;
if (line > LineLimit) {
break;
}
List<String> errmsg = new ArrayList<String>();
FileIOAccountCsvFormData formData = new FileIOAccountCsvFormData();
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);
}
}
}
if (stats == ALCsvTokenizer.CSV_LIST_MODE_ERROR) {
token = reader.nextToken();
same_user = Boolean.parseBoolean(token);
}
while ((!reader.line) && (reader.eof != -1)) {
reader.nextToken();
}
if (formData.getUserName().toString().equals(
ALLocalizationUtils.getl10n("FILEIO_USER_NAME"))) {
continue;
}
if (reader.eof == -1) {
break;
}
formData.setValidator();
if (!formData.validate(errmsg)) {
iserror = true;
}
if (stats == ALCsvTokenizer.CSV_LIST_MODE_ERROR) {
iserror = true;
}
try {
String username = formData.getUserName().getValue();
String code = formData.getUserName().getValue();
FileIOAccountCsvResultData data = new FileIOAccountCsvResultData();
data.initField();
TurbineUser user = new TurbineUser();
if (existedUserMap.containsKey(username)) {
TurbineUser tmpuser2 = existedUserMap.get(username);
// same_user = true;
if ("F".equals(tmpuser2.getDisabled())) {
user.setLoginName(username);
if (!(tmpuser2.getCode().equals(code))) {
if (existedCodeList.contains(code)) {
same_code = true;
iserror = true;
} else {
// ユーザーを上書きする場合, DBから持ってきている社員コードを更新する.
if (code != null && !code.equals("")) {
existedCodeList.set(existedCodeList.indexOf(tmpuser2
.getCode()), code);
}
}
}
} else {
user.setLoginName(null);
iserror = true;
}
} else {
user.setLoginName(username);
TurbineUser newuser = new TurbineUser();
newuser.setLoginName(username);
newuser.setDisabled("F");
existedUserMap.put(username, newuser);
if (existedCodeList.contains(code)) {
same_code = true;
iserror = true;
}
}
user.setPasswordValue(formData.getPassword().getValue());
user.setFirstName(formData.getFirstName().getValue());
user.setLastName(formData.getLastName().getValue());
user.setFirstNameKana(formData.getFirstNameKana().getValue());
user.setLastNameKana(formData.getLastNameKana().getValue());
user.setEmail(formData.getEmail().getValue());
user.setOutTelephone(formData.getOutTelephone().getValue());
user.setInTelephone(formData.getInTelephone().getValue());
user.setCellularPhone(formData.getCellularPhone().getValue());
user.setCellularMail(formData.getCellularMail().getValue());
user.setCode(formData.getCode().getValue());
data.setUser(user);
data.setLineCount(line + line_index);
List<String> postnames = new ArrayList<String>();
String[] st = formData.getPostName().toString().split("/");
for (int k = 0; k < st.length; k++) {
postnames.add((st[k]));
}
data.setPostName(formData.getPostName().getValue());
data.setPostNameList(postnames);
data.setPostNotFound(formData.getPostNotFound());
data.setPositionNotFound(formData.getPositionNotFound());
data.setPositionName(formData.getPositionName().getValue());
data.setSameUser(same_user);
data.setSameCode(same_code);
data.setIsError(iserror);
list.add(data);
} catch (RuntimeException e) {
logger.error("readError");
} catch (Exception e) {
logger.error("readError");
}
if (reader.eof == -1) {
break;
}
}
return list;
}
/**
*
* @return
*/
private Map<String, TurbineUser> getAllUsersFromDB() {
Map<String, TurbineUser> map = null;
try {
SelectQuery<TurbineUser> query = Database.query(TurbineUser.class);
List<TurbineUser> list = query.fetchList();
map = new LinkedHashMap<String, TurbineUser>();
TurbineUser user = null;
int size = list.size();
for (int i = 0; i < size; i++) {
user = list.get(i);
map.put(user.getLoginName(), user);
}
} catch (Exception ex) {
logger.error("[ALEipUtils]", ex);
// throw new ALDBErrorException();
}
return map;
}
/**
*
* @return
*/
private ArrayList<String> getAllUsersCodeFromDB() {
ArrayList<String> codeList = new ArrayList<String>();
try {
SelectQuery<TurbineUser> query = Database.query(TurbineUser.class);
List<TurbineUser> list = query.fetchList();
for (TurbineUser user : list) {
if (user.getCode() != null && !(user.getCode().equals(""))) {
codeList.add(user.getCode());
}
}
} catch (Exception ex) {
logger.error("[ALEipUtils]", ex);
// throw new ALDBErrorException();
}
return codeList;
}
/**
* @param obj
* @return
*
*/
@Override
protected Object getResultData(FileIOAccountCsvResultData obj) {
return obj;
}
/**
* @param obj
* @return
*/
@Override
protected Object getResultDataDetail(FileIOAccountCsvResultData obj) {
return null;
}
/**
* @return
*
*/
@Override
protected Attributes getColumnMap() {
Attributes map = new Attributes();
return map;
}
/**
* ユーザー数が最大値を上回っているかどうかを示す <BR>
*/
public boolean overMaxUser() {
return overMaxUser;
}
public String getLineCount2() {
return ALLocalizationUtils.getl10nFormat(
"FILEIO_ERROR_NUMBER",
getLineCount(),
getErrorCount());
}
public String getLineCount3() {
return ALLocalizationUtils.getl10nFormat(
"FILEIO_REGISTER_NUMBER",
getLineCount(),
getNotErrorCount());
}
}