View Javadoc

1   /*
2    * Copyright (c) 2005, The K-Wf Grid Consortium
3    * Fraunhofer Institute for Computer Architecture and Software Technology
4    * See http://www.kwfgrid.eu and http://www.first.fraunhofer.de for more details.
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  	// Permission overriding methods..
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  	    /// FIXME: stop the executor!
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 }