Installation des SQL-Moduls von Cocoon

Andreas Popper


Inhaltsverzeichnis

1 Vorbemerkungen
Dokumentationen
Relationale Datenbank
2 Konfigurationen
Cocoon
JDBC-Treiber für PostgreSQL-7.0.3
Systemkonfigurationen von Linux
RedHat 6.2
SuSE 6.4, 7.1:
Tomcat
3 Cocoons SQL-Modul in Aktion

Kapitel 1. Vorbemerkungen

Dokumentationen

SQL-Modul: http://linuxtest.ki.ision.net/cocoon/docs/sql/html

PostgreSQL:
1. /usr/doc/postgresql-7.0.3: Doku

2. http://www.postgresql.org/docs/awbook.html: Handbuch!

Relationale Datenbank

Nach Installieren der Datenbank PostgreSQL-7.0.3 (s.dort) wird vom User root die Datenbank root erzeugt, darin eine Tabelle namens test angelegt und zwei Datensätze aus Namen und Vornamen hineingeschrieben sowie ein Primärschlüssel bestimmt:

CREATE TABLE test (
name_id SERIAL PRIMARY KEY,
Vorname CHAR(15),
Nachname CHAR(20)
);

Kapitel 2. Konfigurationen

Cocoon

In der Datei:
/usr/local/jakarta/dist/tomcat/cocoon/WEB-INF/cocoon.properties
wird, sofern notwendig, die Zeile einkommentiert:

processor.type.sql =
org.apache.cocoon.processor.sql.SQLProcessor

JDBC-Treiber für PostgreSQL-7.0.3

Von der PostgreSQL-JDBC-Homepage:
http://www.retep.org.uk/postgres
wird der Treiber für PostgreSQL-7.0.3 heruntergeladen nach:
/home/geronimo/sql/postgres/source/jdbc
und kopiert nach:
/usr/local/postgresql-7.0.3/src/jdbc/jdbc7.0-1.1.jar

JDBC-Test:

Die Funktion von JDBC lässt sich mit folgendem kleinen Java-Programm testen:


import java.sql.*;

public class sample2 {

  public static void main (String[] args) throws SQLException, 
                                                 ClassNotFoundException {

    Class.forName("org.postgresql.Driver");		// load JDBC driver

    // establish a connection with the desired database
    Connection db = 
      DriverManager.getConnection(
        "jdbc:postgresql://localhost/test",  //  url database
        "user", 															// username
        "password");													// password

    // set up a query to run
    PreparedStatement st = db.prepareStatement("SELECT * FROM statename ");

    // run the query to produce a ResultSet
    ResultSet rs = st.executeQuery();
    int numCols  = rs.getMetaData().getColumnCount();

    // print out the contents of the ResultSet
    while (rs.next()) {
      for (int j=1; j <= numCols; j++) 
	System.out.print(rs.getString(j) + "  ");
      System.out.println();
    }

    // close the resources 
    rs.close();
    st.close();
    db.close();
  }
}

In PostgreSQL muss vorher mit: createdb test die Datenbank test angelegt und anschließend darin die Tabelle statename erzeugt werden.

Außerdem muss der User Postgres in:
/usr/local/pgsql/bin
mit: pg_ctl stop und pg_ctl start die neuen Einstellungen wirksam machen.

Systemkonfigurationen von Linux

Inhaltsverzeichnis

RedHat 6.2
SuSE 6.4, 7.1:

RedHat 6.2

Damit PostgreSQL auch auf TCP/IP Aufrufe hört -- sowohl JDBC als auch das Tcl-Frontend PgAccess benutzen sie -- muss in:
/etc/rc.d/initd/postgres
die Zeile einkommentiert:

# Add the "-i" option to enable TCP/IP sockets in addition
# to unix domain sockets.  This is needed for Java´s JDBC
#
PGOPTS="-i"
sowie die Umgebungsvariable POSTMASTER mit dem -i -Flag versehen werden:
POSTMASTER=postmaster -i 

Danach muss PostgreSQL noch mitgeteilt werden, dass JDBC das Recht hat, sie zu bemühen. Entsprechend werden in:
/usr/local/pgsql/data/pg_hba.conf
Die Zeilen eingetragen:

host    root        192.168.128.125  255.255.255.0      trust 
host    geronimo    192.168.128.125  255.255.255.0      trust
host    xml         192.168.128.125  255.255.255.0      trust 

SuSE 6.4, 7.1:

In der Datei: /etc/rc.config findet sich bezüglich PostgreSQL folgende Passage:

#
# Should the postgres daemon be startet automatically on system startup?
#
START_POSTGRES="yes"

#
# In which directory should the PostgreSQL database reside?
#
POSTGRES_DATADIR="/usr/local/pgsql/data"

#
# The options that are given to the PostgreSQL master daemon on startup.
# See the manual pages for postmaster and postgres for valid options.
# Don´t put "-D datadir" here since it is set by the startup script.
# Don´t change this, unless you know what you do.
#
POSTGRES_OPTIONS="-i"
sowie im Verzeichnis /etc/init.d/ die für PostgreSQL zuständige Startdatei postgres, in der dem System mitgeteilt werden muss, wo sich die für PostgreSQL relevanten Verzeichnisse befinden:
H=/usr/local/pgsql/bin/postmaster 
LOGFILE=/usr/local/pgsql/log/postgresql.log
DATADIR=/usr/local/pgsql/data
. /etc/rc.config 

