Das Notes Forum

Lotus Notes / Domino Sonstiges => Projekt Bereich => Help-Desk Applikation !!Help!! => Thema gestartet von: eknori am 21.12.05 - 05:26:50

Titel: Help Application demo at Lotusphere
Beitrag von: eknori am 21.12.05 - 05:26:50
Kam gerade rein ...

Zitat
Hello Ulrich, 

I am with Research In Motion, the makers of the BlackBerry solution.
We are currently looking to demonstrate at Lotusphere BlackBerry Mobile
Data Services 4.1 support for Domino 7 web services and your application
appeared as a candidate.   Do you have any current work to extend the
application using the native D7 web services?   Any means to get
development assistance from your team to add this into the application
(at least a few basic functions) in the next few weeks?

Thanks in advance,

Jon

_____________________________
Jonathan Christiansen
Senior Manager, Technical Services
Cingular Business Unit
Rogers Business Unit
Research In Motion Limited
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 21.12.05 - 17:18:04
Biete ab dem 29.12. meine konstruktive Mitarbeit an. Schau mir das mal an.
Danach sieht es so aus, dass ich bis zum 03.01. auf jeden Fall frei habe, wobei der 1. und weite Teile des 31. natürlich ausfallen. Es sollte aber machbar sein, zumindest teilweise präsentabel zu Webservice-enablen.
Wobei dies vielleicht nicht die ganz hohe SOA Schule sein wird.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 21.12.05 - 18:19:17
Zitat
Biete ab dem 29.12. meine konstruktive Mitarbeit an

Danke Axel, das Angebot nehme ich sehr gerne an. Habe Jonathan gerade gemailt, daß wir das grundsätzlich können, wir aber noch ein paar mehr Informationen benötigen, welche functions sich die Brombeeren denn so vorstellen ...

Und wenn daß nicht zu abgehoben ist, ( und 3 Freiflüge, FirstClass + Hotel in Orlando dabei rauspringen ) sind wir doch zu allen Schandtaten bereit, oder  :D

Scherz beiseite; ist eine  Herausforderung, da daß Thema für mich neu ist; aber man kann ja nur dazulernen...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 21.12.05 - 20:05:17
@Axel, korrigiere mich bitte, wenn ich vollkommen falsch liege.

Lassen wir einmal die Mails in HELP außer acht; dann bleiben Tickets und Todo.

Also gibt es eigentlich nur 2 ( grosse ? ) Klassen

class Ticket und
class Todo

Nehmen wir die Klasse Ticket

diese enthält dann Public und private functions und subs

eine mögliche function könnte dann sein

public function getAllBySupporter ( sName as String ) as NotesDocumentCollection (?)

wobei das Ermitteln der results dann über private funcs erfolgt...

oder

public function GetSubjectFromTicket ( TicketNum as String ) as string

( hier wäre dann ein

Private  Function openDatabase(dbname As String) As Boolean
      Set db = s.GetDatabase("", dbname)
      If db.IsOpen Then
         openDatabase = True
      Else
         openDatabase = False
         msg = "Cannot open database " & dbname
      End If
   End Function
   
   Private Function openView(viewname As String) As Boolean
      Set view = db.GetView(viewname)
      If view Is Nothing Then
         openView = False
         msg = "Cannot open view " & viewname
      Else
         openView = True
      End If
   End Function
   
   Private Sub getSubject
      If doc.HasItem("Subject") Then
         msg = doc.GetItemValue("Subject")(0)
      Else
         msg = "Document does not have Subject"
      End If
   End Sub

im Spiel ... )

Das ist jetzt LS; ist aber auch in Java möglich. Das scheint wurscht zu sein, obwohl mein 7er Client immer abschmiert, wenn ich versuche Java Code in einen WS zu pasten ... ( das aber nur am Rande )

Und das wäre dann schon das ganze Geheimnis der WebServices ?? Will meinen; wir coden Functionen ( erwartet Eingabe , schmeisst Wert zurück)

Um mehr muss man sich an dieser Stelle nicht kümmern; wie der Anforderer mit dem Rückgabewert umgeht, ist seine Sache ...  ???

Sehe ich das richtig ( vereinfacht ) ?
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 21.12.05 - 21:55:24
Aus meiner Sicht sollte man ein aufgabenbezogenes externes Interface schaffen, das alle Aufgaben, die man sinnvoll aus Blackberry in Help ausführen könnte, als Service anbietet. In der Praxis würde man natürlich an irgendeiner Ecke anfangen.

Deine Trennung in public und private functions ist schon sauber. D.h. Notes spezifische Dinge wie getView, getDatabase werden private gekappselt.

getAllBySupporter (sName as String) ist schon mal vernünftig. Der Rückgabewert als asDocumentCollection nicht so. Am besten man gibt die Sammlung der Tickets der Person als xml-runter. Später dazu mehr.

GetSubjectFromTicket ( TicketNum as String ) as string hört sich für mich nicht so sinnvoll ist. Warum sollte man sich von Blackberry erst die TicketNum holen und dann das dazugehörige Subject noch mal extra? Webservices sind nicht besonders performant.
Das ist, was mit vernünftiger Granularität der Services gemeint ist. D.h. man sendet am besten einen ganzen Sack der Tickets runter. Oder man sendet ein paar Werte pro Ticket runter, die in einer Ansicht (nicht NotesView) auf Blackberry dargestellt werden können (etwa TicketNum, Datum, Priorität, Subject) etc und hat dann noch eine zweite Funktion, die nach Auswahl des Tickets aus der Blackberry Ansicht das gesamte Ticket zurückliefert (bzw. alle Teile des Tickets, die in Blackberries Detailansicht des Tickets dargestellt werden sollen). 
Das interessante ist, dass man ganze Dateistrukturen (ähnlich wie ein struct oder type in LotusScript) als xml darstellen kann auch wenn sie verschachtelt sind.
Und xml kann sowohl von Notes als auch von Blackberry in die proprietäre Objektstruktur (Notes-Objekte oder Blackberry-Objekte) umgewandelt werden. Die Aufgabe auf !!Help!!-Seite wäre dann nur das marshalling/un-marshalling (umwandeln) notes-> xml und xml-> notes.
In TicketService könnten dann noch Funktionen wie solveTicket(TicketDoc) oder createTicket(TicketDoc) angeboten werden. Wobei TicketDoc dann (das gesamte Ticket als xml enkodieren würden) oder (nur ein key (ticketNum) und die Felder, die möglicherweise editiert werden können).
Die doc-lit Webservices machen total Sinn. Und nicht nur die rpc-Webservices, wo man nur Strings, Zahlen und alles einzeln übertragen kann. Bei doc-lit Webservices kann man anwendungs-determinierte strucs (z.B. ticket) hin und herschicken. Das geht mit xml und ist auch nicht so schwierig.

Eine weitere Anforderung wäre natürlich authentification/authorization. Weiss aber nicht wie gut das zur Zeit in Notes unterstützt wird. Die einfachere Möglichkeit wäre ssl. Ansonsten wird da aber auch an einer Art xml-Feldverschlüsselung gearbeitet.

Webservices Interfaces sind nicht Objekt-Orientiert!
Sie sind eigentlich mehr Prozeduren, denen man aber structs als Parameter übergeben kann oder die structs zurückliefern können. Es bringt nichts wenn man sich Subject oder ein paar andere Attribute einzeln vom remote Notesserver holen würde. Besser diese structs-Geschichte. Enterprise Java Beans funktioniert teilweise so, dass man sich einzelne Werte vom entfernten Server runterpopelt. EJB-aficionados kommen dann immer mit den dollen caches. In der Praxis ist das dann aber trotzdem langsam.
Ted Neward hat das mal damit verglichen:
Mit heutiger Technologie dauert es 38 Jahre, um von Pluto hin und zurück zu fliegen.
Auf Pluto gibt es total gutes Bier.
Wieviel Bier würde man mit einem Raumschiff von Pluto mitnehmen?
Soviel man tragen kann und sicher nicht jede Bierflasche einzeln (wie teilweise EJB2.0 in Websphere oder erst ticketNum und dann das dazugehörige Subject). 

Hoffe das ist verständlich.
Code
<ticket>
<topic>
Der Button Neues Ticket in der Ansicht Ticket funktioniert nicht
</topic>
<createDateTime>
03.12.04 10:00:00
</createDateTime>
<creator>
Jupp Derwall
</creator>
<history>
<entry>
<date>
14.12.04 10:30:00
</date>
<user>
Sarah Burdenski
</user>
<content>
weiss nicht
</content>
</entry>
<entry>
<date>
14.12.04 10:35:00
</date>
<user>
Big Boss
</user>
<content>
wenn das nicht in 3 Tagen gelöst ist, gibts Ärger
</content>
</entry>
</ticket>
Die Umwandlung in diese Struktur ist einfacher als es vielleicht erst aussieht.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 22.12.05 - 05:22:46
Zitat
Hoffe das ist verständlich.

Ja, das ist es; danke für die Erläuterungen ...

Zitat
Oder man sendet ein paar Werte pro Ticket runter, die in einer Ansicht (nicht NotesView) auf Blackberry dargestellt werden können (etwa TicketNum, Datum, Priorität, Subject) etc und hat dann noch eine zweite Funktion, die nach Auswahl des Tickets aus der Blackberry Ansicht das gesamte Ticket zurückliefert (bzw. alle Teile des Tickets, die in Blackberries Detailansicht des Tickets dargestellt werden sollen).
Zitat
oder createTicket(TicketDoc)

Ich denke, so etwas hat sich Jonathan wohll vorgestellt; habe aber noch keine Antwort auf meine Mail erhalten ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 22.12.05 - 19:23:40
Zitat
Ted Neward hat das mal damit verglichen:
Mit heutiger Technologie dauert es 38 Jahre, um von Pluto hin und zurück zu fliegen.
Auf Pluto gibt es total gutes Bier.
Wieviel Bier würde man mit einem Raumschiff von Pluto mitnehmen?
Soviel man tragen kann und sicher nicht jede Bierflasche einzeln (wie teilweise EJB2.0 in Websphere oder erst ticketNum und dann das dazugehörige Subject).

schöner Vergleich; aber er trifft den Nagel wirklich auf den Kopf. Erfordert eine bisschen andere Denke bei der Entwicklung der Services, aber das sollte machbar sein.

Immer noch keine Antwort. OK, mag an der momentanen "festlichen" Stimmung liegen. Da schalten wohl alle mal einen Gang runter ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 23.12.05 - 17:06:41
Langsam werde ich mit dem Thema warm und auch ein wenig mutiger. Statt einfach nur ein paar Werte aus der DB abzufragen, habe ich mit einen kleinen web service geschrieben, der ein neues Doc in der DB erzeugt und mit Werten füllt.

Sub Click(Source As Button)
   Const urlWSD = "http://main/FirstTest.nsf/FirstTest?wsdl"       ' This is the URL of the server hosting this web service
   Dim result As String
   Dim ret As Integer
   Dim stockSymbol As String
   
'Create a new MSSOAP client object
   Dim webService As Variant
   Set webService =CreateObject("MSSOAP.SoapClient")
   
'Initialize connection to the WSDL file and get WSDL structure
   Call webService.mssoapinit (urlWSD)
   
   key = "tunesien"
   
   'result = webService.getHauptstadt(key)
   ret = webService.createNewDoc ( "England", "London" )
   
   Msgbox ret
End Sub

Als Datenbank nehme ich vorerst einaml die Datenbank, die Axel in diesem Thread gepostet hat http://atnotes.de/index.php?topic=26569.0

Der web service sieht dann so aus:

Class Land
   Private ses As NotesSession
   Private db As NotesDatabase
   Private vwLand As NotesView
   
   Public Sub New
      Set ses = New NotesSession()
      Set db = ses.currentDatabase
      Set vwLand = db.getView("land")
   End Sub
   
   
   Public Function getHauptstadt (land As String) As String
      Dim docLand As NotesDocument
      Set docLand = vwLand.GetDocumentByKey(land)
      If docLand Is Nothing Then
         getHauptstadt = "LAND <" & land & "> kann in der Datenbank nicht gefunden werden."
      Else
         getHauptstadt = docLand.Hauptstadt(0)
      End If
      
   End Function
   
   Public Function createNewDoc ( strLand As String, strHauptstadt As String ) As Integer
      
      On Error Goto ERRHANDLE
      
      Dim doc As NotesDocument
      Set doc = db.CreateDocument
      doc.Land = strLand
      doc.Hauptstadt = strHauptstadt      
      doc.Form = "land"
      Call doc.Save (True,True)
      createNewDoc = 0
EXITPOINT:
      Exit Function
ERRHANDLE:
      createNewDoc = 1
      Resume EXITPOINT
   End Function
   
End Class

Ich finde, daß das, was man als web service bezeichnet noch recht unspektakulär aussieht; eigentlich nix anderes als ein Agent mit Rückgabewert ...

OK, der RetVal im Beispiel ist ein einfacher String oder ein integer; mal sehen, wie das mit komplexeren Strukturen aussieht.

Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 23.12.05 - 18:15:15
Ist es auch nicht.
WSDL Files an sich sind relativ komplex. Ich hab Leute getroffen, die das scheinbar mit einem Blick lesen können.
Die benötigten doc-lit style Webservices erfordern xml-Processing und ich hab in der freien Wildbahn schon die unglaublich kompliziertesten Konstrukte gesehen wie Leute xml parsen. Ich glaub der heute gepostete Link zu den Amazon Webservice aus Domino hat einige gute Ideen. Werd das mal durchgehen. Das sieht gut aus.

Webservices/SOA zielen auch darauf hinaus, dass Transaktions- und Securitykontexte über Webservices verteilt werden, Felder verschlüsselt werden, etc. Wenn man damit anfängt und das auch noch performant halten will, wirds komplex.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 23.12.05 - 18:23:31
Bin ja froh, daß ich erst einmal das Frontent ( Eclipse ) zum Laufen bekommen habe. ( Dank deiner Anleitung, Axel )
Jetzt werde ich mich in der verbleibenden Zeit, bis das Christkind kommt einmal daran machen, verschiedene Dinge auszuprobieren. Auch werde ich mir die Links von Christoph einmal näher ansehen.

Ich bin guter Hoffnung, daß wir die Brombeeren auf der LS mit ein paar guten Services versorgen können. Was AUTH und dergleichen angeht ... die wollen ja lediglich ein paar einfache Dinge haben.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 23.12.05 - 19:40:50
Habe gerade eine Antwort von Jon bekommen

Zitat
Ulrich, my apologies on the delayed response.   All of the functions you described below were in line with my thoughts.   Accessing collections of tickets, viewing tickets, search for ticket, creating and modifying tickets.     We are looking for apps to demo against our MDS 41 web services consumer IDE (MDS studio) and would showcase the app at lotusphere.   Any chance you can have something by January 10th?

Was sagt das Team ? Ist das machbar ?
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 23.12.05 - 21:26:06
Frag ihn am besten noch, wie er sich die Authentizifierungs/Autorisierungsfrage vorstellt?
SSL?
Falls meine Hilfe benötigt wird, habe ich zwischen dem 27.12. und dem 4.1. einige freie Tage.
Aus meiner Sicht ist es für den Producer (Server, also !!!Help!!!) einfacher als für den Client (die).
Also auf jeden Fall machbar.

Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Thomas Schulte am 23.12.05 - 22:12:32
Seh ich auch so. Das ist machbar.

Und die Zeit wäre nicht das Problem. Ich hab bis zum 10.01. Urlaub.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 25.12.05 - 18:47:35
Hier einmal der Rumpf eines Web Services "wsTicket"

Funktionen:

-- CreateTicket ( strUser As String, strProblem As String ) As Integer
-- CloseTicket ( strTicket As String ) As Integer
-- AssignTicket ( strTicket As String, strAssignTo As String ) As Integer
-- GetAllTicketsBySupporter ( strSupporter As String ) As Variant

Das CreateTicket funktioniert schon einmal soweit  8) ; die anderen Funktionen beinhalten ein einfaches ERRHANDLE, aber noch keinen Funktionscode.

Bei GetAllTicketsBySupporter stehe ich ein wenig auf dem Schlauch; in LS würde ich eine NotesDocumentCollection zurückgeben; das funktioniert aber bei einem web service nicht.  ???

Was noch fehlt ist das Abrufen eines bestimmten Tickets, und damit verbunden auch das Suchen nach einem Ticket ...

%REM
#####################################################
 INCLUDES
#####################################################
%END REM   
%INCLUDE "lsxsd.lss"

%REM
#####################################################
 CONSTANTS
#####################################################
%END REM   
Private Const CREATE_TICKET_FORM = "BugReport"
Private Const CREATE_TICKET_INITIAL_STATUS = "0"
Private Const CREATE_TICKET_VIA_WEBSERVICE = 1

Private Const CREATE_TICKET_ERR_NOERROR = 0
Private Const CREATE_TICKET_ERR_MISC_ERROR = 1
Private Const CREATE_TICKET_ERR_MANDANTORY = 2

Private Const ASSIGN_TICKET_ERR_NOERROR = 0
Private Const ASSIGN_TICKET_ERR_MISC_ERROR = 1
Private Const ASSIGN_TICKET_ERR_MANDANTORY = 2

Private Const CLOSE_TICKET_ERR_NOERROR = 0
Private Const CLOSE_TICKET_ERR_MISC_ERROR = 1
Private Const CLOSE_TICKET_ERR_MANDANTORY = 2

Private Const GET_TICKET_ERR_NOERROR = 0
Private Const GET_TICKET_ERR_MISC_ERROR = 1
Private Const GET_TICKET_ERR_MANDANTORY = 2

%REM
#####################################################
 VARIABLES
#####################################################
%END REM   
Private s As NotesSession
Private db As NotesDatabase
Private success As Variant

%REM
#####################################################
 WEBSERVICE
#####################################################
%END REM      
Class wsTicket
   
%REM
#####################################################
 Public Sub New
#####################################################
%END REM      
   Public Sub New
      ' initialize some stuff
      Set s = New NotesSession()
      Set db = s.currentDatabase
   End Sub
   
%REM
#####################################################
 Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
#####################################################
%END REM   
   Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
      
      CreateTicket = CREATE_TICKET_ERR_NOERROR
      
      
      On Error Goto ERRHANDLE
      If Trim(strUser) = "" Or Trim(strProblem) = "" Then
         CreateTicket = CREATE_TICKET_ERR_MANDANTORY ' mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else
         Dim doc As NotesDocument
         Dim dateTime As New NotesDateTime( "" )
         Call dateTime.SetNow
         
         Set doc = db.CreateDocument
         doc.Form = CREATE_TICKET_FORM
         doc.User = strUser      
         doc.Problem = strProblem
         doc.Status = CREATE_TICKET_INITIAL_STATUS ' new Ticket, unassigned
         doc.Webservice = CREATE_TICKET_VIA_WEBSERVICE
         doc.DateCreated = Cstr(dateTime.DateOnly)
         doc.TimeCreated = Cstr(dateTime.TimeOnly)
         success = doc.ComputeWithForm( False, False )
         Call doc.Save (True,True)
      End If
      
EXITPOINT:
      Exit Function
      
ERRHANDLE:
      CreateTicket = CREATE_TICKET_ERR_MISC_ERROR
      Resume EXITPOINT
      
   End Function
   
%REM
#####################################################
 Public GetAllTicketsBySupporter ( strSupporter As String ) As Variant
#####################################################
%END REM      
   Public Function GetAllTicketsBySupporter ( strSupporter As String ) As Variant
      
      On Error Goto ERRHANDLE      
      GetAllTicketsBySupporter = GET_TICKET_ERR_NOERROR
      
      If Trim(strSupporter) = "" Then
         GetAllTicketsBySupporter = GET_TICKET_ERR_MANDANTORY ' mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else      
      ' Your Code goes here   
      End If    
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      GetAllTicketsBySupporter = GET_TICKET_ERR_MISC_ERROR
      Resume EXITPOINT      
      
   End Function
   
%REM
#####################################################
 Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
#####################################################
%END REM   
   Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
      
      On Error Goto ERRHANDLE      
      AssignTicket = ASSIGN_TICKET_ERR_NOERROR
      
      If Trim(strTicket) = "" Or Trim(strAssignTo) = "" Then
         AssignTicket = ASSIGN_TICKET_ERR_MANDANTORY  'mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else      
      ' Your Code goes here   
      End If
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      AssignTicket = ASSIGN_TICKET_ERR_MISC_ERROR
      Resume EXITPOINT
   End Function
   
%REM
#####################################################
 Public Function CloseTicket ( strTicket As String ) As Integer
#####################################################
%END REM   
   Public Function CloseTicket ( strTicket As String ) As Integer
      
      On Error Goto ERRHANDLE      
      CloseTicket = CLOSE_TICKET_ERR_NOERROR
      
      If Trim(strTicket) = "" Then
         CloseTicket = CLOSE_TICKET_ERR_MANDANTORY 'mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else      
      ' Your Code goes here   
      End If    
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      CloseTicket = CLOSE_TICKET_ERR_MISC_ERROR
      Resume EXITPOINT   
   End Function
   
End Class
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 27.12.05 - 18:09:07
Hier ein Update des bisherigen Codes; nach wie vor kämpfe ich mit der Übergabe eine NotesDocumentCollection als ReturnValue einer Anfrage

%REM
#####################################################
 INCLUDES
#####################################################
%END REM   
%INCLUDE "lsxsd.lss"

%REM
#####################################################
 CONSTANTS
#####################################################
%END REM   
Private Const CREATE_TICKET_FORM = "BugReport"
Private Const CREATE_TICKET_INITIAL_STATUS = "0"
Private Const CREATE_TICKET_VIA_WEBSERVICE = 1

Private Const CREATE_TICKET_ERR_NOERROR = 0
Private Const CREATE_TICKET_ERR_MISC_ERROR = 1
Private Const CREATE_TICKET_ERR_MANDANTORY = 2

Private Const ASSIGN_TICKET_ERR_NOERROR = 0
Private Const ASSIGN_TICKET_ERR_MISC_ERROR = 1
Private Const ASSIGN_TICKET_ERR_MANDANTORY = 2

Private Const CLOSE_TICKET_ERR_NOERROR = 0
Private Const CLOSE_TICKET_ERR_MISC_ERROR = 1
Private Const CLOSE_TICKET_ERR_MANDANTORY = 2

Const DEFAULT_RETURN_VALUE ="-"

%REM
#####################################################
 VARIABLES
#####################################################
%END REM   
Private s As NotesSession
Private db As NotesDatabase
Private doc As NotesDocument
Private success As Variant
Private SearchFormula As String
Private strPersonName As String
Private i As Integer
Private nn As NotesName
Private col As NotesDocumentCollection

Class Ticket
   Public User As String
   Public TicketNumber As String
   Public Problem As String
End Class

Class TicketDetails
   Public User As String
   Public TicketNumber As String
   Public Problem As String
   ' ... more to declare
End Class

%REM
#####################################################
 WEBSERVICE
#####################################################
%END REM      
Class wsTicket
   
%REM
#####################################################
 Public Sub New
#####################################################
%END REM      
   Public Sub New
      ' initialize some stuff
      Set s = New NotesSession()
      Set db = s.currentDatabase
   End Sub
   
%REM
#####################################################
 Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
#####################################################
%END REM   
   Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
      
      CreateTicket = CREATE_TICKET_ERR_NOERROR
      
      
      On Error Goto ERRHANDLE
      If Trim(strUser) = "" Or Trim(strProblem) = "" Then
         CreateTicket = CREATE_TICKET_ERR_MANDANTORY ' mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else
         Dim doc As NotesDocument
         Dim dateTime As New NotesDateTime( "" )
         Call dateTime.SetNow
         
         Set doc = db.CreateDocument
         doc.Form = CREATE_TICKET_FORM
         doc.User = strUser      
         doc.Problem = strProblem
         doc.Status = CREATE_TICKET_INITIAL_STATUS ' new Ticket, unassigned
         doc.Webservice = CREATE_TICKET_VIA_WEBSERVICE
         doc.DateCreated = Cstr(dateTime.DateOnly)
         doc.TimeCreated = Cstr(dateTime.TimeOnly)
         success = doc.ComputeWithForm( False, False )
         Call doc.Save (True,True)
      End If
      
EXITPOINT:
      Exit Function
      
ERRHANDLE:
      CreateTicket = CREATE_TICKET_ERR_MISC_ERROR
      Resume EXITPOINT
      
   End Function
   
%REM
#####################################################
 Public Function GetAllTicketsBySupporter ( ) As Variant
#####################################################
%END REM      
   Public Function GetAllTicketsBySupporter ( strSupporter As String, status As String ) As Ticket
      
      On Error Goto ERRHANDLE      
      ' open, progress, closed, empty string or all
      If status = "" Or Ucase(status) = "ALL" Then
         status = "ALL"
      End If
      
      Select Case Ucase(status)
         
      Case "OPEN"
         
      Case "CLOSED"
         
      Case "PROGRESS"
         
      Case "ALL"          
         SearchFormula =_
         |@UpperCase(Form) ="BUGREPORT" & @Name([CN];supporter)="|_
         & CommonNameString (strSupporter ) & |"|
         
      Case Else
         
      End Select
      
      Dim dateTime As New NotesDateTime(_
      Cstr(Datenumber(2000, 5, 1)))
      
      ' get all tickets for a given supporter
      
      Set col = db.Search( SearchFormula, dateTime,0)
      
      Set GetAllTicketsBySupporter = New Ticket
      
      If Trim(strSupporter) = "" Or Col.Count = 0 Then
         ' the function must have a return value
         GetAllTicketsBySupporter.User = DEFAULT_RETURN_VALUE
         GetAllTicketsBySupporter.TicketNumber = DEFAULT_RETURN_VALUE
         GetAllTicketsBySupporter.Problem = DEFAULT_RETURN_VALUE
         Exit Function ' nothing else to do, get outa here !
      Else      
      ' Your Code goes here   
         Set doc = col.GetFirstDocument
         
         GetAllTicketsBySupporter.User = CommonNameString(getItemValue ("user"))
         GetAllTicketsBySupporter.TicketNumber = getItemValue ("ReqNumber")
         GetAllTicketsBySupporter.Problem = getItemValue ("problem")
         
      End If    
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      Resume EXITPOINT      
      
   End Function
   
%REM
#####################################################
 Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
#####################################################
%END REM   
   Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
      
      On Error Goto ERRHANDLE      
      AssignTicket = ASSIGN_TICKET_ERR_NOERROR
      
      If Trim(strTicket) = "" Or Trim(strAssignTo) = "" Then
         AssignTicket = ASSIGN_TICKET_ERR_MANDANTORY  'mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else      
      ' Your Code goes here   
      End If
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      AssignTicket = ASSIGN_TICKET_ERR_MISC_ERROR
      Resume EXITPOINT
   End Function
   
