1 | package org.greenstone.admin.guiext;
|
---|
2 |
|
---|
3 | import org.w3c.dom.Element;
|
---|
4 |
|
---|
5 | import org.greenstone.admin.GAI;
|
---|
6 |
|
---|
7 | import java.util.Properties;
|
---|
8 | import java.util.ArrayList;
|
---|
9 |
|
---|
10 | import javax.swing.JButton;
|
---|
11 |
|
---|
12 | import java.io.File;
|
---|
13 | import java.io.FileInputStream;
|
---|
14 | import java.io.FileOutputStream;
|
---|
15 |
|
---|
16 | public 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 | File extDir = new File(currentExtension.getExtensionDirectory());
|
---|
208 | if(!extDir.exists()){
|
---|
209 | rollbackTo("");
|
---|
210 | }
|
---|
211 |
|
---|
212 | for(int i = 0; i < _steps.size(); i++){
|
---|
213 | Step currentStep = (Step)_steps.get(i);
|
---|
214 | JButton currentButton = currentStep.getButton();
|
---|
215 |
|
---|
216 | //If this step button depends on another button then disabled it
|
---|
217 | String dependsOn = currentStep.getDependsOn();
|
---|
218 | if(dependsOn.equals("")){
|
---|
219 | currentButton.setEnabled(true);
|
---|
220 | }
|
---|
221 | else{
|
---|
222 | String[] dependsList = dependsOn.split(",");
|
---|
223 | boolean enable = true;
|
---|
224 | for(int j = 0; j < dependsList.length; j++){
|
---|
225 | String propertyName = fileStem + "." + dependsList[j];
|
---|
226 |
|
---|
227 | if(_dependencies.getProperty(propertyName) == null || _dependencies.getProperty(propertyName).equals("false")){
|
---|
228 | enable = false;
|
---|
229 | }
|
---|
230 | }
|
---|
231 | currentButton.setEnabled(enable);
|
---|
232 | }
|
---|
233 | }
|
---|
234 | }
|
---|
235 | } |
---|