1 package fr.ifremer.quadrige3.ui.swing.callback;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 import com.google.common.collect.Lists;
28 import com.google.common.collect.Maps;
29 import fr.ifremer.quadrige3.ui.swing.ApplicationUIContext;
30 import fr.ifremer.quadrige3.ui.swing.action.AbstractAction;
31 import fr.ifremer.quadrige3.ui.swing.model.ProgressionUIModel;
32 import org.apache.commons.logging.Log;
33 import org.apache.commons.logging.LogFactory;
34 import org.nuiton.jaxx.application.ApplicationTechnicalException;
35 import org.nuiton.jaxx.application.swing.action.ApplicationActionException;
36 import org.nuiton.updater.ApplicationInfo;
37 import org.nuiton.updater.ApplicationUpdaterCallback;
38
39 import java.util.List;
40 import java.util.Map;
41
42 import static org.nuiton.i18n.I18n.n;
43 import static org.nuiton.i18n.I18n.t;
44
45
46
47
48
49
50
51 public class DataUpdaterCallBack implements ApplicationUpdaterCallback {
52
53
54
55
56 private static final Log LOG = LogFactory.getLog(DataUpdaterCallBack.class);
57
58 public enum UpdateType {
59
60 CONFIG(n("quadrige3.update.config"));
61
62 private final String i18nKey;
63
64 UpdateType(String i18nKey) {
65 this.i18nKey = i18nKey;
66 }
67
68 public String getLabel() {
69 return t(i18nKey);
70 }
71 }
72
73 protected final ApplicationUIContext context;
74
75 protected List<UpdateType> types;
76
77 protected final ProgressionUIModel progressionModel;
78
79 protected boolean dataUpdated;
80
81 protected final AbstractAction<?, ?, ?> action;
82
83
84
85
86
87
88
89 public DataUpdaterCallBack(AbstractAction<?, ?, ?> action, ProgressionUIModel progressionModel) {
90 this.action = action;
91 this.context = action.getContext();
92 this.progressionModel = progressionModel;
93 }
94
95
96
97
98
99
100 public void setTypes(UpdateType... types) {
101 this.types = Lists.newArrayList(types);
102 }
103
104
105
106
107
108
109 public boolean isDataUpdated() {
110 return dataUpdated;
111 }
112
113
114 @Override
115 public Map<String, ApplicationInfo> updateToDo(Map<String, ApplicationInfo> appToUpdate) {
116 Map<String, ApplicationInfo> result = Maps.newHashMap();
117
118 for (UpdateType type : types) {
119 ApplicationInfo info = getInfo(type, appToUpdate);
120 if (info != null) {
121 result.put(info.name, info);
122 }
123 }
124 return result;
125 }
126
127
128 @Override
129 public void startUpdate(ApplicationInfo info) {
130 if (UpdateType.CONFIG.name().toLowerCase().equals(info.name)) {
131 progressionModel.setMessage(t("quadrige3.applicationUpdater.startUpdate.config", info.newVersion));
132 }
133 }
134
135
136 @Override
137 public void updateDone(Map<String, ApplicationInfo> appToUpdate, Map<String, Exception> appUpdateError) {
138
139 if (updateDoneConfig(appToUpdate, appUpdateError)) {
140 dataUpdated = true;
141 }
142 }
143
144
145 @Override
146 public void aborted(String propertiesURL, Exception eee) {
147 if (LOG.isErrorEnabled()) {
148 LOG.error("Could not update from " + propertiesURL, eee);
149 }
150 throw ApplicationActionException.propagateError(action, eee);
151 }
152
153
154
155
156
157
158
159
160 protected boolean updateDoneConfig(Map<String, ApplicationInfo> appToUpdate,
161 Map<String, Exception> appUpdateError) {
162 boolean doRestart = false;
163 Exception error = getError(UpdateType.CONFIG, appUpdateError);
164 if (error != null) {
165
166
167 throw ApplicationActionException.propagateError(
168 action, new ApplicationTechnicalException(t("quadrige3.applicationUpdater.config.error"), error));
169 }
170 ApplicationInfo info = getInfo(UpdateType.CONFIG, appToUpdate);
171 if (info != null) {
172
173 if (LOG.isInfoEnabled()) {
174 LOG.info(String.format(
175 "A config update was downloaded (oldVersion: %s, newVersion: %s), will process it and application will restart",
176 info.oldVersion, info.newVersion));
177 }
178 doRestart = true;
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200 }
201 return doRestart;
202 }
203
204
205
206
207
208
209
210
211 protected ApplicationInfo getInfo(UpdateType type, Map<String, ApplicationInfo> appToUpdate) {
212 return appToUpdate.get(type.name().toLowerCase());
213 }
214
215
216
217
218
219
220
221
222 protected Exception getError(UpdateType type, Map<String, Exception> appUpdateError) {
223 return appUpdateError.get(type.name().toLowerCase());
224 }
225 }