%REM
#####################################################
 Public Function CloseTicket ( strTicket As String ) As Integer
#####################################################
%END REM   
   Public Function CloseTicket ( strTicket As String ) As Integer
      
      On Error Goto ERRHANDLE      
      CloseTicket = CLOSE_TICKET_ERR_NOERROR
      
      If Trim(strTicket) = "" Then
         CloseTicket = CLOSE_TICKET_ERR_MANDANTORY 'mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else      
      ' Your Code goes here   
      End If    
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      CloseTicket = CLOSE_TICKET_ERR_MISC_ERROR
      Resume EXITPOINT   
   End Function
   
%REM
#####################################################
 Private Function CommonNameString (strName As String) As String
#####################################################
%END REM   
   Private Function CommonNameString (strName As String) As String
      Set nn = New NotesName( strName )
      strPersonName = nn.Common
      CommonNameString = strPersonName
   End Function
   
%REM
#####################################################
 Private Function getItemValue ( strItem As String ) As String
#####################################################
%END REM      
   Private Function getItemValue ( strItem As String ) As String
      If doc.HasItem(strItem) Then
         getItemValue = doc.GetItemValue( strItem )(0)
      Else
         getItemValue = DEFAULT_RETURN_VALUE
      End If
   End Function
End Class
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 27.12.05 - 21:15:16
Ulrich,

es macht aus meiner Sicht keinen Sinn, NotesDocumentCollection zu übergeben.
Blackberry hat keinen Notes Client und da gibt es überhaupt keine NotesDocumentCollection.
Vielleicht ist das schon so in Domino Webservices vorgesehen, dass da keine Domino-proprietären Objekte übertragen werden können.
Das ist, was ich mit Document-Style Webservices meine.

Was für einen Client nimmst du?
Eclipse Web Tools Platform?
Ich versuch morgen mal !!!Help!!! auf Domino 7 zu installieren. 

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 27.12.05 - 22:56:22
Im Grunde genommen hat das mit dem Complex Type Kapitel (ziemlich weit unten) von hier zu tun:
http://www-128.ibm.com/developerworks/lotus/library/nd7-webservices/index.html
Du kannst einfach nicht beliebige Datentypen über RPC-style übergeben. D.h. sie dürfen nur aus den genannten in RPC erlaubten Datentypen bestehen.
Du kannst zwar Klassen, Arrays, evtl. sogar Listen (noch nicht genau angeschaut) übertragen, aber eben keine komplexen, in Lotus eingebauten Objekte (z.B. NotesDocumentCollection).
Intern wird das in die SOAP-Datentypen, enkodiert als xml übersetzt.
Ganz hilfreich wars bei meinem ersten Webservices Projekt, als ich einen Proxy dazwischengeschaltet habe (gibts im apache-axis Projekt). Dann kann man nämlich sehen *wie* das Zeugs per xml-message zwischen Consumer und Producer hin-und-hergeschickt wird.
Kann ich mal zeigen.
Damit sieht man besser, was unter der Haube abläuft.
Du müßtest die Document Collection in eine eigene Klasse mappen. Irgendwann werden dann Document-style Webservices einfacher.

Gruß Axel

Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 28.12.05 - 06:09:08
@Axel:

Zum Testen nehme ich Eclipse mit Web Services Explorer Plugin.
Ja, ich weiß, daß man keine Collection übergeben kann.  Habe gestern mal Julian angemailt und ihn gefragt, wie man das lösen könnte; hier seine Antwort:

Ulrich -

There are a few ways to accomplish what you want.

One thing you will NOT be able to do is return an actual NotesDocumentCollection. You can return a custom class, or an array of a custom class, but not a Notes class.

The easiest way to do it in LotusScript is to create a custom class that is something like this:

========= CODE =========

Class TicketCollection
    Public Tickets() As Ticket
    Public Count As Integer
End Class

========= CODE =========


And then you'd have a function in your web service like:


========= CODE =========

Public Function GetAllTickets () As TicketCollection
    Dim session as new NotesSession
    Dim db as NotesDatabase
    Dim dc as NotesDocumentCollection
    Dim doc as NotesDocument
    Dim count as integer

    set db = session.CurrentDatabase
    set dc = db.AllDocuments()
    count = dc.Count
   
    set GetAllTickets = new TicketCollection
    GetAllTickets.Count = count
    If (count = 0) then
        Redim GetAllTickets.Tickets(count)
    Else
        Redim GetAllTickets.Tickets(count - 1)
    End If
   
    count = 0
    set doc = dc.GetFirstDocument
    do until (doc is nothing)
        '** write some kind of function that converts a NotesDocument
        '** to an object of type Ticket
        set GetAllTickets.Tickets(count) = GetTicketInfo(doc)
        count = count + 1
        set doc = db.GetNextDocument(doc)
    loop
   
End Function

========= CODE =========

When something calls the web service, it will have to read the WSDL file to understand how to parse both a TicketCollection and a Ticket, but that's pretty trivial at this point. All you have to do is have the calling code get the TicketCollection, check to see if there are any tickets in it, and if there are, read through the TicketCollection.Ticket() array.

It's useful to have the TicketCollection.Count variable in there, because it's safer to check for TicketCollection.Count == 0 than it is to start reading a possibly null array.

By the way, all the code above was typed directly into this e-mail, so there are likely some errors. But it should give you the idea, anyway.

Hope that helps!

- Julian

Das mit  Public Tickets() As Ticket hatte ich auch schon, aber irgendwie hat das nicht hingehauen; jetzt weiß ich auch warum: Public Count As Integer ist das fehlende Puzzle Teil.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 28.12.05 - 07:31:53
Hmm. Von der Klasse ist es jetzt in Ordnung.
Ein Ticketobjekt besteht ja nun lediglich aus den in SOAP erlaubten Datentypen.
Ich halte nach wie vor doc-Style als sinnvoller.
Hast du es einmal ausprobiert.
Ich kann mal versuchen das hier nachzuvollziehen.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 28.12.05 - 08:22:53
Ok. Ich habs jetzt für meinen Land/Hauptstadt Webservice ausprobiert.
Ich glaub das Problem ist weniger das mit der 0-Collection, sondern mehr dem WSDL zu erklären, was man unter einem Array von Custom-Objekten versteht.
Genau das muss aber im WSDL stehen, würd ich sagen.
Du kannst in einer LotusScript ja nicht einmal deklarieren, dass du einen bestimmten Array zurückgeben willst sondern nur Variant. IMHO muss das Custom Objekt (in meinem Fall LandInst mit den Membern name und Hauptstacdt) aber im WSDL beschrieben werden, damit das funktioniert.


Ohne mir ganz sicher zu sein, sehe ich 2 Möglichkeiten:
a) Irgendwie das wsdl-File customizen (auch nicht einfach) oder
b) Doc-Lit Style Webservices.

Ich versuch das erstmal mit dem Land-Webservices, mach aber heute längere Pausen.

Neuer Land webservice mit neuer Funktion getAllLands()
Code
Class Land
	Private ses As NotesSession
	Private db As NotesDatabase
	Private vwLand As NotesView
	
	
	Public Sub New 
		Set ses = New NotesSession()
		Set db = ses.currentDatabase
		Set vwLand = db.getView("land")
	End Sub
	
	
	Public Function getHauptstadt (land As String) As String
		Dim docLand As NotesDocument
		Set docLand = vwLand.GetDocumentByKey(land)
		If docLand Is Nothing Then 
			getHauptstadt = "LAND <" & land & "> kann in der Datenbank nicht gefunden werden." 
		Else
			getHauptstadt = docLand.Hauptstadt(0)
		End If
		
	End Function
	
	Public Function getAllLands() As Variant
		
		Dim retVal() As LandInst
		Dim aCounter As Long
		aCounter = -1
		Dim aLandInst As LandInst
		
		
		Dim docLand As NotesDocument
		Set docLand = vwLand.getFirstDocument
		
		Do Until docLand Is Nothing
			aCounter = aCounter + 1
			Set aLandInst = New LandInst()
			aLandInst.name = docLand.land(0)
			aLandInst.hauptStadt = docLand.hauptStadt(0)
			Redim Preserve retVal(aCounter) 
			Set retVal(aCounter) = aLandInst
			Set docLand = vwLand.GetNextDocument(docLand)
		Loop
		If aCounter > - 1 Then 
			getAllLands = retVal
		Else 
			getAllLands = retVal
		End If
		
	End Function
	
End Class

erzeugt dieses WSDL:
Code
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="urn:DefaultNamespace" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="urn:DefaultNamespace" xmlns:intf="urn:DefaultNamespace" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <wsdl:message name="GETHAUPTSTADTResponse">
  <wsdl:part name="GETHAUPTSTADTReturn" type="xsd:string"/>
 </wsdl:message>
 <wsdl:message name="GETALLLANDSRequest">
 </wsdl:message>
 <wsdl:message name="GETHAUPTSTADTRequest">
  <wsdl:part name="LAND" type="xsd:string"/>
 </wsdl:message>
 <wsdl:message name="GETALLLANDSResponse">
  <wsdl:part name="GETALLLANDSReturn" type="xsd:anyType"/>
 </wsdl:message>
 <wsdl:portType name="Land">
  <wsdl:operation name="GETHAUPTSTADT" parameterOrder="LAND">
   <wsdl:input message="impl:GETHAUPTSTADTRequest" name="GETHAUPTSTADTRequest"/>
   <wsdl:output message="impl:GETHAUPTSTADTResponse" name="GETHAUPTSTADTResponse"/>
  </wsdl:operation>
  <wsdl:operation name="GETALLLANDS">
   <wsdl:input message="impl:GETALLLANDSRequest" name="GETALLLANDSRequest"/>
   <wsdl:output message="impl:GETALLLANDSResponse" name="GETALLLANDSResponse"/>
  </wsdl:operation>
 </wsdl:portType>
 <wsdl:binding name="DominoSoapBinding" type="impl:Land">
  <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
  <wsdl:operation name="GETHAUPTSTADT">
   <wsdlsoap:operation soapAction="GETHAUPTSTADT"/>
   <wsdl:input name="GETHAUPTSTADTRequest">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:input>
   <wsdl:output name="GETHAUPTSTADTResponse">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:output>
  </wsdl:operation>
  <wsdl:operation name="GETALLLANDS">
   <wsdlsoap:operation soapAction="GETALLLANDS"/>
   <wsdl:input name="GETALLLANDSRequest">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:input>
   <wsdl:output name="GETALLLANDSResponse">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:output>
  </wsdl:operation>
 </wsdl:binding>
 <wsdl:service name="LandService">
  <wsdl:port binding="impl:DominoSoapBinding" name="Domino">
   <wsdlsoap:address location="http://localhost"/>
  </wsdl:port>
 </wsdl:service>
</wsdl:definitions>


Dieser Teil sieht für mich nicht sonderlich ermutigend aus:
Code
<wsdl:message name="GETALLLANDSResponse">
  <wsdl:part name="GETALLLANDSReturn" type="xsd:anyType"/>
 </wsdl:message>

Vielleicht hat Julian Lust sich an der Diskussion zu beteiligen?
Der Land-Webservice wäre ein einfaches Beispiel als Modell, um Domino-Webservices dazu zu bringen, komplexere Datentypen herauszugeben.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 28.12.05 - 08:34:45
Von meinem notes-net-rss feed Reader (http://atnotes.de/index.php?topic=27846.0) weiss ich, dass sich in den letzten Tagen ziemlich viele Hochkaräter im notes-net r6/7 Forum tummeln. Da kann ich das Problem mit der Rückgabe von Collections/Arrays mit custom Classes auch mal posten.  ;D
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 28.12.05 - 12:23:58
Der Aufruf dieser Methode per Webservice:
Public Function getAllLands() As Variant
(2 postings weiter oben).
läßt meinen Domino 7.0 Server abstürzen.
Und zwar immer
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 28.12.05 - 14:06:36
Ja, das hatte ich auch; liegt am Variant. Wenn du als Rückgabewert eine Klasse übergibst läuft das sauber
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 28.12.05 - 14:29:51
Ach so.  ;D  ich muß eine Sammlung von Klassen in eine andere Klasse als Wrapper tun?
Ich glaub das ist der eigentliche Grund, warum Julian dieses Konstrukt gewählt hat.
Code
Class TicketCollection
    Public Tickets() As Ticket
    Public Count As Integer
End Class
Nicht als Schutz, damit der zurückgegebene Array nicht leer ist.
Das Domino Designer RedBook "ND 7" hat übrigens Beispiele für komplexere Webservices mit Java. Ich hab die DBs itso/product.nsf und itso/webservices.nsf auf meinen Server geladen. Mach jetzt den Client.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 28.12.05 - 15:17:38
Java kompiliert nicht (ohne Fehlermeldung. Bug in 7.0?)
Das mit dem Wrapper funktioniert auch nicht richtig.
Der Webservice liefert zumindest bei mir nicht die Elemente des Objekts zurück.

Es ist zwar richtig, dass er 2 Objekte zurücksendet, aber ich hab überhaupt keine Infos über die Properties der Objekte.

Hier die Rückgabe (2 Länder sind in der Datenbank).
Code
<soapenv:Envelope xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <ns1:GETALLLANDSResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:DefaultNamespace">
         <GETALLLANDSReturn xsi:type="ns1:LANDCOLWRAPPER">
            <ALLLANDINST soapenc:arrayType="ns1:LANDINST[2]" xsi:type="soapenc:Array">
               <item xsi:type="ns1:LANDINST"/>
               <item xsi:type="ns1:LANDINST"/>
            </ALLLANDINST>
         </GETALLLANDSReturn>
      </ns1:GETALLLANDSResponse>
   </soapenv:Body>
</soapenv:Envelope>

Tipp: http://www.soapui.org/index.html (schneller als Eclipse).
Vielleicht mache ich irgendetwas falsch.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 28.12.05 - 16:05:31
Ok. War mein Fehler. Hab im Webservices die Objekte zwar initialisiert, aber die Werte nicht gesetzt.

Code
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
 <soapenv:Body>
  <ns1:GETALLLANDSResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:DefaultNamespace"><GETALLLANDSReturn xsi:type="ns1:LANDCOLWRAPPER"><ALLLANDINST xsi:type="soapenc:Array" soapenc:arrayType="ns1:LANDINST[2]"><item xsi:type="ns1:LANDINST"><ANAME xsi:type="xsd:string">Chile</ANAME><HAUPTSTADT xsi:type="xsd:string">Santiago</HAUPTSTADT></item><item xsi:type="ns1:LANDINST"><ANAME xsi:type="xsd:string">Deutschland</ANAME><HAUPTSTADT xsi:type="xsd:string">Berlin</HAUPTSTADT></item></ALLLANDINST></GETALLLANDSReturn></ns1:GETALLLANDSResponse>
 </soapenv:Body>
</soapenv:Envelope><soapenv:Envelope xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <ns1:GETALLLANDSResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:DefaultNamespace">
         <GETALLLANDSReturn xsi:type="ns1:LANDCOLWRAPPER">
            <ALLLANDINST soapenc:arrayType="ns1:LANDINST[2]" xsi:type="soapenc:Array">
               <item xsi:type="ns1:LANDINST">
                  <ANAME xsi:type="xsd:string">Chile</ANAME>
                  <HAUPTSTADT xsi:type="xsd:string">Santiago</HAUPTSTADT>
               </item>
               <item xsi:type="ns1:LANDINST">
                  <ANAME xsi:type="xsd:string">Deutschland</ANAME>
                  <HAUPTSTADT xsi:type="xsd:string">Berlin</HAUPTSTADT>
               </item>
            </ALLLANDINST>
         </GETALLLANDSReturn>
      </ns1:GETALLLANDSResponse>
   </soapenv:Body>
</soapenv:Envelope><?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
 <soapenv:Body>
  <ns1:GETALLLANDSResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:DefaultNamespace"><GETALLLANDSReturn xsi:type="ns1:LANDCOLWRAPPER"><ALLLANDINST xsi:type="soapenc:Array" soapenc:arrayType="ns1:LANDINST[2]"><item xsi:type="ns1:LANDINST"><ANAME xsi:type="xsd:string">Chile</ANAME><HAUPTSTADT xsi:type="xsd:string">Santiago</HAUPTSTADT></item><item xsi:type="ns1:LANDINST"><ANAME xsi:type="xsd:string">Deutschland</ANAME><HAUPTSTADT xsi:type="xsd:string">Berlin</HAUPTSTADT></item></ALLLANDINST></GETALLLANDSReturn></ns1:GETALLLANDSResponse>
 </soapenv:Body>
</soapenv:Envelope>

Ich werd den Land Webservices entsprechend übersichtlich updaten und an den Thread im 7er Forum hängen.

Ich denke, die können mit ihrem Tool etwas damit anfangen.
Kann aber z.B. für die !!!Help!!!-Webservices auch einen Swing Client schreiben.
Hab das auch durch Eclipse gejagt und mit den erzeugten Klassen kann man schon arbeiten.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 28.12.05 - 16:29:08
Genau, so muss das aussehen. Ich werde das jetzt mal für HELP umsetzen. Wollte eigentlich schon früher damit anfangen, aber heute wollte ich "mal eben" ein Update unserer Firewalls machen ... na ja, "mal eben" halt ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 28.12.05 - 18:33:25
Ich habe die Erkenntnisse jetzt einmal in HELP eingebaut:
Die Funktion GetAllTicketsBySupporter  sieht dann so aus


Class TicketCollection
   Public Tickets() As Ticket
   Public TicketCount As Integer
End Class

Class Ticket
   Public User As String
   Public TicketNumber As String
   Public Problem As String
End Class


%REM
#####################################################
 Public Function GetAllTicketsBySupporter ( ) As Variant
#####################################################
%END REM      
   Public Function GetAllTicketsBySupporter ( strSupporter As String, status As String ) As TicketCollection
      
      On Error Goto ERRHANDLE      
      ' open, progress, closed, on hold, empty string or all
      If status = "" Or Ucase(status) = "ALL" Then
         status = "ALL"
      End If
      
      Select Case Ucase(status) ' evaluate status
         
      Case "OPEN"
         SearchFormula =_
         |@UpperCase(Form) ="BUGREPORT" & @UpperCase(@Name([CN];supporter)) ="|_
         & Ucase(CommonNameString (strSupporter )) & |"|
         
      Case "CLOSED"
         SearchFormula =_
         |@UpperCase(Form) ="BUGREPORT" & @UpperCase(@Name([CN];supporter)) ="|_
         & Ucase(CommonNameString (strSupporter )) & |"|
         
      Case "PROGRESS"
         SearchFormula =_
         |@UpperCase(Form) ="BUGREPORT" & @UpperCase(@Name([CN];supporter)) ="|_
         & Ucase(CommonNameString (strSupporter )) & |"|
         
      Case "ON HOLD"
         SearchFormula =_
         |@UpperCase(Form) ="BUGREPORT" & @UpperCase(@Name([CN];supporter)) ="|_
         & Ucase(CommonNameString (strSupporter )) & |"|
         
      Case "ALL"          
         SearchFormula =_
         |@UpperCase(Form) ="BUGREPORT" & @UpperCase(@Name([CN];supporter)) ="|_
         & Ucase(CommonNameString (strSupporter )) & |"|
         
      Case Else
         
      End Select
      
      Dim dateTime As New NotesDateTime(_
      Cstr(Datenumber(2000, 5, 1)))
      
      Set col = db.Search( SearchFormula, dateTime,0)
      count = col.count
      Set GetAllTicketsBySupporter = New TicketCollection
      GetAllTicketsBySupporter.TicketCount = count
      
      If (count = 0) Then
         Redim GetAllTicketsBySupporter.Tickets(count)
      Else
         Redim GetAllTicketsBySupporter.Tickets(count - 1)
      End If
      
      If Trim(strSupporter) = "" Or count = 0 Then
         Exit Function ' nothing else to do, get outa here !
      Else      
         
         i = 0
         Set doc = col.GetFirstDocument
         Do Until (doc Is Nothing)
            
            Set TicketValues = New Ticket
            TicketValues.User = CommonNameString(getItemValue ("user"))
            TicketValues.TicketNumber = getItemValue ("ReqNumber")
            TicketValues.Problem = getItemValue ("problem")
            
            Set GetAllTicketsBySupporter.Tickets(i) = TicketValues
            i = i +1
            Set doc = col.GetNextDocument(doc)
         Loop
         
      End If    
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      Resume EXITPOINT      
      
   End Function

Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 28.12.05 - 19:37:52
Ich habe den Code mal an die "Brombeeren" bei RIM geschickt; Testen in Eclipse oder der SoapGUI ist ja ganz nett, ich würde aber gerne auch wissen, ob die mit dem Zeugs was anfangen können.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 28.12.05 - 20:06:05
Zitat
Kann aber z.B. für die !!!Help!!!-Webservices auch einen Swing Client schreiben.

Möglicherweise wäre das was für den OpenNTF booth.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 28.12.05 - 21:06:50
Übrigens funktioniert ein Konstrukt

for i = 0 to col.count
Set doc = col.GetNthDocument(i)
...
next

bei mir nicht.

Wenn ich aber für i einen festen Wert einsetze (Set doc = col.GetNthDocument(2) ) dann funzt das  ??? Wieder mal ein neuer Bug ??

Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 28.12.05 - 22:08:15
Interessant finde ich die Benamsung. Da wird von Klassen ( class) geredet, wenn man doch eigentlich einen Type meint ...Eine Klasse hat für mich immer mindestens eine Property oder methode.

Daß man einen Variant, eine NotesDocumentCollection oder ein RichText Feld nicht als Response verwenden kann ist aber klar; woher soll denn das System, das den Webservice aufruft wissen, was das sein soll. Also muß man sich auf allgemein verständliche Datentypen einigen ( String , short, long ... )

Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 28.12.05 - 22:10:56
Ich habe den Code mal an die "Brombeeren" bei RIM geschickt; Testen in Eclipse oder der SoapGUI ist ja ganz nett, ich würde aber gerne auch wissen, ob die mit dem Zeugs was anfangen können.

Weiss nicht. Vielleicht zu kompliziert. Hängt vom Tool ab. Zumindest für Java1.4 kann ich mit Eclipse für mein Beispiel eine Reihe von Klassen erzeugen, die als Subsystem definitiv funktionieren.
Der serverseitige Code interessiert mich dann gar nicht mehr.
Aus dem wsdl lasse ich Eclipse diese Klassen generieren.
Dann beinhaltet die xxxProxy-Klasse (hier LandProxy) alle Methoden die ich von Java aus brauche.
Das funktioniert definitiv.
Ich hatte das hier kurz beschrieben: 
http://atnotes.de/index.php?topic=26569.msg169621#msg169621
(zu 6.b ist noch zu Ergänzen, dass man die Klassen in JavaSource/DefaultNamespace findet).
Ich halte das für stabil.

Vielleicht ist es besser, du stellst eine HELP Beispiel DB mit Webservice und gibts denen die URL für das WSDL File. Wenn das Tool das die benutzen einigermassen was taugt, dann ist das eine für die einfachere Basis.

Ich würd übrigens die Methoden für die Tickets anders definieren.
Also nicht nach TicketStatus differenzieren.
Und Objekte mit unterschiedlichen Details runterschicken.
Code
Public Function GetAllTicketsBySupporterView ( strSupporter As String) As TicketViewCollection
Hier nur Daten runterschicken, die für eine Übersichtsdarstellung sinnvoll sind (wie eine NotesView)
TicketViewCollection enthält einen Array aus TicketViewEntry-Objekten:
Code
class TicketViewEntry
Public User As String
   Public TicketNumber As String
   Public Problem As String 
   Public lastChange As Date
end class

... und eine 2. Methode, die einen Eintrag detailiert zurückliefert:
Code
Public Function GetTicketBySupporterDetail ( TicketNumber As String) As Ticket
Hier alle Daten runterschicken, die für den User für die Bearbeitung des Tickets sinnvoll sind
Code
class Ticket
Public User As String
   Public TicketNumber As String
   Public Problem As String 
   Public lastChange As Date
   Public String content
   Public ticketHistoryCollection as TicketHistoryCollection ' oops neues Objekt
   etc. 
end class

Der Blackberry-User sieht dann erst eine Übersichtsdarstellung und das Klicken aus einem der Einträgen in der View startet einen neuen Webservice-Call der das detaillierte Ticket zurückliefert.
Aber ich kann das mal mit einem Swing Client nachvollziehen und mir vorher HELP installieren. Sieht nicht so schwierig aus.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 28.12.05 - 22:20:36
Interessant finde ich die Benamsung. Da wird von Klassen ( class) geredet, wenn man doch eigentlich einen Type meint ...Eine Klasse hat für mich immer mindestens eine Property oder methode.
SOAP ist heute offiziell kein Akronym mehr für "Simple Object Access Protocol" sondern ein Eigenname.
Zum Problem vom "O" in SOAP:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsoap/html/understandsoap.asp
(die erste Hälfte über dem Bild).
Der Grund war aber nicht wie es in dem Microsoft Artikel dargestellt wird (make accessible for broader audience), sondern weil sich Objekt-Bäume nicht so gut für die Verteilung eignen.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 29.12.05 - 01:17:34
Das zweite Problem von SOAP ist das S für Simple. Wenn man sich anschaut, was da über die Leitung geht, um ein simples Array zu übertragen, ist das schon extrem.
Find es ziemlich interessant, ein reales Produkt (HELP) für Webservices zu haben.
Ich bin mir nicht sicher, rechne aber das sich am Ende doc-Lit Style Webservices als effizienter herausstellen werden (vielleicht aus Gründen der Performance).
Werd erstmal mit dem Land-Webservice für den Swing-Client weiterarbeiten und sobald ich da klar bin auf HELP umsteigen. Paßt ganz gut, weil ich sowieso ein paar "modernere" Swing Sachen ausprobieren will. Im übrigen hilft das vielleicht auch den Blackberry-Leuten für die Übersicht. Bis zum 10.1. sollte das locker fertig sein.
Ein Swing Client für HELP könnte eventuell auch für die Praxis interessant sein. Leute könnten dann von zu Hause ausserhalb des Notes-Netzwerks arbeiten. Gibt für mich da noch einige offene Security Fragen, aber das werd ich dann sehen.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 29.12.05 - 08:37:42
wie wäre es mit einem Client basierend auf der Eclipse Rich Client Platform (RCP) anstelle von Swing Client?
Ist gleich eine gute Vorbereitung für Notes 8 ;-)

RIM entwickelt übrigens ebenfalls mit RCP:
http://eclipse.techforge.com/index.php/articles/189
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 29.12.05 - 08:42:32
zum Testen habe ich noch ein kleines Tool gefunden. ( OK, klein ist relativ, immerhin braucht es .NET )

Sitze gerade in der Firma und mülle meinen heimischen Server via web services mit Tickets zu. geht prima  ;D

Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 29.12.05 - 10:37:51
wie wäre es mit einem Client basierend auf der Eclipse Rich Client Platform (RCP) anstelle von Swing Client?
Kannst du machen.  ;)

Von den reinen Webservices ist es nicht so schwierig. Schon Eclipse mit WTP 0.7 erzeugt solide die Klassen für die Verbindung mit dem Webservice, einfach indem man ihm die URL des WSDL füttert. Netbeans 5.0 beta 2 meckert übrigens fehlende WS-I-Profile (spelling?) an. Und dann fehlt dann ein Feature, das in der Doku angegeben ist.

Erzeugt aber die Klassen zur Verbindung mit den Webservices. Ich versteh die aber weniger als die, die Eclipse erzeugt und ich geh zurück auf Eclipse.
In Eclipse kann man einfach die xxxProxy-Klasse als Facade gegen dieses Wirrwarr aus Klassen nehmen.
Unten Screenshots für Eingabefenster sowie die daraus generierten Klassen, wenn man finish klickt. In Eclipse mit WTP sieht es ähnlich aus.




Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 29.12.05 - 13:44:19
Sowieso ist die GUI ja nur ein relativ dünner - aber leider ziemlich komplexer - Layer.
Ein paar Ideen für Caching.
Webservices sind ja relativ langsam.
Es sieht ja so aus, dass auf dem Webservices Consumer und dem Webservice Producer eine Sammlung der Tickets gehalten werden.
Um die Menge der übertragenen Tickets gering zu halten, kann man bei der Abfrage der Tickets ein letztesÄnderungsDatum mitgeben. Es werden dann vom Webservice Producer nur die Tickets runtergesendet, die sich seit dem letzten letzteÄnderungsDatum geändert haben.
Ich bau das jetzt für den Land-Webservice in den Swing Client ein. Relativ generisch.
Man kann auch die geänderten neuen Daten in der GUI extra kennzeichnen.
Die entsprechende Logik liegt natürlich in einem völlig GUI unabhängigen Business Layer. Marc kann das also für den Eclipse RichClient wiederverwenden.

Ich bin relativ optimistisch, dass ich bei langsamer Arbeitsgeschwindigkeit irgendwann heute Abend für den Land-Webservice den Client fertig habe.
Dann kann ich auf HELP umsteigen. Ich hab auch Anfang der nächsten Woche frei.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 29.12.05 - 17:18:11
Für den Land-Webservice ist die Swing-GUI für ca. 20% der angekündigten Features fertig.
Ich lös jetzt noch 80% der Zusatzfeatures wie Refresh-Button, smartes cachen, neue Länder farblich hervorgehoben.
Dann kann ich etwas ähnliches für HELP hochziehen.
Eigentlich ist das ziemlich einfach. Ich mach aber einfach swing nicht so oft.

So ähnlich könnte man das auch für Help machen, oder?
Auf der linken Seite eine Art Navigator für die Tickets und rechts dann die Tickets selbst?
Man kann im Navigator verschiedene Ansichten anbieten (nach Datum, nach Status der Tickets, etc.).

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 29.12.05 - 17:33:27
Das sieht doch schon mal ganz gut aus, Axel  ...

Ich habe noch ein wenig an der Function GetAllTicketsBySupporter rumgewerkelt.
Den Status habe ich gestrichen, so daß als einziger Input nur der Name des Supporters übrigbleibt.

Außerdem habe ich noch das HELP übliche Errorhandling und Logging eingebaut. ( Dazu müssen die dazu notwendigen Funktionen über Use "lib.appl.functions" eingebunden werden )

Ich weiß, daß die Funktion natürlich eine Menge Docs zurückgeben kann; ist mir aber momentan wurscht. RIM will ja nur demonstrieren, daß die Webservices vom Domino 7 mit ihrem Mobile Data Service zusammenarbeiten.

Die Funktion gibt zusätzlich auch den Dokumentenstatus zurück; danach kann man dann clientseitig auch noch filtern. Außerdem wird ein ErrorCode mitgeliefert ...

%REM
#####################################################
 Public Function GetAllTicketsBySupporter ( ) As TicketCollection
#####################################################
%END REM      
   Public Function GetAllTicketsBySupporter ( strSupporter As String ) As TicketCollection
      
      On Error Goto ERRHANDLE      
      
      If Trim(strSupporter) = "" Then
         Set GetAllTicketsBySupporter = New TicketCollection
         GetAllTicketsBySupporter.TicketCount = 0
         GetAllTicketsBySupporter.ErrorCode = GET_TICKET_ERR_MANDANTORY
         Exit Function ' nothing else to do, get outa here !
      Else      
         
         SearchFormula =_
         |@UpperCase(Form) ="BUGREPORT" & @UpperCase(@Name([CN];supporter)) ="|_
         & Ucase(CommonNameString (strSupporter )) & |"|
         
         Dim dateTime As New NotesDateTime(_
         Cstr(Datenumber(2000, 5, 1)))
         Dim dc As NotesDocumentCollection
         Set dc = db.Search( SearchFormula, dateTime,0)
         
         count = dc.count
         Set GetAllTicketsBySupporter = New TicketCollection
         GetAllTicketsBySupporter.TicketCount = count
         GetAllTicketsBySupporter.ErrorCode = GET_TICKET_ERR_NOERROR
         
         If (count = 0) Then
            Redim GetAllTicketsBySupporter.Tickets(count)
         Else
            Redim GetAllTicketsBySupporter.Tickets(count - 1)
         End If
         
         i = 0
         Set doc = dc.GetFirstDocument
         Do Until (doc Is Nothing)
            
            Set TicketValues = New Ticket
            TicketValues.User = CommonNameString(getItemValue ("user"))
            TicketValues.TicketNumber = getItemValue ("ReqNumber")
            TicketValues.Problem = getItemValue ("problem")
            TicketValues.Status = getItemValue ("status")
            
            Set GetAllTicketsBySupporter.Tickets(i) = TicketValues
            i = i +1
            Set doc = dc.GetNextDocument(doc)
            
         Loop
         
      End If    
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      xProc = Getthreadinfo(LSI_THREAD_PROC)
      xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
      If UseOpenLog Then
         Call LogError
      Elseif LogScriptErrors Then
         Call ThrowException ( xProc, xError  )
      End If
      Print xError   'In all cases
      If ResumeMethodNext Then
         Resume Next   
      Else
         Set GetAllTicketsBySupporter = New TicketCollection
         GetAllTicketsBySupporter.TicketCount = count
         GetAllTicketsBySupporter.ErrorCode = GET_TICKET_ERR_MISC_ERROR
         Resume EXITPOINT
      End If      
      
   End Function
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 29.12.05 - 18:06:37
Axel, du hast mehrfach angedeutet, daß du die Webservices langsam findest ( nehme an, du meinst den Response )

Habe gerade mal ein wenig rumgespielt: Knapp 13 Sekunden braucht der Service, um 583 Tickets abzurufen. Also ich finde, das ist i.O., oder ?
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 29.12.05 - 18:46:05
Frage mich gerade, ob es eigentlich sinnvoll ist, die einzelnen Services in einer "Klasse" zu kapseln.
Wenn ich mir so die Dokus dazu anschaue, bauen die für jede Function / Methode einen eigenen Service.
Ich finde das persönlich nicht so toll.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 29.12.05 - 19:36:42
wo habe ich den Denkfehler ?? Hatte ja angedeutet, daß GetNthDocument ( i ) nicht funktioniert. Nach ein wenig Bastelarbeit habe ich folgendes gefunden:

This one doesn't work:


         For i = 0 To dc.Count
            Set doc = dc.GetNthDocument ( i + 1 )
            
            Set TicketValues = New Ticket
            TicketValues.User = CommonNameString(getItemValue ("user"))
            TicketValues.TicketNumber = getItemValue ("ReqNumber")
            TicketValues.Problem = getItemValue ("problem")
            TicketValues.Status = getItemValue ("status")
            
            Set GetAllTicketsBySupporter.Tickets ( i ) = TicketValues
         Next

( doc is not initialized )


BUT this one works like a charme

         For i = 1 To dc.Count
            Set doc = dc.GetNthDocument ( i )
            
            Set TicketValues = New Ticket
            TicketValues.User = CommonNameString(getItemValue ("user"))
            TicketValues.TicketNumber = getItemValue ("ReqNumber")
            TicketValues.Problem = getItemValue ("problem")
            TicketValues.Status = getItemValue ("status")
            
            Set GetAllTicketsBySupporter.Tickets ( i  - 1 ) = TicketValues
         Next   

Isn't it the same ??    

Ich finde einfach nicht den Fehler in meiner Denke; müsste wohl mal wieder Urlaub machen ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 29.12.05 - 19:42:23
Oh Gott, jetzt wo ich es gepostet habe, sehe ich den Denkfehler auf den ersten Blick... wie peinlich
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 29.12.05 - 19:54:51
Und das

         For i = 1 To dc.Count
            Set doc = dc.GetNthDocument ( i )
            
            Set TicketValues = New Ticket
            TicketValues.User = CommonNameString(getItemValue ("user"))
            TicketValues.TicketNumber = getItemValue ("ReqNumber")
            TicketValues.Problem = getItemValue ("problem")
            TicketValues.Status = getItemValue ("status")
            
            Set GetAllTicketsBySupporter.Tickets ( i  -1 ) = TicketValues
         Next

bringt noch einmal einen enormen Performancegewinn : 7 Sekunden für 702 Docs  8)
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 29.12.05 - 20:03:11
Axel, du hast mehrfach angedeutet, daß du die Webservices langsam findest ( nehme an, du meinst den Response )

Habe gerade mal ein wenig rumgespielt: Knapp 13 Sekunden braucht der Service, um 583 Tickets abzurufen. Also ich finde, das ist i.O., oder ?
7 Sekunden find ich eindeutig zu viel. Bin schliesslich kein Websphere-EJB2.0-Entwickler.  Werd auf jeden Fall noch untersuchen, wo er so lange braucht. Meine Idee nur die Tickets runterzuladen, die später verändert worden sind als ein vom Client persistent abgelegter Zeitstempel halte ich nach wie vor für gut. Bin aber auch dafür, erst einmal eine Lösung mit Schwächen anzubieten.

Performance von SOAP ist definitiv ein issue und sowas führt ja heutzutage zu einer Menge von Alternativ-Implementierungen. Macht den Job auch nicht einfacher, ist aber richtig. Das gute an SOAP ist die Toolunterstützung. Beim Programmieren hat man weder auf Client noch auf Serverseite direkt etwas mit xml zu tun.

Zu wissen wie man das in der Not schneller machen kann und die Stellen zu kennen, wo es langsam ist, halte ich für eine wichtige Information. Dafür ein besseres Verständnis, ist ein Grund warum ich das hier alles mache.
Weiss noch nicht, wie HELP funktioniert, aber 583 Tickets in denen mein Name steht, wäre definitiv ein Problem in der realen Welt mit sämtlichen Helpdesksystemen, die ich kenne. ;D Vielleicht eine zu große Zahl.
 
Zitat
rage mich gerade, ob es eigentlich sinnvoll ist, die einzelnen Services in einer "Klasse" zu kapseln.
Nö. Eine wsdl Datei für sämtliche Funktionen, die irgendwie etwas mit Tickets zu tun haben. Das ist auch für die IDE auf Consumerseite wesentlich einfacher für die Code-Generierung.
Und zudem entspricht das den Design-Ideen der SOA (consultant-buzzword-on-top-of-SOA) wie ich es verstehe. Bin aber in Thomas Erls Bibel mit dem dicksten Bucheinband, den ich seit langen gesehen habe, erst auf Seite 160 von 700 .

Zitat
For i = 0 To dc.Count
            Set doc = dc.GetNthDocument ( i + 1 )

Ich versuche sowas in jeder Programmiersprache wo möglich zu umgehen. dc.getNextDocument(doc) ist eh schneller.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Thomas Schulte am 29.12.05 - 20:12:15
Ich denke nicht das es in diesem Fall etwas ausmacht ob das Ganze 7 oder 2 Sekunden braucht um 700 Tickets runterzuladen. Am anderen Ende, zumindest für dieses Beispiel, sitzt, steht oder liegt ein Mensch und der braucht schon einmal länger als 7 Sekunden um überhaupt nur die erste der gelieferten Informationen zu verarbeiten.

Für ein "Maschine to Maschine" Interface macht es dann schon wieder Sinn das Ganze noch etwas zu beschleunigen.

Was die Implementierung von Services angeht hat Axel denke ich teilweise recht. Alles was mit Tickets zu tun hat in eine WSDL packen. ABER nur solange es wirklich zwingend zum Ticket gehört.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 29.12.05 - 22:49:23
@Thomas: Die Anwendung ist zu der Zeit quasi blockiert. Ist so als würde man 10 Sekunden warten, bis eine Webseite geladen ist. Die Tickets kommen in einem Schwung und nicht häppchenweise an.
Da kann man höchstens:
a) einen Balken anzeigen, damit überhaupt was auf dem Bildschirm passiert oder
b) paging, d.h. man implementiert eine neue Webservices Funktion, die die Tickets nacheinander in einer gewissen Stückelung (z.B. 50) runterlädt. Außerdem hab ich jetzt Performance-Tests gegen die Anwendung gemacht. Das sind bei inzwischen vermutlich 2.700 Tickets (s. persönliche Nachricht) bei einem User 34 sec.
SOAP ist so gebaut, dass erst das gesamte SOAP-File empfangen werden muß, bevor da überhaupt nur daran gedacht wird, das weiterzuverarbeiten.

Ulrich, ich hab dir eine persönliche Nachricht geschickt. Mich macht das immer ein bischen nervös, wenn ich die nicht in der Outbox sehe. Hoffentlich ist die angekommen. Thomas, ich schicke die dir jetzt auch.

Axel

Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 05:41:39
Axel,

ja, PM ist angekommen; Kopie in der Outbox ist doch eine Einstelung im Profi.

Wg. der Werte; OK ist halt ein Unterschied, ob das mit 512kB Upstream über DSL läuft, oder im internen Netz mit einigem mehr an Dampf dahinter ...

Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 06:37:32
Zur Performance würde ich mir generell schon Gedanken machen; was allerdings diesen speziellen Fall hier betrifft, werde ich mich mehr auf die Funktionen selber konzentrieren.

Der BB greift ja nicht direkt auf den Domino Server zu; das wird ja über den BES gesteuert. Und der gibt letztendlich die Pakete an den BB weiter. Das könnte also auch schon deutlich performanter sein.
Wie das allerdinds von RIM gesteuert wird, entzieht sich meiner Kenntnis. Aber ich glaube, die wissen schon, was sie tun müssen ...

@Thomas:

wg. der Strukturen mit einem Misch aus Ticket und Todo.

Die TicketCollection beinhaltet ja die Klasse Ticket

Wenn du jetzt noch die ToDo zum Ticket mit übergeben willst, musst du eine neue Klasse ToDoCollection erstellen, die ihrerseits wieder eine Klasse ToDo as Array enthält.

Und die ToDoCollection baust du dann in die Klasse Ticket ein.

Class ToDoCollection
  Public ToDos () as ToDo
  Public ToDoCount as integer
end class

Class ToTo
 Public ToDoNumber as string
end class



Class TicketCollection
   Public Tickets() As Ticket
   Public TicketCount As Integer
End Class

Class Ticket
   Public User As String
   Public TicketNumber As String
   Public Problem As String
  Public ToDoCol as ToDoCollection
End Class

Das sollte dann eine saubere Struktur ergeben ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 30.12.05 - 08:34:26
Die Idee, dass nur die diff übertragen wird, läßt sich imho wirklich relativ einfach realisieren.

Notes kennt seit 7 offenbar einen neuen Datentyp XSD_DATETIME
SOAPJavaLotusScript
xsd:dateTimejava.util.CalendarXSD_DATETIME

Die letzte Tabelle in diesem Artikel:
http://www-128.ibm.com/developerworks/lotus/library/nd7-webservices/index.html

Imho könnte man das in die Search Formula einbauen. Das dort ein Date/Time Wert geschickt wird und dann in der Funktion GetAllTicketsBySupporter nur solche Tickets runtergesendet werden als der DateTime Wert, der der Funktion in einem Bonus-Parameter übergeben wurde.

Arbeite aber erstmal mit dem was da ist.

Im Grunde ist das eine Art selbstgebaute Replizierung.
Auf der Seite des Clients würd ich den Datumswert nach jedem update request gegen den Webservice Request in eine Datei schreiben.

Es erscheint mir wichtig, die Menge der Daten, die am Client ankommen, klein zu halten. V.a. auch, damit der weniger zu tun hat. Diese kleinen Geräte haben ja auch nicht unbedingt so viel processing power wie ein PC. Z.B. könnte man mit Swing die neuen Dokumente wohl auch prima in die existierende Struktur einmischen. Wenn immer alles neu runtergesendet wird, müßte man die gesamten Widgets quasi ganz neu aufbauen. Und Gui-Objekte sind nicht unbedingt klein. Ausserdem sollte dort im Namen von übersichtlichen, erweiterbaren und leicht änderbaren Design eine Zwischenschicht da sein. D.h. die Inhalte der ganzen Objekte der Webservices werden sowieso noch einmal in extra Business Objekte kopiert.
2.700 oder 700 Tickets kann man eh nicht in einem Blackberry anzeigen. Deshalb werd ich für den ersten Client-Prototypen sowieso nur die ersten 10 oder 20 Tickets anzeigen. Das dürfte auch für eine Demo ausreichend sein. Ich hatte im meinem Leben noch nicht mehr als 20 Tickets.

Falls es jemanden interessiert, kann ich das Eclipse Projekt irgendwie über ein peer-to-peer Netzwerk verfügbar machen, wenn ausreichend da ist. Arbeite inzwischen mit Eclipse WTP1.0. Kann als Komplettpaket runtergeladen werden und wirkt stabiler als WTP 0.7.

Ich hab ständig im Hinterkopf, dass in der gesamten Literatur document-style Webservices (und nicht rpc-style) präferiert wird. Im Kontext der Funktion GetAllTicketsBySupporter wird mir auch klar, warum. Bei großen Datenmengen wird einfach alles doppelt und dreifach übertragen, wenn man sich das tatsächliche SOAP-Dokument in SOAPUI oder ähnlichem mal genauer anschaut.
Ist aber erstmal nicht so dramatisch. Domino unterstützt beides.

In der Literatur wird btw. auch davon gesprochen, dass error-codes in einem header-Bereich der SOAP Nachricht gehören. Weiss aber momentan auch nicht wie man das implementiert und nur am Rande. Ist nicht funktional.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 30.12.05 - 08:44:56
du kannst ja mal Quellcode posten vom Swing-Client. Ich würde gern mal einen RCP dafür bauen aber ich weiß nicht ob ich dazu komme (einer muss ja auch arbeiten hier  O0 ).
Diese Baumdarstellung, ist das in Swing schon drin oder musst du das bauen? Im RCP geht das nämlich ganz einfach über JFace TreeViewer...
Hat HELP!!! eigentlich eine CMDB? Die ist nämlich das Herzstück eines jeden TroubleTicket Systems. Wenn nicht, vielleicht kann ich da mal meine Erfahrung einbringen, irgendwann im nächsten Jahr...

Ist WTP 1.0 Eclipse + Web oder fehlt da irgendwas? Sonst kannst du damit ja einfach ein neues RCP-Projekt erstellen und deinen Code da reinziehen.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 08:51:57
Zitat
Hat HELP!!! eigentlich eine CMDB?

Thomas hat da was in der Hinterhand; ist aber noch nicht freigegeben ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 30.12.05 - 09:06:04
Diese Baumdarstellung, ist das in Swing schon drin oder musst du das bauen?
javax.swing.JTree
Hier ist eine visuelle Übersicht der Swing Widgets:
http://java.sun.com/docs/books/tutorial/uiswing/components/components.html
(die sind besser als die da aussehen, weil die da das unsägliche Metal Look & Feel verwenden. Man kann aber Look & Feels austauschen, wie man bei meinem Beispiel sieht).
Zitat
Im RCP geht das nämlich ganz einfach über JFace TreeViewer...
Gibt da auch ein Widget, das eine Art Mischung aus Tree und Table ist. Hab aber den Namen vergessen. Das würde Sinn machen. Swing ist aber auch nicht so schlecht.
Zitat
Hat HELP!!! eigentlich eine CMDB? Die ist nämlich das Herzstück eines jeden TroubleTicket Systems. Wenn nicht, vielleicht kann ich da mal meine Erfahrung einbringen, irgendwann im nächsten Jahr...
Configuration Management Database. Kannte die Abkürzung nicht.
Zitat
Ist WTP 1.0 Eclipse + Web oder fehlt da irgendwas? Sonst kannst du damit ja einfach ein neues RCP-Projekt erstellen und deinen Code da reinziehen.
ja. Das all-in-one Paket:
http://download.eclipse.org/webtools/downloads/drops/R-1.0-200512210855/
(URL möglicherweise nicht stabil).
Ich hab mehrere Eclipse installiert, die sich diverse Workplaces sharen. So machen das viele. Aber vermutlich weisst du das.
Schick dir das, sobald das stabil ist. Du brauchst auch nicht direkt auf die leicht kuriose, automatisch generierte Schicht von SOAP-Consumer Klassen zuzugreifen, weil da ein Layer von Business Objekten zwischen ist. RCP interessiert mich natürlich auch.

Hab die GUI probeweise mit dem hochgelobten WYSWYG Swing Editor von Netbeans 5.0 beta 2 zusammengeklickt (echt gut). Mußte da nur noch der ihren speziellen Layout-Manager in das Eclipse-Projekt als jar importieren. Werd aber auf Carsten Lentzschs looks & forms umsteigen. Das Projekt ist btw. Java5, aber das sollte keine Probleme machen. Ich stell die verwendete Java Version in Eclipse immer projekt-spezifisch ein.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 30.12.05 - 09:13:14
das Buch zu RCP ist übrigens sehr gut, besonders das Kapitel 'Objektrelationale Brücken (Hibernate etc.) wird dir gefallen (siehe http://atnotes.de/index.php?topic=24620.msg175496#msg175496)

<Start Fredjacking>
Zur CMDB (ITIL: Configuration Management): Ich hoffe sie ist nicht Notes-basiert  ??? Da würde ich wirklich eine relationale Datenbank bevorzugen, da CMDBs üblicherweise von vielen Anwendungen geteilt werden. Mit OpenLDAP kann man sowas vielleicht gut bauen, das gibt extrem gute Zugriffszeiten
<End Fredjacking>
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Thomas Schulte am 30.12.05 - 09:20:40
Zitat
Hat HELP!!! eigentlich eine CMDB?

Thomas hat da was in der Hinterhand; ist aber noch nicht freigegeben ...
Das hängt jetzt davon ab.

Was wir haben ist eine Datenbank für das System Management, in der der Lebenszyklus einer Hardware aufgezeichnet werden kann. Mit der Zuordnung zu Personen, Stellen, ....
Mit Teilen und so weiter.

Was wir auch haben, allerdings Stand alone und noch lange nicht soweit das es sauber in !!Help!! integriert werden kann ist eine Datenbank für Service Level Management. Aus der kann man dann wenn das mal so läuft wie ich mir das vorstelle die Responsezeiten und die Dringlichkeit einer Störung rausholen.

Ich glaub was Mark meint ist eine Zentrale Konfigurations Datenbank. Für die ganze Anwendung und nein, das haben wir nicht.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 30.12.05 - 09:27:20
out of topic:
Für die Integration von Fremdsystemen in Notes (CMDB, SLA-DB) können Webservices definitiv Sinn machen.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 30.12.05 - 09:28:55
Zitat
Ich glaub was Mark meint ist eine Zentrale Konfigurations Datenbank. Für die ganze Anwendung und nein, das haben wir nicht.
Tut mir leid, ich denke schon völlig in ITIL. Eine CMDB ist für mich wie oben gesagt die Configuration Management Database. Hier stehen alle Assets drin, das sind im Allgemeinen sämtliche Hardware die inventarisiert ist sowie alle Softwarelizenzen.
In jedem Helpdeskticket gibt es dann zig Relationen zur CMDB:
- Hardware des Users
- bisherige Tickets auf diesen PC
- Kostenstelle des PC-Owners
- Lizenzen die dem PC oder User zugeordnet sind
etc.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 30.12.05 - 09:58:12
Zurück zum Thema.
@Ulrich: Warum hat der zurückgegebene Ticket-Type der Funktion GetAllTicketsByUser Funktion einen Member user?
Der Consumer sendet den Namen des TicketUsers doch schon hoch?

Public Function GetAllTicketsBySupporter ( strSupporter As String ) As TicketCollection ?
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 10:02:22
supporter und user sind zwei unterschiedliche Personen.





Titel: kleinerer Bug beim Webservice
Beitrag von: flaite am 30.12.05 - 12:00:58
Hi,

beim Junit Testen ist mir folgendes aufgefallen:
Wenn man der Funktion .GETALLTICKETSBYSUPPORTER(suporter) einen Supporter übergibt, den es nicht gibt, dann wird in TICKETCOLLECTION.TICKET[] kein leeres Array zurückgeschickt, sondern ein Array mit einem Element, das leer ist. Meiner Ansicht nach liegt das an der Serverseite. Guck mir das noch mal an.

Ansonsten funktioniert der Business Layer für diese Funktion. Sieht gut aus.
Ein very-Alpha-prototype-Swing Client könnte heute abend oder morgen früh fertig sein.


Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 12:09:16
Liegt wohl hier dran

If Trim(strSupporter) = "" Then
         Set GetAllTicketsBySupporter = New TicketCollection
         GetAllTicketsBySupporter.TicketCount = 0
         GetAllTicketsBySupporter.ErrorCode = GET_TICKET_ERR_MANDANTORY
         Exit Function ' nothing else to do, get outa here !
Else   


Da wird die TicketCollection initialisiert und somit auch das Tickets().

Ich denke, man muss Tickets() lediglich auf NOTHING setzen ...
Probiere ich gleich zuhause aus ( in 2 Stunden ist Feierabend  ;D )

Sorry, falsche Stelle im Code
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 30.12.05 - 12:23:54
Noch ein bischen genörgel bzgl. der Testdaten  ;D
Die TicketNumber der Tickets eines Users mit sehr vielen Tickets ist für die einzelnen Dokumente nicht eindeutig.
Und da ich in dem Clientcode vorsorglich ein bischen Intelligenz eingebaut habe, hat mich das jetzt erstmal ein wenig verwirrt.
Er schreibt die Tickets in eine Java-Map (wie Liste in LotusScript) mit der TicketNumber als Key. Wenn er den Key schon in der Map findet, wird das alte Ticket auf der Client Seite überschrieben und kein neues erzeugt. Das passiert relativ häufig innerhalb einer TicketCollection was in der realen Welt nicht so sein sollte, da die TicketNumber vermutlich eindeutig ist.

