StatusAnzeiger.java
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 sqlFunktionthrows 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!=nullcon.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