Urlaub -> Scala (8)
Scala Lotus Notes
Heute wollte ich mal Scala gegen eine meiner Lieblingsumgebungen laufen lasse -> Lotus Notes
Kategorie Heute wollte ich mal Scala gegen eine meiner Lieblingsumgebungen laufen lasse -> Lotus Notes
Als erstes habe ich gemäß meinem Beispiel
von Gestern ein paar Control Strukturen definiert (genau zwei) ->
package domino
import lotus.domino._
object DominoControl {
def DominoRun ( code : => Any) = {
try {
NotesThread.sinitThread()
code
} finally {
NotesThread.stermThread()
}
}
def processDocumentsA <: { def getFirstDocument() : Document; def getNextDocument(xd : Document) : Document },B(col: A) (f : Document => B ) : List[B] = {
import scala.collection.mutable.ListBuffer
val ret = new ListBuffer[B]
var d = col.getFirstDocument
while ( d != null ) {
var dnext = col.getNextDocument(d)
if (d.isValid() && !d.isDeleted()) ret += f(d)
d.recycle
d = dnext
}
ret.toList
}
}
Die erste DominoRun initialisiert die Umgebung und macht diese am Ende wieder dicht :)
Die zweite processDocuments implementiert ein viel (von mir benutztes Pattern), welches darauf beruht, dass es in Domino meistens bei Collection, Views usw. die Methoden getFirst und getNext gibt.
Da die Sortierung der Dokumente beim Bearbeiten geändert werden kann, wird zuerst der Nachfolger geholt, bevor die Bearbeitung stattfindet
Weiter habe ich zwei case class definiert
case class ShortDocument(form : String, unid : String, created : Date)
object ShortDocument {
def createShortDocument( xd : Document ) : ShortDocument = {
ShortDocument(xd.getItemValue("Form").elementAt(0).toString(),xd.getUniversalID(),xd.getCreated().toJavaDate())
}
}
case class TimeTracking(user : String, date : String, hours : String )
object TimeTracking {
def createTimeTracking( xd : Document ) : TimeTracking = {
TimeTracking(xd.getItemValue("userbooked").elementAt(0).toString(),xd.getItemValue("trackingdate").elementAt(0).toString(),xd.getItemValue("hoursbooked").elementAt(0).toString())
}
}
Nun folgender Code:
object MyFirstDomino extends Application {
import DominoControl._
def openDatabase(xs : Session, xServer : String, xDatabase : String ) : Database = {
xs.getDatabase(xServer,xDatabase)
}
DominoRun {
val s = NotesFactory.createSession()
val p = s.getPlatform()
println("Platform = " + p)
println("Test")
val db = openDatabase(s,"connector.1/Blues Brothers","hosting/resch/t_resch.nsf")
println(db.getTitle())
val vw = db.getView(".AppLUTimeTracking")
processDocuments(vw) { d => val tt = TimeTracking.createTimeTracking(d);println(tt);tt }
val ad = db.getAllDocuments()
processDocuments(ad) { d => val sd = ShortDocument.createShortDocument(d);println(sd);sd }
}
}
Das heißt mit den gleichen Kontrollstrukturen, gehe ich einmal über eine NotesCollection und einmal über eine NotesView :)
Gruß JJR
P.S.: Für xd.getItemValue("userbooked").elementAt(0).toString() überlege ich mir noch was!
package domino
import lotus.domino._
object DominoControl {
def DominoRun ( code : => Any) = {
try {
NotesThread.sinitThread()
code
} finally {
NotesThread.stermThread()
}
}
def processDocumentsA <: { def getFirstDocument() : Document; def getNextDocument(xd : Document) : Document },B(col: A) (f : Document => B ) : List[B] = {
import scala.collection.mutable.ListBuffer
val ret = new ListBuffer[B]
var d = col.getFirstDocument
while ( d != null ) {
var dnext = col.getNextDocument(d)
if (d.isValid() && !d.isDeleted()) ret += f(d)
d.recycle
d = dnext
}
ret.toList
}
}
Die erste DominoRun initialisiert die Umgebung und macht diese am Ende wieder dicht :)
Die zweite processDocuments implementiert ein viel (von mir benutztes Pattern), welches darauf beruht, dass es in Domino meistens bei Collection, Views usw. die Methoden getFirst und getNext gibt.
Da die Sortierung der Dokumente beim Bearbeiten geändert werden kann, wird zuerst der Nachfolger geholt, bevor die Bearbeitung stattfindet
Weiter habe ich zwei case class definiert
case class ShortDocument(form : String, unid : String, created : Date)
object ShortDocument {
def createShortDocument( xd : Document ) : ShortDocument = {
ShortDocument(xd.getItemValue("Form").elementAt(0).toString(),xd.getUniversalID(),xd.getCreated().toJavaDate())
}
}
case class TimeTracking(user : String, date : String, hours : String )
object TimeTracking {
def createTimeTracking( xd : Document ) : TimeTracking = {
TimeTracking(xd.getItemValue("userbooked").elementAt(0).toString(),xd.getItemValue("trackingdate").elementAt(0).toString(),xd.getItemValue("hoursbooked").elementAt(0).toString())
}
}
Nun folgender Code:
object MyFirstDomino extends Application {
import DominoControl._
def openDatabase(xs : Session, xServer : String, xDatabase : String ) : Database = {
xs.getDatabase(xServer,xDatabase)
}
DominoRun {
val s = NotesFactory.createSession()
val p = s.getPlatform()
println("Platform = " + p)
println("Test")
val db = openDatabase(s,"connector.1/Blues Brothers","hosting/resch/t_resch.nsf")
println(db.getTitle())
val vw = db.getView(".AppLUTimeTracking")
processDocuments(vw) { d => val tt = TimeTracking.createTimeTracking(d);println(tt);tt }
val ad = db.getAllDocuments()
processDocuments(ad) { d => val sd = ShortDocument.createShortDocument(d);println(sd);sd }
}
}
Das heißt mit den gleichen Kontrollstrukturen, gehe ich einmal über eine NotesCollection und einmal über eine NotesView :)
Gruß JJR
P.S.: Für xd.getItemValue("userbooked").elementAt(0).toString() überlege ich mir noch was!