Code
Ticket ticketBO = null;
// check ob in der Map ein Ticket mit dieser TICKETNUMBER schon da ist. Wenn ja überschreiben, sonst neu erzeugen.
			if ((ticketBO = mTickets.get(ticketWs.getTICKETNUMBER())) != null) { 
				System.out.println("old.ticket"); // ja ich bau da gleich log4j ein :-)
				ticketBO.setStatus(ticketWs.getSTATUS());
				ticketBO.setUser(ticketWs.getUSER());
				ticketBO.setProblem(ticketWs.getPROBLEM());
			} else {
				ticketBO = Ticket.getInstance(ticketWs.getTICKETNUMBER(),
						ticketWs.getSTATUS(), ticketWs.getUSER(), ticketWs
								.getPROBLEM());
				mTickets.put(ticketBO.getTicketNumber(), ticketBO);
			}
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 12:27:12
Zitat
Die TicketNumber der Tickets eines Users mit sehr vielen Tickets ist für die einzelnen Dokumente nicht eindeutig.

Wenn du das auf die 2.700 Tickets beziehst, hast du Recht. Die habe ich gestern flugs duch Kopieren erzeugt; und da bleibt natürlich die ursprüngliche Nummer bestehen  ;D
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 12:42:20
Noch mal kurz zum Umfang:

Als Services hatte ich mir die Folgenden vorgestellt

- CreateTicket
- GetAllNewTickets
- GetAllTicketsBy Supporter
- GetTicketDetails
- GetTicketToDos ( oder dies schon mit im GetTicketDetails mit behandeln )
- GetToDoDetails
- AssignTicket ( das würde auch das reassign mit einschließen )
- CloseTicket

Damit müßte man doch schon ein bisschen was zeigen können.

auf ein CreateToDo und alle damit verbundenen Funktionen würde ich gerne verzichten. Lieber ein paar wenige Funktionen, die auch funktionieren, als eine riesige Menge an stuff, der nur halbherzig funktioniert.

Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 30.12.05 - 15:30:38
Was ich ein bischen vermisse sind update Funktionen. updateTicket. GetTicketTodos gehört für mich zu GetTicketDetails.
Was mich noch ein bischen gewundert hat, war dass Status als String zurückgegeben wird aber ein Integer oder Short ist. Zumindest bräuchte ich da die Mappings dieser Zahlen zu den Namen der Stati.
Ein Punkt ist natürlich security. Vielleicht muß das für die demo nicht fertig sein. Ich weiss momentan nicht wie Lotus sich das denkt. Es gibt im Redbook Apdev 7 aber auch ein Kapitel, das dies beschreibt. Vielleicht geht ssl mit Client Auth.
Eine andere Möglichkeit ist:
Eine javabasierte pki - Infrastruktur aufbauen (nicht so schwierig). 
Die clients verschlüsseln das mit ihrem privaten Schlüssel und das dann mit dem öffentlichen Schlüssel des Servers. Der Server entschlüsselt den (kurzen) Usernamen mit erst seinem privaten Schlüssel und dann mit dem öffentlichen Schlüssel des Users. Natürlich muß für jeden User, der den Webservice nutzt ein pki-Schlüsselpaar generiert werden und der öffentliche Schlüssel des Users im Server gehalten werden. Halte das aber für machbar. Vielleicht gibts auch weniger bastelintensive Lösungen.

Es gibt auf globalen Webservices Specification Level ziemlich fortgeschrittene Initiativen, um Security (Authentification, Autorisierung, digitale Signatur, ACL) für Webservices verfügbar zu machen. Vielleicht können wir dafür etwas in zukünftigen Domino Versionen erwarten.
Das Apdev 7 Redbook macht folgenden Hinweis:
Zitat
At this time, there are no broadly-adopted specifications for Web services security. As a result
developers can either build up services that do not use these capabilities or can develop
ad-hoc solutions that may lead to interoperability problems.
Dies wäre so was wie ich oben gesagt habe. Das ist sicher machbar, aber vielleicht nicht interoperabel mit nicht-Java Clients und ausserdem bringt es Performanz-, Programmierungs- und Administrations-Overhead mit sich.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 16:24:33
Zitat
GetTicketTodos gehört für mich zu GetTicketDetails.

gut, das sehe ich auch so und werde das entsprechend einbauen.

Zitat
Zumindest bräuchte ich da die Mappings dieser Zahlen zu den Namen der Stati.

Sollst du bekommen; oder soll ich dann gleich im Klartext ausgeben ?

Zitat
Ein Punkt ist natürlich security. Vielleicht muß das für die demo nicht fertig sein.

Richtig; denke da können wir dann weitermachen, wenn die Demo steht.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 30.12.05 - 16:43:38
Zitat
Zumindest bräuchte ich da die Mappings dieser Zahlen zu den Namen der Stati.

Sollst du bekommen; oder soll ich dann gleich im Klartext ausgeben ?
Klartext ist besser, weil so garantiert ist, dass auf Seiten der Datenbank und im Webservice die gleichen Bezeichner verwendet werden. Ist doch so, oder?
Falsch. Am besten beides. Es muß sichergestellt sein, dass auch bei fremdländischen Versionen der Bezeichner runtergegeben wird. Die Nummer braucht der Consumer für die Sortierung der Stati.
Die Nummer aber besser als Integer.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Thomas Schulte am 30.12.05 - 16:47:10
Nein nicht ganz, Axel. Das Prinzip von Help ist das es mehrsprachig ist. Das bedeutet für den Status eben auch, das er nur in verschlüsselter Form vorliegt und zur Laufzeit umgesetzt wird.

Das sollte man hier auch nicht aus den Augen verlieren. Ich denke auch bei den Webservices nicht. Vielleicht müssen wir tatsächlich (irgendwann, nicht gleich) einen Layer mitgeben, der in der definierten Sprache die jeweiligen Bezeichnungen für die Übergebenen Felder (so denn welche vorhanden sind) mitgibt.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 16:55:18
So, hier mal das Grundgerüst:

%REM
#####################################################
 INCLUDES
#####################################################
%END REM   
%INCLUDE "lsxsd.lss"

%REM
#####################################################
 CONSTANTS
#####################################################
%END REM   
Private Const CREATE_TICKET_FORM = "BugReport"
Private Const CREATE_TICKET_INITIAL_STATUS = "0"
Private Const CREATE_TICKET_VIA_WEBSERVICE = 1

Private Const CREATE_TICKET_ERR_NOERROR = 0
Private Const CREATE_TICKET_ERR_MISC_ERROR = 1
Private Const CREATE_TICKET_ERR_MANDANTORY = 2

Private Const ASSIGN_TICKET_ERR_NOERROR = 0
Private Const ASSIGN_TICKET_ERR_MISC_ERROR = 1
Private Const ASSIGN_TICKET_ERR_MANDANTORY = 2

Private Const CLOSE_TICKET_ERR_NOERROR = 0
Private Const CLOSE_TICKET_ERR_MISC_ERROR = 1
Private Const CLOSE_TICKET_ERR_MANDANTORY = 2

Private Const MISC_ERROR = 1
Private Const NOERROR = 0
Private Const MANDANTORY = 2

Const DEFAULT_RETURN_VALUE ="-"

%REM
#####################################################
 VARIABLES
#####################################################
%END REM   
Private s As NotesSession
Private db As NotesDatabase
Private doc As NotesDocument
Private success As Variant
Private SearchFormula As String
Private strPersonName As String
Private nn As NotesName
Private dc As NotesDocumentCollection
Private count As Integer
Private i As Integer
Private TicketValues As Ticket

Class TicketCollection
   Public Tickets() As Ticket
   Public TicketCount As Integer
   Public ErrorCode As Integer
End Class

Class Ticket
   Public User As String
   Public TicketNumber As String
   Public Problem As String
   Public Status As String
End Class

Class TicketDetails
   Public User As String
   Public TicketNumber As String
   Public Problem As String
   Public Status As String
   '... eine Ahnung was sonst noch
   Public AssociatedTodo As ToDoCollection
End Class

Class ToDoCollection
   Public ToDos() As ToDo
   Public ToDoCount As Integer
End Class

Class ToDo
   Public ToDoNumber As String
   Public Problem As String
   Public Status As String
End Class

%REM
#####################################################
 WEBSERVICES 0.01  (c) 2005,2006, Ulrich Krause, Thomas Schulte, Axel Janssen
 
----------------------------------------------------------------------------------------------------------
# Public functions and subs:
----------------------------------------------------------------------------------------------------------
 Public Sub New
 Public Function GetNewTickets ( ) As TicketCollection
 Public Function GetTicketDetails ( TicketNumber as String  ) As TicketDetails
 Public Function GetAllTicketsBySupporter ( strSupporter As String ) As TicketCollection
 Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
 Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
 Public Function CloseTicket ( strTicket As String ) As Integer

----------------------------------------------------------------------------------------------------------
# Private functions and subs:
----------------------------------------------------------------------------------------------------------
 Private Function CommonNameString (strName As String) As String
 Private Function getItemValue ( strItem As String ) As String

#####################################################
%END REM      
Class wsTicket
   
%REM
#####################################################
 Public Sub New
#####################################################
%END REM      
   Public Sub New
      ' initialize some stuff
      Set s = New NotesSession()
      Set db = s.currentDatabase
   End Sub
   
%REM
#####################################################
 Public Function GetNewTickets ( ) As TicketCollection
#####################################################
%END REM      
   Public Function GetNewTickets ( ) As TicketCollection
      
      On Error Goto ERRHANDLE   
      
      SearchFormula =_
      |@UpperCase(Form) ="BUGREPORT" & Status ="0"|
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      xProc = Getthreadinfo(LSI_THREAD_PROC)
      xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
      If UseOpenLog Then
         Call LogError
      Elseif LogScriptErrors Then
         Call ThrowException ( xProc, xError  )
      End If
      Print xError   'In all cases
      If ResumeMethodNext Then
         Resume Next   
      Else
         Resume EXITPOINT
      End If         
   End Function
   
%REM
#####################################################
 Public Function GetTicketDetails ( TicketNumber as String  ) As TicketDetails
#####################################################
%END REM      
   Public Function GetTicketDetails ( TicketNumber as String  ) As TicketDetails
      
      On Error Goto ERRHANDLE   
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      xProc = Getthreadinfo(LSI_THREAD_PROC)
      xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
      If UseOpenLog Then
         Call LogError
      Elseif LogScriptErrors Then
         Call ThrowException ( xProc, xError  )
      End If
      Print xError   'In all cases
      If ResumeMethodNext Then
         Resume Next   
      Else
         Resume EXITPOINT
      End If            
   End Function
   
   
%REM
#####################################################
 Public Function GetAllTicketsBySupporter ( strSupporter As String ) As TicketCollection
#####################################################
%END REM      
   Public Function GetAllTicketsBySupporter ( strSupporter As String ) As TicketCollection
      
      On Error Goto ERRHANDLE      
      
      If Trim(strSupporter) = "" Then
         Set GetAllTicketsBySupporter = New TicketCollection
         GetAllTicketsBySupporter.TicketCount = 0
         GetAllTicketsBySupporter.ErrorCode = MANDANTORY
         Exit Function ' nothing else to do, get outa here !
      Else      
         
         SearchFormula =_
         |@UpperCase(Form) ="BUGREPORT" & @UpperCase(@Name([CN];supporter)) ="|_
         & Ucase(CommonNameString (strSupporter )) & |"|
         
         Dim dateTime As New NotesDateTime(_
         Cstr(Datenumber(2000, 5, 1)))
         Dim dc As NotesDocumentCollection
         Set dc = db.Search( SearchFormula, dateTime,0)
         
         count = dc.count
         If count = 0 Then Goto ERRHANDLE
         Set GetAllTicketsBySupporter = New TicketCollection
         GetAllTicketsBySupporter.TicketCount = count
         GetAllTicketsBySupporter.ErrorCode = NOERROR
         
         If (count = 0) Then
            Redim GetAllTicketsBySupporter.Tickets(count)
         Else
            Redim GetAllTicketsBySupporter.Tickets(count - 1)
         End If
         
         i = 0
         Set doc = dc.GetFirstDocument
         Do Until (doc Is Nothing)
            
            Set TicketValues = New Ticket
            TicketValues.User = CommonNameString(getItemValue ("user"))
            TicketValues.TicketNumber = getItemValue ("ReqNumber")
            TicketValues.Problem = getItemValue ("problem")
            TicketValues.Status = getItemValue ("status")
            
            Set GetAllTicketsBySupporter.Tickets(i) = TicketValues
            i = i +1
            Set doc = dc.GetNextDocument(doc)
            
         Loop
         
%REM            
         For i = 1 To dc.Count
            Set doc = dc.GetNthDocument ( i )
            
            Set TicketValues = New Ticket
            TicketValues.User = CommonNameString(getItemValue ("user"))
            TicketValues.TicketNumber = getItemValue ("ReqNumber")
            TicketValues.Problem = getItemValue ("problem")
            TicketValues.Status = getItemValue ("status")
            
            Set GetAllTicketsBySupporter.Tickets ( i  -1 ) = TicketValues
         Next
%END REM      
         
      End If    
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      xProc = Getthreadinfo(LSI_THREAD_PROC)
      xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
      If UseOpenLog Then
         Call LogError
      Elseif LogScriptErrors Then
         Call ThrowException ( xProc, xError  )
      End If
      Print xError   'In all cases
      If ResumeMethodNext Then
         Resume Next   
      Else
         Set GetAllTicketsBySupporter = New TicketCollection
         GetAllTicketsBySupporter.TicketCount = count
         GetAllTicketsBySupporter.ErrorCode = MISC_ERROR
         Resume EXITPOINT
      End If      
      
   End Function
   
%REM
#####################################################
 Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
#####################################################
%END REM   
   Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
      
      CreateTicket = CREATE_TICKET_ERR_NOERROR
      
      
      On Error Goto ERRHANDLE
      If Trim(strUser) = "" Or Trim(strProblem) = "" Then
         CreateTicket = CREATE_TICKET_ERR_MANDANTORY ' mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else
         Dim doc As NotesDocument
         Dim dateTime As New NotesDateTime( "" )
         Call dateTime.SetNow
         
         Set doc = db.CreateDocument
         doc.Form = CREATE_TICKET_FORM
         doc.User = strUser      
         doc.Problem = strProblem
         doc.Status = CREATE_TICKET_INITIAL_STATUS ' new Ticket, unassigned
         doc.Webservice = CREATE_TICKET_VIA_WEBSERVICE
         doc.DateCreated = Cstr(dateTime.DateOnly)
         doc.TimeCreated = Cstr(dateTime.TimeOnly)
         success = doc.ComputeWithForm( False, False )
         Call doc.Save (True,True)
      End If
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      xProc = Getthreadinfo(LSI_THREAD_PROC)
      xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
      If UseOpenLog Then
         Call LogError
      Elseif LogScriptErrors Then
         Call ThrowException ( xProc, xError  )
      End If
      Print xError   'In all cases
      If ResumeMethodNext Then
         Resume Next   
      Else
         CreateTicket = CREATE_TICKET_ERR_MISC_ERROR
         Resume EXITPOINT
      End If   
   End Function
   
   
%REM
#####################################################
 Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
#####################################################
%END REM   
   Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
      
      On Error Goto ERRHANDLE      
      AssignTicket = ASSIGN_TICKET_ERR_NOERROR
      
      If Trim(strTicket) = "" Or Trim(strAssignTo) = "" Then
         AssignTicket = ASSIGN_TICKET_ERR_MANDANTORY  'mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else      
      ' Your Code goes here   
      End If
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      xProc = Getthreadinfo(LSI_THREAD_PROC)
      xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
      If UseOpenLog Then
         Call LogError
      Elseif LogScriptErrors Then
         Call ThrowException ( xProc, xError  )
      End If
      Print xError   'In all cases
      If ResumeMethodNext Then
         Resume Next   
      Else
         AssignTicket = ASSIGN_TICKET_ERR_MISC_ERROR
         Resume EXITPOINT
      End If
   End Function
   
%REM
#####################################################
 Public Function CloseTicket ( strTicket As String ) As Integer
#####################################################
%END REM   
   Public Function CloseTicket ( strTicket As String ) As Integer
      
      On Error Goto ERRHANDLE      
      CloseTicket = CLOSE_TICKET_ERR_NOERROR
      
      If Trim(strTicket) = "" Then
         CloseTicket = CLOSE_TICKET_ERR_MANDANTORY 'mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else      
      ' Your Code goes here   
      End If    
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      xProc = Getthreadinfo(LSI_THREAD_PROC)
      xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
      If UseOpenLog Then
         Call LogError
      Elseif LogScriptErrors Then
         Call ThrowException ( xProc, xError  )
      End If
      Print xError   'In all cases
      If ResumeMethodNext Then
         Resume Next   
      Else
         CloseTicket = CLOSE_TICKET_ERR_MISC_ERROR
         Resume EXITPOINT   
      End If
   End Function
   
%REM
#####################################################
 Private Function CommonNameString (strName As String) As String
#####################################################
%END REM   
   Private Function CommonNameString (strName As String) As String
      Set nn = New NotesName( strName )
      strPersonName = nn.Common
      CommonNameString = strPersonName
   End Function
   
%REM
#####################################################
 Private Function getItemValue ( strItem As String ) As String
#####################################################
%END REM      
   Private Function getItemValue ( strItem As String ) As String
      If doc.HasItem(strItem) Then
         getItemValue = doc.GetItemValue( strItem )(0)
      Else
         getItemValue = DEFAULT_RETURN_VALUE
      End If
   End Function
   
End Class
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 17:18:50
Axel:

Wenn ein Supporter angegeben wird, der keine Tickets hat ( also nicht in der DB existiert ) springe ich aus der function mit exit function raus.

entsprechend wir das hier als response geliefert; kann man damit was anfangen, sprich im Frontend entsprechend behandeln  ??

- <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <soapenv:Body>
  <ns1:GETALLTICKETSBYSUPPORTERResponse xmlns:ns1="urn:DefaultNamespace" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
  </soapenv:Body>
  </soapenv:Envelope>
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 17:59:16
Habe das Gerüst noch einmal geändert:

Es gibt jetzt eine neue Public Function GetTicketsByStatus ( status As String ) As TicketCollection
Das bietet ein wenig mehr Flexibilität.

Dadurch reduziert sich der Code zur Ermittlung der neuen Tickets auf

%REM
#####################################################
 Public Function GetNewTickets ( ) As TicketCollection
#####################################################
%END REM      
   Public Function GetNewTickets ( ) As TicketCollection
      
      Set GetNewTickets = GetTicketsByStatus ("0")
      
   End Function


In der gleichen weise lassen sich dann leicht Functions für Closed Tickets etc bauen.

Auch bisher noch nicht verwendete Stati lassen sich clientseitig über die neue Funktion bedienen; daher public und nicht private...

%REM
#####################################################
 INCLUDES
#####################################################
%END REM   
%INCLUDE "lsxsd.lss"

%REM
#####################################################
 CONSTANTS
#####################################################
%END REM   
Private Const CREATE_TICKET_FORM = "BugReport"
Private Const CREATE_TICKET_INITIAL_STATUS = "0"
Private Const CREATE_TICKET_VIA_WEBSERVICE = 1

Private Const CREATE_TICKET_ERR_NOERROR = 0
Private Const CREATE_TICKET_ERR_MISC_ERROR = 1
Private Const CREATE_TICKET_ERR_MANDANTORY = 2

Private Const ASSIGN_TICKET_ERR_NOERROR = 0
Private Const ASSIGN_TICKET_ERR_MISC_ERROR = 1
Private Const ASSIGN_TICKET_ERR_MANDANTORY = 2

Private Const CLOSE_TICKET_ERR_NOERROR = 0
Private Const CLOSE_TICKET_ERR_MISC_ERROR = 1
Private Const CLOSE_TICKET_ERR_MANDANTORY = 2

Private Const MISC_ERROR = 1
Private Const NOERROR = 0
Private Const MANDANTORY = 2

Const DEFAULT_RETURN_VALUE ="-"

%REM
#####################################################
 VARIABLES
#####################################################
%END REM   
Private s As NotesSession
Private db As NotesDatabase
Private doc As NotesDocument
Private success As Variant
Private SearchFormula As String
Private strPersonName As String
Private nn As NotesName
Private dc As NotesDocumentCollection
Private count As Integer
Private i As Integer
Private TicketValues As Ticket

Class TicketCollection
   Public Tickets() As Ticket
   Public TicketCount As Integer
   Public ErrorCode As Integer
End Class

Class Ticket
   Public User As String
   Public TicketNumber As String
   Public Problem As String
   Public Status As String
End Class

Class TicketDetails
   Public User As String
   Public TicketNumber As String
   Public Problem As String
   Public Status As String
   '... eine Ahnung was sonst noch
   Public AssociatedTodo As ToDoCollection
End Class

Class ToDoCollection
   Public ToDos() As ToDo
   Public ToDoCount As Integer
End Class

Class ToDo
   Public ToDoNumber As String
   Public Problem As String
   Public Status As String
End Class

%REM
#####################################################
 WEBSERVICES 0.01  (c) 2005,2006, Ulrich Krause, Thomas Schulte, Axel Janssen
 
----------------------------------------------------------------------------------------------------------
# Public functions and subs:
----------------------------------------------------------------------------------------------------------
 Public Sub New
 Public Function GetNewTickets ( ) As TicketCollection
 Public Function GetTicketDetails ( TicketNumber as String ) As TicketDetails
 Public Function GetAllTicketsBySupporter ( strSupporter As String ) As TicketCollection
 Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
 Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
 Public Function CloseTicket ( strTicket As String ) As Integer

----------------------------------------------------------------------------------------------------------
# Private functions and subs:
----------------------------------------------------------------------------------------------------------
 Private Function CommonNameString (strName As String) As String
 Private Function getItemValue ( strItem As String ) As String
 Private Function GetTickets ( status As String ) As TicketCollection

#####################################################
%END REM      
Class wsTicket
   
%REM
#####################################################
 Public Sub New
#####################################################
%END REM      
   Public Sub New
      ' initialize some stuff
      Set s = New NotesSession()
      Set db = s.currentDatabase
   End Sub
   
%REM
#####################################################
 Public Function GetNewTickets ( ) As TicketCollection
#####################################################
%END REM      
   Public Function GetNewTickets ( ) As TicketCollection
      
      Set GetNewTickets = GetTicketsByStatus ("0")
      
   End Function
   
%REM
#####################################################
 Public Function GetClosedTickets ( ) As TicketCollection
#####################################################
%END REM      
   Public Function GetClosedTickets ( ) As TicketCollection
      
      Set GetClosedTickets = GetTicketsByStatus ("99")
      
   End Function   
   
%REM
#####################################################
 Public Function GetOpenTickets ( ) As TicketCollection
#####################################################
%END REM      
   Public Function GetOpenTickets ( ) As TicketCollection
      
      Set GetOpenTickets = GetTicketsByStatus ("1")
      
   End Function   
   
%REM
#####################################################
 Public Function GetResubmittedTickets ( ) As TicketCollection
#####################################################
%END REM      
   Public Function GetResubmittedTickets ( ) As TicketCollection
      
      Set GetResubmittedTickets = GetTicketsByStatus ("98")
      
   End Function      
   
   
%REM
#####################################################
 Public Function GetTicketDetails ( TicketNumber as String  ) As TicketDetails
#####################################################
%END REM      
   Public Function GetTicketDetails ( TicketNumber As String ) As TicketDetails
      
      On Error Goto ERRHANDLE   
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      xProc = Getthreadinfo(LSI_THREAD_PROC)
      xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
      If UseOpenLog Then
         Call LogError
      Elseif LogScriptErrors Then
         Call ThrowException ( xProc, xError  )
      End If
      Print xError   'In all cases
      If ResumeMethodNext Then
         Resume Next   
      Else
         Resume EXITPOINT
      End If            
   End Function
   
   
%REM
#####################################################
 Public Function GetAllTicketsBySupporter ( strSupporter As String ) As TicketCollection
#####################################################
%END REM      
   Public Function GetAllTicketsBySupporter ( strSupporter As String ) As TicketCollection
      
      On Error Goto ERRHANDLE      
      
      If Trim(strSupporter) = "" Then
         Set GetAllTicketsBySupporter = New TicketCollection
         GetAllTicketsBySupporter.TicketCount = 0
         GetAllTicketsBySupporter.ErrorCode = MANDANTORY
         Exit Function ' nothing else to do, get outa here !
      Else      
         
         SearchFormula =_
         |@UpperCase(Form) ="BUGREPORT" & @UpperCase(@Name([CN];supporter)) ="|_
         & Ucase(CommonNameString (strSupporter )) & |"|
         
         Dim dateTime As New NotesDateTime(_
         Cstr(Datenumber(2000, 5, 1)))
         Dim dc As NotesDocumentCollection
         Set dc = db.Search( SearchFormula, dateTime,0)
         
         count = dc.count
         If count = 0 Then Exit Function
         Set GetAllTicketsBySupporter = New TicketCollection
         GetAllTicketsBySupporter.TicketCount = count
         GetAllTicketsBySupporter.ErrorCode = NOERROR
         
         If (count = 0) Then
            Redim GetAllTicketsBySupporter.Tickets(count)
         Else
            Redim GetAllTicketsBySupporter.Tickets(count - 1)
         End If
         
         i = 0
         Set doc = dc.GetFirstDocument
         Do Until (doc Is Nothing)
            
            Set TicketValues = New Ticket
            TicketValues.User = CommonNameString(getItemValue ("user"))
            TicketValues.TicketNumber = getItemValue ("ReqNumber")
            TicketValues.Problem = getItemValue ("problem")
            TicketValues.Status = getItemValue ("status")
            
            Set GetAllTicketsBySupporter.Tickets(i) = TicketValues
            i = i +1
            Set doc = dc.GetNextDocument(doc)
            
         Loop
         
%REM            
         For i = 1 To dc.Count
            Set doc = dc.GetNthDocument ( i )
            
            Set TicketValues = New Ticket
            TicketValues.User = CommonNameString(getItemValue ("user"))
            TicketValues.TicketNumber = getItemValue ("ReqNumber")
            TicketValues.Problem = getItemValue ("problem")
            TicketValues.Status = getItemValue ("status")
            
            Set GetAllTicketsBySupporter.Tickets ( i  -1 ) = TicketValues
         Next
%END REM      
         
      End If    
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      xProc = Getthreadinfo(LSI_THREAD_PROC)
      xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
      If UseOpenLog Then
         Call LogError
      Elseif LogScriptErrors Then
         Call ThrowException ( xProc, xError  )
      End If
      Print xError   'In all cases
      If ResumeMethodNext Then
         Resume Next   
      Else
         Set GetAllTicketsBySupporter = New TicketCollection
         GetAllTicketsBySupporter.TicketCount = count
         GetAllTicketsBySupporter.ErrorCode = MISC_ERROR
         Resume EXITPOINT
      End If      
      
   End Function
   
