001 /*
002 * Created on 09.04.2004
003 */
004 package de.fub.tip.datenbank.logik;
005 import java.sql.Connection;
006 import java.sql.PreparedStatement;
007 import java.sql.ResultSet;
008 import java.sql.SQLException;
009 import java.sql.Statement;
010
011 import javax.sql.DataSource;
012
013 import org.apache.log4j.Logger;
014
015 import de.fub.tip.datenanzeige.ormapper.EinzeilerVO;
016 import de.fub.tip.datenbank.factory.LogicObject;
017
018 /**
019 * Sinn: Diese Klasse implementiert die Logik zur Status-Anzeige
020 * Dabei gibt es verschiedene Aufrufe zur:
021 * <ul>
022 * <li>Postgis-Version</li>
023 * <li>PostgreSQL-Version</li>
024 * <li>Anzahl der angemeldeten Besucher/User</li>
025 * </ul>
026 *
027 * @author hirsch, 09.04.2004
028 * @version 2004-04-11
029 * $Id: StatusAnzeiger.java,v 1.10 2004/05/13 12:13:39 hirsch Exp $
030 *
031 */
032 public class StatusAnzeiger implements LogicObject {
033 /** eigener Logger für Fehler */
034 private static Logger logger =
035 Logger.getLogger(ThemenBearbeiter.class);
036
037 /** Datenbankverbindung der Komponente */
038 private Connection con = null;
039 /** Datenbankstatement */
040 private Statement statement = null;
041 /** Datenbankstatement, das parametrisiert werden kann */
042 private PreparedStatement prepStatement = null;
043 /** Ergebnis der Abfragen */
044 private ResultSet rs = null;
045 /** STRUTS-Datenquelle aus dem Verbindungspool */
046 private DataSource dataSource = null;
047 /** Inhalt der Statuszeile als Einzeiler kodiert */
048 private EinzeilerVO ergebnis = null;
049
050 /**
051 * startet den Prüfer im aktuellen Request,
052 * damit Zugriff auf die DB möglich wird.
053 * @param dataSource von Action
054 */
055 public StatusAnzeiger(DataSource dataSource) {
056 logger.debug("StatusAnzeiger startet...");
057 this.dataSource = dataSource;
058 this.ergebnis = new EinzeilerVO();
059 } // end of Konstruktor
060
061 /**
062 * bestimmt die verwendete PostGIS-Version als <code>EinzeilerVO</code>
063 * @return PostgisVersion
064 * @throws SQLException,
065 * wenn beim Auslesen aus der DB Probleme auftauchen
066 */
067 public EinzeilerVO getPostgisVer() throws SQLException {
068 return this.getResult("postgis_version()");
069 } // end of getPostgisVer
070
071 /**
072 * bestimmt die verwendete PostgreSQL-Version
073 * als <code>EinzeilerVO</code>
074 *
075 * @return PostgresqlVersion
076 * @throws SQLException
077 * wenn beim Auslesen aus der DB Probleme auftauchen
078 */
079 public EinzeilerVO getPostgresVer() throws SQLException {
080 return this.getResult("version()");
081 } // end of getPostgresVer
082
083 /**
084 * bestimmt die Anzahl der angemeldeten Benutzer als
085 * <code>EinzeilerVO</code> durch Zählung der Tupel
086 * der Datenbanktabelle USERDATA.
087 *
088 * @return Anzahl der angemeldeten Benutzer
089 * @throws SQLException
090 * wenn beim Auslesen aus der DB Probleme auftauchen
091 */
092 public EinzeilerVO getUserCount() throws SQLException {
093 return this.getResult("usercount()");
094 } // end of getUserCount
095
096 /**
097 * kapselt den Zugriff auf die Datenbank für die getter-Methoden.
098 * In den meisten Fällen werden direkt SQL-Funktionen aufgerufen, die
099 * der Funktion als Parameter dienen.<br>
100 * Um beispielsweise die aktuelle Postgres-Version abzufragen lautet
101 * der SQL-String: <code>SELECT version();</code>. Aus diesem Grund
102 * übernimmt diese Funktion dann <code>version()</code> und
103 * bastelt den Rest drumherum.<br>
104 * Das Ergebnis ist dann ein <code>EinzeilerVO</code>!
105 *
106 * @param sqlFunktion datenbanknaher Funktionsaufruf
107 * @return Ergebnis als Einzeiler
108 */
109 private EinzeilerVO getResult(String sqlFunktion) throws SQLException {
110 EinzeilerVO resultat = new EinzeilerVO();
111 String sql;
112
113 // da kein PreparedStatement geht ebend traditionell:
114 // Argumentwert bestimmt auszuführendes SELECT-Statement,
115 // da die Verwendung von PreparedStatement nicht mit
116 // Inhalten - wie Datenbankfuntionen - funktioniert.
117 if(sqlFunktion == "version()") {
118 sql = "SELECT version() AS info ";
119
120 } else if(sqlFunktion == "postgis_version()") {
121 sql = "SELECT postgis_version() AS info ";
122
123 } else if(sqlFunktion == "usercount()") {
124 sql = "SELECT count(*) AS info FROM userdata ";
125
126 } else {
127 resultat.setWert("not yet implemented");
128 logger.error("StatusAnzeiger.getResult(" + sqlFunktion +
129 "): ungültiges Argument verwendet!");
130
131 return resultat;
132 } // end if
133
134 try {
135 this.con = this.dataSource.getConnection();
136
137 // So geht es leider nicht:
138 // this.prepStatement = this.con.prepareStatement("SELECT ? AS info");
139 // this.prepStatement.setString(1, sqlFunktion);
140 // this.rs = this.prepStatement.executeQuery();
141
142 this.statement = this.con.createStatement();
143 this.rs = this.statement.executeQuery(sql);
144
145 // Auswerten und Ergebnis in EinzeilerVO packen
146 if ( this.rs != null && this.rs.next() ) {
147 resultat.setWert(rs.getString("info"));
148 logger.info("getResult = " + resultat.getWert());
149 resultat.logObject(logger);
150 } else {
151 throw new SQLException("StatusAnzeiger.getResult" +
152 "( "+ sqlFunktion + ") - Fehler beim Ergebnisauslesen aus DB.");
153 } // end if
154 resultat.logObject(logger);
155 } // end of try
156
157
158 // Datenbankverbindung schliessen
159 finally {
160 try {
161 if(con!=null) con.close();
162 logger.debug("StatusAnzeiger.getResult(): " +
163 "DB-Con geschlossen.");
164
165 } catch (SQLException e1) {
166 logger.debug("StatusAnzeiger.getResult(): " + e1);
167 logger.debug("StatusAnzeiger.getResult(): " +
168 "Fehler beim Schliessen der DB-Con: " +
169 e1.getLocalizedMessage());
170 } // end of catch
171 } // end of finally
172
173 return resultat;
174 } // end of getResult
175 } // end of class
|