com.silverwrist.dynamo.security.AuditWriteOps_mysql.java Source code

Java tutorial

Introduction

Here is the source code for com.silverwrist.dynamo.security.AuditWriteOps_mysql.java

Source

/*
 * The contents of this file are subject to the Mozilla Public License Version 1.1
 * (the "License"); you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
 * 
 * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
 * WARRANTY OF ANY KIND, either express or implied. See the License for the specific
 * language governing rights and limitations under the License.
 * 
 * The Original Code is the Venice Web Communities System.
 * 
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
 * for Silverwrist Design Studios.  Portions created by Eric J. Bowersox are
 * Copyright (C) 2002 Eric J. Bowersox/Silverwrist Design Studios.  All Rights Reserved.
 * 
 * Contributor(s): 
 */
package com.silverwrist.dynamo.security;

import java.sql.*;
import java.util.*;
import org.apache.commons.collections.*;
import com.silverwrist.util.*;
import com.silverwrist.dynamo.except.*;
import com.silverwrist.dynamo.iface.*;
import com.silverwrist.dynamo.util.*;

public class AuditWriteOps_mysql extends AuditWriteOps {
    /*--------------------------------------------------------------------------------
     * Attributes
     *--------------------------------------------------------------------------------
     */

    private DBUtilities m_utils; // reference to utilities object
    private PropertySerializer m_psz; // property serializer object
    private ReferenceMap m_eventid_cache; // private event ID cache

    /*--------------------------------------------------------------------------------
     * Constructor
     *--------------------------------------------------------------------------------
     */

    public AuditWriteOps_mysql(DBConnectionPool pool) {
        super(pool);
        m_utils = (DBUtilities) (pool.queryService(DBUtilities.class));
        m_psz = (PropertySerializer) (pool.queryService(PropertySerializer.class));
        m_eventid_cache = new ReferenceMap(ReferenceMap.SOFT, ReferenceMap.SOFT);

    } // end constructor

    /*--------------------------------------------------------------------------------
     * Abstract implementations from class AuditWriteOps
     *--------------------------------------------------------------------------------
     */

    void writeAuditRecord(PropertyKey event, java.util.Date timestamp, int uid, int subid, String ip,
            Object[] props) throws DatabaseException {
        Connection conn = null;
        PreparedStatement stmt = null;
        Statement stmt2 = null;
        try { // get a connection
            conn = getConnection();
            stmt2 = conn.createStatement();

            // First subphase is to get the event ID corresponding to this event; if it doesn't exist,
            // we need to create it.
            int event_id = -1;
            Integer id_val = (Integer) (m_eventid_cache.get(event));
            if (id_val != null) // found it in our own cache
                event_id = id_val.intValue();
            if (event_id < 0) { // OK, we didn't find it locally, go out to the database and look.
                ResultSet rs = null;
                try { // lock the "auditevent" table until we can do what we have to
                    stmt2.executeUpdate("LOCK TABLES auditevent WRITE;");

                    // look up the event ID
                    stmt = conn.prepareStatement(
                            "SELECT eventid FROM auditevent WHERE event_nsid = ? " + "AND event_name = ?;");
                    stmt.setInt(1, event.getNamespaceID());
                    stmt.setString(2, event.getName());
                    rs = stmt.executeQuery();
                    if (rs.next())
                        event_id = rs.getInt(1);
                    else { // insert a new record and get a new, dynamically-generated event ID
                        SQLUtils.shutdown(stmt);
                        stmt = conn
                                .prepareStatement("INSERT INTO auditevent (event_nsid, event_name) VALUES (?, ?);");
                        stmt.setInt(1, event.getNamespaceID());
                        stmt.setString(2, event.getName());
                        stmt.executeUpdate();
                        event_id = MySQLUtils.getLastInsertInt(conn);

                    } // end else

                } // end try
                finally { // unlock the table once we're done here
                    MySQLUtils.unlockTables(conn);
                    SQLUtils.shutdown(rs);

                } // end finally

                m_eventid_cache.put(event, new Integer(event_id)); // and cache it for next time

            } // end if

            try { // lock the "audit" table for writing
                stmt2.executeUpdate("LOCK TABLES audit WRITE;");

                // prepare the big statement
                stmt = conn.prepareStatement("INSERT INTO audit (on_date, event, uid, subid, ip, prop0, prop1, "
                        + "prop2, prop3, prop4, prop5, prop6, prop7) VALUES "
                        + "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
                m_utils.setDateTime(stmt, 1, timestamp);
                stmt.setInt(2, event_id);
                stmt.setInt(3, uid);
                stmt.setInt(4, subid);
                stmt.setString(5, ip);
                for (int i = 0; i < props.length; i++) { // set all the property values
                    if (props[i] == null)
                        stmt.setNull(6 + i, Types.VARCHAR);
                    else { // serialize the property
                        String s = m_psz.serializeProperty(props[i]);
                        if (s == null)
                            throw new DatabaseException(AuditWriteOps_mysql.class, "SecurityMessages",
                                    "audit.serialize");
                        stmt.setString(6 + i, s);

                    } // end else

                } // end for

                stmt.executeUpdate(); // chunk it out!

            } // end try
            finally { // and unlock this table once we're done here
                MySQLUtils.unlockTables(conn);

            } // end finally

        } // end try
        catch (SQLException e) { // translate to a general DatabaseException
            throw generalException(e);

        } // end catch
        finally { // shut everything down
            SQLUtils.shutdown(stmt);
            SQLUtils.shutdown(stmt2);
            SQLUtils.shutdown(conn);

        } // end finally

    } // end writeAuditRecord

} // end class AuditWriteOps_mysql