package com.idega.core.accesscontrol.data; import java.io.Serializable; import java.sql.SQLException; import java.sql.Timestamp; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.ejb.FinderException; import com.idega.data.GenericEntity; import com.idega.data.IDOException; import com.idega.data.IDOLookup; import com.idega.data.IDOLookupException; import com.idega.data.IDORelationshipException; import com.idega.data.SimpleQuerier; import com.idega.data.query.MatchCriteria; import com.idega.data.query.Order; import com.idega.data.query.SelectQuery; import com.idega.data.query.Table; import com.idega.user.data.User; import com.idega.user.data.UserHome; import com.idega.util.ArrayUtil; import com.idega.util.ListUtil; import com.idega.util.datastructures.map.MapUtil; /** * Title: idegaclasses Description: Copyright: Copyright (c) 2001 Company: * * @author <a href="mailto:aron@idega.is">aron@idega.is * @version 1.0 */ public class LoginRecordBMPBean extends GenericEntity implements LoginRecord { private static final long serialVersionUID = 1226010571114699626L; public static String getEntityTableName() { return "IC_LOGIN_REC"; } public static String getColumnLoginId() { return "IC_LOGIN_ID"; } public static String getColumnInStamp() { return "IN_STAMP"; } public static String getColumnOutStamp() { return "OUT_STAMP"; } public static String getColumnIPAddress() { return "IP"; } public static String getColumnLoginAsUser() { return "USER_ID"; } @Override public void initializeAttributes() { addAttribute(this.getIDColumnName()); addManyToOneRelationship(getColumnLoginId(), LoginTable.class); addManyToOneRelationship(getColumnLoginAsUser(), User.class); setNullable(getColumnLoginAsUser(), true); addAttribute(getColumnInStamp(), "Login Stamp", Timestamp.class); addAttribute(getColumnOutStamp(), "Logout Stamp", Timestamp.class); addAttribute(getColumnIPAddress(), "IP address", String.class, 41); addIndex("IDX_LOGIN_REC_1", getColumnLoginId()); } @Override public String getEntityName() { return getEntityTableName(); } @Override public void setLoginId(int Id) { setColumn(getColumnLoginId(), Id); } @Override public void setLogin(LoginTable login) { setColumn(getColumnLoginId(), login); } @Override public int getLoginId() { return getIntColumnValue(getColumnLoginId()); } @Override public LoginTable getLogin() { return (LoginTable) getColumnValue(getColumnLoginId()); } @Override public Timestamp getLogInStamp() { return (Timestamp) getColumnValue(getColumnInStamp()); } @Override public void setLogInStamp(Timestamp stamp) { setColumn(getColumnInStamp(), stamp); } @Override public Timestamp getLogOutStamp() { return (Timestamp) getColumnValue(getColumnOutStamp()); } @Override public void setLogOutStamp(Timestamp stamp) { setColumn(getColumnOutStamp(), stamp); } @Override public String getIPAdress() { return getStringColumnValue(getColumnIPAddress()); } @Override public void setIPAdress(String ip) { setColumn(getColumnIPAddress(), ip); } @Override public int getLoginAsUserID() { return getIntColumnValue(getColumnLoginAsUser()); } @Override public void setLoginAsUserID(int userId) { setColumn(getColumnLoginAsUser(), userId); } @Override public User getLoginAsUser() { return (User) getColumnValue(getColumnLoginAsUser()); } @Override public void setLoginAsUser(User user) { setColumn(getColumnLoginAsUser(), user); } public Collection<?> ejbFindAllLoginRecords(int loginID) throws FinderException { String sql = "select * from " + this.getTableName() + " where " + LoginRecordBMPBean.getColumnLoginId() + " = " + loginID; System.out.println("----------------"); System.out.println(sql); System.out.println("----------------"); return super.idoFindIDsBySQL(sql); } public int ejbHomeGetNumberOfLoginsByLoginID(int loginID) throws IDOException { String sql = "select count(*) from " + this.getTableName() + " where " + LoginRecordBMPBean.getColumnLoginId() + " = " + loginID; return super.idoGetNumberOfRecords(sql); } public Integer ejbFindByLoginID(int loginID) throws FinderException { Collection<?> loginRecords = idoFindAllIDsByColumnOrderedBySQL(LoginRecordBMPBean.getColumnLoginId(), loginID); if (!loginRecords.isEmpty()) { return (Integer) loginRecords.iterator().next(); } else { throw new FinderException("File was not found"); } } public java.sql.Date ejbHomeGetLastLoginByLoginID(Integer loginID) throws FinderException { StringBuffer sql = new StringBuffer(); sql.append(" select max(in_stamp) from ic_login_rec "); sql.append(" where ic_login_id = ").append(loginID); sql.append(" and in_stamp < "); sql.append(" (select max(in_stamp) from ic_login_rec where ic_login_id =").append(loginID).append(") "); try { return getDateTableValue(sql.toString()); } catch (SQLException e) { throw new FinderException(e.getMessage()); } } public java.sql.Date ejbHomeGetLastLoginByUserID(Integer userID) throws FinderException { StringBuffer sql = new StringBuffer(); sql.append(" select max(in_stamp) from ic_login_rec r, ic_login l "); sql.append(" where l.ic_login_id = r.ic_login_id "); sql.append(" and l.ic_user_id = ").append(userID); sql.append(" and in_stamp < "); sql.append(" (select max(in_stamp) from ic_login_rec r2,ic_login l2 where r2.ic_login_id = l2.ic_login_id "); sql.append(" and l2.ic_user_id = ").append(userID).append(" ) "); try { return getDateTableValue(sql.toString()); } catch (SQLException e) { throw new FinderException(e.getMessage()); } } public Object ejbFindLastLoginRecord(User user) throws FinderException { Table table = new Table(this); Table login = new Table(LoginTable.class); SelectQuery query = new SelectQuery(table); query.addColumn(table, getIDColumnName()); try { query.addJoin(table, login); } catch (IDORelationshipException ire) { throw new FinderException(ire.getMessage()); } query.addCriteria(new MatchCriteria(login, "ic_user_id", MatchCriteria.EQUALS, user)); query.addOrder(new Order(table.getColumn(getColumnInStamp()), false)); return idoFindOnePKByQuery(query); } public Map<User, Date> ejbFindLastLoginRecordsForAllUsers() throws FinderException, IDOLookupException { String query = "select l.ic_user_id, max(r.IN_STAMP) from IC_LOGIN_REC r, ic_login l where r.ic_login_id = l.ic_login_id group by l.IC_USER_ID"; List<Serializable[]> data = null; try { data = SimpleQuerier.executeQuery(query, 2); } catch (Exception e) { e.printStackTrace(); } if (ListUtil.isEmpty(data)) { return null; } Map<Integer, Date> usersIdsAndDates = new HashMap<Integer, Date>(); for (Serializable[] dataPair: data) { if (ArrayUtil.isEmpty(dataPair)) { continue; } if (dataPair.length != 2) { continue; } Serializable userId = dataPair[0]; Serializable date = dataPair[1]; if (userId instanceof Number && date instanceof Date) { usersIdsAndDates.put(((Number) userId).intValue(), (Date) date); } } if (MapUtil.isEmpty(usersIdsAndDates)) { return null; } UserHome userHome = (UserHome) IDOLookup.getHome(User.class); Collection<User> users = userHome.findByPrimaryKeyCollection(usersIdsAndDates.keySet()); if (ListUtil.isEmpty(users)) { return null; } Map<User, Date> lastLogins = new HashMap<User, Date>(); for (User user: users) { Date date = usersIdsAndDates.get(Integer.valueOf(user.getId())); if (date == null) { continue; } lastLogins.put(user, date); } return lastLogins; } public Object ejbFindPreviousLoginRecord(LoginRecord record) throws FinderException { Table table = new Table(this); SelectQuery query = new SelectQuery(table); query.addColumn(table, getIDColumnName()); query.addCriteria(new MatchCriteria(table, getColumnInStamp(), MatchCriteria.LESS, record.getLogInStamp())); query.addOrder(new Order(table.getColumn(getColumnInStamp()), false)); return idoFindOnePKByQuery(query); } }