%REM
#####################################################
 Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
#####################################################
%END REM   
   Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
      
      CreateTicket = CREATE_TICKET_ERR_NOERROR
      
      
      On Error Goto ERRHANDLE
      If Trim(strUser) = "" Or Trim(strProblem) = "" Then
         CreateTicket = CREATE_TICKET_ERR_MANDANTORY ' mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else
         Dim doc As NotesDocument
         Dim dateTime As New NotesDateTime( "" )
         Call dateTime.SetNow
         
         Set doc = db.CreateDocument
         doc.Form = CREATE_TICKET_FORM
         doc.User = strUser      
         doc.Problem = strProblem
         doc.Status = CREATE_TICKET_INITIAL_STATUS ' new Ticket, unassigned
         doc.Webservice = CREATE_TICKET_VIA_WEBSERVICE
         doc.DateCreated = Cstr(dateTime.DateOnly)
         doc.TimeCreated = Cstr(dateTime.TimeOnly)
         success = doc.ComputeWithForm( False, False )
         Call doc.Save (True,True)
      End If
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      xProc = Getthreadinfo(LSI_THREAD_PROC)
      xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
      If UseOpenLog Then
         Call LogError
      Elseif LogScriptErrors Then
         Call ThrowException ( xProc, xError  )
      End If
      Print xError   'In all cases
      If ResumeMethodNext Then
         Resume Next   
      Else
         CreateTicket = CREATE_TICKET_ERR_MISC_ERROR
         Resume EXITPOINT
      End If   
   End Function
   
   
%REM
#####################################################
 Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
#####################################################
%END REM   
   Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
      
      On Error Goto ERRHANDLE      
      AssignTicket = ASSIGN_TICKET_ERR_NOERROR
      
      If Trim(strTicket) = "" Or Trim(strAssignTo) = "" Then
         AssignTicket = ASSIGN_TICKET_ERR_MANDANTORY  'mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else      
      ' Your Code goes here   
      End If
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      xProc = Getthreadinfo(LSI_THREAD_PROC)
      xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
      If UseOpenLog Then
         Call LogError
      Elseif LogScriptErrors Then
         Call ThrowException ( xProc, xError  )
      End If
      Print xError   'In all cases
      If ResumeMethodNext Then
         Resume Next   
      Else
         AssignTicket = ASSIGN_TICKET_ERR_MISC_ERROR
         Resume EXITPOINT
      End If
   End Function
   
%REM
#####################################################
 Public Function CloseTicket ( strTicket As String ) As Integer
#####################################################
%END REM   
   Public Function CloseTicket ( strTicket As String ) As Integer
      
      On Error Goto ERRHANDLE      
      CloseTicket = CLOSE_TICKET_ERR_NOERROR
      
      If Trim(strTicket) = "" Then
         CloseTicket = CLOSE_TICKET_ERR_MANDANTORY 'mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else      
      ' Your Code goes here   
      End If    
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      xProc = Getthreadinfo(LSI_THREAD_PROC)
      xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
      If UseOpenLog Then
         Call LogError
      Elseif LogScriptErrors Then
         Call ThrowException ( xProc, xError  )
      End If
      Print xError   'In all cases
      If ResumeMethodNext Then
         Resume Next   
      Else
         CloseTicket = CLOSE_TICKET_ERR_MISC_ERROR
         Resume EXITPOINT   
      End If
   End Function
   
%REM
#####################################################
 Public Function GetTicketsByStatus ( status As String ) As TicketCollection
#####################################################
%END REM      
   Public Function GetTicketsByStatus ( status As String ) As TicketCollection
      
      On Error Goto ERRHANDLE   
      
      SearchFormula =_
      |@UpperCase(Form) ="BUGREPORT" & Status = "| & status & |"|
      
      Dim dateTime As New NotesDateTime(_
      Cstr(Datenumber(2000, 5, 1)))
      Dim dc As NotesDocumentCollection
      Set dc = db.Search( SearchFormula, dateTime,0)
      
      count = dc.count
      If count = 0 Then Exit Function
      
      Set GetTicketsByStatus = New TicketCollection
      GetTicketsByStatus.TicketCount = count
      GetTicketsByStatus.ErrorCode = NOERROR
      
      Redim GetTicketsByStatus.Tickets(count - 1)
      
      i = 0
      Set doc = dc.GetFirstDocument
      Do Until (doc Is Nothing)
         
         Set TicketValues = New Ticket
         TicketValues.User = CommonNameString(getItemValue ("user"))
         TicketValues.TicketNumber = getItemValue ("ReqNumber")
         TicketValues.Problem = getItemValue ("problem")
         TicketValues.Status = getItemValue ("status")
         
         Set GetTicketsByStatus.Tickets(i) = TicketValues
         i = i +1
         Set doc = dc.GetNextDocument(doc)
         
      Loop
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      xProc = Getthreadinfo(LSI_THREAD_PROC)
      xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
      If UseOpenLog Then
         Call LogError
      Elseif LogScriptErrors Then
         Call ThrowException ( xProc, xError  )
      End If
      Print xError   'In all cases
      If ResumeMethodNext Then
         Resume Next   
      Else
         Resume EXITPOINT
      End If         
   End Function   
   
%REM
#####################################################
 Private Function CommonNameString (strName As String) As String
#####################################################
%END REM   
   Private Function CommonNameString (strName As String) As String
      Set nn = New NotesName( strName )
      strPersonName = nn.Common
      CommonNameString = strPersonName
   End Function
   
%REM
#####################################################
 Private Function getItemValue ( strItem As String ) As String
#####################################################
%END REM      
   Private Function getItemValue ( strItem As String ) As String
      If doc.HasItem(strItem) Then
         getItemValue = doc.GetItemValue( strItem )(0)
      Else
         getItemValue = DEFAULT_RETURN_VALUE
      End If
   End Function
   
End Class


Damit sieht das Gerüst im Web Services Explorer nun so aus
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 19:22:22
Habe noch eine weitere Funktion GetAllTicketsByUser hinzugefügt.

Wer will und kann, darf die verfügbaren Services gerne einmal unter

http://eknori.dyndns.org/helpdesk.nsf/wsTicket?WSDL

ausprobieren.

Erstellt einfach mal ein paar Tickets und füllt die DB mit Leben ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 19:29:37
kam gerade von RIM rein
Zitat
Ulrich, thanks for the update.   I will test early next week and get back to you. 

Happy New Years. 

Cheers,
Jon
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 30.12.05 - 20:07:34
Nein nicht ganz, Axel. Das Prinzip von Help ist das es mehrsprachig ist. Das bedeutet für den Status eben auch, das er nur in verschlüsselter Form vorliegt und zur Laufzeit umgesetzt wird.
Die Gui des Webservices wird natürlich auch internationalisiert sein. Fehlermeldungen, Bezeichner in Guis, etc. werden spätestens aber der Beta in einer properties Datei definiert werden können.

Das sollte man hier auch nicht aus den Augen verlieren. Ich denke auch bei den Webservices nicht. Vielleicht müssen wir tatsächlich (irgendwann, nicht gleich) einen Layer mitgeben, der in der definierten Sprache die jeweiligen Bezeichnungen für die Übergebenen Felder (so denn welche vorhanden sind) mitgibt.
Ich würd sagen, wir machen dafür eine eigene Funktion in der WSDL Datei, die eine Map (LotusScript = List) runterliefert. Muß aber nicht sofort sein. Vielleicht bleibt auch Status das einzige internationalisierte Feld, das vom Webservice benutzt wird. Jedoch hat das schon mehrere Werte.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 20:19:22
Zitat
Vielleicht bleibt auch Status das einzige internationalisierte Feld, das vom Webservice benutzt wird.

Bisher ist es das; das ist bisher auch das einzige non-content element, was übergeben wird.
Alles andere ist natürlich data-content in der jeweiligen Landessprache ...

Ich kann dir aber auch gerne den Inhalt der SprachDocs via WSDL zur Verfügung stellen.

ähh, haben wir eigentilch irgendwo ein mapping Status = StatusAsFullText  ?.





Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 20:29:42
mir fällt gerade auf, daß bei den functions ClosedTickets, ResubmittedTickets und OpenTickets immer derjenige Goofy fehlt, der die Aktion Close, Resubmit ausgelöst hat, bzw. wer das Ticket denn nun in Bearbeitung hat...

Auch das wird gelöst werden ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 30.12.05 - 20:41:27
Habe das Gerüst noch einmal geändert:

Es gibt jetzt eine neue Public Function GetTicketsByStatus ( status As String ) As TicketCollection
Das bietet ein wenig mehr Flexibilität.

Hi.

Der strittige Punkt...
Werd darauf nochmal zurückkommen, wenn ein Grundgerüst des Clients steht. Vielleicht verstehe ich das auch ein bischen falsch. Wir werden sehen. Jetzt eine Diskussion zu starten wäre der falsche Zeitpunkt.
Mit den leeren Tickets probiere ich in nächster Zeit aus. Das sieht für mich ein bischen gefährlich aus. Ich probiers im Laufe dieses Abends aus. Hab anderes gemacht in den letzten Stunden.


Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 21:20:15
Zitat
Der strittige Punkt...

Ich habe es eingebaut, weil ich noch nicht konkret weiß, was die Brombeeren wollen.
Axel, ich denke momentan an das Projekt und nicht unbedingt so strukturiert, wie du es tust.
Die Funktion ist da; ob sie genutzt wird ... ??? Rausschmeißen kann man immer was.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 22:07:16
hmm, traut sich keiner, mir eine neues Ticket via Service zu erstellen ??   :-:
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 30.12.05 - 22:07:55
Vielleicht sollte man doch die Funktionen über mehrere WSDLs verteilen. Jedenfalls versuche ich gerade aus dem neuen WSDL Eclipse das Client System generieren zu lassen und gerate langsam an die Grenzen des Physikalisch zur Verfügung stehenden Speichers auf diesem Rechner. Ermutigenderweise ist es in den letzten Sekunden ein bischen besser geworden. Ich lass den noch ein bischen laufen.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 22:10:09
Zitat
Vielleicht sollte man doch die Funktionen über mehrere WSDLs verteilen.

Vorteil ??
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 22:17:51
Das Gerüst wird jetzt nicht mehr verändert ! Basta Wir können hier noch monatelang debattieren ... 10.01 ist deadline ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 30.12.05 - 23:18:12
Basta
Eclipse packt es momentan nicht, daraus die stubs zu generieren. Ich weiss nicht warum. Möglicherweise weil die wsdl Datei zu umfangreich ist. Oder aus anderen Gründen. Ich probiere weiter. 
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 23:23:21
wie, mit dem bisschen wird eclipse nicht fertig ??

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="urn:DefaultNamespace" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="urn:DefaultNamespace" xmlns:intf="urn:DefaultNamespace" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <wsdl:types>
  <schema targetNamespace="urn:DefaultNamespace" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
   <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
   <complexType name="TICKET">
    <sequence>
     <element name="USER" type="xsd:string"/>
     <element name="TICKETNUMBER" type="xsd:string"/>
     <element name="ACTIONBY" type="xsd:string"/>
     <element name="PROBLEM" type="xsd:string"/>
     <element name="STATUS" type="xsd:string"/>
    </sequence>
   </complexType>
   <complexType name="ArrayOfTICKET">
    <complexContent>
     <restriction base="soapenc:Array">
      <attribute ref="soapenc:arrayType" wsdl:arrayType="impl:TICKET[]"/>
     </restriction>
    </complexContent>
   </complexType>
   <complexType name="TICKETCOLLECTION">
    <sequence>
     <element name="TICKETS" nillable="true" type="impl:ArrayOfTICKET"/>
     <element name="TICKETCOUNT" type="xsd:short"/>
     <element name="ERRORCODE" type="xsd:short"/>
    </sequence>
   </complexType>
   <complexType name="TODO">
    <sequence>
     <element name="TODONUMBER" type="xsd:string"/>
     <element name="PROBLEM" type="xsd:string"/>
     <element name="STATUS" type="xsd:string"/>
    </sequence>
   </complexType>
   <complexType name="ArrayOfTODO">
    <complexContent>
     <restriction base="soapenc:Array">
      <attribute ref="soapenc:arrayType" wsdl:arrayType="impl:TODO[]"/>
     </restriction>
    </complexContent>
   </complexType>
   <complexType name="TODOCOLLECTION">
    <sequence>
     <element name="TODOS" nillable="true" type="impl:ArrayOfTODO"/>
     <element name="TODOCOUNT" type="xsd:short"/>
    </sequence>
   </complexType>
   <complexType name="TICKETDETAILS">
    <sequence>
     <element name="USER" type="xsd:string"/>
     <element name="TICKETNUMBER" type="xsd:string"/>
     <element name="PROBLEM" type="xsd:string"/>
     <element name="STATUS" type="xsd:string"/>
     <element name="ASSOCIATEDTODO" nillable="true" type="impl:TODOCOLLECTION"/>
    </sequence>
   </complexType>
  </schema>
 </wsdl:types>
 <wsdl:message name="GETTICKETSBYSTATUSResponse">
  <wsdl:part name="GETTICKETSBYSTATUSReturn" type="impl:TICKETCOLLECTION"/>
 </wsdl:message>
 <wsdl:message name="CLOSETICKETResponse">
  <wsdl:part name="CLOSETICKETReturn" type="xsd:short"/>
 </wsdl:message>
 <wsdl:message name="GETTICKETDETAILSRequest">
  <wsdl:part name="TICKETNUMBER" type="xsd:string"/>
 </wsdl:message>
 <wsdl:message name="GETTICKETDETAILSResponse">
  <wsdl:part name="GETTICKETDETAILSReturn" type="impl:TICKETDETAILS"/>
 </wsdl:message>
 <wsdl:message name="CREATETICKETRequest">
  <wsdl:part name="STRUSER" type="xsd:string"/>
  <wsdl:part name="STRPROBLEM" type="xsd:string"/>
 </wsdl:message>
 <wsdl:message name="GETNEWTICKETSResponse">
  <wsdl:part name="GETNEWTICKETSReturn" type="impl:TICKETCOLLECTION"/>
 </wsdl:message>
 <wsdl:message name="CLOSETICKETRequest">
  <wsdl:part name="STRTICKET" type="xsd:string"/>
 </wsdl:message>
 <wsdl:message name="GETALLTICKETSBYSUPPORTERResponse">
  <wsdl:part name="GETALLTICKETSBYSUPPORTERReturn" type="impl:TICKETCOLLECTION"/>
 </wsdl:message>
 <wsdl:message name="GETOPENTICKETSResponse">
  <wsdl:part name="GETOPENTICKETSReturn" type="impl:TICKETCOLLECTION"/>
 </wsdl:message>
 <wsdl:message name="GETALLTICKETSBYUSERRequest">
  <wsdl:part name="STRUSER" type="xsd:string"/>
 </wsdl:message>
 <wsdl:message name="GETTICKETSBYSTATUSRequest">
  <wsdl:part name="STATUS" type="xsd:string"/>
 </wsdl:message>
 <wsdl:message name="GETCLOSEDTICKETSResponse">
  <wsdl:part name="GETCLOSEDTICKETSReturn" type="impl:TICKETCOLLECTION"/>
 </wsdl:message>
 <wsdl:message name="GETRESUBMITTEDTICKETSRequest">
 </wsdl:message>
 <wsdl:message name="ASSIGNTICKETRequest">
  <wsdl:part name="STRTICKET" type="xsd:string"/>
  <wsdl:part name="STRASSIGNTO" type="xsd:string"/>
 </wsdl:message>
 <wsdl:message name="CREATETICKETResponse">
  <wsdl:part name="CREATETICKETReturn" type="xsd:short"/>
 </wsdl:message>
 <wsdl:message name="ASSIGNTICKETResponse">
  <wsdl:part name="ASSIGNTICKETReturn" type="xsd:short"/>
 </wsdl:message>
 <wsdl:message name="GETOPENTICKETSRequest">
 </wsdl:message>
 <wsdl:message name="GETNEWTICKETSRequest">
 </wsdl:message>
 <wsdl:message name="GETRESUBMITTEDTICKETSResponse">
  <wsdl:part name="GETRESUBMITTEDTICKETSReturn" type="impl:TICKETCOLLECTION"/>
 </wsdl:message>
 <wsdl:message name="GETALLTICKETSBYSUPPORTERRequest">
  <wsdl:part name="STRSUPPORTER" type="xsd:string"/>
 </wsdl:message>
 <wsdl:message name="GETCLOSEDTICKETSRequest">
 </wsdl:message>
 <wsdl:message name="GETALLTICKETSBYUSERResponse">
  <wsdl:part name="GETALLTICKETSBYUSERReturn" type="impl:TICKETCOLLECTION"/>
 </wsdl:message>
 <wsdl:portType name="wsTicket">
  <wsdl:operation name="GETNEWTICKETS">
   <wsdl:input message="impl:GETNEWTICKETSRequest" name="GETNEWTICKETSRequest"/>
   <wsdl:output message="impl:GETNEWTICKETSResponse" name="GETNEWTICKETSResponse"/>
  </wsdl:operation>
  <wsdl:operation name="GETCLOSEDTICKETS">
   <wsdl:input message="impl:GETCLOSEDTICKETSRequest" name="GETCLOSEDTICKETSRequest"/>
   <wsdl:output message="impl:GETCLOSEDTICKETSResponse" name="GETCLOSEDTICKETSResponse"/>
  </wsdl:operation>
  <wsdl:operation name="GETOPENTICKETS">
   <wsdl:input message="impl:GETOPENTICKETSRequest" name="GETOPENTICKETSRequest"/>
   <wsdl:output message="impl:GETOPENTICKETSResponse" name="GETOPENTICKETSResponse"/>
  </wsdl:operation>
  <wsdl:operation name="GETRESUBMITTEDTICKETS">
   <wsdl:input message="impl:GETRESUBMITTEDTICKETSRequest" name="GETRESUBMITTEDTICKETSRequest"/>
   <wsdl:output message="impl:GETRESUBMITTEDTICKETSResponse" name="GETRESUBMITTEDTICKETSResponse"/>
  </wsdl:operation>
  <wsdl:operation name="GETALLTICKETSBYUSER" parameterOrder="STRUSER">
   <wsdl:input message="impl:GETALLTICKETSBYUSERRequest" name="GETALLTICKETSBYUSERRequest"/>
   <wsdl:output message="impl:GETALLTICKETSBYUSERResponse" name="GETALLTICKETSBYUSERResponse"/>
  </wsdl:operation>
  <wsdl:operation name="GETTICKETDETAILS" parameterOrder="TICKETNUMBER">
   <wsdl:input message="impl:GETTICKETDETAILSRequest" name="GETTICKETDETAILSRequest"/>
   <wsdl:output message="impl:GETTICKETDETAILSResponse" name="GETTICKETDETAILSResponse"/>
  </wsdl:operation>
  <wsdl:operation name="GETALLTICKETSBYSUPPORTER" parameterOrder="STRSUPPORTER">
   <wsdl:input message="impl:GETALLTICKETSBYSUPPORTERRequest" name="GETALLTICKETSBYSUPPORTERRequest"/>
   <wsdl:output message="impl:GETALLTICKETSBYSUPPORTERResponse" name="GETALLTICKETSBYSUPPORTERResponse"/>
  </wsdl:operation>
  <wsdl:operation name="CREATETICKET" parameterOrder="STRUSER STRPROBLEM">
   <wsdl:input message="impl:CREATETICKETRequest" name="CREATETICKETRequest"/>
   <wsdl:output message="impl:CREATETICKETResponse" name="CREATETICKETResponse"/>
  </wsdl:operation>
  <wsdl:operation name="ASSIGNTICKET" parameterOrder="STRTICKET STRASSIGNTO">
   <wsdl:input message="impl:ASSIGNTICKETRequest" name="ASSIGNTICKETRequest"/>
   <wsdl:output message="impl:ASSIGNTICKETResponse" name="ASSIGNTICKETResponse"/>
  </wsdl:operation>
  <wsdl:operation name="CLOSETICKET" parameterOrder="STRTICKET">
   <wsdl:input message="impl:CLOSETICKETRequest" name="CLOSETICKETRequest"/>
   <wsdl:output message="impl:CLOSETICKETResponse" name="CLOSETICKETResponse"/>
  </wsdl:operation>
  <wsdl:operation name="GETTICKETSBYSTATUS" parameterOrder="STATUS">
   <wsdl:input message="impl:GETTICKETSBYSTATUSRequest" name="GETTICKETSBYSTATUSRequest"/>
   <wsdl:output message="impl:GETTICKETSBYSTATUSResponse" name="GETTICKETSBYSTATUSResponse"/>
  </wsdl:operation>
 </wsdl:portType>
 <wsdl:binding name="DominoSoapBinding" type="impl:wsTicket">
  <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
  <wsdl:operation name="GETNEWTICKETS">
   <wsdlsoap:operation soapAction=""/>
   <wsdl:input name="GETNEWTICKETSRequest">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:input>
   <wsdl:output name="GETNEWTICKETSResponse">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:output>
  </wsdl:operation>
  <wsdl:operation name="GETCLOSEDTICKETS">
   <wsdlsoap:operation soapAction=""/>
   <wsdl:input name="GETCLOSEDTICKETSRequest">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:input>
   <wsdl:output name="GETCLOSEDTICKETSResponse">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:output>
  </wsdl:operation>
  <wsdl:operation name="GETOPENTICKETS">
   <wsdlsoap:operation soapAction=""/>
   <wsdl:input name="GETOPENTICKETSRequest">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:input>
   <wsdl:output name="GETOPENTICKETSResponse">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:output>
  </wsdl:operation>
  <wsdl:operation name="GETRESUBMITTEDTICKETS">
   <wsdlsoap:operation soapAction=""/>
   <wsdl:input name="GETRESUBMITTEDTICKETSRequest">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:input>
   <wsdl:output name="GETRESUBMITTEDTICKETSResponse">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:output>
  </wsdl:operation>
  <wsdl:operation name="GETALLTICKETSBYUSER">
   <wsdlsoap:operation soapAction=""/>
   <wsdl:input name="GETALLTICKETSBYUSERRequest">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:input>
   <wsdl:output name="GETALLTICKETSBYUSERResponse">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:output>
  </wsdl:operation>
  <wsdl:operation name="GETTICKETDETAILS">
   <wsdlsoap:operation soapAction=""/>
   <wsdl:input name="GETTICKETDETAILSRequest">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:input>
   <wsdl:output name="GETTICKETDETAILSResponse">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:output>
  </wsdl:operation>
  <wsdl:operation name="GETALLTICKETSBYSUPPORTER">
   <wsdlsoap:operation soapAction=""/>
   <wsdl:input name="GETALLTICKETSBYSUPPORTERRequest">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:input>
   <wsdl:output name="GETALLTICKETSBYSUPPORTERResponse">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:output>
  </wsdl:operation>
  <wsdl:operation name="CREATETICKET">
   <wsdlsoap:operation soapAction=""/>
   <wsdl:input name="CREATETICKETRequest">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:input>
   <wsdl:output name="CREATETICKETResponse">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:output>
  </wsdl:operation>
  <wsdl:operation name="ASSIGNTICKET">
   <wsdlsoap:operation soapAction=""/>
   <wsdl:input name="ASSIGNTICKETRequest">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:input>
   <wsdl:output name="ASSIGNTICKETResponse">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:output>
  </wsdl:operation>
  <wsdl:operation name="CLOSETICKET">
   <wsdlsoap:operation soapAction=""/>
   <wsdl:input name="CLOSETICKETRequest">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:input>
   <wsdl:output name="CLOSETICKETResponse">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:output>
  </wsdl:operation>
  <wsdl:operation name="GETTICKETSBYSTATUS">
   <wsdlsoap:operation soapAction=""/>
   <wsdl:input name="GETTICKETSBYSTATUSRequest">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:input>
   <wsdl:output name="GETTICKETSBYSTATUSResponse">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:output>
  </wsdl:operation>
 </wsdl:binding>
 <wsdl:service name="wsTicketService">
  <wsdl:port binding="impl:DominoSoapBinding" name="Domino">
   <wsdlsoap:address location="http://main/helpdesk.nsf/wsTicket?WSDL"/>
  </wsdl:port>
 </wsdl:service>
</wsdl:definitions>
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 30.12.05 - 23:41:44
wie, mit dem bisschen wird eclipse nicht fertig ??

Nein. Momentan nicht. Bitte um Sachlichkeit.
Es kann noch aus ein paar anderen Gründen liegen. Die ganze Codegenerierung basiert auf massivem xml-Baum Zeugs. Und da gibt es Punkte, in denen der Speicherbedarf exponentiell ansteigen kann. Werd aber noch den Java Heap-Speicher für Eclipse auf höchstmöglich setzen. Vielleicht hat auch wtp1.0 einfach einen bug. Oder es liegt daran, dass ich das im selben Projekt generiere. Der Computer ist nicht richtig abgestürzt, es kam aber zu massiven swapping, cpu-Auslastung am Anschlag, aber irgendwie tut sich da was. Es führt aber zu keinen Ergebnissen.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 30.12.05 - 23:51:11
Zitat
Bitte um Sachlichkeit.
kein Problem ...

Ich kenne mich halt in DER Materie nicht aus ... man mag es mir verzeihen.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 30.12.05 - 23:52:58
Ok. Falscher Alarm. Bug in WTP 1.0 oder einer der anderen genannten Gründe. Jetzt war es in 5 Sekunden da. Vorher hab ichs 2 x > 30 min laufen lassen. Hat mich leicht wahnsinnig gemacht.  ;D

Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 31.12.05 - 00:12:48
sieht gut aus. Für eclipse wtp1.0 scheint man teilweise noch starke Nerven zu brauchen. Waren noch ein paar issues  ::)
Aber jetzt sieht es wieder ok aus.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: _Arne_ am 31.12.05 - 10:56:52
hmm, traut sich keiner, mir eine neues Ticket via Service zu erstellen ??   :-:


Hum ich als unwissender habe einfach mal die URL aufgerufen, aber
dort bekomme ich nur das XML Gerüst (FF sowie IE) ... aber denke
da habe ich es mir zu einfach gemacht ?

Gruß,
Arne
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 31.12.05 - 11:04:48
@Arne:

