package is.idega.idegaweb.campus.block.phone.business;
import is.idega.idegaweb.campus.block.phone.data.PhoneFileInfo;
import is.idega.idegaweb.campus.data.AccountPhone;
import is.idega.idegaweb.campus.data.AccountPhoneHome;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.ejb.FinderException;
import javax.transaction.TransactionManager;
import com.idega.block.finance.data.Account;
import com.idega.block.finance.data.AccountPhoneEntry;
import com.idega.block.finance.data.AccountPhoneEntryHome;
import com.idega.data.IDOLookup;
import com.idega.transaction.IdegaTransactionManager;
import com.idega.util.IWTimestamp;
/**
* Title:
* Description:
* Copyright: Copyright (c) 2000-2001 idega.is All Rights Reserved
* Company: idega
*@author <a href="mailto:aron@idega.is">Aron Birkir</a>
* @version 1.1
*/
public class PhoneFileHandler {
public PhoneFileHandler() {
}
public List parseFile(File PhoneFile) {
List L = null;
try {
FileReader fin = new FileReader(PhoneFile);
LineNumberReader lin = new LineNumberReader(fin);
String line = null;
StringTokenizer st;
StringBuffer sb;
String anumber, snumber, bnumber;
int nightsec, daysec, sec;
float price;
IWTimestamp stamp;
int count = 10;
int linecount = 1;
Vector V = new Vector();
AccountPhoneEntry ape;
while ((line = lin.readLine()) != null) { //&& count != 0){
st = new StringTokenizer(line, ";");
sb = new StringBuffer();
if (st.countTokens() == 8) {
try {
anumber = st.nextToken().trim();
snumber = st.nextToken().trim();
bnumber = st.nextToken().trim();
String s = st.nextToken().trim();
stamp = parseStamp(s);
nightsec = Integer.parseInt(st.nextToken());
daysec = Integer.parseInt(st.nextToken());
sec = Integer.parseInt(st.nextToken());
price = Float.parseFloat(st.nextToken());
ape = ((AccountPhoneEntryHome) IDOLookup.getHome(AccountPhoneEntry.class)).create();
ape.setLastUpdated(IWTimestamp.getTimestampRightNow());
ape.setDayDuration(daysec);
ape.setNightDuration(nightsec);
ape.setDuration(sec);
ape.setMainNumber(anumber);
ape.setPhonedStamp(stamp.getTimestamp());
ape.setPhoneNumber(bnumber);
ape.setPrice(-price);
ape.setSubNumber(snumber);
ape.setStatus(com.idega.block.finance.data.AccountPhoneEntryBMPBean.statusUnread);
V.add(ape);
}
catch (Exception ex) {
System.err.println("error in line " + linecount);
}
L = V;
}
else {
System.err.println("error in line " + linecount + " : too few columns");
}
//System.err.println(sb.toString());
count--;
linecount++;
}
}
catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
}
catch (IOException fnfe) {
fnfe.printStackTrace();
}
return L;
}
public IWTimestamp parseStamp(String stamp) {
StringBuffer st = new StringBuffer();
if (stamp != null && stamp.length() >= 19) {
st.append(stamp.substring(0, 10));
st.append(" ");
st.append(stamp.substring(11, 13));
st.append(":");
st.append(stamp.substring(14, 16));
st.append(":");
st.append(stamp.substring(17, 19));
}
return new IWTimestamp(st.toString());
}
public void process(File PhoneFile) throws java.rmi.RemoteException,FinderException {
process3(PhoneFile);
}
public void process3(File PhoneFile) throws java.rmi.RemoteException,FinderException {
// Map M = PhoneFinder.mapOfAccountPhoneListsByPhoneNumber(null);
Map M2 = PhoneFinder.mapOfAccountsWithPhoneNumber();
//DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT,new Locale("is","IS"));
// If we can assess something
if (/*M != null &&*/ M2 != null) {
try {
long phonetime = -1;
long from = -1;
long to = -1;
//long deliverTime = -1;
//long returnTime = -1;
FileReader fin = new FileReader(PhoneFile);
LineNumberReader lin = new LineNumberReader(fin);
javax.transaction.TransactionManager t = com.idega.transaction.IdegaTransactionManager.getInstance();
try {
t.begin();
int entryFactor = -1;
String line = null;
StringTokenizer st;
StringBuffer sbError = new StringBuffer(), sbNoAccount = new StringBuffer();
String anumber, snumber, bnumber;
int nightsec, daysec, sec;
float price = 0, totPrice = 0;
IWTimestamp stamp;
int count = 10;
int linecount = 1, noAccountCount = 0, errorCount = 0, numberCount = 0;
//Vector vError = new Vector();
//Vector vNoAccount = new Vector();
Hashtable phoneNumbers = new Hashtable();
AccountPhoneEntry ape;
//Integer iAccountId;
Account eAccount;
AccountPhone ap;
Collection accountList;
AccountPhoneEntryHome apeHome = (AccountPhoneEntryHome) IDOLookup.getHome(AccountPhoneEntry.class);
AccountPhoneHome accountPhoneHome = (AccountPhoneHome) IDOLookup.getHome(AccountPhone.class);
boolean foundAccount = false;
// int listsize;
boolean cont = false;
while ((line = lin.readLine()) != null) {
//&& count != 0){
//System.err.println();
foundAccount = false;
cont = false;
st = new StringTokenizer(line, ";");
if (st.countTokens() == 8) {
ape = apeHome.create();
try {
anumber = st.nextToken().trim();
snumber = st.nextToken().trim();
bnumber = st.nextToken().trim();
String s = st.nextToken().trim();
stamp = parseStamp(s);
nightsec = Integer.parseInt(st.nextToken());
daysec = Integer.parseInt(st.nextToken());
sec = Integer.parseInt(st.nextToken());
price = Float.parseFloat(st.nextToken());
ape.setLastUpdated(IWTimestamp.getTimestampRightNow());
ape.setDayDuration(daysec);
ape.setNightDuration(nightsec);
ape.setDuration(sec);
ape.setMainNumber(anumber);
ape.setPhonedStamp(stamp.getTimestamp());
ape.setPhoneNumber(bnumber);
ape.setPrice(entryFactor * price);
ape.setSubNumber(snumber);
ape.setStatus(com.idega.block.finance.data.AccountPhoneEntryBMPBean.statusUnread);
phonetime = ape.getPhonedStamp().getTime();
cont = true;
}
catch (Exception ex) {
System.err.println("error in line " + linecount);
cont = false;
}
// valid line in file
if (cont) {
String number = ape.getSubNumber();
// account for phonenumber exist
if (phoneNumbers.containsKey(number)) {
Integer ncount = (Integer) phoneNumbers.get(number);
phoneNumbers.put(number, new Integer(ncount.intValue() + 1));
}
else {
phoneNumbers.put(number, new Integer(1));
numberCount++;
}
IWTimestamp phonedStamp = new IWTimestamp(ape.getPhonedStamp());
phonedStamp.setHour(0);
phonedStamp.setMinute(0);
phonedStamp.setSecond(0);
phonedStamp.setMilliSecond(0);
accountList = accountPhoneHome.findByPhoneNumberAndPhonedDate(number, phonedStamp.getDate());
//if (M.containsKey(number)) {
if(!accountList.isEmpty()){
//accountList = (List) M.get(number);
if (accountList != null) {
// listsize = accountList.size();
for (Iterator iter = accountList.iterator(); iter.hasNext(); ) {
ap = (AccountPhone) iter.next();
from = ap.getValidFrom().getTime();
IWTimestamp iwstamp = new IWTimestamp(ap.getValidTo().getTime());
iwstamp.setHour(23);
iwstamp.setMinute(59);
iwstamp.setSecond(59);
iwstamp.setMilliSecond(999);
to = iwstamp.getTime().getTime();
// deliverTime = ap.getDeliverTime()!=null?ap.getDeliverTime().getTime():from;
// returnTime = ap.getReturnTime()!=null?ap.getReturnTime().getTime():to;
if(from <= phonetime && phonetime <= to){
ape.setAccountId(ap.getAccountId());
ape.setStatus(com.idega.block.finance.data.AccountPhoneEntryBMPBean.statusRead);
if (M2.containsKey(ap.getAccountId())) {
eAccount = (Account) M2.get(ap.getAccountId());
eAccount.addAmount(ape.getPrice());
M2.put(ap.getAccountId(), eAccount);
}
ape.store();
foundAccount=true;
totPrice += ape.getPrice();
break;
}
else{
//System.err.println("NOS Contract "+ap.getAccountId().toString()+"\t del:"+df.format(new Date(deliverTime))+" ret:"+df.format(new Date(returnTime))+" phoned:"+new Timestamp(phonetime)+" number:"+number);
}
}
if(!foundAccount){
sbNoAccount.append(line);
sbNoAccount.append("\n");
noAccountCount++;
}
}
}
// account for phonenumber doesn�t exist
else {
sbNoAccount.append(line);
sbNoAccount.append("\n");
noAccountCount++;
}
}
// invalid line in file
else {
System.err.println("error in line " + linecount + " : parsing error");
sbError.append(line);
sbError.append("\n");
errorCount++;
}
}
else {
System.err.println("error in line " + linecount + " : too few columns");
sbError.append(line);
sbError.append("\n");
errorCount++;
}
count--;
linecount++;
} // while
Iterator It = M2.values().iterator();
while (It.hasNext()) {
eAccount = (Account) It.next();
eAccount.store();
}
PhoneFileInfo pfi = ((is.idega.idegaweb.campus.block.phone.data.PhoneFileInfoHome) com.idega.data.IDOLookup.getHomeLegacy(PhoneFileInfo.class)).createLegacy();
pfi.setDateRead(IWTimestamp.getTimestampRightNow());
pfi.setLineCount(linecount - 1);
pfi.setErrorCount(errorCount);
pfi.setNoAccountCount(noAccountCount);
pfi.setFileName(PhoneFile.getName());
pfi.setNumberCount(numberCount);
pfi.setTotalAmount(totPrice);
pfi.store();
if (errorCount > 0) {
FileWriter out = new FileWriter(new File(PhoneFile.getParentFile(), "e_" + PhoneFile.getName()));
BufferedWriter bout = new BufferedWriter(out);
bout.write(sbError.toString());
bout.close();
out.close();
}
if (noAccountCount > 0) {
FileWriter out = new FileWriter(new File(PhoneFile.getParentFile(), "n_" + PhoneFile.getName()));
BufferedWriter bout = new BufferedWriter(out);
bout.write(sbNoAccount.toString());
bout.close();
out.close();
}
t.commit();
}
catch (Exception e) {
try {
t.rollback();
}
catch (javax.transaction.SystemException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}
}
catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
}
/*catch(IOException fnfe){
fnfe.printStackTrace();
}*/
}
else {
System.err.println("no accounts behind phonenumbers");
}
}
public void processFile(String fileName) {
//System.err.println(fileName);
if (fileName != null) {
try {
File phoneFile = new File(fileName);
process3(phoneFile);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
else {
System.err.println("no filename in Campus phonefilehandler");
}
}
public void process2(File PhoneFile) {
//Map M = PhoneFinder.mapOfAccountsListsByPhoneNumber();
// If we can assess something
//if( M != null ){
try {
FileReader fin = new FileReader(PhoneFile);
LineNumberReader lin = new LineNumberReader(fin);
TransactionManager t = IdegaTransactionManager.getInstance();
String line = null;
StringTokenizer st;
StringBuffer sbError = new StringBuffer(), sbNoAccount = new StringBuffer();
String anumber, snumber, bnumber;
int nightsec, daysec, sec;
float price, totPrice = 0;
IWTimestamp stamp;
int count = 10;
int linecount = 1, noAccountCount = 0, errorCount = 0, numberCount = 0;
Vector vError = new Vector();
Vector vNoAccount = new Vector();
Vector vEntries = new Vector();
Hashtable phoneNumbers = new Hashtable();
Hashtable phoneEntries = new Hashtable();
IWTimestamp from = IWTimestamp.RightNow();
IWTimestamp to = IWTimestamp.RightNow();
AccountPhoneEntry ape;
Integer iAccountId;
Account eAccount;
boolean cont = false;
List entryList;
try {
t.begin();
while ((line = lin.readLine()) != null) { //&& count != 0){
cont = false;
st = new StringTokenizer(line, ";");
if (st.countTokens() == 8) {
ape = ((AccountPhoneEntryHome) IDOLookup.getHome(AccountPhoneEntry.class)).create();
try {
anumber = st.nextToken().trim();
snumber = st.nextToken().trim();
bnumber = st.nextToken().trim();
String s = st.nextToken().trim();
stamp = parseStamp(s);
nightsec = Integer.parseInt(st.nextToken());
daysec = Integer.parseInt(st.nextToken());
sec = Integer.parseInt(st.nextToken());
price = Float.parseFloat(st.nextToken());
ape.setLastUpdated(IWTimestamp.getTimestampRightNow());
ape.setDayDuration(daysec);
ape.setNightDuration(nightsec);
ape.setDuration(sec);
ape.setMainNumber(anumber);
ape.setPhonedStamp(stamp.getTimestamp());
ape.setPhoneNumber(bnumber);
ape.setPrice(price);
ape.setSubNumber(snumber);
ape.setStatus(com.idega.block.finance.data.AccountPhoneEntryBMPBean.statusUnread);
vEntries.add(ape);
cont = true;
}
catch (Exception ex) {
System.err.println("error in line " + linecount);
cont = false;
}
// valid line in file
if (cont) {
String number = ape.getSubNumber();
// account for phonenumber exist
if (phoneNumbers.containsKey(number)) {
Integer ncount = (Integer) phoneNumbers.get(number);
phoneNumbers.put(number, new Integer(ncount.intValue() + 1));
}
else {
phoneNumbers.put(number, new Integer(1));
numberCount++;
}
}
// invalid line in file
else {
System.err.println("error in line " + linecount + " : parsing error");
sbError.append(line);
sbError.append("\n");
errorCount++;
}
}
else {
System.err.println("error in line " + linecount + " : too few columns");
sbError.append(line);
sbError.append("\n");
errorCount++;
}
count--;
linecount++;
} // while
Map M = PhoneFinder.mapOfAccountPhoneListsByPhoneNumber(from);
if (M != null && vEntries.size() > 0) {
String number;
AccountPhone ap;
List accountList;
int listsize;
Iterator it = vEntries.iterator();
while (it.hasNext()) {
ape = (AccountPhoneEntry) it.next();
number = ape.getSubNumber();
if (M != null && M.containsKey(number)) {
accountList = (List) M.get(number);
if (accountList != null) {
listsize = accountList.size();
for (int i = 0; i < listsize; i++) {
ap = (AccountPhone) accountList.get(i);
if (ape.getPhonedStamp().getTime() <= ap.getValidTo().getTime()) {
System.err.println("ape " + ape.getSubNumber() + " account" + ap.getAccountId().intValue());
ape.setAccountId(ap.getAccountId());
}
}
}
ape.store();
}
// account for phonenumber doesn�t exist
else {
sbNoAccount.append(line);
sbNoAccount.append("\n");
noAccountCount++;
}
}
}
else
System.err.println(" no accounts ");
PhoneFileInfo pfi = ((is.idega.idegaweb.campus.block.phone.data.PhoneFileInfoHome) com.idega.data.IDOLookup.getHomeLegacy(PhoneFileInfo.class)).createLegacy();
pfi.setDateRead(IWTimestamp.getTimestampRightNow());
pfi.setLineCount(linecount - 1);
pfi.setErrorCount(errorCount);
pfi.setNoAccountCount(noAccountCount);
pfi.setFileName(PhoneFile.getName());
pfi.setNumberCount(numberCount);
pfi.setTotalAmount(totPrice);
pfi.store();
t.commit();
} catch (Exception e) {
e.printStackTrace(System.err);
try {
t.rollback();
} catch (Exception e1) {
e1.printStackTrace(System.err);
}
}
if (errorCount > 0) {
FileWriter out = new FileWriter(new File(PhoneFile.getParentFile(), "e_" + PhoneFile.getName()));
BufferedWriter bout = new BufferedWriter(out);
bout.write(sbError.toString());
bout.close();
out.close();
}
if (noAccountCount > 0) {
FileWriter out = new FileWriter(new File(PhoneFile.getParentFile(), "n_" + PhoneFile.getName()));
BufferedWriter bout = new BufferedWriter(out);
bout.write(sbNoAccount.toString());
bout.close();
out.close();
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}