public void shutdown() { synchronized (lock) { shutdownRequested = true; } /* Now close the ServerSocket */ try { new Socket(sock.getInetAddress(), sock.getLocalPort()).close(); } catch (IOException ex) { Ganymede.stackTrace(ex); } }
public void createSession(String personaName) { try { /* Snag the appropriate Admin Persona from the database */ DBObject persona = (DBObject) ((DBObjectBase) Ganymede.db.get("Admin Persona")).get(personaName); /* If there is a user associated with this persona, snag it */ DBObject user = null; InvidDBField userField = (InvidDBField) persona.get("User"); if (userField != null) { user = (DBObject) userField.getVal(); } /* Now we have all we need to create the session */ session = new GanymedeSession(personaName, user, persona, false); } catch (RemoteException ex) { Ganymede.stackTrace(ex); return; } interp.set("session", session); }
/** * This method is used to scan the persistent log storage for log events that match invid and that * have occurred since sinceTime. * * @param invid If not null, retrieveHistory() will only return events involving this object * invid. * @param sinceTime if not null, retrieveHistory() will only return events occuring on or after * the time specified in this Date object. * @param beforeTime if not null, retrieveHistory() will only return events occurring on or before * the time specified in this Date object. * @param keyOnAdmin if true, rather than returning a string containing events that involved * <invid>, retrieveHistory() will return a string containing events performed on behalf * of the administrator with invid <invid>. * @param fullTransactions if true, the buffer returned will include all events in any * transactions that involve the given invid. if false, only those events in a transaction * directly affecting the given invid will be returned. * @param getLoginEvents if true, this method will return only login and logout events. if false, * this method will return no login and logout events. * @return A human-readable multiline string containing a list of history events */ public StringBuffer retrieveHistory( Invid invid, Date sinceTime, Date beforeTime, boolean keyOnAdmin, boolean fullTransactions, boolean getLoginEvents) { if (con == null) { throw new IllegalArgumentException("no connection to postgres database"); } StringBuffer buffer = new StringBuffer(); Date transDate = null; String prevTransID = null; String transAdmin = null; ResultSet rs = null; /* -- */ try { if (keyOnAdmin) { rs = queryEventsByAdmin(invid, sinceTime, beforeTime); } else if (fullTransactions) { rs = queryEventsByTransactions(invid, sinceTime, beforeTime); } else { rs = queryEvents(invid, sinceTime, beforeTime); } while (rs.next()) { long time = rs.getLong(1); String token = rs.getString(2); String adminName = rs.getString(3); String text = rs.getString(4); String transactionID = rs.getString(5); if (invid.getType() == SchemaConstants.UserBase) { if (token.equals("normallogin") || token.equals("normallogout") || token.equals("abnormallogout")) { if (!getLoginEvents) { continue; // we don't want to show login/logout activity here } } else if (getLoginEvents) { continue; // we don't want to show non-login/logout activity here } } if (prevTransID != null && !prevTransID.equals(transactionID)) { buffer.append( "---------- End Transaction " + transDate.toString() + ": " + transAdmin + " ----------\n\n"); transAdmin = null; transDate = null; prevTransID = null; } if (token.equals("starttransaction")) { transDate = new Date(time); String tmp2 = "---------- Transaction " + transDate.toString() + ": " + adminName + " ----------\n"; // remember our admin name and transaction id so we // can put out a notice about closing the previous // transaction when we see it transAdmin = adminName; prevTransID = transactionID; buffer.append(tmp2); } else if (token.equals("finishtransaction")) { String tmp2 = "---------- End Transaction " + new Date(time).toString() + ": " + adminName + " ----------\n\n"; prevTransID = null; transAdmin = null; transDate = null; buffer.append(tmp2); } else { String tmp = token + "\n" + WordWrap.wrap(text, 78, "\t") + "\n"; buffer.append(tmp); } } } catch (SQLException ex) { Ganymede.debug("SQLException in retrieveHistory: " + ex.getMessage()); Ganymede.debug("** SQLState: " + ex.getSQLState()); Ganymede.debug("** SQL Error Code: " + ex.getErrorCode()); Ganymede.debug(Ganymede.stackTrace(ex)); return buffer; } finally { try { if (rs != null) { rs.close(); Statement st = rs.getStatement(); if (st != null) { st.close(); } } } catch (SQLException ex) { } } return buffer; }
/** * This method writes the given event to the persistent storage managed by this controller. * * @param event The DBLogEvent to be recorded */ public synchronized void writeEvent(DBLogEvent event) { if (con == null) { throw new IllegalArgumentException("no connection to postgres database"); } try { if (statement == null) { statement = con.prepareStatement( "insert into event (event_id, javatime, sqltime, classtoken, " + "admin_invid, admin_name, trans_id, text) " + "values (?,?,?,?,?,?,?,?)"); } if (event.eventClassToken.equals("starttransaction")) { transactionID = event.transactionID; } primaryKey++; statement.setInt(1, primaryKey); statement.setLong(2, event.time.getTime()); statement.setTimestamp(3, new java.sql.Timestamp(event.time.getTime())); statement.setString(4, event.eventClassToken); if (event.admin != null) { statement.setString(5, event.admin.toString()); } else { statement.setNull(5, java.sql.Types.VARCHAR); } if (event.adminName != null) { statement.setString(6, event.adminName); } else { statement.setNull(5, java.sql.Types.VARCHAR); } if (event.transactionID != null) { statement.setString(7, event.transactionID); } else { statement.setNull(5, java.sql.Types.VARCHAR); } if (event.description != null) { statement.setString(8, event.description); } else { statement.setNull(5, java.sql.Types.VARCHAR); } statement.addBatch(); for (String address : event.getMailTargets()) { statement.addBatch( "insert into email (event_id, address) values(" + primaryKey + ", '" + address + "')"); } for (Invid invid : event.getInvids()) { statement.addBatch( "insert into invids (invid, event_id) values('" + invid.toString() + "'," + primaryKey + ")"); } // if we had successfully logged our entire transaction, // record a mapping in the transactions table from each // invid in the transaction (which are recorded in the // starttransaction line) to the transaction id // // if we get a transactionID mismatch we won't record anything // // we reset the transactionID and transInvids List // pointer in any event if (event.eventClassToken.equals("finishtransaction")) { if (transactionID != null && transactionID.equals(event.transactionID)) { for (Invid invid : event.getInvids()) { statement.addBatch( "insert into transactions (invid, trans_id) values('" + invid.toString() + "','" + transactionID + "')"); } } transactionID = null; } statement.executeBatch(); statement.clearParameters(); } catch (SQLException ex) { Ganymede.debug("SQLException in spinLog: " + ex.getMessage()); Ganymede.debug("** SQLState: " + ex.getSQLState()); Ganymede.debug("** SQL Error Code: " + ex.getErrorCode()); Ganymede.debug(Ganymede.stackTrace(ex)); Ganymede.debug("Event was " + event.toString()); return; } }