mit dem Tool aus diesem Thread (http://atnotes.de/index.php?topic=27792.msg176635#msg176635) kannst du das testen.

Titel: Re: Help Application demo at Lotusphere
Beitrag von: _Arne_ am 31.12.05 - 11:06:57
Ah Danke, nur mit NET Downloaden über die Elterliche ISDN Leitung sieht es schlecht aus (:
Dann muss ich wohl bis Montag warten.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 31.12.05 - 14:22:33
Axel, ich denke momentan an das Projekt und nicht unbedingt so strukturiert, wie du es tust.
Wow. Strukturiert. Was ein Wort  ;D
Das einzig wahre bezüglich strukturiert/unstruktiert ist, dass es extrem kontextabhängig ist. Im Arbeitsleben kommt oft einer und werturteilt: Sie arbeiten sehr strukturiert / oder / Sie arbeiten sehr unstrukturiert. Mir ist beides begegnet. Oft ist das Urteil "unstrukturiert" darin begründet, dass 2 Personen von verschiedenen Kontexten ausgehen. Da das Projekt der Kontext ist, sehe ich obige Aussage als einen Widerspruch an  ;D
Das Hauptding, dass mich an Go fasziniert: Die weissen und schwarzen Steine bilden Strukturen. Und in der 4000 jährigen (ok. bezogen auf die tiefgreifende japanische Reform vielleicht 400 jährigen Geschichte) des Spiels werden immer neue Erkenntnisse entwickelt, die zeigen, dass eine Struktur, die vor 10 Jahren als effizient angesehen wurde, ineffizient ist. Und dabei gibt es seit dem 18. Jhdt. und verstärkt seit 1920 va. in Japan und seit ca. 1980 vertärkt in Süd-Korea und China Profi-Spieler und Schulen für dieses Spiel, dessen Regeln in 10 Minuten verstanden werden können.

Wir sehen einfach nicht den gleichen Kontext. Aber das ist normal, und nicht weiter schlimm. Du bist ja für den producer-Part (serverseitiger Teil) verantwortlich. Ich mache dazu nur Vorschläge.  Könnte ich Strukturen wirklich immer richtig lesen, wäre ich 9 Dan und nicht 17 kyo.  ;)

Referenz-Kontexte sind eben meist ungleichzeitig.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 01.01.06 - 10:19:58
Ok. Wieder halbwegs da.

Ich bin dabei
a) einen Business Layer zu schreiben, der die von den aus Eclipse generierten Webservice Consumer Klassen generierten Entities in eine normalisierte Form bringt. Der erste Integrationstest wird heute sicher stattfinden. @Ulrich: Du kannst vielleicht die Blackberry Leute fragen, ob die damit etwas anfangen können. Erleichtert vielleicht Verständnis und Arbeit.

b) eine Gui zu schreiben. Hab mich entschlossen: Wenn dann richtig und arbeite mit einigen Ideen aus Scott Delaps Buch: Desktop Java Live (sehr gut). Macht das ganze erstmal nicht unbedingt leichter, sollte aber in einer leicht adaptierbaren und übersichtlichen GUI-Schicht resultieren. Die GUI wird in allen Bezeichnern und Fehlermeldungen internationalisierbar sein. Über properties-Dateien. Ich werde für die Beta translations_de.properties, translations_en.properties und translations_es.properties zur Verfügung stellen.   

Mir fallen einige Dinge in den Webservice Producer auf, die vielleicht geklärt werden sollten.
Vor allem stellt sich bei mir eine supporter/user Verwirrung ein.
Beide Members von Ticket und TicketDetails können unterschiedliche Personen referenzieren.
Imho gehören dann auch beide Variablen in die Objekte Ticket und TicketDetails  ??? Oder verstehe ich da etwas falsch?
Kleinigkeit, aber ich würd das was im Webservice als "TICKETNUMBER" bezeichnet wird, immer id benamsen.

Am Rande:
a) Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
Interessanterweise konvertiert Eclipse den Rückgabe-INT in einen short.

b) ich glaube wir sind bezüglich des ErrorÜbergabe jenseits der Orthodoxie. Ist aber erstmal nicht so wichtig.

Ich hoffe der Service hat Sylvester überstanden, weil ich heute noch testen will.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 01.01.06 - 10:55:11
Zitat
ch hoffe der Service hat Sylvester überstanden, weil ich heute noch testen will

yep, hat er  ;D

Mir sind gestern selber noch ein paar Dinge aufgefallen. Muss mal überlegen, ob wir das für die Demo noch mit einbauen, oder ob das dann unter limitations fällt.

Beim Schließen eines Tickets ( auch beim Zuweisen oder Annehmen ) werden ja immer Mails losgetreten, die den User oder den neuen Supporter darüber benachrichtigen, was gerade geschehen ist. Die benötigten Strings stehen aber erst im UIdoc zur Verfügung, da die Appl. ja erst dann weiß, wer mit welcher Sprache vor der Kiste sitzt. Das ist natürlich im Background nicht möglich.
Man müsste also immer noch den BB User und seine Sprache mit übergeben. Den Rest kann man dann über die Sprachdokumente auslesen.
Evt. ist das auch möglich, nur die ID des BB devices zu übergeben. Muss Mittwoch mal in der Firma gucken, ob man mit der Info irgendwie etwas us dem BES auslesen kann ( steckt ja im Prin zip nur eine SQL DB dahinter )
Das wäre dann aber auch schon wieder sehr speziell auf den BB zugeschnitten und nicht mehr universell einsetzbar ...

Auch die LogActions, die die Historie ( irgendwann ) einmal ersetzen werden, sind Vordergrund methoden.
Da werde ich mich gleich noch hinsetzen, und entsprechende Hintergrundmethoden schreiben.

Zitat
was im Webservice als "TICKETNUMBER" bezeichnet wird, immer id benamsen.
yo, ändere ich ab

Zitat
@Ulrich: Du kannst vielleicht die Blackberry Leute fragen, ob die damit etwas anfangen können. Erleichtert vielleicht Verständnis und Arbeit.
So wie ich das verstanden habe, haben die eine eigene Entwicklungsumgebung für den MDS; da können die sich die Sachen aus dem WSDL zusammenklicken ...

Zitat
Vor allem stellt sich bei mir eine supporter/user Verwirrung ein.

User ist der wo fragt und
Supporter ist der wo die Frage beantwortet / Lösung anbietet

Was die Returns bei den Fehlern angeht ... Mir ist erst einmal wichtig, daß verschiedene Dinge überhaupt erst einmal abgefangen werden; Ich denke, entsprechende Fehlernummern mit einer Beschreibung ( ;D ) reichen aus, um das auf dem BB device entsprechend anzuzeigen ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 01.01.06 - 11:39:41
Beim Schließen eines Tickets ( auch beim Zuweisen oder Annehmen ) werden ja immer Mails losgetreten...
Wer kennt das nicht. computeWithForm()  ???
Zitat
Zitat
was im Webservice als "TICKETNUMBER" bezeichnet wird, immer id benamsen.
yo, ändere ich ab
WAIT. Aber bitte nicht vor dem ersten Integrationstest  ::)
Ich muß dann wieder die stubs regenerieren.

Zitat
da können die sich die Sachen aus dem WSDL zusammenklicken ...
Ich hab ja selber hier quasi eine Klickie-Klickie Umgebung, aber das deckt meist nur 80% ab. Vielleicht hilft lauffähiger code ihnen, die restlichen 20% schnell zu implementieren.
Zitat
Ich denke, entsprechende Fehlernummern mit einer Beschreibung ( ;D ) reichen aus, um das auf dem BB device entsprechend anzuzeigen ...
Ja klar. Ich wollte damit nur sagen, dass Webservices afaik einen eigenen Mechanismus haben, der möglicherweise einfacher ist.

Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 01.01.06 - 11:48:49
Zitat
WAIT. Aber bitte nicht vor dem ersten Integrationstest  Roll Eyes

OK, ich warte jetzt sowieso erst mal auf ein Feedback von RIM; habe Jon gestern die Version zum Testen zugeschickt, wie sie momentan vorliegt ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 01.01.06 - 12:15:33
Zitat
Wer kennt das nicht. computeWithForm()
sure, aber dann weiß ich trotzdem noch nicht, welche Sprache angezogen werden soll.

Da die Demo aber eh in english abläuft, werde ich das für en einbauen ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 01.01.06 - 13:40:09
Noch eine Kleinigkeit. Weil Ticket.Status und TicketDetails.Status jeweils eine Zahl runterliefert, sollte es besser int sein. Das ist einfach klarer.
Ich konvertier das hier unten nämlich sowieso wieder in int um.
Code
ticketV.setStatus(Integer.parseInt(ticketWs.getSTATUS()));
ticketV.setStatusCode(Integer.parseInt(ticketWs.getSTATUS()));
ich mein das Integer.parseInt().
Kann das auch nicht einfach in String lassen, weil sich daraus ansonsten eventuell bei weiteren Stati die bekannten Sortierungsprobleme ergeben (3 wird hinter 21 sortiert, wenn nach String sortiert wird).

Ich map die Statuscodes übrigens in einer sprachspezifischen properties-Datei:
z.B.:
Code
translations_de.properties: 
status0=neu
status1=offen
status98=bearbeitet
status99=geschlossen
oder:
in translations_en.properties
Code
status0=new
status1=open
status98=resubmited
status99=closed
So kann man in Java internationalisieren(Klasse RessourceBundle). Er zieht bei mir automatisch die _de Datei, weil das eine deutsche Version von Windows XP ist. Aber das nur am Rande.

Ich tendiere dazu, es besser zu finden, dass im Webservice Producer die Funtktion CreateTickets mit CreateTickets(TicketDetails ticketDetails) implementiert würde und nicht CreateTicket(String userName, String Problem). Das würde mehr Flexibilität geben. Teile des TicketDetails-Objekts können ja unten leer bleiben und im Producer gefüllt werden. Wenn man dann im Webservice Producer doch ein zusätzliches Property vom Client braucht, müßte man nicht die Parameter der Funktion enden, aber das nur am Rande. Stört so erstmal nicht weiter.

Gruß Axel

Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 01.01.06 - 14:03:15
Zitat
Ich tendiere dazu, es besser zu finden, dass im Webservice Producer die Funtktion CreateTickets mit CreateTickets(TicketDetails ticketDetails) implementiert würde und nicht CreateTicket(String userName, String Problem).

Hat was ... Aber wie gesagt; ich lasse das erst einmal so, damit du testen kannst. Außerdem warte ich das Feedback von RIM ab.

Das CloseTicket funktioniert soweit; es wird geprüft, ob

- das Ticket nicht schon geschlossen wurde ( retcode 5)
- das Ticket noch offene ToDos hat.  ( retcode 4 )

Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 01.01.06 - 21:47:27
Das dauert doch länger als ich dachte. Denke aber das ich irgendwann heute nacht sämtliche tests für den business layer grün sind:

Ich bringe für die Ansichten die Daten in verschiedene Strukturen. Das ist jetzt erstmal fertig.
Kommt noch reasign create und so ein Zeug. Das dürfte einfacher sein, weil das nur jeweils 1 Ticket betrifft und ich die nicht extra neu gruppieren muß.

status = null ist erstmal nicht so wichtig. Die haben sowieso den statusCode (wird nicht angezeigt) und der status kann immer dynamisch gezogen werden, ohne dass dies die Performance merklich belastet.

