/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.cmp2.audit.beans; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Timestamp; import java.sql.Types; import java.util.Date; import javax.ejb.CreateException; import javax.ejb.EJBException; import javax.ejb.SessionBean; import javax.ejb.SessionContext; import javax.naming.InitialContext; import javax.security.auth.login.LoginContext; import javax.sql.DataSource; import org.jboss.test.cmp2.audit.interfaces.ApplicationCallbackHandler; import org.jboss.test.cmp2.audit.interfaces.Audit; import org.jboss.test.cmp2.audit.interfaces.AuditHome; import org.jboss.test.cmp2.audit.interfaces.AuditMapped; import org.jboss.test.cmp2.audit.interfaces.AuditMappedHome; /** * Session facade for audit testing. * * @author Adrian.Brock@HappeningTimes.com * @version $Revision: 81036 $ */ public class AuditSessionBean implements SessionBean { private static final int FULL = 1; private static final int CREATE = 2; private static final int UPDATE = 3; private static final int CREATE_CHANGED_NAMES = 4; private static final int UPDATE_CHANGED_NAMES = 5; private static final int CREATE_MAPPED = 6; private static final int UPDATE_MAPPED = 7; private static String QUERY_FULL = "select audit_created_by, audit_created_time, audit_updated_by, audit_updated_time" + " from cmp2_audit where id = ?"; private static String QUERY_CREATE = "select audit_created_by, audit_created_time" + " from cmp2_audit where id = ?"; private static String QUERY_UPDATE = "select audit_updated_by, audit_updated_time" + " from cmp2_audit where id = ?"; private static String QUERY_CREATE_CHANGED_NAMES = "select createdby, createdtime" + " from cmp2_audit_changednames where id = ?"; private static String QUERY_UPDATE_CHANGED_NAMES = "select updatedby, updatedtime" + " from cmp2_audit_changednames where id = ?"; private static String QUERY_CREATE_MAPPED = "select createdby, createdtime" + " from cmp2_audit_mapped where id = ?"; private static String QUERY_UPDATE_MAPPED = "select updatedby, updatedtime" + " from cmp2_audit_mapped where id = ?"; public void createAudit(String id) { try { LoginContext login = ApplicationCallbackHandler.login("audituser1", "user1"); try { AuditHome home = getAuditEJB(); home.create(id); } finally { if (login != null) login.logout(); } } catch (Exception e) { throw new EJBException(e); } } public void updateAudit(String id, String stringValue) { try { LoginContext login = ApplicationCallbackHandler.login("audituser2", "user2"); try { AuditHome home = getAuditEJB(); Audit audit = home.findByPrimaryKey(id); audit.setStringValue(stringValue); } finally { if (login != null) login.logout(); } } catch (Exception e) { throw new EJBException(e); } } public void updateAuditWithClear(String id, String stringValue) { try { LoginContext login = ApplicationCallbackHandler.login("old-client-login", "audituser2", "user2"); try { AuditHome home = getAuditEJB(); Audit audit = home.findByPrimaryKey(id); audit.setStringValue(stringValue); } finally { if (login != null) login.logout(); } } catch (Exception e) { throw new EJBException(e); } } public void createAuditChangedNames(String id) { try { LoginContext login = ApplicationCallbackHandler.login("audituser1", "user1"); try { AuditHome home = getAuditChangedNamesEJB(); home.create(id); } finally { if (login != null) login.logout(); } } catch (Exception e) { throw new EJBException(e); } } public void updateAuditChangedNames(String id, String stringValue) { try { LoginContext login = ApplicationCallbackHandler.login("audituser2", "user2"); try { AuditHome home = getAuditChangedNamesEJB(); Audit audit = home.findByPrimaryKey(id); audit.setStringValue(stringValue); } finally { if (login != null) login.logout(); } } catch (Exception e) { throw new EJBException(e); } } public void createAuditMapped(String id) { try { LoginContext login = ApplicationCallbackHandler.login("audituser1", "user1"); try { AuditMappedHome home = getAuditMappedEJB(); home.create(id); } finally { if (login != null) login.logout(); } } catch (Exception e) { throw new EJBException(e); } } public void updateAuditMapped(String id, String stringValue) { try { LoginContext login = ApplicationCallbackHandler.login("audituser2", "user2"); try { AuditMappedHome home = getAuditMappedEJB(); AuditMapped audit = home.findByPrimaryKey(id); audit.setStringValue(stringValue); } finally { if (login != null) login.logout(); } } catch (Exception e) { throw new EJBException(e); } } public void createAuditMappedChangedFields(String id, String user, long time) { try { LoginContext login = ApplicationCallbackHandler.login("audituser1", "user1"); try { AuditMappedHome home = getAuditMappedEJB(); AuditMapped audit = home.create(id); audit.setCreatedBy(user); audit.setCreatedTime(new Date(time)); } finally { if (login != null) login.logout(); } } catch (Exception e) { throw new EJBException(e); } } public void updateAuditMappedChangedFields(String id, String stringValue, String user, long time) { try { LoginContext login = ApplicationCallbackHandler.login("audituser2", "user2"); try { AuditMappedHome home = getAuditMappedEJB(); AuditMapped audit = home.findByPrimaryKey(id); audit.setStringValue(stringValue); audit.setUpdatedBy(user); audit.setUpdatedTime(new Date(time)); } finally { if (login != null) login.logout(); } } catch (Exception e) { throw new EJBException(e); } } public String fullAuditCheck(String id, String user, long beginTime, long endTime) { try { AuditData auditData = getAuditData(id, FULL); if (user.equals(auditData.createdBy) == false) return "Expected created by to be set to " + user + " during the test but got " + auditData.createdBy; if (auditData.createdTime < beginTime || auditData.createdTime > endTime) return "Expected created time to be set between " + beginTime + "-" + endTime + " during the test but got " + auditData.createdTime; if (user.equals(auditData.updatedBy) == false) return "Expected updated by to be set to " + user + " during the test but got " + auditData.updatedBy; if (auditData.updatedTime < beginTime || auditData.updatedTime > endTime) return "Expected updated time to be set between " + beginTime + "-" + endTime + " during the test but got " + auditData.updatedTime; return null; } catch (Exception e) { throw new EJBException(e); } } public String createAuditCheck(String id, String user, long beginTime, long endTime) { return createCheck(id, CREATE, user, beginTime, endTime); } public String updateAuditCheck(String id, String user, long beginTime, long endTime) { return updateCheck(id, UPDATE, user, beginTime, endTime); } public String createAuditChangedNamesCheck(String id, String user, long beginTime, long endTime) { return createCheck(id, CREATE_CHANGED_NAMES, user, beginTime, endTime); } public String updateAuditChangedNamesCheck(String id, String user, long beginTime, long endTime) { return updateCheck(id, UPDATE_CHANGED_NAMES, user, beginTime, endTime); } public String createAuditMappedCheck(String id, String user, long beginTime, long endTime) { String failure = createCheck(id, CREATE_MAPPED, user, beginTime, endTime); if (failure != null) return failure; try { LoginContext login = ApplicationCallbackHandler.login("audituser1", "user1"); try { AuditMappedHome home = getAuditMappedEJB(); AuditMapped audit = home.findByPrimaryKey(id); if (user.equals(audit.getCreatedBy()) == false) return "Expected getter to return user from test"; long time = audit.getCreatedTime().getTime(); if (time < beginTime || time > endTime) return "Expected getter to return time from test"; return null; } finally { if (login != null) login.logout(); } } catch (Exception e) { throw new EJBException(e); } } public String updateAuditMappedCheck(String id, String user, long beginTime, long endTime) { String failure = updateCheck(id, UPDATE_MAPPED, user, beginTime, endTime); if (failure != null) return failure; try { LoginContext login = ApplicationCallbackHandler.login("audituser1", "user1"); try { AuditMappedHome home = getAuditMappedEJB(); AuditMapped audit = home.findByPrimaryKey(id); if (user.equals(audit.getUpdatedBy()) == false) return "Expected getter to return user from test"; long time = audit.getUpdatedTime().getTime(); if (time < beginTime || time > endTime) return "Expected getter to return time from test"; return null; } finally { if (login != null) login.logout(); } } catch (Exception e) { throw new EJBException(e); } } public String createCheck(String id, int type, String user, long beginTime, long endTime) { try { AuditData auditData = getAuditData(id, type); if (user.equals(auditData.createdBy) == false) return "Expected created by to be set to " + user + " during the test but got " + auditData.createdBy; if (auditData.createdTime < beginTime || auditData.createdTime > endTime) return "Expected created time to be set between " + beginTime + "-" + endTime + " during the test but got " + auditData.createdTime; return null; } catch (Exception e) { throw new EJBException(e); } } public String updateCheck(String id, int type, String user, long beginTime, long endTime) { try { AuditData auditData = getAuditData(id, type); if (user.equals(auditData.updatedBy) == false) return "Expected updated by to be set to " + user + " during the test but got " + auditData.updatedBy; if (auditData.updatedTime < beginTime || auditData.updatedTime > endTime) return "Expected updated time to be set between " + beginTime + "-" + endTime + " during the test but got " + auditData.updatedTime; return null; } catch (Exception e) { throw new EJBException(e); } } public void ejbCreate() throws CreateException { } public void setSessionContext(SessionContext ctx) { } public void ejbActivate() { } public void ejbPassivate() { } public void ejbRemove() { } private AuditData getAuditData(String id, int type) throws Exception { Connection c = getDataSource().getConnection(); PreparedStatement s = null; try { switch (type) { case FULL: s = c.prepareStatement(QUERY_FULL); break; case CREATE: s = c.prepareStatement(QUERY_CREATE); break; case UPDATE: s = c.prepareStatement(QUERY_UPDATE); break; case CREATE_CHANGED_NAMES: s = c.prepareStatement(QUERY_CREATE_CHANGED_NAMES); break; case UPDATE_CHANGED_NAMES: s = c.prepareStatement(QUERY_UPDATE_CHANGED_NAMES); break; case CREATE_MAPPED: s = c.prepareStatement(QUERY_CREATE_MAPPED); break; case UPDATE_MAPPED: s = c.prepareStatement(QUERY_UPDATE_MAPPED); break; // case CREATE_UNSECURED: // s = c.prepareStatement(QUERY_CREATE_UNSECURED); // break; // case UPDATE_UNSECURED: // s = c.prepareStatement(QUERY_UPDATE_UNSECURED); // break; } s.setString(1, id); ResultSet r = s.executeQuery(); r.next(); switch (type) { case FULL: return new AuditData(r.getString(1), getTimestamp(r, 2), r.getString(3), getTimestamp(r, 4)); case CREATE: case CREATE_CHANGED_NAMES: case CREATE_MAPPED: return new AuditData(r.getString(1), getTimestamp(r, 2), null, 0); case UPDATE: case UPDATE_CHANGED_NAMES: case UPDATE_MAPPED: return new AuditData(null, 0, r.getString(1), getTimestamp(r, 2)); } return null; } finally { if (s != null) s.close(); if (c != null) c.close(); } } private AuditHome getAuditEJB() throws Exception { return (AuditHome) new InitialContext().lookup("java:comp/env/ejb/AuditEJB"); } private AuditHome getAuditChangedNamesEJB() throws Exception { return (AuditHome) new InitialContext().lookup("java:comp/env/ejb/AuditChangedNamesEJB"); } private AuditMappedHome getAuditMappedEJB() throws Exception { return (AuditMappedHome) new InitialContext().lookup("java:comp/env/ejb/AuditMappedEJB"); } private DataSource getDataSource() throws Exception { return (DataSource) new InitialContext().lookup("java:comp/env/jdbc/DataSource"); } private static long getTimestamp(ResultSet r, int index) throws Exception { ResultSetMetaData metaData = r.getMetaData(); switch (metaData.getColumnType(index)) { case Types.DATE: return r.getDate(index).getTime(); case Types.TIMESTAMP: Timestamp timestamp = r.getTimestamp(index); long time = timestamp.getTime(); if (time % 1000 == 0) time += timestamp.getNanos() / 1000000; return time; } return -1; } public static class AuditData { public String createdBy; public long createdTime; public String updatedBy; public long updatedTime; public AuditData(String createdBy, long createdTime, String updatedBy, long updatedTime) { this.createdBy = createdBy; this.createdTime = createdTime; this.updatedBy = updatedBy; this.updatedTime = updatedTime; } } }