Autor Thema: Help Application demo at Lotusphere  (Gelesen 163064 mal)

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.710
  • Geschlecht: Männlich
Re: Help Application demo at Lotusphere
« Antwort #100 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 )

Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Help Application demo at Lotusphere
« Antwort #101 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]

« Letzte Änderung: 01.01.06 - 22:02:11 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Help Application demo at Lotusphere
« Antwort #102 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 <-<<
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Help Application demo at Lotusphere
« Antwort #103 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
« Letzte Änderung: 02.01.06 - 00:04:03 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Help Application demo at Lotusphere
« Antwort #104 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
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Help Application demo at Lotusphere
« Antwort #105 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.
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Help Application demo at Lotusphere
« Antwort #106 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
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.710
  • Geschlecht: Männlich
Re: Help Application demo at Lotusphere
« Antwort #107 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 ...
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.710
  • Geschlecht: Männlich
Re: Help Application demo at Lotusphere
« Antwort #108 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.
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Help Application demo at Lotusphere
« Antwort #109 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...
sagt Mark.



slowfood.de

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.710
  • Geschlecht: Männlich
Re: Help Application demo at Lotusphere
« Antwort #110 am: 03.01.06 - 08:08:59 »
ich war gerade noch drauf, ebenfalls mit Webservices Studio.
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Help Application demo at Lotusphere
« Antwort #111 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
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Help Application demo at Lotusphere
« Antwort #112 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
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Help Application demo at Lotusphere
« Antwort #113 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...
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Help Application demo at Lotusphere
« Antwort #114 am: 03.01.06 - 09:15:58 »
Im Laufe des Tages. Hab doch noch ein paar Job-related Dinge.

Gruß Axel
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Help Application demo at Lotusphere
« Antwort #115 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
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.710
  • Geschlecht: Männlich
Re: Help Application demo at Lotusphere
« Antwort #116 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
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Help Application demo at Lotusphere
« Antwort #117 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 ... :'(
« Letzte Änderung: 03.01.06 - 19:38:32 von eknori »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.710
  • Geschlecht: Männlich
Re: Help Application demo at Lotusphere
« Antwort #118 am: 03.01.06 - 19:38:54 »
Boah ... ich glaube ich mache Feierabend; jetzt habe ich deinen Artikel editiert, statt drauf zu antworten ...  :'(
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Help Application demo at Lotusphere
« Antwort #119 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

Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz