/*
* Created on 20.05.2005
* Author: Moritz Kroll
*/
package jplagAdminTool;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
import java.util.Vector;
import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
import jplagWsClient.jplagClient.UserData;
import jplagWsClient.jplagClient.UserDataArray;
public class UserTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private static final long MILLISECS_PER_DAY = 1000 * 60 * 60 * 24;
public static final int USERNAME=0;
public static final int CREATED=1;
public static final int CREATEDBY=2;
public static final int EXPIRES=3;
public static final int DURATION=4;
public static final int LASTUSAGE=5;
public static final int NUMSUBS=6;
public static final int REALNAME=7;
public static final int EMAIL=8;
public static final int STATE=9;
private int userstate=0;
private String[] columnNames = { "Username", "Created", "CreatedBy",
"Expires", "Duration", "Last usage", "Subs", "Realname", "EMail", "State"};
Vector<BackedUserData> userDataVector = null;
public void setAdminState(int ustate) {
userstate=ustate;
}
public int getAdminState() {
return userstate;
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
if(userDataVector == null) return 0;
return userDataVector.size();
}
public String getColumnName(int col) {
return columnNames[col];
}
@SuppressWarnings("unchecked")
public Class getColumnClass(int col) {
if(isDate(col)) return Date.class;
if(col==NUMSUBS || col==DURATION) return Integer.class;
return Object.class;
}
public boolean isCellEditable(int row, int col) {
if(col == DURATION) return false;
if((userstate & BackedUserData.MASK_JPLAGADMIN)==0)
{
return col!=CREATED && col!=CREATEDBY && col!=LASTUSAGE &&
col!=NUMSUBS;
}
return true;
}
public boolean isDate(int col) {
switch(col)
{
case CREATED:
case EXPIRES:
case LASTUSAGE:
return true;
default:
return false;
}
}
public static String formatCalendar(Calendar cal) {
if(cal==null) return "No date";
DateFormat df=DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.GERMAN);
return df.format(cal.getTime());
}
/**
* Accepts both dd.MM.yy and dd.MM.yyyy formats
*/
private Calendar parseCalendar(String string)
throws ParseException
{
Calendar cal=new GregorianCalendar(TimeZone.getTimeZone("GMT"));
SimpleDateFormat sdf2=new SimpleDateFormat("dd.MM.yy");
SimpleDateFormat sdf4=new SimpleDateFormat("dd.MM.yyyy");
sdf2.setLenient(false);
sdf4.setLenient(false);
Date date;
try
{
date=sdf2.parse(string);
}
catch(ParseException e)
{
date=sdf4.parse(string);
}
cal.setTime(date);
return cal;
}
public Object getValueAt(int row, int col) {
if(userDataVector==null || row>=userDataVector.size())
return "Illegal getValueAt call";
UserData ud=(UserData) userDataVector.get(row);
switch(col)
{
case USERNAME: return ud.getUsername();
// case CREATED: return formatCalendar(ud.getCreated());
case CREATED: return ud.getCreated().getTime();
case CREATEDBY: return ud.getCreatedBy();
// case EXPIRES: return formatCalendar(ud.getExpires());
case EXPIRES:
return (ud.getExpires()==null ? null
: ud.getExpires().getTime());
case DURATION:
if(ud.getExpires() == null) return -1;
return (int)((ud.getExpires().getTimeInMillis()
- ud.getCreated().getTimeInMillis()) / MILLISECS_PER_DAY);
// case LASTUSAGE: return formatCalendar(ud.getLastUsage());
case LASTUSAGE:
return (ud.getLastUsage()==null ? null
: ud.getLastUsage().getTime());
case NUMSUBS: return new Integer(ud.getNumOfSubs());
case REALNAME: return ud.getRealName();
case EMAIL: return ud.getEmail();
case STATE: return BackedUserData.getStateName(ud.getState());
default: return "Illegal column";
}
}
public boolean isChanged(String orig,String newone) {
if((orig==null || orig.length()==0)!=(newone.length()==0)) return true;
if(orig==null || orig.length()==0) return false;
return !orig.equals(newone);
}
public void setValueAt(Object val, int row, int col) {
if(userDataVector==null)
{
System.out.println("Illegal setValueAt call!");
return;
}
BackedUserData ud=(BackedUserData) userDataVector.get(row);
try {
boolean changed=false;
switch(col)
{
case USERNAME:
if(isChanged(ud.getUsername(),(String)val))
{
ud.setUsername((String)val);
changed=true;
}
break;
case CREATED:
{
Calendar newcal=parseCalendar((String)val);
if(ud.getCreated().after(newcal) ||
ud.getCreated().before(newcal))
{
ud.setCreated(newcal);
changed=true;
}
break;
}
case CREATEDBY:
if(isChanged(ud.getCreatedBy(),(String)val))
{
ud.setCreatedBy((String)val);
changed=true;
}
break;
case EXPIRES:
if(((String)val).equals(""))
{
if(ud.getExpires()!=null)
{
ud.setExpires(null);
changed=true;
}
}
else
{
Calendar newcal=parseCalendar((String)val);
if(ud.getExpires()==null
|| ud.getExpires().after(newcal)
|| ud.getExpires().before(newcal))
{
ud.setExpires(newcal);
changed=true;
}
}
break;
case LASTUSAGE:
if(((String)val).equals(""))
{
if(ud.getLastUsage()!=null)
{
ud.setLastUsage(null);
changed=true;
}
}
else
{
Calendar newcal=parseCalendar((String)val);
if(ud.getLastUsage().after(newcal) ||
ud.getLastUsage().before(newcal))
{
ud.setLastUsage(newcal);
changed=true;
}
}
break;
case NUMSUBS:
{
int newval=Integer.parseInt((String)val);
if(ud.getNumOfSubs()!=newval)
{
ud.setNumOfSubs(newval);
changed=true;
}
break;
}
case REALNAME:
if(isChanged(ud.getRealName(),(String) val))
{
ud.setRealName((String) val);
changed=true;
}
break;
case EMAIL:
if(isChanged(ud.getEmail(),(String) val))
{
ud.setEmail((String) val);
changed=true;
}
break;
case STATE:
{
int newval=BackedUserData.getStateInt((String)val);
if(ud.getState()!=newval)
{
if((newval & BackedUserData.MASK_DEACTIVATED) == 0 &&
ud.getExpires()!=null)
{
Calendar cal=Calendar.getInstance(
TimeZone.getTimeZone("GMT"));
if(cal.after(ud.getExpires()))
{
if((ud.getState() & BackedUserData.MASK_EXPIRED) == 0)
{
ud.setState(ud.getState() | BackedUserData.MASK_EXPIRED);
changed=true;
}
break;
}
}
ud.setState(newval);
changed=true;
}
break;
}
}
if(changed)
{
fireTableChanged(new TableModelEvent(this,row,row,col));
}
}
catch(ParseException ex) {} // replace wrong cells by orginal ones
catch(NumberFormatException ex) {} // dito
}
public boolean isValid(int row, int col) {
if(col==USERNAME || col==CREATEDBY || col==REALNAME || col==EMAIL)
{
Object obj=getValueAt(row,col);
if(obj==null || obj.toString().length()==0) return false;
}
return true;
}
public void setUserDataArray(UserDataArray userarray) {
UserData[] dataArray=userarray.getItems();
userDataVector=new Vector<BackedUserData>(dataArray.length,3);
for(int i=0;i<dataArray.length;i++)
{
userDataVector.add(new BackedUserData(dataArray[i]));
}
fireTableDataChanged();
}
public void addNewUser(UserData data) {
if(userDataVector==null)
{
System.out.println("addNewUser(UserData): userDataVector==null!!");
return;
}
BackedUserData bud=new BackedUserData(data);
userDataVector.add(bud);
fireTableDataChanged();
}
public void removeUser(String user) {
for(int i=0;i<userDataVector.size();i++)
{
if(((BackedUserData) userDataVector.get(i)).getOrigUsername().
equals(user)) {
userDataVector.remove(i);
fireTableRowsDeleted(i,i);
return;
}
}
}
public boolean existsDoubled(String user) {
int numfound=0;
for(int i=0;i<userDataVector.size();i++)
{
if(((BackedUserData) userDataVector.get(i)).getUsername().
equals(user))
numfound++;
}
return numfound>=2;
}
public int getUserState(String user) {
for(int i=0;i<userDataVector.size();i++)
{
BackedUserData data=(BackedUserData) userDataVector.get(i);
if(data.getUsername().equals(user))
return data.getState();
}
return 0;
}
public BackedUserData getBackedUserData(int index) {
return (BackedUserData) userDataVector.get(index);
}
}