source: main/trunk/greenstone3/src/java/org/greenstone/admin/guiext/SequenceList.java@ 21989

Last change on this file since 21989 was 21919, checked in by sjm84, 14 years ago

New code for GAI extension manager

File size: 6.0 KB
Line 
1package org.greenstone.admin.guiext;
2
3import org.w3c.dom.Element;
4
5import org.greenstone.admin.GAI;
6
7import java.util.Properties;
8import java.util.ArrayList;
9
10import javax.swing.JButton;
11
12import java.io.File;
13import java.io.FileInputStream;
14import java.io.FileOutputStream;
15
16public class SequenceList
17{
18 protected ArrayList _steps = new ArrayList();
19 protected ExtensionInformation _parent = null;
20 protected Properties _dependencies = null;
21
22 public SequenceList(Element sequenceElement, ExtensionInformation parent)
23 {
24 _parent = parent;
25
26 loadExtensionStatesFromFile();
27
28 if(sequenceElement != null){
29 Element[] stepElements = ExtXMLHelper.getMultipleChildElements(sequenceElement, ExtXMLHelper.STEP, true);
30 if(stepElements == null || stepElements.length == 0){
31 System.err.println("This <" + ExtXMLHelper.SEQUENCE_LIST + "> element does not have any valid <" + ExtXMLHelper.STEP + "> elements");
32 }
33 else{
34 for(int i = 0; i < stepElements.length; i++){
35 Element currentStep = stepElements[i];
36 String action = currentStep.getAttribute("action");
37
38 if(i == 0 && !action.equals("download")){
39 _steps.add(new DownloadStep(this));
40 }
41
42 if(action.equals("download")){
43 _steps.add(new DownloadStep(currentStep, this));
44 }
45 else if(action.equals("properties")){
46 _steps.add(new PropertiesStep(currentStep, this));
47 }
48 else if(action.equals("button")){
49 _steps.add(new CommandStep(currentStep, this));
50 }
51 else if(action.equals("panel")){
52 _steps.add(new PanelStep(currentStep, this));
53 }
54 else if(action.equals("remove")){
55 _steps.add(new RemoveStep(currentStep, this));
56 }
57 else{
58 System.err.println("\"" + action + "\" is not a valid action attribute for <" + ExtXMLHelper.STEP + "> elements (valid options are \"download\", \"properties\", \"panel\", \"button\") or \"remove\"");
59 }
60
61 if((i == stepElements.length-1) && !action.equals("remove")){
62 _steps.add(new RemoveStep((DownloadStep)_steps.get(0), this));
63 }
64 }
65 }
66 }
67 else{
68 System.err.println("This <" + ExtXMLHelper.SEQUENCE_LIST + "> element is null");
69 }
70 }
71
72 public ExtensionInformation getParent()
73 {
74 return _parent;
75 }
76
77 public Step[] getSteps()
78 {
79 return (Step[])(_steps.toArray(new Step[0]));
80 }
81
82 public JButton[] getButtons()
83 {
84 if(_steps == null){
85 System.err.println("Cannot get buttons for this sequence list as it has no steps");
86 return null;
87 }
88
89 JButton[] buttons = new JButton[_steps.size()];
90 for(int i = 0; i < _steps.size(); i++){
91 buttons[i] = ((Step)_steps.get(i)).getButton();
92 }
93
94 return buttons;
95 }
96
97 private void loadExtensionStatesFromFile()
98 {
99 if(_dependencies == null){
100 _dependencies = new Properties();
101 }
102
103 String fileName = GAI.getGSDL3ExtensionHome() + System.getProperty("file.separator") + "extensionStates.properties";
104 try{
105 File stateFile = new File(fileName);
106
107 if(stateFile.exists()){
108 _dependencies.load(new FileInputStream(new File(fileName)));
109 }
110 }
111 catch(Exception ex){
112 ex.printStackTrace();
113 }
114 }
115
116 private void saveExtensionStatesToFile()
117 {
118 String fileName = GAI.getGSDL3ExtensionHome() + System.getProperty("file.separator") + "extensionStates.properties";
119 try{
120 _dependencies.store(new FileOutputStream(new File(fileName)), null);
121 }
122 catch(Exception ex){
123 ex.printStackTrace();
124 }
125 }
126
127 public boolean addDependency(String id)
128 {
129 if(_dependencies != null){
130 _dependencies.setProperty(_parent.getFileStem() + "." + id, "true");
131 saveExtensionStatesToFile();
132 return true;
133 }
134 else{
135 System.err.println("Cannot add dependency as it has not yet been loaded");
136 return false;
137 }
138 }
139
140 public void rollbackTo(String id)
141 {
142 if(_dependencies != null){
143 rollbackToRecursive(id);
144 saveExtensionStatesToFile();
145 }
146 else{
147 System.err.println("Cannot remove dependency as it has not yet been loaded");
148 }
149 }
150
151 private void rollbackToRecursive(String id)
152 {
153 Step rollbackStep = null;
154 ArrayList dependsSteps = new ArrayList();
155 for(int i = 0; i < _steps.size(); i++){
156 if(((Step)(_steps.get(i))).getId().equals(id)){
157 rollbackStep = (Step)_steps.get(i);
158 }
159
160 String[] depends = ((Step)_steps.get(i)).getDependsOn().split(",");
161
162 for(int j = 0; j < depends.length; j++){
163 if(depends[j].equals(id)){
164 dependsSteps.add(((Step)_steps.get(i)).getId());
165 }
166 }
167 }
168
169 _dependencies.setProperty(_parent.getFileStem() + "." + id, "false");
170
171 for(int i = 0; i < dependsSteps.size(); i++){
172 rollbackToRecursive((String)dependsSteps.get(i));
173 }
174 }
175
176 public void clearPropertySteps()
177 {
178 for(int i = 0; i < _steps.size(); i++){
179 Step currentStep = (Step)_steps.get(i);
180 if(currentStep instanceof PropertiesStep){
181 ((PropertiesStep)currentStep).setPropertiesToDefaults();
182 }
183 }
184 }
185
186 public void registerStepCompletion(Step step)
187 {
188 addDependency(step.getId());
189
190 if(!step.getRollbacks().equals("")){
191 String[] rollbacks = step.getRollbacks().split(",");
192 for(int k = 0; k < rollbacks.length; k++){
193 rollbackTo(rollbacks[k]);
194 }
195 }
196
197 updateButtons();
198 }
199
200 public void updateButtons()
201 {
202 loadExtensionStatesFromFile();
203
204 ExtensionInformation currentExtension = _parent;
205 String fileStem = currentExtension.getFileStem();
206
207 for(int i = 0; i < _steps.size(); i++){
208 Step currentStep = (Step)_steps.get(i);
209 JButton currentButton = currentStep.getButton();
210
211 //If this step button depends on another button then disabled it
212 String dependsOn = currentStep.getDependsOn();
213 if(dependsOn.equals("")){
214 currentButton.setEnabled(true);
215 }
216 else{
217 String[] dependsList = dependsOn.split(",");
218 boolean enable = true;
219 for(int j = 0; j < dependsList.length; j++){
220 String propertyName = fileStem + "." + dependsList[j];
221
222 if(_dependencies.getProperty(propertyName) == null || _dependencies.getProperty(propertyName).equals("false")){
223 enable = false;
224 }
225 }
226 currentButton.setEnabled(enable);
227 }
228 }
229 }
230}
Note: See TracBrowser for help on using the repository browser.