Tomcat

Tomcat und damit Cocoon muss mitgeteilt werden, wo sie JDBC finden können. Das geschieht, indem das jdbc7.0-1.1.jar-Archiv in das lib-Verzeichnis von tomcat kopiert wird: /usr/local/jakarta/dist/tomcat/lib

Außerdem müssen Tomcat in: $TOMCAT_HOME/conf/server.xml die Zugangsdaten für die Datenbank mitgeteilt werden:


    driverName="org.postgresql.Driver"
    connectionURL="jdbc:postgresql://localhost.html"
    connectionName="root"
    connectionPassword="foo"

wobei hier xml der Name der Datenbank ist.

Kapitel 3. Cocoons SQL-Modul in Aktion

In PostgreSQL muss die Datenbank: root erzeugt werden und darin eine Tabelle test, die einige Adressbuchzeilen enthält mit den Bezeichnungen:
Vorname
Nachname
telefonnr
strasse
hausnr
plz
ort

Im .xml-File wird die Anfrage an die Datenbank in der SQL-Notation gestellt:

<query connection="foo">
  select * from test
  </query>
Alle anderen Angaben dienen der Identifikation des Benutzers und der aufgerufenen Datenbank.

Das .xsl-Stylesheet verarbeitet die Antwort der Datenbank, die via SQL-Modul in XML angeliefert wird. Hier ist HTML das schließliche Ausgabeformat, es könnte aber auch ein beliebig anderes sein.

xml-File und xsl-Stylesheet orientieren sich an den Anweisungen in:
/usr/local/apache/htdocs/cocoon/docs/sql.html, der offiziellen Cocoon-Dokumentation.

.xml-File:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="sql02.xsl" type="text/xsl"?>

<?cocoon-process type="sql"?>
<?cocoon-process type="xslt"?>

<page>
  <connectiondefs>
    <connection name="foo">	<!-- beliebiger Name -->
      <driver>org.postgresql.Driver</driver>
      <dburl>jdbc:postgresql://localhost/root</dburl>
    	<username>root</username>
		<password>foo</password>
	</connection>
  </connectiondefs>
  
  <tab>
  <query connection="foo">
  select * from test
  </query>
  </tab>
  <sqlerror message="The database server is on fire"/>
</page>

.xsl-Stylesheet

<?xml version="1.0"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

  <xsl:template match="page">
   	<xsl:processing-instruction name="cocoon-format">
   		type="text/html"
	</xsl:processing-instruction>
   <html>
    <head>
     <title>
     PostgreSQL Search Results
     </title>
    </head>
    <body bgcolor="#FFF8DC">
	<font face="helvetica">
    <h1>PostgreSQL</h1>
     <xsl:apply-templates/>
	 </font>
    </body>
   </html>
  </xsl:template>
  
 <xsl:template match="tab">
 	<table border="2" cellspacing="0"
	 cellpadding="6" bordercolor='#000099' bgcolor="#CCCCFF">
		<tr>
			<th>Vorname</th>
			<th>Nachname</th>
			<th>Telefon-Nr.</th>
			<th>Strasse</th>
			<th>Hausnr.</th>
			<th>PLZ</th>
			<th>Ort</th>
		</tr>
			<xsl:apply-templates/>
		</table>
 </xsl:template>

 <xsl:template match="ROW">
	
	<tr>
     <xsl:apply-templates select="Vorname"/>
	 <xsl:apply-templates select="Nachname"/>
	 <xsl:apply-templates select="telefonnr"/>
	 <xsl:apply-templates select="strasse"/>
	 <xsl:apply-templates select="hausnr"/>
	 <xsl:apply-templates select="plz"/>
	 <xsl:apply-templates select="ort"/>
	 
     </tr>
	
  </xsl:template>

  <xsl:template match="Vorname">
	 <td>
      <xsl:apply-templates/>
	 </td>
  </xsl:template>
  
  <xsl:template match="Nachname">
  	 <td>
      <xsl:apply-templates/>
	 </td>
  </xsl:template>
  
  <xsl:template match="telefonnr"> 	 
	 <td>
      <xsl:apply-templates/>
	 </td>
  </xsl:template>
  
<xsl:template match="strasse"> 	 
	 <td>
      <xsl:apply-templates/>
	 </td>
  </xsl:template>
  
  <xsl:template match="hausnr">	 
	 <td>
      <xsl:apply-templates/>
	 </td>
  </xsl:template>
  
  <xsl:template match="plz">
	 <td>
      <xsl:apply-templates/>
	 </td>
  </xsl:template>
  
  <xsl:template match="ort">
	 <td>
      <xsl:apply-templates/>
	 </td>
  </xsl:template>

</xsl:stylesheet>

Der xml-File wird aufgerufen mit:
http://localhost/cocoon/cocoon_sql/sql01.xml
und liefert die Ausgabe der Datenbank, entsprechend dem xsl-Stylesheet formatiert, zurück (s. o.).