-> bezeichnet jeweils ein neues TicketPartial (dasselbe wie Ticket bei dir, nicht zu verwechseln mit TicketFull (bei dir TicketDetails).

1. Tickets gesucht nach key user "Heinz Ulrich Krause", geordnet Nach Status.
Dies Datenstruktur kann dann in einem JTree (so ähnlich wie outline) genutzt werden, um die Tickets nach den Stati zu gruppieren:

printing out value from method:testGetUserTicketsOrderedByStatus()
offen
   ->
[TicketPartial:
name: COMM-6JXH7Z
status: null
user: Heinz Ulrich Krause
problem: Take a look at the refresh function , please

does not work !

mit freundlichen Grüssen

Heinz Ulrich Krause
Am Zaunbusch 8
40822 Mettmann

Mobil: 0174 9898464
SKYPE: eknori
WEB: http://www.eknori.de

newItem: true]
geschlossen
   ->
[TicketPartial:
name: COMM-6K7LXD
status: null
user: Heinz Ulrich Krause
problem: Test neuzuweisung. Maybe there is a wrong language key !!
newItem: true]
   ->
[TicketPartial:
name: COMM-6JXHE9
status: null
user: Heinz Ulrich Krause
problem: This ticket is created using the "Quick Call" form
newItem: true]
   ->
[TicketPartial:
name: HUKE-6JXH8N
status: null
user: Heinz Ulrich Krause
problem: SAP down because AS/400 needs IPL
newItem: true]
   ->
[TicketPartial:
name: COMM-6K7LLS
status: null
user: Heinz Ulrich Krause
problem: There is no problem in the new release
newItem: true]
----------------------------------------------------------------------------------------------------------------

2. Tickets gesucht nach key suporter "Heinz Ulrich Krause", geordnet Nach Status.
printing out value from method:testGetSuporterTicketsOrderedByStatus()
neu
   ->
[TicketPartial:
name: COMM-6KMPHS
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
   ->
[TicketPartial:
name: COMM-6KMPHT
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
   ->
[TicketPartial:
name: COMM-6KMPHU
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
   ->
[TicketPartial:
name: COMM-6KKMS4
status: null
user: Hein Bloed
problem: Baldy man
newItem: true]
   ->
[TicketPartial:
name: COMM-6KMPHV
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
   ->
[TicketPartial:
name: COMM-6KMPHW
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
   ->
[TicketPartial:
name: COMM-6KMPHR
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
   ->
[TicketPartial:
name: COMM-6KMPHX
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
   ->
[TicketPartial:
name: COMM-6KMPHY
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
   ->
[TicketPartial:
name: COMM-6KMPK2
status: null
user: Heinz Urich Krause
problem: HAPPY NEW Year ... what a crap ...
newItem: true]
offen
   ->
[TicketPartial:
name: HUKE-6KDMGE
status: null
user: Witte Administrator
problem: Ticket manually created
newItem: true]
   ->
[TicketPartial:
name: COMM-6KKTVW
status: null
user: Stefan1971
problem: Noch ein Ticket, weil's so schön ist!
newItem: true]
   ->
[TicketPartial:
name: COMM-6KKMQZ
status: null
user: Hein Bloed
problem: I'm loosing my hair
newItem: true]
   ->
[TicketPartial:
name: COMM-6KKQJY
status: null
user: Bruce Elgort
problem: NO, I wasn't here
newItem: true]
   ->
[TicketPartial:
name: COMM-6KKTML
status: null
user: Arnold Schwarzenegger
problem: I would like to have a bratwurscht with a bretzel and sauerkraut.
newItem: true]
   ->
[TicketPartial:
name: COMM-6KKTKX
status: null
user: PowerLuser
problem: Any key cannot be found.
newItem: true]
   ->
[TicketPartial:
name: COMM-6JXH7Z
status: null
user: Heinz Ulrich Krause
problem: Take a look at the refresh function , please

does not work !

mit freundlichen Grüssen

Heinz Ulrich Krause
Am Zaunbusch 8
40822 Mettmann

Mobil: 0174 9898464
SKYPE: eknori
WEB: http://www.eknori.de

newItem: true]
geschlossen
   ->
[TicketPartial:
name: HUKE-6JXH8N
status: null
user: Heinz Ulrich Krause
problem: SAP down because AS/400 needs IPL
newItem: true]
   ->
[TicketPartial:
name: COMM-6K7LXD
status: null
user: Heinz Ulrich Krause
problem: Test neuzuweisung. Maybe there is a wrong language key !!
newItem: true]
   ->
[TicketPartial:
name: COMM-6K7LLS
status: null
user: Heinz Ulrich Krause
problem: There is no problem in the new release
newItem: true]
   ->
[TicketPartial:
name: COMM-6JXHE9
status: null
user: Heinz Ulrich Krause
problem: This ticket is created using the "Quick Call" form
newItem: true]


--------------------------------------------------------------------------------------------------------------------

printing out value from method:testGetSuporterTicketsOrderedByUser()
tickets gesucht nach suporter Heinz Ulrich Krause, gruppiert nach User.
Arnold Schwarzenegger
   ->
[TicketPartial:
name: COMM-6KKTML
status: null
user: Arnold Schwarzenegger
problem: I would like to have a bratwurscht with a bretzel and sauerkraut.
newItem: true]
Bruce Elgort
   ->
[TicketPartial:
name: COMM-6KKQJY
status: null
user: Bruce Elgort
problem: NO, I wasn't here
newItem: true]
Hein Bloed
   ->
[TicketPartial:
name: COMM-6KMPHR
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
   ->
[TicketPartial:
name: COMM-6KKMS4
status: null
user: Hein Bloed
problem: Baldy man
newItem: true]
   ->
[TicketPartial:
name: COMM-6KMPHW
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
   ->
[TicketPartial:
name: COMM-6KMPHS
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
   ->
[TicketPartial:
name: COMM-6KMPHX
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
   ->
[TicketPartial:
name: COMM-6KMPHY
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
   ->
[TicketPartial:
name: COMM-6KMPHU
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
   ->
[TicketPartial:
name: COMM-6KKMQZ
status: null
user: Hein Bloed
problem: I'm loosing my hair
newItem: true]
   ->
[TicketPartial:
name: COMM-6KMPHV
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
   ->
[TicketPartial:
name: COMM-6KMPHT
status: null
user: Hein Bloed
problem: no prob. at al, jsut teting the service
newItem: true]
Heinz Ulrich Krause
   ->
[TicketPartial:
name: COMM-6JXH7Z
status: null
user: Heinz Ulrich Krause
problem: Take a look at the refresh function , please

does not work !

mit freundlichen Grüssen

Heinz Ulrich Krause
Am Zaunbusch 8
40822 Mettmann

Mobil: 0174 9898464
SKYPE: eknori
WEB: http://www.eknori.de

newItem: true]
   ->
[TicketPartial:
name: HUKE-6JXH8N
status: null
user: Heinz Ulrich Krause
problem: SAP down because AS/400 needs IPL
newItem: true]
   ->
[TicketPartial:
name: COMM-6K7LXD
status: null
user: Heinz Ulrich Krause
problem: Test neuzuweisung. Maybe there is a wrong language key !!
newItem: true]
   ->
[TicketPartial:
name: COMM-6K7LLS
status: null
user: Heinz Ulrich Krause
problem: There is no problem in the new release
newItem: true]
   ->
[TicketPartial:
name: COMM-6JXHE9
status: null
user: Heinz Ulrich Krause
problem: This ticket is created using the "Quick Call" form
newItem: true]
Heinz Urich Krause
   ->
[TicketPartial:
name: COMM-6KMPK2
status: null
user: Heinz Urich Krause
problem: HAPPY NEW Year ... what a crap ...
newItem: true]
PowerLuser
   ->
[TicketPartial:
name: COMM-6KKTKX
status: null
user: PowerLuser
problem: Any key cannot be found.
newItem: true]
Stefan1971
   ->
[TicketPartial:
name: COMM-6KKTVW
status: null
user: Stefan1971
problem: Noch ein Ticket, weil's so schön ist!
newItem: true]
Witte Administrator
   ->
[TicketPartial:
name: HUKE-6KDMGE
status: null
user: Witte Administrator
problem: Ticket manually created
newItem: true]

Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 01.01.06 - 22:28:44
Die Funktion getTicketDetails ist nicht implementiert  ???

Hier kommt nix an. In deinem zuletzt geposteten Source code scheint es so zu sein.
Code
%REM
#####################################################
 Public Function GetTicketDetails ( TicketNumber as String  ) As TicketDetails
#####################################################
%END REM      
   Public Function GetTicketDetails ( TicketNumber as String  ) As TicketDetails
      
      On Error Goto ERRHANDLE   
      
EXITPOINT:
exit function <-<<
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 01.01.06 - 23:45:28
create Ticket hat Test grün.
von mir ist ein Ticket drin:
Code
[TicketPartial:
id: COMM-6KMUUW
statusCode: 0
user: Axel Janssen
problem: p1136155428718
newItem: true]

Das ist auch der einzige Junit-Test, der einigermassen vernünftig ist. Vielleicht interessiert es jemanden:
Code
	/*
	 * Test method for
	 * 'de.atnotes.help.wsclient.domain.BasicTicketsRepository.createTicket(String,
	 * String)'
	 */
	public void testCreateTicket() {
		String user = "Axel Janssen";
		String problem = "p" + System.currentTimeMillis();

		TicketFull ticketFull = TicketFull.getInstanceUsingUserData(null, -1,
				user, problem, null);
		int ret = -1;
		try {
			ret = ticketsRep.createTicket(ticketFull);
		} catch (EnvironmentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		assertEquals(0, ret);

		// try to retrieve newly created ticket from remote database. Must have
		// statusCode =0

		Map<Integer, Set<TicketPartial>> mTicketsUserOrderedByStatus = null;

		try {
			mTicketsUserOrderedByStatus = ticketsRep
					.getUserTicketsOrderedByStatus(user, true);
		} catch (EnvironmentException e) {

			e.printStackTrace();
		}

		Set<TicketPartial> set = mTicketsUserOrderedByStatus.get(0);
		Iterator<TicketPartial> it = set.iterator();
		TicketPartial ticketPartial = null;
		boolean wasFound = false;
		while (it.hasNext()) {
			ticketPartial = it.next();
			if (ticketPartial.getProblem().equals(problem)) {
				wasFound = true;
				System.out.println(ticketPartial);
				break; // while
			}
		}
		assertTrue(wasFound);

	}
Erst erzeugt er ein Ticket und dann guckt der Test selbst nach, obs da ist. Wegen der currentTimeMilis() im problem ist es sehr wahrscheinlich, dass es sich um kein Duplikat handelt.

Das Tolle an junit-Tests ist, dass sie einfach da sind. D.h.: Wenn ich was verändere, kann ich jederzeit mit der quasi völlig automatisch startenden Batterie der Junit-Tests überprüfen, ob der neue Code vielleicht nicht zu einem Fehler geführt hat. Ausserdem hat man immer einen schicken
grünen -> alles ok
roten -> eine der assert-Funktionen meldet Fehler
oder tiefroten -> Exception geworfen.

Balken
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 01.01.06 - 23:57:11
Aus Design-Gesichtspunkten halte ich die von den Funktionen
 Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
 Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
 Public Function CloseTicket ( strTicket As String ) As Integer

retunierten Integer für keine gute Idee.

Warum nicht einfach einen String runtergeben, der den Fehler ein bischen beschreibt. Davon läuft der Speicher vom Blackberry auch nicht voll.
UND VOR ALLEM: Bei CreateTicket wird ein Teil des Tickets auf dem Client (user, problem), ein anderer Teil aber auf dem Server erzeugt: WICHTIG IST V.A. id (oder) TicketNumber (und die ist alphanumerisch). Ich seh das quasi als zwingend an, dass CreateTicket diese ID zurückgibt. Die restlichen Werte sind eh beim Erzeugen mehr so Konstanten also egal.
Das ist auch ein RDBMS-Proggen Prinzip: bei SQL Create am besten immer den Primärschlüssel zurückgeben (der wird ja oft wie bei dir von der DB automatisch erzeugt).

Dieser Beitrag war so ziemlich das drängenste Problem, was ich zur Zeit sehe.

Auch für die anderen Funktionen wären Text Fehlermeldungen find ich besser. Ich mapp die Nummern sowieso direkt auf String und ich glaub wie gesagt nicht, dass dies sich auf den Speicher von BlackBerry merklich auswirkt.
(
Code
if (ret == 1) {
				throw new EnvironmentException(AppUtils.getValue("exception.general.mandatoryParameterNotSet") + 
						"ticketFull.user=" + ticketFull.getUser() + "ticketFull.problem=" + ticketFull.getProblem());
			}
			if (ret == 2) {
				throw new EnvironmentException(AppUtils.getValue("exception.environmentException.WebserviceErrorCode"));
			}
)



Wenn ich ins Bett gehe, habe ich erstmal genug getestet. Meinetwegen kann die DB für ein paar Stunden vom Netz gehen, verändert werden, etc. Aber bitte hier ankündigen. Ich kann mir ohne große Schwierigkeiten MockObjekte erzeugen (von Hand. leider kann ichs nicht anders obwohls dafür tools gibt), die die entfernten Objekte simmulieren. Ist eh einfacher.

Versuch aber noch assignTicket und closeTicket zu implementieren.
In den JunitTests fehlen noch ein paar Tests auf Exceptions. Mach ich später noch.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 02.01.06 - 00:10:21
Axel:

Wenn ein Supporter angegeben wird, der keine Tickets hat ( also nicht in der DB existiert ) springe ich aus der function mit exit function raus.

entsprechend wir das hier als response geliefert; kann man damit was anfangen, sprich im Frontend entsprechend behandeln  ??

- <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <soapenv:Body>
  <ns1:GETALLTICKETSBYSUPPORTERResponse xmlns:ns1="urn:DefaultNamespace" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
  </soapenv:Body>
  </soapenv:Envelope>
GETALLTICKETSBYSUPPORTERR scheint hier bei leeren Collections null zu sein. Ich find das nicht so gut. Wenn es schon ein Objekt gibt, dass als eine Art von Container für den Array dient und dazu noch eine ARRAY.length Variable (wie immer die heisst) hält, dann sollte nicht das ganze Objekt null sein. Das muß irgendwie gehen, dass in GETALLTICKETSBYSUPPORTER ein Array[0] zurückgegeben wird. Das wäre wesentlich besser.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 02.01.06 - 00:18:50
Den Rest mach ich später. Sieht aber gut aus.
Vielleicht ist es keine schlechte Idee noch ein bischen Funktionalität für die Todos anzubieten.
Ich werde jetzt schneller.
Am nervigsten war es, vernünftige datenstrukturen für die Collections, die in den Views angezeigt werden, hinzubekommen.
Je mehr Mühe ich mir hier gemacht habe, desto weniger Arbeit habe ich, wenn ich tatsächlich eine JTable auf diese Daten loslasse.

Java5 war teilweise ein bischen gewöhnungsbedürftig. Generics (dieses Zeugs <String>) sind sehr praktisch. Ebenfalls die ForAll Schleife, in denen kein ForAll als Wort vorkommt. Denke ich kann auch Scott Delap für die Gui folgen, ohne dass mich das aus der Bahn wirft.

Hier ist die zentrale Facade-Klasse, die mit den von Eclipse generierten Klassen spricht und sich die Werte über Webservices holt:
Code
package de.atnotes.help.wsclient.domain;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import de.atnotes.help.wsclient.gui.AppUtils;
import de.atnotes.help.wsclient.ws.TICKET;
import de.atnotes.help.wsclient.ws.TICKETCOLLECTION;
import de.atnotes.help.wsclient.ws.TICKETDETAILS;
import de.atnotes.help.wsclient.ws.TODO;
import de.atnotes.help.wsclient.ws.WsTicketProxy;

/**
 * @author Axel
 * 
 */
public class BasicTicketsRepository implements TicketsRepository {

	private WsTicketProxy ticketProxy;

	private Map<String, TicketPartial> mTicketsSuporter;

	private Map<String, TicketPartial> mTicketsUser;

	private Map<String, TicketFull> mTicketsFull;

	private Map<Integer, Set<TicketPartial>> userTicketsOrderedByStatus;

	private Map<Integer, Set<TicketPartial>> suporterTicketsOrderedByStatus;

	private Map<String, Set<TicketPartial>> suporterTicketsOrderedByUser;

	public BasicTicketsRepository() {

	}

	/**
	 * to use in view
	 * 
	 * @throws EnvironmentException
	 */
	public Map<Integer, Set<TicketPartial>> getUserTicketsOrderedByStatus(
			String user, boolean retrieveRemotely) throws EnvironmentException {
		// if null then retrieve allways from remote database
		if (userTicketsOrderedByStatus == null)
			retrieveRemotely = true;

		if (retrieveRemotely) {
			retrieveAllTicketsByUser(user);
			if (userTicketsOrderedByStatus == null)
				userTicketsOrderedByStatus = new HashMap<Integer, Set<TicketPartial>>();
			else {
				userTicketsOrderedByStatus.clear();
			}

			for (TicketPartial ticketPartial : mTicketsUser.values()) {
				Set<TicketPartial> sTicketsPartial = userTicketsOrderedByStatus
						.get(ticketPartial.getStatusCode());
				if (sTicketsPartial == null) {
					sTicketsPartial = new HashSet<TicketPartial>();
				}
				sTicketsPartial.add(ticketPartial);

				userTicketsOrderedByStatus.put(ticketPartial.getStatusCode(),
						sTicketsPartial);
			}
		}
		return userTicketsOrderedByStatus;
	}

	/**
	 * to use in view
	 * 
	 * @throws EnvironmentException
	 */
	public Map<Integer, Set<TicketPartial>> getSuporterTicketsOrderedByStatus(
			String user, boolean retrieveRemotely) throws EnvironmentException {
		// if null then retrieve allways from remote database

		if (suporterTicketsOrderedByStatus == null)
			retrieveRemotely = true;

		if (retrieveRemotely) {
			retrieveAllTicketsBySupporter(user);

			if (suporterTicketsOrderedByStatus == null)
				suporterTicketsOrderedByStatus = new HashMap<Integer, Set<TicketPartial>>();
			else {
				suporterTicketsOrderedByStatus.clear();
			}

			for (TicketPartial ticketPartial : mTicketsSuporter.values()) {
				Set<TicketPartial> sTicketsPartial = suporterTicketsOrderedByStatus
						.get(ticketPartial.getStatusCode());
				if (sTicketsPartial == null) {
					sTicketsPartial = new HashSet<TicketPartial>();
				}
				sTicketsPartial.add(ticketPartial);

				suporterTicketsOrderedByStatus.put(ticketPartial
						.getStatusCode(), sTicketsPartial);
			}
		}
		return suporterTicketsOrderedByStatus;
	}

	/**
	 * to use in view
	 */
	public Map<String, Set<TicketPartial>> getSuporterTicketsOrderedByUser(
			String user, boolean retrieveRemotely) throws EnvironmentException {
		// if null then retrieve allways from remote database
		if (suporterTicketsOrderedByUser == null)
			retrieveRemotely = true;

		if (retrieveRemotely) {
			retrieveAllTicketsBySupporter(user);

			if (suporterTicketsOrderedByUser == null)
				suporterTicketsOrderedByUser = new HashMap<String, Set<TicketPartial>>();
			else {
				suporterTicketsOrderedByUser.clear();
			}
			for (TicketPartial ticketPartial : mTicketsSuporter.values()) {
				Set<TicketPartial> sTicketsPartial = suporterTicketsOrderedByUser
						.get(ticketPartial.getUser());
				if (sTicketsPartial == null) {
					sTicketsPartial = new HashSet<TicketPartial>();
				}
				sTicketsPartial.add(ticketPartial);

				suporterTicketsOrderedByUser.put(ticketPartial.getUser(),
						sTicketsPartial);
			}
		}
		return suporterTicketsOrderedByUser;
	}

	/**
	 * calls Webservices to get a full ticket from the webservice to show in a
	 * form.
	 * 
	 * 
	 * @param String
	 *            idTicket the id of the full ticket to retrieve.
	 * 
	 * @return TicketFull
	 * @throws EnvironmentException
	 *             called when webservice doesn't work or it returns an
	 *             errorcode.
	 */
	public TicketFull getFullTicketById(String idTicket)
			throws EnvironmentException {
		TICKETDETAILS ticketFullWs = null;

		try {
			ticketFullWs = getTicketProxy().GETTICKETDETAILS(idTicket);
			/*
			 * ERRORCODE !!! if (ticketF.getERRORCODE() != 0) throw new
			 * EnvironmentException( AppUtils
			 * .getValue("exception.environmentException.WebserviceErrorCode") +
			 * ticketColWs.getERRORCODE());
			 */
		} catch (RemoteException e) {
			throw new EnvironmentException(
					AppUtils
							.getValue("exception.environmentException.ConnectionWithWebServiceFailed"),
					e);
		}
		TODO[] toDosWs = ticketFullWs.getASSOCIATEDTODO().getTODOS();

		List<TodoFull> todosFull = new ArrayList<TodoFull>();

		if (toDosWs != null) {
			for (TODO toDoWs : toDosWs) {
				TodoFull todoFull = TodoFull
						.getInstanceUsingWebserviceData(toDoWs);
				todosFull.add(todoFull);

			}
		}

		return TicketFull.getInstanceUsingWebserviceData(ticketFullWs,
				todosFull);

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see de.atnotes.help.goodies.bonus.wsclient.domain.TicketRepository#assignTicket(java.lang.String,
	 *      java.lang.String)
	 */
	public int assignTicket(String id, String newSupporter)
			throws EnvironmentException {
		// TODO muss noch überarbeitet werden.
		int ret = -1;
		try {
			ret = getTicketProxy().ASSIGNTICKET(id, newSupporter);
		} catch (RemoteException e) {
			throw new EnvironmentException(
					AppUtils
							.getValue("exception.environmentException.ConnectionWithWebServiceFailed"),
					e);
		}
		return ret;

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see de.atnotes.help.goodies.bonus.wsclient.domain.TicketRepository#closeTicket(java.lang.String)
	 */
	public int closeTicket(String id) throws EnvironmentException {
		int ret = -1;
		try {
			ret = getTicketProxy().CLOSETICKET(id);
		} catch (RemoteException e) {
			throw new EnvironmentException(
					AppUtils
							.getValue("exception.environmentException.ConnectionWithWebServiceFailed"),
					e);
		}
		return ret;

	}

	public int createTicket(TicketFull ticketFull) throws EnvironmentException {
		short ret = -1;
		try {
			ret = getTicketProxy().CREATETICKET(ticketFull.getUser().trim(),
					ticketFull.getProblem().trim());
			if (ret == 1) {
				throw new EnvironmentException(AppUtils
						.getValue("exception.general.mandatoryParameterNotSet")
						+ "ticketFull.user="
						+ ticketFull.getUser()
						+ "ticketFull.problem=" + ticketFull.getProblem());
			}
			if (ret == 2) {
				throw new EnvironmentException(
						AppUtils
								.getValue("exception.environmentException.WebserviceErrorCode"));
			}

		} catch (RemoteException e) {
			throw new EnvironmentException(
					AppUtils
							.getValue("exception.environmentException.ConnectionWithWebServiceFailed"),
					e);

		}

		return ret;

	}

	/**
	 * calls Webservices to get partial tickets from a webservice. Can be used
	 * to implement a cache later
	 * 
	 * @param mTicketsSuporter
	 *            map of existing lands in business layer
	 * @return
	 * @throws EnvironmentException
	 *             called when webservice doesn't work or it returns an
	 *             errorcode.
	 */
	void retrieveAllTicketsBySupporter(String suporter)
			throws EnvironmentException {

		TICKET[] ticketsWs = new TICKET[0];
		try {
			TICKETCOLLECTION ticketColWs = getTicketProxy()
					.GETALLTICKETSBYSUPPORTER(suporter);
			if (ticketColWs.getERRORCODE() != 0)
				throw new EnvironmentException(
						AppUtils
								.getValue("exception.environmentException.WebserviceErrorCode")
								+ ticketColWs.getERRORCODE());
			ticketsWs = ticketColWs.getTICKETS();

		} catch (RemoteException rex) {
			throw new EnvironmentException(
					AppUtils
							.getValue("exception.environmentException.ConnectionWithWebServiceFailed"),
					rex);
		}

		mTicketsSuporter = generateTicketsPartialFromWsData(ticketsWs,
				mTicketsSuporter);

	}

	/**
	 * calls Webservices to get a map of partial tickets from a webservice. Can
	 * be used to implement a cache later
	 * 
	 * @param mTicketsSuporter
	 *            map of existing lands in business layer
	 * @return Map <String, TicketPartial>
	 * @throws EnvironmentException
	 *             called when webservice doesn't work or it returns an
	 *             errorcode.
	 */
	void retrieveAllTicketsByUser(String user) throws EnvironmentException {
		TICKET[] ticketsWs = new TICKET[0];
		try {
			TICKETCOLLECTION ticketColWs = getTicketProxy()
					.GETALLTICKETSBYUSER(user);
			if (ticketColWs.getERRORCODE() != 0)
				throw new EnvironmentException(
						AppUtils
								.getValue("exception.environmentException.WebserviceErrorCode")
								+ ticketColWs.getERRORCODE());
			ticketsWs = ticketColWs.getTICKETS();

		} catch (RemoteException e) {
			throw new EnvironmentException(
					AppUtils
							.getValue("exception.environmentException.ConnectionWithWebServiceFailed"),
					e);
		}

		mTicketsUser = generateTicketsPartialFromWsData(ticketsWs, mTicketsUser);

	}

	/**
	 * helper function used by getAllTicketsByUser and getAllTicketsBySupporter
	 */

	private Map<String, TicketPartial> generateTicketsPartialFromWsData(
			TICKET[] ticketsWs, Map<String, TicketPartial> mTicketsPartial) {

		// if (mTicketsPartial == null)
		mTicketsPartial = new HashMap<String, TicketPartial>();

		for (TicketPartial ticketBO : mTicketsPartial.values()) {
			ticketBO.setNewItem(false);
		}

		for (TICKET ticketWs : ticketsWs) {
			TicketPartial ticketV = null;
			if ((ticketV = mTicketsPartial.get(ticketWs.getTICKETNUMBER())) != null) {
				System.out.println("old.ticket");
				ticketV.setStatusCode(ticketWs.getSTATUS());
				ticketV.setUser(ticketWs.getUSER());
				ticketV.setProblem(ticketWs.getPROBLEM());
			} else {
				ticketV = TicketPartial
						.getInstanceUsingWebserviceData(ticketWs);
			}
			mTicketsPartial.put(ticketV.getId(), ticketV);

		}

		return mTicketsPartial;

	}

	/**
	 * @return Returns the ticketProxy.
	 */
	private WsTicketProxy getTicketProxy() {
		if (ticketProxy == null)
			ticketProxy = new WsTicketProxy();
		return ticketProxy;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}



Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 02.01.06 - 05:18:57
Zitat
Die Funktion getTicketDetails ist nicht implementiert
Richtig, ebenso wie die AssignTicket; da existiert bisher nur ein func stub ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 02.01.06 - 19:36:28
@Axel:

Habe die

Class TicketDetails
   Public User As String
   Public Supporter As String
   Public ID As String
   Public Problem As String
   Public Solution As String
   Public Status As Integer
   Public application As String
   '... keine Ahnung was sonst noch
   'Public AssociatedTodo As ToDoCollection
End Class

eingebaut.

Und CreateTicket gibt jetzt die TicketNummer als string zurück.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 03.01.06 - 08:02:29
ist die Testdatenbank noch online?
Ich habe gestern und heute mal mit dem .NET WebService Studio getestet, bekomme aber immer
Zitat
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object.
Hab unseren Proxy bereits eingetragen, klappt aber noch nicht...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 03.01.06 - 08:08:59
ich war gerade noch drauf, ebenfalls mit Webservices Studio.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 03.01.06 - 08:45:39
http://eknori.dyndns.org/helpdesk.nsf/wsTicket?WSDL
Ist noch da.
Meine Junit Tests melden überall grün, ausser bei createTicket.
Da heisst es:
Code
org.xml.sax.SAXException: Bad types (class java.lang.String -> short)
Ulrich hat da ja auch Änderungen angekündigt.
... und Eclipse hat jetzt auch problemlos die Stub Klassen für die neue Version generiert (hab alllerdings wtp genommen).
Gibt einige  neue Properties (z.B. ACTIONBY in TICKET).
Bau das jetzt in meinen Business Layer ein.

Es existiert eine theoretische Möglichkeit, dass der Service nicht WS-Interoperability Profile kompatibel ist, hab aber momentan keine Ahnung wie man das testen kann (ausser mit WSAD und das ist mir zu langsam auf diesem Rechner).
Das sind noch so Punkte (nicht unbedingt für eine LotusSphere Demo):
- Caching (sehr wichtig für real world webservices)
- WSI-Interoperability
- Security
- doc-lit-style für Collections als return besser
- Notes RichText (ist sehr komplex zu konvertieren für einen nicht-Notes Client).

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 03.01.06 - 08:58:52
ist die Testdatenbank noch online?

Ich kann dir schicken, was ich bis jetzt fertig habe. Will das nicht unbedingt hier posten, weil das wg. der jars im Projekt ziemlich groß ist.

Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 03.01.06 - 09:13:22
schick mal rüber...
Mit WTP konnte ich das nun auch nutzen, der .NET-Krams will bei mir nicht richtig...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 03.01.06 - 09:15:58
Im Laufe des Tages. Hab doch noch ein paar Job-related Dinge.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 03.01.06 - 09:24:47
Imho wärs einfacher, wenn wir für sowas ein Versions-Kontrolle unterstütztes Projekt auf sourceforge.net, javalobby.org oder vielleicht sogar openNTF.org hätten.
Nathan Freeman hat angekündigt, dass er cvs für Domino unterstützen will. Werd da mal nachfragen, ob man dann da auch eng-Domino-verbundene-Java-Projekte (wie dieser Client) laufen lassen könnte. Würde Sinn machen.
Als nächstes würde ich javaLobby fragen.

Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 03.01.06 - 18:23:37
Assign Ticket ist jetzt auch rudimentär implementiert. An den Parametern wird sich wohl nichts mehr ändern, aber innerhalb der Funktion fehlen noch ein paar Sachen...

%REM
#####################################################
 Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
#####################################################
%END REM   
   Public Function AssignTicket ( ID As String, strAssignTo As String) As String
      
      On Error Goto ERRHANDLE      
      AssignTicket = ""
      
      If Trim ( ID ) = "" Or Trim(strAssignTo) = "" Then
         AssignTicket = ASSIGN_TICKET_ERR_MANDANTORY  'mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else      
         SearchFormula =|ReqNumber ="| & Trim( ID ) & |"|   
         Set dc = getDocuments ( SearchFormula )
         
         count = dc.count
         If count = 0 Then Exit Function
         If count > 0 Then  ' search successful
            Dim doc As NotesDocument
            Set doc = dc.GetFirstDocument
            If doc.status(0) <> "99" Then 'check status
               If doc.status(0) = "0" Then 'New Ticket
                  doc.status = "1"
               End If
               doc.supporter = strAssignTo
               success = doc.ComputeWithForm( False, False )
               AssignTicket = doc.ReqNumber(0) & ASSIGN_TICKET_ERR_NOERROR
               Call doc.Save ( True, True )
            Else
               AssignTicket = ASSIGN_TICKET_ERR_ALREADY_CLOSED
               Exit Function
            End If
         End If
      End If
      
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      xProc = Getthreadinfo(LSI_THREAD_PROC)
      xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
      If UseOpenLog Then
         Call LogError
      Elseif LogScriptErrors Then
         Call ThrowException ( xProc, xError  )
      End If
      Print xError   'In all cases
      If ResumeMethodNext Then
         Resume Next   
      Else
         AssignTicket = ASSIGN_TICKET_ERR_MISC_ERROR
         Resume EXITPOINT
      End If
   End Function
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 03.01.06 - 19:30:21
Zitat
Todo ist weg.
Du meinst das ToDo bei den Details ? Ja, ich war gestern zu blöd, ein array zu (re)-dimmen ... baue ich abe morgen wieder ein.

Zitat
Haben eigentlich die Blackberry Leute etwas gesagt?

Leider bisher noch nicht: habe heute morgen noch wg. Auth und deinem client nachgefragt ... Schweigen im Walde ...  :P


Boah ... ich glaube ich mache Feierabend; jetzt habe ich deinen Artikel editiert, statt drauf zu antworten ... :'(
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 03.01.06 - 19:38:54
Boah ... ich glaube ich mache Feierabend; jetzt habe ich deinen Artikel editiert, statt drauf zu antworten ...  :'(
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 03.01.06 - 21:27:47
Nimms nicht persönlich, aber ich bin mir jetzt 100% sicher, dass ich bei dem nächsten Webservices Consumer, den ich programmieren werde, auf einen gewissen Formalismus (Use Cases, Objekt-Modell) bestehen werde. Aber um das effektiv zu machen, dient auch dieser Lernprozess.
Diese Api ist instabiler als 2 Erdplatten, die gerade einen Tsunami erzeugen  ;D
Kein großer Akt das neu zu erzeugen, aber ich hab ToDo auch im Business Layer weggehauen.

Ich probier jetzt mal assignTickets zu implementieren und für eins der von mir erzeugten tickets zu testen.

Um über instabile Apis zu sprechen. Ich glaub mittlerweile das TicketsDetails nicht so eine gute Idee war. Am besten wir hauen irgendwann Ticket weg und machen TicketDetails zu Ticket.
Das ist irgendwie doppelt. Eine Ticket-Klasse reicht eigentlich.

Bei mir kam gestern der Mann mit dem Hammer. Der 1.1. (Sonntag) war ziemlich extrem. Hab auch nicht alles richtig durchdacht. Es war und ist aber definitiv brauchbar und auf besser änderbar. Das betrifft aber mehr business-layer interne Sachen.

Ach ja. Wo wir jetzt so weit sind. Warum kann ich nicht einfach ein Datum hochschicken und du sendest nur Tickets runter, die nach diesem Datum zuletzt geändert wurden.
Es macht Sinn aus Performance-Gesichtspunkten, den Datenbestand auf dem Client und dem Server als 2 verbundene aber vollständige Datenbanken vorzustellen (wobei der Serverbestand natürlich der "führende" Datenbestand ist). Ich kann diese ganzen Tickets, ToDo und whatever Daten hier auch persistent in eine embedded Datenbank schreiben oder als Files serialisieren, so dass nach dem Neustart des Clients der Datenbestand des letzten Downloads gar nicht vom Server gezogen werden muss. So könnte z.B. auch ohne Internetverbindung gearbeitet werden. Dabei muss natürlich auch bei eventuellen Updates auf dem Server gecheckt werden, ob die Daten des Clients irgendwie veraltet sind. Das geht, macht Sinn und bzgl. der Konsistenz von 2 Datenbeständen gibts lecker Design Patterns von Martin Fowler.  :D
 

Gruß Axel

Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 04.01.06 - 05:13:21
Zitat
Warum kann ich nicht einfach ein Datum hochschicken und du sendest nur Tickets runter, die nach diesem Datum zuletzt geändert wurden.

Könnte es daran iegen, daß eine solche Funktion bisher noch nicht existiert ??
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 04.01.06 - 08:00:20
Könnte es daran iegen, daß eine solche Funktion bisher noch nicht existiert ??
Ja klar. Ich wollte nur andeuten, dass dies absolut Sinn machen würde.  ;)
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 04.01.06 - 08:03:46
gut, dann baue ich das noch ein.
Wegen der Klassen Ticket und TicketDetails hast du natürlich vollkommen Recht ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 04.01.06 - 13:26:46
Das mit dem TicketDetails war dummerweise meine Idee.

Zwischen den beiden Zielen:
a) Client hat den aktuellen Ticket Bestand vom Server und
b) die Anwendung ist responsiv
besteht der entscheidende Zielkonflikt.

Am meisten Zeit geht eindeutig für das pullen der Tickets vom Server durch den Client drauf.
Also sollten diese Zeiten möglichst gering und selten gehalten werden. Mit dem lastChange Datum ist gewährleistet, dass jeweils nur die diff vom Server an den Client übertragen wird (deutlich weniger). Dabei muss man natürlich noch auf gelöschte Dokumente achtgeben, falls es das in HELP gibt, aber das ist vielleicht erstmal nicht so wichtig.
Um die aktuellen Tickets vom Server zu pullen, soll es im Client einen expliziten Button dafür geben. Ansonsten arbeitet der User mit dem zuletzt runtergeladenen Bestand an Tickets.
Fraglich ist das noch nicht implementierte Feature update eines Tickets.
Vermutlich macht es Sinn, dass schon wenn ein User ein Ticket zum update auswählt auf dem Server geprüft wird, dass das Ticket einen anderen Stand als auf dem Client hat und ob eventuell ein lock flag gesetzt ist (falls es das in HELP gibt).
Auch nach dem editieren des Tickets (also beim Speichern auf dem Server) muß geprüft werden, ob nicht zwischendurch jemand anders das Ticket bearbeitet hat (oder man benutzt einfach den Lock-Mechanismus von Help, falls es ihn gibt). Die Änderung müßte bei Konflikt zurückgewiesen werden.

Ein weiteres Thema ist security. Dazu später mehr.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 05.01.06 - 19:59:43
Habe RIM gerade noch einmal eine Mail bzgl. Feedback und weiterer Vorgehensweise geschickt. Sollte sich bis Samstag abend keiner zucken, betrachte ich das  Project als gescheitert.

Das soll aber nicht bedeuten, daß ich mit dem Thema nicht weitermachen werde. Im Grunde ist es ja völlig wurscht, ob die Services von einer Brombeere oder einer anderen Application "consumed" werden.

Für mich war dieses Projekt sehr lehrreich; und viele der Postings, die Axel bzgl. Planung und Uses Cases etc. geschrieben hat, sehe ich heute in einem anderen Licht ( Ich meine nicht die Posts in diesem Thread, sondern viele andere der letzten Monate und Jahre )

Lotusphere 2006 wird eh sehr Web Services lastig werden; daher wird man Anfang Februar aus dieser Richtung noch ein paar Sachen hören werden ..

Thomas hatte in Telefonaten angesprochen, dass Web Services möglicherweise eine "einfache" Lösung ist, wenn man z.B. ein Interface auch zwischen zwei Notes DBs schreiben will, um Daten abzufragen etc.
Das würde diese Config Doc basierten Interfaces ersetzen können, bei denen immer ein Server, eine DB und eine View angegeben werden muss; zudem muss man noch die Felder kennen, auf die man zugreifen will. Web Services würden einfach Methoden zur Verfügung stellen, die den Job erledigen ..

Ich finde den Gedanken gut.

Daß man auf dem Server dann den HTTP task laufen lassen muss, nehme ich in Kauf...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 05.01.06 - 22:37:57
Vielleicht kriegen die ihren Client einfach nicht in den Griff und der ihr alles-automatisch-tool sagt ihnen Sachen, die sie nicht verstehen.  ;D
Mich hat das auch weitergebracht und werd den Client auf jeden Fall weiterentwickeln. Deshalb wäre es doch ganz praktisch, wenn der Client noch ein paar Tage am Laufen bleibt.

Technologien wie Webservices mit SOAP haben natürlich Grenzen, an denen es aufhört sinnvoll zu sein. Um das herauszufinden, mache ich das hier u.a..

<rant>
Bzgl. meiner Postings ist auch vieles Mißverstanden worden. Ich bin überhaupt kein Freund von übertriebener Planung. Ich seh das selbst in benachbarten Websphere Projekten. Ich wünsche das beste... Aber plötzlich mischen da alle Leute mit, machen "fachliche" (nicht-technische) Arbeit, planen groß rum, haben aber keine Ahnung und dann haben die Entwickler 2 Wochen Zeit, um diese freundlicherweise in 6 Monaten doll geplanten Sachen zu "implementieren" mit irgendwelchen brillianten in-house "frameworks" und die framework-"Entwickler", die das dreifache verdienen sind nicht ansprechbar, weil sie nämlich nur noch die Hälfte (Teilzeit) arbeiten. Integrations- und Unit-Tests werden irgendwann gestrichen, weil das "die Entwickler" nicht "annehmen".
Bestimmte Techniken machen aber in einem vernünftigen Rahmen und nach einer nicht kurzen Gewöhnphase Sinn. Leider werden sie viel zu oft von irgendwelchen überehrgeizigen Schnöseln nicht unbedingt mit schlechter Absicht  als Werkzeuge eingesetzt, die eine Art Vorhölle erzeugen, auf die irgendwann keiner mehr Bock hat.

Ich will keine perfekte alles-klappt-Welt. Ich will weniger nix-klappt-Welt. Und genau dafür sollte man diese Analyse-Werkzeuge einsetzen.
</rant>

Interfaces sind natürlich eine gute Sache. Sie sind einfach stabil da und man kann beliebig die eigentliche Implementierung ändern. Es ist nur die Frage wie stabil das Interface ist. In unserem Fall war es das nicht und auch mit einem guten Analyse Prozess hätten wir kein stabiles Interface im ersten Schritt hinbekommen. Wenn man aber im Interface etwas ändert, dann muß man auch in der Implementierung was ändern (2 Stellen). Eclipse weisst einen drauf hin, aber ich hatte eine Stelle, an der ein Interface definitiv übertrieben war. Es gibt eben keine einfachen Wahrheiten.


 
Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: regedit am 05.01.06 - 23:36:04
Also, falls die ganze Sache scheitern sollte, hoffe ich, dass Ihr trotzdem weiter daran arbeiten werdet. Ich brauche zwar kein Blackberry, finde aber toll, was Ihr auf die Beine gestellt habt. Leider konnte ich dem ganzen nur passiv folgen, da mir dies bezüglich einfach das KnowHow fehlt, aber ich muß schon sagen, dass ich ganz schön Bauklötze gestaunt habe   :o
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 06.01.06 - 07:32:25
Zitat
wenn der Client noch ein paar Tage am Laufen bleibt.

die Datenbank ist eigentlich immer online ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 06.01.06 - 12:53:21
Läuft auch CORBA bei dir? Naja, wahrscheinlich komme ich hier eh nicht durch die Firewall. Ansonsten hast du ja sicher mein Selbstgespräch im Java-Bereich http://atnotes.de/index.php?topic=28027.0 mitverfolgt ^-^
Falls ich den RCP noch etwas hübscher mache werde ich ihn mal komplett posten...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 06.01.06 - 17:43:38
Zitat
Läuft auch CORBA bei dir?

Nein

Zitat
Ansonsten hast du ja sicher mein Selbstgespräch im Java-Bereich http://atnotes.de/index.php?topic=28027.0 mitverfolgt Azn
Falls ich den RCP noch etwas hübscher mache werde ich ihn mal komplett posten...

Das Ergebnis sieht doch schon ganz nett aus ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 06.01.06 - 19:18:00
Habe RIM gerade noch einmal aufgefordert, ein feedback abzugeben...

eigentlich sollte ja unter Berücksichtigung der Zeitverschiebung eine Antwort innerhalb der nächsten 30 min. erfolgen können.

To be honest; I'm pissed
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 06.01.06 - 19:28:03
Kaum fragt man 100x nach, kommt auch schon eine Antwort (das sollte isch mir mal bei uns in der Firma erlauben )

Zitat
Ulrich,

You will hear back from me today on this. 

Thanks,
Jon
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 07.01.06 - 07:25:08
Hier nun das Feedback:

Zitat
Ulrich, so far so good.   I was able to load the lss into a web service just fine.   The web service imported into a MDS Studio project without problems.   The final stage is to test the functionality through the service from our MDS connection service.   Unfortunately, the service appears to be down in our lab right now.   I have our admin looking at the problem but this may not be working again until Monday.   Once up, I will complete the tests and get back to you with the results.   I am suspecting that the services will be consumed by the client without problems.
 
Have a good weekend and you will hear from me by Monday or sooner.    Thanks again for your work on this project.    Assuming this all comes together on time, it will be a great showcase of your application and our platform capabilities.
 
BTW, how much effort was put into coding the scripts so far?
 
 
Regards,
Jon
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 07.01.06 - 09:49:51
Der (unfertige und nur teilweise funktionsfähige) Source code des Clients kann wie folgt bezogen werden:
ftp://5.15.40.146/
Das ist meine Hamachi-Adresse.
Hamachi ist eine Art P2P Lösung.
http://hamachi.cc/screenshots
Die Installation ist sehr einfach und ich halte das für sicher (v.a. wenn man keinen eigenen ftp Server betreibt :-) )

Vielleicht funktioniert das ftp auch für nicht hamachi-verbundene. Halte ich aber für unwahrscheinlich.
Dies sind 2 Eclipse Projekte, die in Eclipse WTP Platform importiert werden können. (Import Funktion von Eclipse WTP im File-Menü).
Das andere Projekt djl-examples sind die Beispiele des Buchs von Scott Delap. Ich hab in meinem Projekt (help_ws_swing) die Libs daraus referenziert. Diese gewisse Schlamperei werde ich beim nächsten update bereinigen.
Zur Zeit funktioniert noch nicht soviel. Einfach mal die Klasse im test-Sourcefolder des Projekts starten. Über den Source code sollte auch für nicht-JUnit-Interessierte klar werden wie man mit dem business-Layer kommunizieren kann.

Updates des Source codes werde ich mit Timestamp im Filenamen des zips kennzeichnen.

Der FTP Server kann möglicherweise vom Netz sein. Bei Problemen mir bitte eine private Nachricht hinterlassen.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 07.01.06 - 17:43:27
Jonathan  hat mir gerade noch  geschrieben, daß ich auf jeden Fall vor der LS noch screenshots bekomme, wo gezeigt wird, wie der BB auf HELP zugreift.

Wie Axel ja schon erwähnt hat, sind die Services und dort die verwendeten Objekte nicht das Gelbe vom Ei. Da ist viel redundantes Gedönse drin.

So wie sie jetzt sind, scheinen die RIM Leute da was draus machen zu können ...

Trotzdem werde ich den ganzen Kram noch einmal from scratch neu aufbauen.

Da wird es dann kein TicketDetail oder ToDoDetail mehr geben, sondern einfach nur ein Objekt Ticket bzw. ToDo ( und Mail )

Die Tickets, ToDo und Mails können dann in einer entsprechenden Collection auftauchen.

So wird dann z.B. beim CreateTicket das Objekt Ticket verwendet und die Nicht-Pflicht-Properties halt serverseitig entsprechend vorbesetzt.

Ob RPC/lit oder DOC/lit; da muss ich ehrlich gestehen, da weiß ich nicht, wie das auf Consumerseite aussieht, auf Seiten des Producers sehe ich da irgendwie nicht so den grossen Unterschied.
Aber wie gesagt, das habe ich noch nicht durchblickt.

Würde mich freuen, wenn Axel und Mark auch weiterhin dabei bleiben und auch noch ein paar Leute mehr dazukommen ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 07.01.06 - 21:13:56
WAIT.
Vorschlag: Hol dir auf jedenfall die Meinungen der Clients an, bevor du das umstellst.
Ich hab jetzt nämlich festgestellt, dass es gute Argumente für TicketDetails gibt  ;)
Es ist der häufigste und zugleich einer der schlimmsten Fehler beim Design von Objekt-Modellen, dass man sich von irgendwelchen abstrakten Prinzipien (Redundanz) leiten läßt und glaubt gute Objekt-Modelle würden irgendeine "natürliche" Realität abbilden. Objektmodelle haben eine Funktion in der Anwendung. Das ist das wichtige.

Die Redundanz erzeugt keine besonders hohen Kosten im Client. Es hilft aber die Netzwerklatenz für das Pullen der Tickets geringer zu machen. UND DAS IST EIN WICHTIGER PUNKT, um den Service performant zu halten.
Mein Dream-Request wäre ja immer noch:
gib-mir-alle-Requests-die-seit-diesem-timestamp-geändert-wurden. Man zeigt die Tickets zunächst einmal in einer Übersicht an (Baumstruktur, Navigator, Outline). Für diese Baumdarstellung braucht man bestimmte Informationen nicht. Die braucht man nur, wenn man sich das Ticket tatsächlich ansehen will. Und dies dürfte die Minderheit der Tickets sein. Diese selten angeforderten Zusatzinfos sind in TicketDetails. So dumm ist das gar nicht.
Man muß dann wirklich von den konkreten Anwendungsfällen ausgehen und auch Performanz-Gesichtspunkte schon mit in die Evaluierung einbeziehen. Poste heute abend vermutlich noch eine GUI pre-alpha preview. Optisch ist es schon recht weit gediehen. Es liegen eine Menge Einzelteile rum. Die müssen nur noch konkret verbunden werden (und das ist nicht einfach). Manche komplexen Einzelteile sind auch noch höchst unvollständig.

Gruß Axel


Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 07.01.06 - 23:36:35
Ich habs Ulrich schon als PM geschickt, aber hier nochmal:
Hab jetzt auf sourceforge-net einen projekt request für den Swing Client gestellt. Dies wird irgendwann nächste Woche bearbeitet, d.h. abgelehnt oder genehmigt.

Ich bin damit vielleicht einer der ersten der 100.000 an openSource Java Entwicklern, die most happily openSource Code für die Plattform, which is "best" in security, reliability, managability, scalability and flexibility zur Verfügung stellt. Denn wie wir alle wissen:
Zitat
I know a lot of people who work day by day with different collaboration tools (in ex. MSFT products), but only Notes flexibility give them needed satisfaction.
haha. Es fühlt sich gut an, der erste von 100.000 zu sein.
(kleiner Scherz, nicht böse gemeint).

Ansonsten probiere ich weiter mit Hamachi. Ulrich Krause und ich sind uns nicht sicher wie sicher das wirklich ist. CHECKT AUF JEDEN FALL, DASS IHR KEINE FREIGEGEBENEN ORDNER AUF EUREM RECHNER HABT, wenn ihr euch bei hamachi einklingt (ausser natürlich ihr stellt die extra für hamachi zur Verfügung.
Ihr müßt euch bei hamachi zu einem Netwerk verbinden. Wird nach der Installation erklärt.
Name: atnotes
Kennwort: kennwort.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 08.01.06 - 12:58:36
Ulrich und ich haben heute morgen festgestellt, dass das importieren des zip Files im download (über hamachi, s.o.) in eine eigene Eclipse-WTP Umgebung nicht so ganz einfach ist.
Im Download befindet sich jetzt ein gezipptes Word how_to_etc....zip, das dies erklärt. UND eine Datei .classpath, die in dem im Worddokument beschriebenen Prozess benutzt werden muß.
Hamachi läuft. Wer nicht weiss, wie er Zugriff auf die downloads bekommen soll, bitte eine private Nachricht an mich.
Ich hoffe mit dem guide klappt das jetzt bei Ulrich.
Um den guide zu verstehen, muß man Eclipse WTP installiert haben und wissen was ein Eclipse Workspace ist sowie sich ein bischen mit den Eclipse Perspectives auskennen.

Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 09.01.06 - 19:03:38
@Axel:

Danke für die Anleitung; damit habe ich es geschafft, den Client zu installieren. Der Code sieht recht gut strukturiert aus, auch wenn ich noch nicht alles verstehe ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 09.01.06 - 20:03:03
Zitat
Zitat
Ulrich, so far so good.   I was able to load the lss into a web service just fine.   The web service imported into a MDS Studio project without problems.   The final stage is to test the functionality through the service from our MDS connection service.   Unfortunately, the service appears to be down in our lab right now.   I have our admin looking at the problem but this may not be working again until Monday.   Once up, I will complete the tests and get back to you with the results.   I am suspecting that the services will be consumed by the client without problems.
 
Have a good weekend and you will hear from me by Monday or sooner.    Thanks again for your work on this project.    Assuming this all comes together on time, it will be a great showcase of your application and our platform capabilities.
 
BTW, how much effort was put into coding the scripts so far?
 
 
Regards,
Jon

noch keine Antwort; Montag ist fast vorbei, und ich komme mir blöd dabei vor, noch einmal nachzufragen ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 10.01.06 - 05:14:53
Next steps

Zitat
Nothing gets by you.   We have been working on our domino and BES servers today.     We have success!!     I was able to successfully run most of the services through our BlackBerry runtime connecting to your web services!    Create Ticket, Request by number, request by user, etc.    We will need to adjust the services some to allow for more data to be returned when appropriate.    Next steps:
 
1.   I will send along some screen shots and descriptions so you can visualize the application and process.
2.   Tomorrow I will be speaking with the rest of the team on next steps.    There are a few options for building out the clients:
            1)   Our team builds out the front end using our MDS 4.1 Studio IDE application and your team tweaks the backend web service
            2)   Our team builds front end and takes care of back end tweaks
            3)   Your team takes full ownership and  learns the Studio product and builds out front end
 
If you all are up for the challenge and would like to work on the BlackBerry client side (drag and drop plus very lightweight javascripting), we will support your setup, training and configuration.   
 
Let me know.
 
Cheers,
Jon

ich habe option 1) gewählt ...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 10.01.06 - 07:26:39
Ist nicht meine Entscheidung, aber ich verstehs nicht.
1. Sind die Backendservices vom reinen Coding her nicht so viel Arbeit.
2. Kann man von der ihren Meinung sicher was lernen.
3. Wenn der ihre Vorstellungen seltsam sind, kann man immer noch einen weiteren Webservice bauen help_blackberry.wsdl . help_theRealThing.wsdl.
4. Ist für eine Helpdeskanwendung Blackberry ein absolut sinnvoller Client. HELP würde durch dieses Feature imho gewinnen.
5. Er will die ownership dir und Thomas übertragen (nicht so wichtig, aber ok).
6. Ein bischen Blackberry lernen ist sicher auch nicht das dümmste.
7. Der Umfang ist überschaubar.

Ich hab für die nächsten 2.8 Tage keine Zeit. Das gilt auch für den Client. Donnerstag könnte ruhig werden. Freitag auch. Samstag, Sonntag sowieso. Es sei denn es gibt ein wirkliches Problem in einen der Projekte, an denen ich mitarbeite. Die Risiken sind aber eher gering.

Problem ist die Kürze der Zeit bis zur Lotussphere.
Ich wäre für 2) für jede Form der Mitarbeit bereit. Wenn kein anderer das macht, würd ichs auf dieser Seite alleine machen.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Thomas Schulte am 10.01.06 - 07:32:12
Ich sehe das genauso wie Axel. Sinnvoll wäre auf jeden Fall Option1 oder 3 wenn wir was über die Schwarzbeere lernen wollen.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 10.01.06 - 07:34:38
Ich habe gerade ein paar screenshots bekommen, die zeigen, wie der Service für den BB aufbereitet wird und daraus eine application gestrickt wird. Das sieht alles gar nicht soo wild aus.
Allerdings ist die nächste Woche bei mir dermaßen zugeknallt mit Terminen, daß ich mich ein wenig scheue, die komplette Infrastruktur aufzubauen und mich in den MDS Designer einzuarbeiten.
Die Services noch ein wenig an die BB Erfordernisse anzupassen, darin sehe ich kein Problem. das kann ich abends oder vor dem Frühstück erledigen.
Deshalb die Entscheidung für Option 1).

Sollte das auf der LS erfolgreich über die Bühne gehen und RIM uns eine entsprechende Infrastruktur zur Verfügung stellen, werde ich mich auch tiefer mit der Erstellung von BB Applikationen beschäftigen.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 10.01.06 - 07:46:07
ich hatte mir letzte Woche bereits mal das RIM SDK 4.1 runtergeladen (in der Hoffnung, etwas Eclipse-ähnliches zu entdecken) aber leider ist das ganze auf einer anderen IDE aufgebaut. Funzt sicher alles ähnlich, aber da konnte ich mich auch nicht so schnell zurechtfinden als dass ich da mal eben ein Frontend stricken könnte. Außerdem ist die ruhige Zeit jetzt leider vorbei...
Aber wenn das Projekt hier auch nach der LS weiterverfolgt wird bleibe ich auf jeden Fall am Ball, es gibt ja auch für Eclipse eine MicroEdition IDE vielleicht kann man die auch für RIM nehmen. Außderdem werden in Zukunft sicher mehr Leute mit Handhelds auf Notes-DBs zugreifen wollen...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 10.01.06 - 07:51:52
die Oberfläche des MDS Studios sieht eigentlich recht intuitiv aus. Hat ein bisschen was von Visual Basic...

Ach ja, im letzten Podcast (http://takingnotes.openntf.org/blogs/takingnotes.nsf/dx/taking-notes-episode-9-01.08.06-large-scale-notes-deployments-with-bill-buchan.htm) von Taking Notes wurde das Projekt auch erwähnt ( 38. Minute )  :D
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 10.01.06 - 07:53:40
@Axel:

Danke für die Anleitung; damit habe ich es geschafft, den Client zu installieren. Der Code sieht recht gut strukturiert aus, auch wenn ich noch nicht alles verstehe ...

Das Design des Clients ist darauf ausgerichtet, auch in größeren Anwendungen nicht den Überblick zu verlieren. Das macht dies für diese kleine Anwendung auf den ersten Blick unübersichtlicher. Ich hole mir die Anregungen wie gesagt aus einem hochgelobten, kürzlich erschienenen Buch. Da ich mit Swing selbst nicht so wahnsinnig viel Erfahrung habe, ist es auch für mich nicht einfach.   
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 10.01.06 - 07:57:19
das MDS Studio habe ich nicht, sondern das Java Development Kit inkl. Simulatoren für Mailserver, Enterprise Server und Devices. Das MDS Studio scheint geringere Kompetenz zu verlangen (nur Skriptsprache) aber kostet dafür...
Bei Lotus Workplace soll es doch auch einen Entwicklungsaclient geben, wo die Programmierer dann nur die Events per JavaScript programmieren, damit nicht jeder Java nutzen muss. So machen die es wohl auch...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 10.01.06 - 08:01:37
Mark hat per Email gemeldet, dass meine Java-Eclipse Client Klassen nicht hinter einer authentifizierenden Firmen-Firewall funktionieren.
Die Webservices Klassen (package *.ws) werden ja von WTP 1.0 aus dem .wsdl generiert. Ich hab bisher noch nicht rausgefunden, wo man da was für Firewall einstellen kann.
Die generierten Klassen verwenden wiederum jakarta axis 1.0 als Webservice Libraries. Da muss es auf jeden Fall etwas für geben. Zur Not schreibt man also in die generierten Klassen. Eclipse hat btw. verschiedene newsgroups, die man sich in den Newsreader laden kann. Muß aber jetzt den Zug erreichen.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 10.01.06 - 08:14:25
leider komme ich mit dem Webserivce und Firewall momentan nicht weiter, da der Wizard in meinem WTP 1.0 zur Generierung eines Webservice Clients nicht läuft. Ich kann keinen Client Proxy Type wählen (die Liste ist leer), daher läuft der Wizard nicht weiter. Sonst würde der Wizard sicher meinen eingestellten Proxy zur Überwindung der Firewall mit einbauen...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 10.01.06 - 12:16:51
Versuch mal Install Webservice Client on Server wegzuklicken.
Hat er im Screen davor die wsdl genommen?
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 10.01.06 - 13:25:42
vielleicht muss ich vorher Tomcat installieren?? Ich probier das mal
Gut zu wissen. Man muss TomCat lokal installiert haben, um den Wizard zu nutzen (und um dort die Nutzung des lokalen TomCats abzuwählen)
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 10.01.06 - 14:47:47
vielleicht muss ich vorher Tomcat installieren?? Ich probier das mal
Gut zu wissen. Man muss TomCat lokal installiert haben, um den Wizard zu nutzen (und um dort die Nutzung des lokalen TomCats abzuwählen)
Das hab ich auch mal geglaubt, mittlerweile nicht mehr. Bin mir aber nicht sicher.

Bzgl. dieser Firewall Geschichte scheinen die WTP Leute grob fahrlässig zu sein.
http://dev.eclipse.org/newslists/news.eclipse.webtools/msg01573.html
(inklusive Follow ups). Es scheint wirklich keine Lösung zu existieren.
Werd da mal in der newsgroup nachbohren, wohne aber bis morgen im Hotel in einer Pension und hab keinen Zugriff auf den Newsreader. Du kannst dich bei Eclipse.org für den newsserver anmelden. Ist nur fraglich, ob das in deinem Firmennetzwerk geht.

Hier wird gesagt, dass es hinter einem authentifizierenden Proxy funktioniert (nix anderes als was wir hier als firewall bezeichnen)->
http://dev.eclipse.org/newslists/news.eclipse.webtools/msg06111.html

oder:
Zitat
Abhijit,
in case you have not tried it yet, the Internet Preferences page (Window ->
Preferences -> Internet) may be of help. You can use this preference page to
configure the Eclipse JRE to tunnel thru an HTTP proxy firewall.

Cheers - CB.

Gruß Axel

Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 10.01.06 - 16:02:53
bin momentan dabei, meinen RCP von CORBA auf WebService umzustellen mit dem WsTicketProxy, ist ganz schön hakelig. Nun bin ich aber wieder beim Firewall-Problem hängengeblieben.
Komisch dass der WebService-Explorer einwandfrei die eingestellte Firewall aus den Preferences von Eclipse akzeptiert, ich dies aber nicht dem generierten Webservice Client mitteilen kann ;-(
Ich werd mal eine News Links verfolgen...
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 10.01.06 - 16:30:48
verdammte schxxxe, es geht!

Des Rätsels Lösung war wie immer einfach, wenn man sie kennt:

http://wiki.apache.org/ws/FrontPage/Axis/AxisProxy

Ich habe meinen Proxy nun explizit gesetzt, und zwar hier (ist sicher noch nicht der ideale Ort dafür)

Code
public DominoSoapBindingStub(java.net.URL endpointURL,
			javax.xml.rpc.Service service) throws org.apache.axis.AxisFault {

		this(service);
		super.cachedEndpoint = endpointURL;
		// manual proxy
		System.setProperty("http.proxyHost", "meinproxy.server");
		System.setProperty("http.proxyPort", "1234");
		// end proxy
	}

Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 10.01.06 - 16:44:12
so, nun klappen auch die Details. Habe die TreeNodes erweitert um TicketNode und TicketCollectionNode...

Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 10.01.06 - 17:29:09
verdammte schxxxe, es geht!

Des Rätsels Lösung war wie immer einfach, wenn man sie kennt:

Ich habe meinen Proxy nun explizit gesetzt, und zwar hier (ist sicher noch nicht der ideale Ort dafür)

Ich find das ziemlich ehrlichgesagt ziemlich bescheiden, dass man es offensichtlich nicht im Wizzard von Eclipse RTP 1.0 setzen kann. Grundsätzlichkeiten wie authentifizierende Proxies sollten wirklich berücksichtigt werden. Ort? Vermutlich die Daten in eine .properties-Datei in das Projekt tun?

Ansonsten sieht das sehr gut aus was du machst. V.a. auch schnell.
Gruß Axel 
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 10.01.06 - 17:45:10
hier noch eine neue Nachricht von Jon:

Zitat
Ulrich, update from our team meeting.    We are going to use the Help app in at least two of our hands-on training sessions at Lotusphere on Sunday and Monday.   We have another presentation session on Wed where it may get highlighted.   We have several booths on the showcase floor that will be demoing apps, and the App may make the these booth pods as well.   I will give you materials from the training sessions, including the training guide and MDS Studio project files, that you can throw up on openntf if you like.

@Mark: schöne Arbeit !
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 11.01.06 - 09:58:08
so ich bin erstmal durch damit. Falls irgendwo tiefergehendes Interesse hieran besteht sagt mir einfach Bescheid, dann würde ich noch weiter in den RCP-Dschungel vordringen.
Das Prinzip ist verstanden, die Integration eines beliebigen WebService in einen Eclipse RCP gezeigt. Angehängt noch ein Bild vom letzten Stand und der Sourcecode (den kann man nicht so ohne weiteres nutzen aber wer schon mal ein RCP erstellt hat (siehe Demos in Eclipse) der sieht auf Anhieb was wohin gehört.)
 Der Export als Produkt geht eigentlich automatisch per Wizard aber wie immer gibt es irgendwelche doppelten Pfadeinträge (von Axis) bei mir. Wenn ich das dann rausnehme dann findet er die Axis-Klassen gar nicht mehr usw. Die Wizards in Eclipse sind also recht gut, aber sobald etwas nicht läuft muss man doch wissen wie die Technik hinter der Fassade läuft (wildes Manipulieren von .properties, .product, plugin.xml etc)
In meiner Demo werden nur die Calls dargestellt. Das Erstellen von Calls ist aber sehr einfach zu integrieren, einfach eine neue View mit ein paar Feldern drauf und ein Knopf der CREATETICKET() vom WebserviceProxy aufruft.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 11.01.06 - 10:07:03
per Wizard aber wie immer gibt es irgendwelche doppelten Pfadeinträge (von Axis) bei mir.
Die entsprechenden jars in das lib Verzeichnis des Projekts kopieren und in der Konfiguration des Projekts die Libs von da ziehen. Zur Zeit wird bei den axis - libs auf Libraries innerhalb des plug-in Verzeichnisses von WTP 1.0 verwiesen (guck dir .classpath an. Dann wird das klar).

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 11.01.06 - 10:12:40
ok, habs gefunden. Das Plugin zieht sich seine benötigten Klassen bereits und ich hatte sie im Projekt noch einmal manuell hinzugefügt. Das Produkt ist 12MB gross und allein lauffähig. Hier habt ihr noch einmal das Plugin, das könnt ihr einfach in das Eclipse-Verzeichnis entpacken (und mit -clean Eclipse neu starten), dann sollte das klappen.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 11.01.06 - 16:47:20
Habe mir gerade das MDS Studion von RIM installiert. Dann den Service über den Wizard importiert; den Simulator gestartet und .....

funktioniert  :D

( Anm. es muss ein Webserver installiert sein, sonst funzt der Simulator nicht )

Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 11.01.06 - 22:33:09
Ich bin daran auch beteiligt, aber wir sollten vielleicht den Thread trennen in mehrere Teile
Vorschlag:
a) Webservices allgemein
b) Webservices in Eclipse
c) Design des serverseitigen Webservices (hier ist noch eine Menge Modellarbeit, irgendwann, wenn wir das ernst nehmen).
d) Programmierung des serverseitigen Webservices
d) Toolkit für Blackberry
e) Swing Client: Rätseln über Scottie Delap
f) RCP Client
g) Servlet/JSP Implementierung des Clients (Zukunft)
h) JMS Implementierung des Clients (Zukunft)
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Mark³ am 12.01.06 - 07:54:51
@Ulrich: Das hört sich ja einfach an  :D
Welchen Service hast du importiert? Ein Programm von RIM welches dein WSDL verarbeitet? Oder generiert MDS Studio automatisch eine Minimal-Gui aus der WSDL?
MDS Studio ist doch kostenpflichtig, oder?
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 12.01.06 - 07:59:29
Zitat
MDS Studio ist doch kostenpflichtig, oder?
Du kannst dir eine Einzelplatzversion + Lizenzschlüssel kostenlos bei RIM runterladen.

Beim Anlegen eines neuen Projekts trägst du dann die bekannte URI ein ... That's all.
Den Rest erledigt das Programm.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: Christopher am 12.01.06 - 08:09:12
Und wenn das ganze noch auf einem Poket PC funktionieren würde und nicht nur BB das wäre das ein echter Hammer.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: eknori am 12.01.06 - 08:15:28
Habe ich mich gestern mit Thomas schon drüber unterhalten. Dürfte aber mit dem SWING Client von Axel oder dem RPC Client von Mark machbar sein.

Titel: Re: Help Application demo at Lotusphere
Beitrag von: Christopher am 12.01.06 - 08:19:30
Ja das wäre echt schon ein Hammer wenn das noch geht. Ich würde mich dann als Testnutzer betätigen. Habe einen MDA 3 WM 2003 bei uns haben viele aber auch eine MDA Prob mit WM 5 damit könnte es man dann auch testen.
Titel: Re: Help Application demo at Lotusphere
Beitrag von: flaite am 12.01.06 - 12:25:15
Habe ich mich gestern mit Thomas schon drüber unterhalten. Dürfte aber mit dem SWING Client von Axel oder dem RPC Client von Mark machbar sein.
Leider so nicht. Pocket PC unterstützt nicht das vollständige Java 2 Standard Edition (J2SE). Man müßte den Client dann nochmal neu mit einer speziellen Java MObile Version programmieren:
http://www.comp.lancs.ac.uk/computing/users/fittond/ppcjava.html
Ich würds mit Sun Personal Java oder mit SuperWaba versuchen.
Wir können das machen, sobald wir ein bischen Routine in die Geschichte bekommen haben.
Mark hat ins Java Net Forum Links für das arbeiten mit Mobile Java in Eclipse gepostet.

Gruß Axel
Titel: Re: Help Application demo at Lotusphere
Beitrag von: m3 am 03.02.06 - 15:58:43
Taking Notes Episode 9: Large-Scale Notes Deployments with Bill Buchan (http://takingnotes.openntf.org/blogs/takingnotes.nsf/dx/taking-notes-episode-9-01.08.06-large-scale-notes-deployments-with-bill-buchan.htm)

!!Help!!, eknori und Axel werden bei ~ Minute 33:30 genannt. ;)