...wirft noch beim schliessen Keine Security Exception mehr.
Schnell durchgecoded. Evtl. später neue Version.
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);
}
});
}
}
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.
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