Das Notes Forum

Lotus Notes / Domino Sonstiges => Java und .NET mit Notes/Domino => Thema gestartet von: qojote am 13.02.04 - 08:55:19

Titel: programm code posten zur Diskussion
Beitrag von: qojote am 13.02.04 - 08:55:19
Hi all,

in den vergangenen Monaten war ich sehr knapp mit der Zeit doch das ist jetzt zum Glück vorbei.
Ich habe einen Agent geschrieben der über JDBC Daten in einer NotesDB ergänzt nun wollt ich mal fragen ob jemand Lust hat wenn ich denn Code poste mit mir darüber zu sprechen was man wie besser machen kann und ob der Aufbau so sinnvoll ist.  Wäre bestimmt auch für die anderen Anfänger in dem Bereich Hilfreich weil sich bestimmt einige grundlegende Konzepte ableiten lassen.

Gruß
Qojote
Titel: Re:programm code posten zur Diskussion
Beitrag von: animate am 13.02.04 - 18:45:59
ja tu das doch mal. ich kann dir wahrscheinlich keine megacoolen Tipps geben, die Java selbst betreffen, aber evtl was zum Design sagen.
Titel: Re:programm code posten zur Diskussion
Beitrag von: Axel_Janssen am 13.02.04 - 21:10:15
ja. klar.
Mein Posting bezüglich source code ist vermutlich ziemlich missverständlich.
Es bezieht sich auf relativ konkrete und auch nicht raketenwissenschaftliche Dinge die mir bei der Arbeit begegnen.
Manchmal haben Kollegen konkret gute Ideen und da will ich ein bischen vorsichtig sein und das nicht im Überschwang hinausposaunen.

JDBC oder RDBMS-Zugriff allgemein ist ein mehr generelles und sowieso hervorragend dokumentiertes Thema.

Gruß Axel
Titel: Re:programm code posten zur Diskussion
Beitrag von: qojote am 13.02.04 - 23:41:51
Hi,
Jdbc RDBMS ist eben das aktuelle Programm was ich geschrieben habe mir geht es aber mehr um das Design und die no Nos zu finden.
Bei vielen Sachen die man sich selbst aneignet benutzt man oft einen zu komplizierten oder auch schlechten Weg nur weil man es besser nicht weiß und es auch so geht.
Ich sitze leider grad nicht an meinem Rechner poste meinen code morgen abend.
Gruß
qojote
Titel: Re:programm code posten zur Diskussion
Beitrag von: animate am 14.02.04 - 07:38:42
um das Design zu kommentieren, wäre dann auch eine, zumindest grobe, Liste der Anforderungen sinnvoll. Und natürlcih ein Klassendiagramm, falls sowas vorhanden ist.
Titel: Re:programm code posten zur Diskussion
Beitrag von: qojote am 15.02.04 - 00:02:17
Okay Anforderung war einfach aus einer Relationalen Db infos in eine Notesdb zu holen primärschlüssel ist die Kundennummer.

Hier der Code.

import lotus.domino.*;
import java.sql.*;
import com.ibm.as400.*;
import java.lang.*;
import java.util.*;
import java.util.Date;
import java.text.*;
public class JavaAgent extends AgentBase {

   public void NotesMain() {

      try {
            //logdateien setzen und Konfigdokumente holen         
            Session session = getSession();
            AgentContext agentContext = session.getAgentContext();
            Database db = agentContext.getCurrentDatabase();
            View view=db.getView("(agents)");
            Document doc = view.getDocumentByKey("Import",true);
            Log dblog=session.createLog(doc.getItemValueString("Log_Eintrag"));
            dblog.openNotesLog(doc.getItemValueString("Log_db_server"),doc.getItemValueString("Log_db_path"));
            
            sql sql1=new sql();
            Verarbeitung verb=new Verarbeitung(session,doc,dblog,sql1);
            verb.process();
         
            view.recycle();
            db.recycle();
         
         }
catch(Exception e) {
//System.out.println("ausstieg");         
e.printStackTrace();
      }
}
}

import lotus.domino.*;
import java.sql.*;
import com.ibm.as400.*;
import java.lang.*;
import java.util.*;
import java.util.Date;
import java.text.*;


public class Verarbeitung
{
  public Document doc;
  public Document berichtdoc;
  public Document docnl;
  public Database db2;
  public Log dbLog;
  public String server;
  public String pfad;
  public String logtext;
  public Session session;
  public DocumentCollection dc;
  public View view;
  public sql sql1;
  public int i=0;
  public String kunden;
  public String sdatum;
  public Date sdatum2;
  public SimpleDateFormat sd=new SimpleDateFormat("mm.dd.yyyy ");
  public Date ddatum=new java.util.Date();      
  public Date lastrun=new java.util.Date();
  public String createdoc;
  public String makenull;
  public String kdnrupdate="0";
  public Verarbeitung(Session session,Document doc,Log dbLog,sql sql1)

{
   this.doc=doc;
   this.session=session;
   this.dbLog=dbLog;
   this.sql1=sql1;
try {   
this.dc=doc.getResponses();
}
catch(Exception e) {
//System.out.println("ausstieg");         
e.printStackTrace();
      }
}


public void process()
{

try {   
docnl=dc.getFirstDocument();   
while (docnl!=null)
{
   //informationen aus Konfigdoc holen z.b.sql
   i=0;
   server=docnl.getItemValueString("server");
   db2=session.getDatabase(server,docnl.getItemValueString("db_path"));
   makenull=docnl.getItemValueString("makenull");   
   view=db2.getView(docnl.getItemValueString("notes_view"));
   String sqlstatment=docnl.getItemValueString("sql");
   String btrida=docnl.getItemValueString("btrida");
   dbLog.logAction("Start der Verarbeitung für "+ btrida);
   String date=docnl.getItemValueString("Last_run");
   sql1.getrs(sqlstatment);
   sdatum=sd.format(lastrun);
   String useit=docnl.getItemValueString("use_it");
if(useit.equals("ja"))
{   
   while (sql1.rs.next() )
   {
            
         
         
      kunden=sql1.rs.getString("APAIDN");
      kunden=kunden.trim();
      
      if (makenull.equals("ja"))         
            {            
            kunden="0"+kunden;
            DocumentCollection dc2=view.getAllDocumentsByKey(kunden);
            if (dc2.getCount()<=0)
            {
                  dbLog.logError(1,"Kunde nicht vorhanden"+ kunden);
                  
                  }
            
               else
               {
                  this.updatebericht(dc2);
                  i=i+1;
                  }
            }
      else
            {
                  DocumentCollection dc2=view.getAllDocumentsByKey(kunden);
                  if (dc2.getCount()<=0)
               {      
               
                  dbLog.logError(1,"Kunde nicht vorhanden"+ kunden);
               
               }
               else
               {
                  this.updatebericht(dc2);
                  i=i+1;
                  }
            }      
}
}
dbLog.logAction("Es wurden "+i+ "Kunden in"+btrida+" geupdatet");
sdatum="'"+sdatum+"'";
docnl.replaceItemValue("last_run",sdatum);
docnl.save();
docnl=dc.getNextDocument();
}
sql1.con.close();
}
catch(Exception e) {
//System.out.println("ausstieg");         
e.printStackTrace();
      }
      
      
}


   public void updatebericht(DocumentCollection dc)
{
DocumentCollection dc1=dc;
Document berichtdoc;
Item item1;

   try{
         berichtdoc= dc1.getFirstDocument();
          item1=berichtdoc.getFirstItem("T1");
          if (item1==null)
          {
             sdatum2=sql1.rs.getDate("ERSTEZ");         
            DateTime dt=session.createDateTime(sdatum2);
             berichtdoc.replaceItemValue("T1",dt);
            berichtdoc.replaceItemValue("T2",dt);
            
         }
         else
         {
            
            sdatum2=sql1.rs.getDate("ERSTEZ");                  
            DateTime dt=session.createDateTime(sdatum2);
          berichtdoc.replaceItemValue("T2",dt);
         }      
                     
         
         berichtdoc.save();
         if(berichtdoc.save()==false)
         {
            dbLog.logError(1,"Fehler beim Speichern von "+ kunden);
                  
         }   
      dbLog.logAction("Kunde "+ kunden+ "geupdatet");
      sql1.updatesd(berichtdoc.getItemValueString("kundennr"));
      
      }
      catch(Exception e) {
//System.out.println("ausstieg");         
e.printStackTrace();
      }          
   }
}

import lotus.domino.*;
import java.sql.*;
import com.ibm.as400.*;
import java.lang.*;
import java.util.*;
import java.util.Date;
import java.text.*;
public class sql {

public String constr;
Connection con;
public ResultSet rs;

public sql()

{
         
         this.constr=constr;
         try{
         Class.forName("com.ibm.as400.access.AS400JDBCDriver");
         String connstr = ("jdbc:as400:myhost");
         con = DriverManager.getConnection(connstr,"Username","password");
}
catch(Exception e) {
//System.out.println("ausstieg");         
e.printStackTrace();
}
}
public void getrs(String sqlquery)
{
   String sqlstring;
   try
   {
         sqlstring=sqlquery;
         Statement stmt = con.createStatement();
         rs=stmt.executeQuery(sqlstring);
   }
   catch(Exception e) {
      
e.printStackTrace();
}
}
public void  updatesd(String kunden) throws SQLException
{

   String sql="update testbib.testtable set field = '1'  concat  (substring(field ,2,19))  where"
+" apaidn=cast('"+kunden+"' as Integer) and rrn(testbib.testfield) ="+this.rs.getString("satznummer") ;
   Statement stmt = con.createStatement();
   boolean update =stmt.execute(sql);
   int apaidn=this.rs.getInt("kunden");         
}
}

Bin noch nicht ganz fertig hab bestimmt noch variabelen deklariert die ich gar nicht mehr benutzte sollte euch aber nicht vom kommentieren abhalten.
Gruß
qojote
Titel: Re:programm code posten zur Diskussion
Beitrag von: Axel_Janssen am 15.02.04 - 10:15:10
Ok. Ich fange im Laufe des Tages an. Da ich momentan wg. Zertifizierung auch am WE busy bin, werden wir dieses WE nicht fertig.

Titel: Re:programm code posten zur Diskussion
Beitrag von: animate am 15.02.04 - 13:16:24
ich kann dazu sagen, dass deine Anwendung nicht sehr objektorientiert programmiert ist. Im Prinzip hast du hier eine Klasse (Verarbeitung) mit einer Methode (process = verarbeite), die alles erledigt.

Wenn dein Ziel ist, dass das Teil läuft, egal wie, dann ist das in Ordnung.
Falls du sagst, "das ist doch objekorientiert, weil ich habe hier doch Objekte" oder falls du Tipps haben möchtest, wie du das vielleicht objektorientierter (und damit leichter erweiterbar, wartbar, verständlich, etc) machen kannst, dann sag nochmal bescheid.
Titel: Re:programm code posten zur Diskussion
Beitrag von: Axel_Janssen am 15.02.04 - 20:50:41
Fühl mich momentan so als ob 2 fette Säcke Enterprise Java Beans auf meinen geschundenen Körper gefallen sind. Deshalb erstmal keinen code.

Thomas hat auf jedenfall Recht. Das ist nicht objekt-orientiert. Du kannst jede Methode, Eigenschaft um das Schlüsselwort static ergänzen.  

Design Überlegungen können schnell volumenmäßig ausarten. Aber ich kann nächste Woche mal anfangen.

2 Dinge vom reinen Java-Standpunkt:
- Dein Errorhandling ist nicht konsequent.
Ich würde die Exception auf jeden Fall in die Log Datenbank rausschreiben. Eine LogDatenbank zu benutzen ist grundsätzlich eine gute Idee.
- Wenn ich JDBC schreibe, benutze ich immer PreparedStatement.  
http://java.sun.com/docs/books/tutorial/jdbc/basics/prepared.html
Dies hat neben möglichen Performance-Vorteilen v.a. auch Vorteile hinsichtlich der Sicherheit. Wenn du dir SQL Statements direkt aus user eingaben aus Feldern zusammenbaust, können SQL-aficionados durch nested SQL statements und sowas relativ schnell Arten des Zugriffs auf die Daten erhalten, die du gar nicht willst.

Gruß Axel
Titel: Re:programm code posten zur Diskussion
Beitrag von: qojote am 15.02.04 - 22:25:02
Hallo Thomas,
es ist na klar nicht mein Ziel das es läuft egel wie.
Na klar will ich es besser machen deswegen habe ich den Code ja gepostet.
Jede Anregung ist na klar willkommen.
Geht aber nicht zu hart mit mir ins Gericht ich Anfänger :-))
Also Thomas tob dich ruhig aus. Selbes gilt na klar auch für dich Axel.

Ich hab na klar auch in den Büchern gestöbert aber die Objektorientierung an so einem einfachen Beispiel sieht eben doch ganz anders aus als wenn es dann selbst versucht.
Mann neigt doch dazu wenn man aus der Lotusschiene kommt den Code dann so runter zu hacken.
Das die errors im Log ausgegeben werden wollt ich noch machen aber erst als letztes auf der console ist es beim runprobieren bequemer.

Also schon mal vielen Dank in voraus.
Ich freu mich schon auf eure Hinweise.

Gruß
qojote
Titel: Re:programm code posten zur Diskussion
Beitrag von: animate am 15.02.04 - 22:49:26
also austoben werde ich mich nicht. das solltest du machen zur Übung  ;)
ich kann nur versuchen mehr oder weniger wertvolle Tipps dafür zu geben.

Du hast schon Bücher zu OO gelesen, du kennst dich also schon etwas aus.

Als allererstes empfehle ich, nicht die VHIT-Methode anzuwenden und gleich in die Tasten zu hauen.
Für den Anfang wäre es z.B. ganz gut, mal zu überlegen, welche Klassen du später mal brauchen wirst. Wie machst du das? Ein Weg könnte sein, dass du diesen Satz
Zitat
Okay Anforderung war einfach aus einer Relationalen Db infos in eine Notesdb zu holen primärschlüssel ist die Kundennummer.

mal näher betrachtest und dein Problem vielleicht doch etwas detaillierter formulierst (in dieser Problembeschreibung könnten dann z.B. die Worte 'Konfiguration', 'Datensatz', 'Tabelle', usw. auftauchen).
In dieser Problembeschreibung sind Substantive ernsthafte Kandidaten für spätere Klassen. Für jede gefundene Klasse malst du einen Kasten und schreibst den Namen der Klasse rein.

Wenn du das hast, dann meld dich wieder.

Sorry, wenn sich das etwas oberlehrermäßig anhört. Es ist nicht so gemeint.
Titel: Re:programm code posten zur Diskussion
Beitrag von: qojote am 17.02.04 - 23:50:30
okay vielen Dank.

Hört sich nicht oberlehrerhaft an.Ich werd daa mal somachen wie von dir beschrieben und mich dann nochmal melden.

Gruß
qojote
Titel: Re:programm code posten zur Diskussion
Beitrag von: Axel Janssen temp am 18.02.04 - 18:33:08
Hi,

das ganze ist nicht trivial.
Es läuft darauf hinaus ein notes-relationales Framework auf JDBC-Basis zu bauen.
Ich kann am Wochenende mal anfangen. Ich gebe mir genau 2 Stunden Zeit (werde also bestimmtenst nicht fertig).

Ich werde auch nicht mit OOAD-Analyse anfangen, sondern versuchen mich aufbauend auf dem Data Access Object J2EE Design Pattern der Geschichte zu nähern. OOAD-Analyse spielt natürlich eine Rolle, aber es fliessen weitere Sachen mit ein.

Das ist ein Problem von Notes+Java: In plain Java (oder mit App-Server) hat man immer bestehende Frameworks, die man einfach nutzt und nicht selber schreibt (Hibernate, Spring). In Notes lassen sich allenfalls Ideen davon nutzen. Das ist schwieriger.

Gruß Axel
Titel: Re:programm code posten zur Diskussion
Beitrag von: qojote am 18.02.04 - 19:01:20
hi Axel,

wenn dich so hör dann beschleicht mich der Gedanke das ich mir da das falsche Porjekt zum lernen gesucht habe :-))

Aber ich hoffe doch das ich dabei eine ganze Menge von der vorgehensweise etc lernen kann.

Die Frameworks die du da aufzählst kenne ich nicht (newbie )
hast du da vielleicht einen Link.

Ich hab jetzt mal parallel angefangen mich mit dem oline course java paison (hast du mal denn Link gepostet )zu beschäftigen.
Kämpfe aber zur Zeit leider noch damit Ant auf meinem Notbook zum laufen zu bekommen.

Ich bin mal gespannt was deine Analyse zu Tage fördert.
Danke für deine Mühe.

Gruß
Qojote
Titel: Re:programm code posten zur Diskussion
Beitrag von: Axel Janssen temp am 18.02.04 - 20:44:28
... hm. Ehrlichgesagt habe ich bei dem von mir empfohlenen Kurs dann nie mitgemacht  :-\

Vielleicht hilft das angeschlossene Yahoo-Groups Forum. Ich kann mich dunkel erinnern, dass da einige Leute Probleme mit der dort besprochenen ant-Konfiguration hatten.

Gruß Axel

Titel: Re:programm code posten zur Diskussion
Beitrag von: qojote am 19.02.04 - 22:31:58
Ich glaube auch nicht das dir dieser Kurs no soviel gebracht hätte  ;)

Für mich ist das aber schon ein ganz guter Einstieg um mir einen kleinen Überlick über einen Teil dieses riesigen Themas zu verschaffen.

In dem Forum muß ich nochmal schauen.
Ich wills aber erst noch mal auf einem anderen Rechner versuchen mit einem vernünftigen OS.
Ich habs auf meinem Notebook getestet. Da hab ich leider aus Kompatilitäts gründen zu den Sesamstrassen spielen von meinem Sohn Windows ME drauf.

Gruß
qojote


Gruß
Sven
Titel: Re:programm code posten zur Diskussion
Beitrag von: Axel_Janssen am 21.02.04 - 22:44:59
Hi,

es ist wesentlich einfacher anderer Leutes code nieder zu machen, als es selbst besser zu machen.

Du benutzt Java wie eine Skriptsprache. Das geht zwar auch, führt aber genau nicht zu Übersichtlichkeit und Wiederverwendbarkeit.

Klassen sollten durch "high cohesion" und "low coupling" geprägt sein.
high cohesion: Klassen sollten sich möglichst mit zusammenhängenden Themen befassen.
Das war dann auch in die richtige Richtung Verarbeitung beschäftigt sich mit Notes und sql mit RDBMS.
Wiederverwendbar ist aber gerade Verarbeitung nicht. Schon wenn du auf eine andere Tabelle der RDBMS zugreifen willst ginge es nur mit copy und paste Wiederverwendung, was auf die Dauer deutlich zu anstrengend ist.

Deine Exception Handling/Logging Strategie ist nicht konsequent. Das benutzen einer Log-Datenbank ist eine sehr gute Idee. Aber warum wird z.B. eine mgl. exception im SQL-statement Teil nicht geloggt?
Vernünftigste Regel ist wohl, dem Anwender eine für ihn verständliche Meldung zu liefern und das technische Zeugs in MÖGLICHST WENIGEN LOG-DATEIEN bzw. Mechanismen zu senden, damit sich das ein Fachmann anschauen kann.

In dieser Branche wird ständig nach Wiederverwendung geschrien. Besonders mehr Management orientierte Menschen haben aber oft deutliche Schwierigkeiten zu begreifen, dass Wiederverwendbarkeit eine tendentiell hohe intelektuelle Anforderung darstellt, die viel mit Erfahrung zu tun hat. Auch mit der Erfahrung von anderen Leuten. Deshalb beschäftige ich mich mit Design Patterns und Frameworks. Das ist zwar weniger sexy als einfach loszuhacken, aber imnsho mittelfristig eine gute Idee.
Meine Idee ist, die Anforderung erstmal mit klassisch mit dem DAO Access Pattern anzugehen, ibatis (http://www.ibatis.com/common/dao.html) abzuchecken und meine Rod Johnson Studien wieder aufzunehmen. Ausserdem ist es sinnvoll irgendwie eine Art von Connection Pooling aufzuabauen..

Fortsetzung folgt. Wg. der geschilderten, real existierenden Doppel-Belastung dauerts ein bischen länger.

Wir bräuchten erstmal eine vernünftige Debugging Umgebung. Ich habe eine Idee, wie man Notes-Agenten dadurch simmuliert, dass man aus Eclipse Notes von aussen anspricht. Dann hätte man Debugging von Java-Notes-Agenten ähnlichen Gebilden.

Gruß Axel
 
Titel: Re:programm code posten zur Diskussion
Beitrag von: TMC am 21.02.04 - 23:03:09
es ist wesentlich einfacher anderer Leutes code nieder zu machen, als es selbst besser zu machen.

Das sind wahre Worte :-)

Matthias
Titel: Re:programm code posten zur Diskussion
Beitrag von: qojote am 22.02.04 - 11:41:51
Hi Axel,

das mit der Verarbeitung ist mir leider auch schon beim programmieren aufgefallen  :-[.

Um nicht immer in den Agent einsteigen zu müssen habe ich die Sql Statements in die Konfigurations Dokumente ausgelagert was schon ganz gut ist damit ich mit dem Agent verschiedene Daten zurückgeben kann.
Mein großes Problem hierbei ist aber leider das die Notes Datenstrukturen und Datentypen ganz unterschiedlicher Art (zur Relationalen DB )sind was dazu führt das ich mir eigentlich jedes Feld anschauen und gegebenfalls wandeln muß.
Dies macht es na klar auch sehr schwer wieder verwendbaren Code zu schreiben.
Ich hab im Moment leider auch sehr wenig Zeit, hoffe aber das es ab morgen besser wird so das ich endlich mein Anforderungskonzept und den versuch das in Klassen zu packen fertig bekomme.
Da ich diese Art von Agenten in der nächsten Zeit öfters brauchen werde will ich mal versuchen so etwas wie ein Framework dafür zu bauen.

Gruß
Qojote
Titel: Re:programm code posten zur Diskussion
Beitrag von: Axel_Janssen am 20.03.04 - 23:32:13
ok. hier kommt bald mein Vorschlag.

Habe das aber ein bischen anders gemacht.
Von "aussen" wird eine NotesDatenbank per Java ausgelesen und in eine MySQL Datenbank geschrieben.
Man kann das ganze auch als Notes-Agenten umschreiben. Benötigt aber ein bischen Anpassung. So konnte ich Eclipse benutzen. Ich schreib Notes-Java Agenten auch in Eclipse (und kopier die dann rüber). Alles in Eclipse zu schreiben ist noch besser, weil dann hab ich debugger und viele Dinge mehr.

So richtig voll objekt-orientiert ist das auch nicht.
Letztlich wird hier auch kein richtiger OO-Business-Layer gebildet, sondern die ganzen Daten nur so portiert: auslesen_aus_notes --> Datenstruktur (ohne behaviour, keine Methoden) --> RDBMS (konkret MySQL). Beziehungen zwischen Tabellen (oder Haupt-Antwort-Doc) werden nicht berücksichtigt. Kein Transaktionssupport.
Kyle Brown hat das in seinem tollen Websphere-Buch angesprochen. Der Sack schmeisst aber mit ca. 4-6 Fowler-Enterprise Business Application Patterns (auch ein sehr gutes Buch, btw) um sich und das geht nicht mal so schnell am Wochenende. War auch für die Aufgaben-Stellung nicht nötig.
Vielleicht geht das neue Spring-Framework in die Richtung, aber da bin ich mir noch nicht so sicher.

Ich werde hier lediglich eine Implementierung des guten alten DAO-J2EE-Patterns reinschmeissen.
Das ist aber schon ein ganzes Stück flexibler als Quojotes Ansatz.
Und es gibt hier tonnenweise dolle Interfaces und abstrakte Methoden.

Als konkretes Beispiel habe ich die gist - Datenbank von eknori genommen, die im Rahmen des Entfernungs-Berechnungs-Threads entstanden ist (hier ist link auf download: http://www.atnotes.de/attachments/Dist.rar ). Ist nicht klein.

Ich hab als "RDBMS" die zukünftige SAP-Datenbank mySql gewählt. Ist recht einfach zu bedienen und nicht so groß wie db2 oder Oracle. Reicht aus. http://www.mysql.com/products/index.html . Interessierte müssen auch unbedingt den jdbc-Treiber und (ernste Empfehlung) das controll center runterladen. GAlles gibts bei der mySql Seite.
Die einfachste Art mySql zu starten ist über den Befehl mysqld-nt --standalone aus der Kommandozeile im bin-Verzeichnis von mySql.
Der Standard-Alle-Rechte-User heisst glaub ich "admin" ohne Kennwort.

Ich beschreibe alles Eclipse-mässig, weil das meine Entwicklungsumgebung ist.

Wens interessiert. Auf MySql müsste erstmal eine Datenbank erstellt werden. Die soll "gist" heissen. Geht mit dem Controll Center
Hier ist der DDL-code für die Generierung der einzigen Tabelle:
Code
# Host: localhost
# Database: gist
# Table: 'location'
# 
CREATE TABLE `location` (
  `id` bigint(20) NOT NULL auto_increment,
  `city` varchar(50) NOT NULL default '',
  `loc` varchar(30) default '',
  `east` varchar(10) NOT NULL default '10',
  `north` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`id`),
  KEY `BY_CITY` (`city`)
) TYPE=MyISAM; 

Die gist-DB sollte im Controll-Center grün sein. Dann auf SQL Button klicken. Das obige DDL reinkopieren und dann ausführen. Dann Control Center schliessen und öffnen (tool ist nicht so schlau, hab aber auch null doku dazu gelesen.

rest.kommt.später, lüpt aber schon.  
Arbeite vielleicht morgen noch daran, die Generierung der mySql Datenbank ein bischen konfortabler zu gestalten, aber das mach ich auch nicht jeden Tag.

Gruß Axel
Titel: Re:programm code posten zur Diskussion
Beitrag von: Axel_Janssen am 21.03.04 - 21:55:25
ok. hier ist der Source-code.

Das ist kein perfektes Projekt, sonder mehr so didaktisch.
Das ist eine Implementierung des Data Access Objekts Pattern (mit abstract factory). Einfach präventiv 2 Aspirin schlucken und sich einfach mal drauf einlassen.
Kritik immer gerne.
Java ist eine objekt-orientierte Sprache. Leute die von Skript-Umgebungen kommen neigen dazu, dass aus Gewohnheit aus Skripting-Sprache zu benutzen. Objekt Orientierung ist aber viel interessanter.
Hier werden ein paar features von OO benutzt (Interfaces, Polymorphismus, etc.). Keine Sorge. Thomas erklärt das dann schon  ;D

Bei dem Import des Source-Codes in eure nifty Eclipse Entwicklungsgebungen würde ich wie folgt vorgehen:
- Öffnet Eclipse
- erzeugt ein Java Projekt DAOwithNotes (oder anderer Name).
- entzippt das Zip-File
- Geht in das Verzeichnis src des entzippten Inhalts.
- Kopiert den g.e.s.a.m.t.e.n Inhalt des src-Ordners in die Zwischenablage.
- rechte Maustaste auf das Verzeichnis src des Eclipse-Projekts.
- wählt in dem PopUp-Dialog paste.

Jetzt kommen total viele Fehlermeldungen in dem tasks Fenster.
Das ist weil ihr noch ein paar Zusatz-jars aus dem Internet runterladen müsst.
1. log4j: http://jakarta.apache.org/site/binindex.cgi --> die zip Datei unter wo Log4j KEYS steht. Ich weiss das da total viele Sachen stehen. Irgendwie ist das aber auch alphabetisch geordnet.
2. commons-lang : die gleiche Seite wie oben nur ein bischen weiter oben. Wieder die Zip Datei. Hat ein gewisses Risiko, da das eine andere Version ist als die von mir verwendete.

So. Das müsst ihr dann entzippen. Und da dann nach den jars suchen.
In Log4j ist das log4j-1.2.8.jar in dist-lib.
In commons-lang dürfte es auch ein commons-lang-2.0.jar geben.
Gut. Den MySQL Connector/J habt ihr euch gestern schon von der Seite www.mysql.com heruntergeladen. Da gibt es auch ein jar und noch 2 weitere im lib Verzeichnis (besser einfach dazutun, obwohl diese beiden vermutlich nicht gebraucht werden).

Diese jars müsstet ihr in das Eclipse Projekt einbinden. Am einfachsten geht das mit rechte Maustaste auf das Projekt im Navigator. Properties ganz unten in Popup-Menü. In dem sich öffnenden Dialog links Java Build Path öffnen. Dort add external jars Button klicken. Und nacheinander all diese oben erwähnten jars einbinden. Ach so: Das Notes.jar muss auch noch eingebunden werden. Notes.jar im Notes-Programm-Verzeichnis. Die gist Datenbank solltet ihr in euren Notes-Client legen.

Gut jetzt noch mal speichern und die Fehlermeldungen dürften weg gehen.
Ihr müsst dann die beiden properties Dateien notes.properties und mysql.properties anpassen. Bei mySql ist Name, Kennwort des Standard-Administrator eingetragen. Falls ihr da nicht getuned habt, dürfte das so stimmen. In Notes steht pwd für das Notes-Passwort eurer Notes-ID. Diese muss im PATH eures OS liegen. Server ist leer, wenn ihr die dist.nsf (s.o.) in das data von Notes-Client installiert habt.

Dann starten. In Eclipse auf das laufende-Männchen Smart-Icon klicken. Oben Projekt auswählen. Als main-Klasse de.aja.gist.some_boring_and_simple_facade.Aekschn wählen.

Links unten Run button.
Dann kommt erstmal eine Fehlermeldung. Das ist mein Problem. Ich bin großer Freund der "nicht für jede Simpelst-Konfiguration eine xml Datei mit DOM-Parser auslesen, besser gute alte Properties Dateien". Tja und da hab ich ein Problem. Hilfe gerne. Die beiden Properties Dateien müssen zur Zeit im user.home Verzeichnis stehen. Die Fehlermeldung sagt euch wo das ist. Kopiert die einfach dahin und startet nochmal.

Gruß Axel
Titel: Re:programm code posten zur Diskussion
Beitrag von: Axel_Janssen am 21.03.04 - 22:03:56
Hier ist noch das Api-Dok (s. attachment)

Eigentlich wollte ich unbedingt noch ein paar UML-Diagramme erstellen. Aber dazu bin ich nicht mehr gekommen. Hier wird das ein bischen erklärt:
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html
Titel: Re:programm code posten zur Diskussion
Beitrag von: Axel_Janssen am 21.03.04 - 22:19:44
die Einrichtung ist vielleicht nicht ganz einfach für Leute, die nicht so vertraut mit MySQL vertraut sind. Da sind auch ein paar Dinge, die für Java_Für_Notes interessant sind (wird auf Notes zugegriffen, Log4j).

Gruß Axel