1
2
3
4
5
6 package net.kwfgrid.gwui.applet;
7
8 import net.kwfgrid.gwui.InvisibleWorkflowGroup;
9 import net.kwfgrid.gwui.WorkflowGroup;
10 import net.kwfgrid.gwui.GWUI;
11 import net.kwfgrid.gwui.SingleClientWorkflowInstanceManager;
12 import net.kwfgrid.gworkflowdl.protocol.client.ClientWorkflow;
13
14 import org.glassbox.gui.*;
15 import org.glassbox.executor.Executor;
16 import org.glassbox.widgets.StatusBarExecutor;
17
18 import java.security.Permission;
19 import java.applet.Applet;
20 import java.util.Hashtable;
21
22 import org.apache.log4j.Logger;
23
24 public class WorkflowAppletGroup extends InvisibleWorkflowGroup implements Member {
25 public static final String IDENTIFIER = "kwfgrid.WorkflowAppletGroup";
26
27 private static final Logger logger = Logger.getLogger(WorkflowAppletGroup.class);
28
29 final static class MySecurityManager extends SecurityManager {
30
31 public void checkPermission(Permission perm) {}
32 public void checkPermission(Permission perm, Object context) {}
33 }
34
35 static {
36 System.setSecurityManager(new MySecurityManager());
37 }
38
39 private static WorkflowAppletGroup _instance = null;
40 private static Object STATIC_LOCK = new Object();
41
42 public static WorkflowAppletGroup getInstance(final Applet applet) {
43 synchronized (STATIC_LOCK) {
44 if (_instance == null) {
45 _instance = new WorkflowAppletGroup();
46 }
47 _instance.setAppletStatus(applet, UNDEFINED);
48 return _instance;
49 }
50 }
51
52 private Executor _executor;
53 private Group _group;
54 private Hashtable _appletstatus;
55
56 private WorkflowAppletGroup() {
57 super(new SingleClientWorkflowInstanceManager());
58 _executor = null;
59 _group = null;
60 _appletstatus = new Hashtable();
61 GWUI.getInstance().addMember(this);
62 }
63
64 private void checkAppletStatus(final Applet applet) {
65 Object[] st = _appletstatus.values().toArray();
66 boolean stopclient = true;
67 for (int i=0; i<st.length; i++) {
68 if (((String)st[i]).equals(RUNNING) ||
69 ((String)st[i]).equals(INITIATED) ||
70 ((String)st[i]).equals(PAUSED) ||
71 ((String)st[i]).equals(UNDEFINED)) {
72 stopclient = false;
73 break;
74 }
75 }
76 if (stopclient) {
77 logger.debug("Stopping client and executor.");
78 ((SingleClientWorkflowInstanceManager)getWorkflowInstanceManager()).interruptClient();
79 setProperty(ACTIVE_WORKFLOW_DOCUMENT_KEY, null);
80
81 _executor = null;
82 }
83 }
84
85 public synchronized void setAppletStatus(Applet applet, String status) {
86 logger.debug("Applet "+applet.getClass()+" set status to "+status+".");
87 _appletstatus.put(applet, status);
88 checkAppletStatus(applet);
89 if (status.equals(EXITING)) {
90 logger.debug("Applet "+applet.getClass()+" exited. Removing from known applets.");
91 _appletstatus.remove(applet);
92 }
93 }
94
95 public synchronized Executor getExecutor(final Applet applet) {
96 if (_executor == null) {
97 _executor = new StatusBarExecutor(new StatusBarExecutor.StatusBar() {
98 public void showStatus(String message) {
99 applet.showStatus(message);
100 }
101 });
102 }
103
104 logger.debug("Applet "+applet.getClass()+" gets executor: " + _executor);
105
106 return _executor;
107 }
108
109 public String getIdentifier() {
110 return IDENTIFIER;
111 }
112
113 public Group getGroup() {
114 return _group;
115 }
116
117 public void setGroup(Group group) {
118 _group = group;
119 }
120
121 public void groupPropertyChanged(String name, Object oldvalue, Object newvalue) {
122 setProperty(name, newvalue);
123 }
124 }