Autor Thema: Java Gui durch Agent  (Gelesen 4012 mal)

Offline prong

  • Frischling
  • *
  • Beiträge: 22
  • I love YaBB 1G - SP1!
Java Gui durch Agent
« am: 13.11.04 - 11:02:24 »
 Moin,

ich habe da ein kleines Problem mit Java in Notes.
Angeblich versteht Notes ja Java, allerdings scheint das Verständnis nur sehr begrenzt
zu gelten.
Folgendes Problem:
Ich möchte über ein Agent einen Java Gui starten. Folgender Code funktioniert:

import lotus.domino.*;
import javax.swing.*;

public class JavaAgent extends AgentBase {

   public void NotesMain() {

      try {
         Session session = getSession();
         AgentContext agentContext = session.getAgentContext();

         JFrame frame = new JFrame("Test");
         frame.setSize(300,200);
         frame.setVisible(true);
         // (Your code goes here)

      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}

es erscheint ein Fenster.

Wenn ich das ganze aber in eine andere Klasse packe, mit einer Funktion die das
GUI aufbaut. Kommt nix, außerdem kann ich auch kein Layout setzten.
Sprich frame.getContentPane(); funktioniert nicht.

Eins ist sicher der Code  läuft im richtigen Java ohne Probleme.

Kann mir da jemand einen Tip geben?

Danke und Gruß

Marco

PS: Arbeite mit 6.5.1

Offline prong

  • Frischling
  • *
  • Beiträge: 22
  • I love YaBB 1G - SP1!
Re: Java Gui durch Agent
« Antwort #1 am: 13.11.04 - 12:36:34 »
Hat sich erledigt, haber heraus bekommen, dass Notes kein swing kann  ???
Komisch, aber was sollte man anderes erwarten...

Hat vielleicht irgendwer eine Ahnung wie ich java.swing.*;
importieren kann, oder nen Interface dafür schreiben kann

Marinero Atlántico

  • Gast
Re: Java Gui durch Agent
« Antwort #2 am: 13.11.04 - 12:48:06 »
Hat sich erledigt, haber heraus bekommen, dass Notes kein swing kann  ???

Hi.

Ich wüßte nicht, warum sollte Notes "kein Swing können sollte".  Kannst du bitte mal deinen nicht-funktionierenden code posten. Dann könnte man auch untersuchen, warum das nicht funktioniert (soweit Zeit).

Soweit ich weiss, hat Ralf hier aus dem Forum mit sowas gearbeitet (und zwar mit Swing).

Ich persönlich bin architekturmässig eher Purist. Hast du dir mal überlegt,  deine Gui einfach als Standalone Anwendung einfach in swt oder swing zu entwickeln, diese mit Java Web Start oder sonstwie zu verteilen und die dann mit http oder webservices over http mit dem Domino Server kommunizieren zu lassen?
Ich halte das für eine sauberere Lösung.
http://www-106.ibm.com/developerworks/lotus/library/opstdomino-pt3/

Du hast mit "Swing Gui in Notes Agenten" sicherlich irgendwelche echt potentiell vertrackte Threading Geschichten am Werk. Was also erstmal wie eine kompakte Lösung aussieht (Isch pack die GUI einfach in den Agenten), ist vielleicht gar nicht einfacher. 

[die folgenden Infos sind nicht richtig nachgeprüft und amateurhaft ausgedrückt, wenn ich Zeit habe schlage ich nach]
Eine Swing GUI belegt auf jeden Fall einen eigenen GUI-Thread...
Vielleicht solltest du aus dem Notes-Agenten einen eigenen GUI-Thread starten, darin die GUI laufen lassen und den Notes-Agent-Thread solange in einer Endlosschleife laufen lassen, bis der Anwender die GUI abbricht.
Vielleicht schaue ich mir das noch genauer an oder Ralf kommt vorbei.


Gruß Axel


« Letzte Änderung: 13.11.04 - 13:05:39 von Marinero Atlántico »

Offline prong

  • Frischling
  • *
  • Beiträge: 22
  • I love YaBB 1G - SP1!
Re: Java Gui durch Agent
« Antwort #3 am: 13.11.04 - 12:56:34 »
Der Code steht oben.

Vielleicht hätte ich besser schreiben sollen Notes Agents können kein Swing.

Leider macht es wenig Sinn das ganze als Standalone Anwendung zu schreiben, da
der Agent für das einlesen einer Datei zuständig sein soll. Diese soll der Nutzer über einen Dialog auswählen können und anschließend automatisch verarbeitet werden.

Gruß

Marco

Marinero Atlántico

  • Gast
Re: Java Gui durch Agent
« Antwort #4 am: 13.11.04 - 13:08:25 »
Vielleicht hätte ich besser schreiben sollen Notes Agents können kein Swing.
Das geht vermutlich schon. Ist aber nicht so einfach.
Leider macht es wenig Sinn das ganze als Standalone Anwendung zu schreiben, da
der Agent für das einlesen einer Datei zuständig sein soll. Diese soll der Nutzer über einen Dialog auswählen können und anschließend automatisch verarbeitet werden.
Warum machst du die Eingabe nicht einfach über eine Notes (oder Web Maske/geht beides) und lässt dann das File über einen Agenten weiterverarbeiten?

Offline prong

  • Frischling
  • *
  • Beiträge: 22
  • I love YaBB 1G - SP1!
Re: Java Gui durch Agent
« Antwort #5 am: 13.11.04 - 13:12:33 »
Hm, wäre auch ne Möglichkeit.
Bin aber eher der Java-Freund.

Verstehe nicht, warum Notes agents kein swing kennen, das gibt es doch schon seit Jahren.

Ich denke man kann swing importieren, indem man ein entsprechendes Interface schreib, allerdings wüßte ich nicht wie ich dieses einbinden sollte.

Gruß

Marco

Marinero Atlántico

  • Gast
Re: Java Gui durch Agent
« Antwort #6 am: 13.11.04 - 17:10:56 »
Du kannst ein Applet schreiben. Sogar ein Thread Applet (find ich aber auch nicht so gut).
Agents mit Swing zu mixen ist imho konzeptionell ein bischen problematisch, weil Agents eben eine Backend-Technologie und Swing eben Frontend. Es geht aber.

Sobald ich Zeit finde, kann ich mich mal dran versuchen.

Gruß Axel

Marinero Atlántico

  • Gast
Re: Java Gui durch Agent
« Antwort #7 am: 13.11.04 - 19:03:09 »
...wirft noch beim schliessen Keine Security Exception mehr.
Schnell durchgecoded. Evtl. später neue Version.

Code
import lotus.domino.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class JavaAgent extends AgentBase {
        // steuert Endlosschleife, die Agenten offenhält. Auf true gesetzt durch Nachricht aus GUI (killProcess())
	private boolean shouldIBeDead = false;
	
	public void NotesMain() {

		try {
			Session session = getSession();
			AgentContext agentContext = session.getAgentContext();
			
			// erzeugt einfach gui-objekt. Wieso Interface. Der Weg ist wohl besser. 
			ThisIndustrySucks.init(this);
			
			// endlosschleife, aufgehoben über call aus gui.objekt. 
			while (!shouldIBeDead) {
                                // Nächste Zeile: nur für debuggen. Auskommentieren macht alles eine Menge responsiver. 
				System.out.println("Agent thread");
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public void killProcess() {
		shouldIBeDead = true;
	}
}


class ThisIndustrySucks extends JFrame {
	
	// hält aufrufenden Agenten. 
	final JavaAgent callerAgent;
	
	private ThisIndustrySucks(JavaAgent caller) {
		// simple gui
		super("The day I learnt to love http://www.jroller.com/fate");
		callerAgent = caller;	
		Container contentPane = getContentPane();
		
		JLabel label = new JLabel ("schlecht, sehr schlecht designed");
		
		contentPane.add(label, BorderLayout.CENTER);
	}
	
	// lenkt um auf Agent
	private void killProcess() {
		callerAgent.killProcess();
	}
	
	// static initialisierer
	public static void init(JavaAgent caller) {
		
		 final ThisIndustrySucks f = new ThisIndustrySucks(caller);
		
		 f.setBounds(100, 100, 350, 250);
		 f.setVisible(true);
		 f.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		
		// closing window 
		 f.addWindowListener(new WindowAdapter() {
		 	public void windowClosed(WindowEvent e) {
		 		// versuche so den aufrufenden Agenten zu stoppen. Es funktioniert wirft aber eine SecurityException. 
		 		// Iris hat Java Agents glaub ich mit R6 auf Applet Security gesetzt. Den Grund weiss ich nicht. 
                                // vor f.killProcess() kann jetzt noch an den Agenten irgendwie zurückgesendet werden, was denn jetzt ausgewählt wurde!!
		 		f.killProcess();
				//System.exit(0);
		 		
		 	}
		 });
	}
}

« Letzte Änderung: 13.11.04 - 19:45:49 von Marinero Atlántico »

Marinero Atlántico

  • Gast
Re: Java Gui durch Agent
« Antwort #8 am: 13.11.04 - 19:37:53 »
So geht das natürlich auch. Wenn ich kein System.exit(0) in WindowClosing mache, geht auch die SecurityException weg (gilt wohl auch für oben. Muss ich nochmal probieren).
Das Problem mit diesen Ansatz ohne Endlosschleife im Agenten ist, dass der Agent sofort beendet wird und aus der GUI keine Möglichkeiten mehr bestehen, Nachrichten an den Agenten (d.h. an Notes zu senden).
Eine andere Möglichkeit wäre nun das Senden von Nachrichten aus der GUI an Domino in der GUI eine eigene HTTP Connection, WebService, RMI-Call oder was auch immer gegen Domino zu senden.
Ich würd sagen, dass HTTPConnection mit jakarta.Commons.HTTPClient am einfachsten ist.

Code
import lotus.domino.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class JavaAgent extends AgentBase {
	private boolean shouldIBeDead = false;
	
	public void NotesMain() {

		try {
			Session session = getSession();
			AgentContext agentContext = session.getAgentContext();
			sinitThread();
			// erzeugt einfach gui-objekt. Wieso Interface. Der Weg ist wohl besser. 
			ThisIndustrySucks.init(this);
			stermThread();
			/* endlosschleife, aufgehoben über call aus gui.objekt. 
			while (!shouldIBeDead) {
				System.out.println("Agent thread");
			}
			*/
			System.out.println("Agent closed");
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public void killProcess() {
		shouldIBeDead = true;
	}
}


class ThisIndustrySucks extends JFrame {
	
	// hält aufrufenden Agenten. 
	final JavaAgent callerAgent;
	
	private ThisIndustrySucks(JavaAgent caller) {
		// simple gui
		super("The day I learnt to love http://www.jroller.com/fate");
		callerAgent = caller;	
		Container contentPane = getContentPane();
		
		JLabel label = new JLabel ("schlecht, sehr schlecht designed");
		
		contentPane.add(label, BorderLayout.CENTER);
	}
	
	// lenkt um auf Agent
	private void killProcess() {
		//callerAgent.killProcess();
	}
	
	// static initialisierer
	public static void init(JavaAgent caller) {
		
		 final ThisIndustrySucks f = new ThisIndustrySucks(caller);
		
		 f.setBounds(100, 100, 350, 250);
		 f.setVisible(true);
		 f.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		
		// closing window 
		 f.addWindowListener(new WindowAdapter() {
		 	public void windowClosed(WindowEvent e) {
		 		// versuche so den aufrufenden Agenten zu stoppen. Es funktioniert wirft aber eine SecurityException. 
		 		// Iris hat Java Agents glaub ich mit R6 auf Applet Security gesetzt. Den Grund weiss ich nicht. 
		 		//f.killProcess();
				//System.exit(0);
		 		
		 	}
		 });
	}
}
Probiers einfach aus und schalte Datei\Extras\Java Debug console ein.



Gruß Axel

Marinero Atlántico

  • Gast
Re: Java Gui durch Agent
« Antwort #9 am: 14.11.04 - 07:01:00 »
Einen Notes Agenten als Swing Top Level Container zu schreiben geht wirklich nicht.
In Java gibt es keine Mehrfachvererbung und sowohl AgentBase als auch Swing Top Level Container enthalten eine Menge an wirklicher Zusatzfunktionalität, so dass man das nicht einfach über die Implementierung von Interfaces lösen könnte.


Offline prong

  • Frischling
  • *
  • Beiträge: 22
  • I love YaBB 1G - SP1!
Re: Java Gui durch Agent
« Antwort #10 am: 14.11.04 - 11:46:21 »
Hey super,

das nenne ich mal ne ausführliche Antwort.
Werde es mal probieren.

Weißt du zufällig wie ich eclipse so konfiguriere das ich dort direkt entwickeln kann.
Ich habe das Problem, dass ich keinen Zugang zum Server bekomme. Ich weiß zwar wo ich was eingeben soll, aber leider nicht in welcher Form die Server-Adresse, der User-Name und das Passwort sein muß.

Gruß

Marco

PS: Danek nochmal

Offline umi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.062
  • Geschlecht: Männlich
  • one notes to rule'em all, one notes to find'em....
    • Belsoft AG
Re: Java Gui durch Agent
« Antwort #11 am: 15.11.04 - 08:34:59 »
Es gibt doch das Domino Toolkit für Websphere, evtl. läuft das auch in Eclipse.
Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re: Java Gui durch Agent
« Antwort #12 am: 15.11.04 - 08:54:47 »
oder du folgst dem Tip von Sem
http://www.atnotes.de/index.php?topic=19360.0
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Java Gui durch Agent
« Antwort #13 am: 15.11.04 - 09:00:42 »
Wollte mich auch mal kurz dazuäussern!

1. Swing in Agents geht definitiv und wird bei uns auch produktiv eingesetzt. Das meiste dazu hat ja schon Axel geschrieben. Achtung ohne Kunstgriffe ist Swing aber erst in Notes 6 verfügbar. in Notes 5.x muss man die Datei SWINGALL.jar über JavaUserClasses einbinden.

2. Falls man in dem Javaguicode keine Zugriffe auf Notes Daten machen muß, ist es sicher besser die LS2J Methode zu verwenden. Leider hat Lotus hier aber grob gepatzt und lässt kein öffnen einer Notessession zu.

3. Wenn man in dem Agent Zugriff auf Notesdaten haben will dann muß man in dem Guithread  immer höllisch aufpassen, dass man den Thread für Notes initialisiert und wieder terminiert, da es sonst zu abstürzen kommen kann. Weiters muß unbedingt mit Recycle gearbeitet werden, da sonst bald der Speicher ausgeht.

Noch ein Problem, das bis datto nicht gelöst ist. Wenn aus dem Agent ein modaler Javadialog aufgerufen wird, kommt es ab und zu dazu, dass das Java Fenster hinter dem logischerweise nicht mehr ragierenden Client zu liegen kommt und man nur mit Alt-Tab zu der Dialogbox wechseln kann. Dies wird scheinbar in Notes 7.0 geändert, habe ich aber noch nicht getestet.

Abschliessend meine Erfahrung.

Datenbanken mit Javaguis bringen wenn richtig eingesetzt sehr großen Nutzen, da sich dort viele Sachen machen lassen, die in Standard Notes nicht möglich sind. Aber man muß sich sehr viel damit beschäftigen und Fehler im Code sind insofern sehr ärgerlich, da es meist zu Abstürzen des Notes Clients kommt. Ich entwickle daher den Code immer zuerst ausserhalb von Notes z.B. in Netbeans oder Websphere und teste in dann erst wenn alles funktioniert im Notesclient. Meine großen Hoffnungen mit LS2J ein Werkzeug in die Hand zu bekommen, dass alle größeren Probleme beseitigt, haben sich leider nicht erfüllt, da man dabei keinen Zugriff auf eine Notessession bekommt. Deshalb bin ich bei den Agents geblieben.


Grüße

Ralf

Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Marinero Atlántico

  • Gast
Re: Java Gui durch Agent
« Antwort #14 am: 16.11.04 - 16:00:12 »
@Ralf:
Ich mag an dieser Lösung, dass Notes-Security "problemlos dabei ist" (um es klar auszudrücken). Die GUI bleibt quasi "im Agenten".
Ich mag an dieser Lösung nicht, dass es immer neben diesen GUI-Thread einen nutzlosen Thread gibt, der ständig durch die Endlosschleife eiert (wie bei meinem Beispiel 1).
Beispiel 2 werde ich ein bischen weiter ausbauen. Eine Art fire-and-forget GUI aus Sicht des Agenten. Der Agent terminiert, die GUI ist da.
Der User kann dann über HTTP Infos an den Server zurückschicken. Damit hat man natürlich keine Notes-Security. Notes-Security da einzubauen ist noch einmal eine Ecke komplizierter (eine ziemlich große Ecke imho).
 
Auch mit der Eclipse Lösung in dem IBM DevWork Artikel wird einfach nur ein Zugriff beschrieben und Notes Security sowie Security überhaupt ausgeklammert.

Es gibt doch das Domino Toolkit für Websphere, evtl. läuft das auch in Eclipse.
Das ist lediglich für die Integration via Custom Tags für JSP. Das hat hiermit nichts zu tun. Es läuft sogar in Tomcat. Man könnte jetzt natürlich einen standalone Tomcat in Eclipse einbauen (könnt ich mal ausprobieren)

Also mit heterogenen Anwendungsplattformen hat man auf jeden Fall ein Thema, Security da einzubauen. J2EE hat hierfür standardisierte Lösungen und gerade bei Portal Servern ist das ein ziemlich prominentes Thema. Das heisst nicht, dass es super-trivial wäre.

Gruß Axel

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Java Gui durch Agent
« Antwort #15 am: 17.11.04 - 08:18:01 »
Hallo Axel!

Die Endlosschleife kannst du dir sparen, wenn du einen modalen Dialog verwendest, dann wartet der Agent, bis zu Beendigung des Guis.

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz