1 package fr.ifremer.quadrige2.ui.swing.common.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.base.Charsets;
28 import com.google.common.collect.Lists;
29 import com.google.common.collect.Maps;
30 import com.google.common.io.Files;
31 import fr.ifremer.quadrige2.ui.swing.common.ApplicationUIContext;
32 import fr.ifremer.quadrige2.ui.swing.common.action.AbstractAction;
33 import fr.ifremer.quadrige2.ui.swing.common.model.ProgressionModel;
34 import org.apache.commons.logging.Log;
35 import org.apache.commons.logging.LogFactory;
36 import org.nuiton.jaxx.application.ApplicationTechnicalException;
37 import org.nuiton.jaxx.application.swing.action.ApplicationActionException;
38 import org.nuiton.updater.ApplicationInfo;
39 import org.nuiton.updater.ApplicationUpdater;
40 import org.nuiton.updater.ApplicationUpdaterCallback;
41
42 import java.io.File;
43 import java.io.IOException;
44 import java.util.List;
45 import java.util.Map;
46 import java.util.Properties;
47
48 import static org.nuiton.i18n.I18n.n;
49 import static org.nuiton.i18n.I18n.t;
50
51
52
53
54
55
56
57 public class DataUpdaterCallBack implements ApplicationUpdaterCallback {
58
59
60
61
62 private static final Log LOG = LogFactory.getLog(DataUpdaterCallBack.class);
63
64 public enum UpdateType {
65
66 I18N(n("quadrige2.update.i18n")),
67 HELP(n("quadrige2.update.help")),
68 CONFIG(n("quadrige2.update.config"));
69
70 private final String i18nKey;
71
72 UpdateType(String i18nKey) {
73 this.i18nKey = i18nKey;
74 }
75
76 public String getLabel() {
77 return t(i18nKey);
78 }
79 }
80
81 protected final ApplicationUIContext context;
82
83 protected List<UpdateType> types;
84
85 protected final ProgressionModel progressionModel;
86
87 protected boolean dataUpdated;
88
89 protected final AbstractAction<?, ?, ?> action;
90
91
92
93
94
95
96
97 public DataUpdaterCallBack(AbstractAction<?, ?, ?> action, ProgressionModel progressionModel) {
98 this.action = action;
99 this.context = action.getContext();
100 this.progressionModel = progressionModel;
101 }
102
103
104
105
106
107
108 public void setTypes(UpdateType... types) {
109 this.types = Lists.newArrayList(types);
110 }
111
112
113
114
115
116
117 public boolean isDataUpdated() {
118 return dataUpdated;
119 }
120
121
122 @Override
123 public Map<String, ApplicationInfo> updateToDo(Map<String, ApplicationInfo> appToUpdate) {
124 Map<String, ApplicationInfo> result = Maps.newHashMap();
125
126 for (UpdateType type : types) {
127 ApplicationInfo info = getInfo(type, appToUpdate);
128 if (info != null) {
129 result.put(info.name, info);
130 }
131 }
132 return result;
133 }
134
135
136 @Override
137 public void startUpdate(ApplicationInfo info) {
138 if (UpdateType.I18N.name().toLowerCase().equals(info.name)) {
139 progressionModel.setMessage(t("quadrige2.applicationUpdater.startUpdate.i18n", info.newVersion));
140 }
141 if (UpdateType.HELP.name().toLowerCase().equals(info.name)) {
142 progressionModel.setMessage(t("quadrige2.applicationUpdater.startUpdate.help", info.newVersion));
143 }
144 if (UpdateType.CONFIG.name().toLowerCase().equals(info.name)) {
145 progressionModel.setMessage(t("quadrige2.applicationUpdater.startUpdate.config", info.newVersion));
146 }
147 }
148
149
150 @Override
151 public void updateDone(Map<String, ApplicationInfo> appToUpdate,
152 Map<String, Exception> appUpdateError) {
153
154 boolean updateI18n = updateDoneI18n(appToUpdate, appUpdateError);
155 boolean updateHelp = updateDoneHelp(appToUpdate, appUpdateError);
156 boolean updateConfig = updateDoneConfig(appToUpdate, appUpdateError);
157
158 boolean doRestart = updateI18n || updateHelp || updateConfig;
159
160 if (doRestart) {
161 dataUpdated = true;
162 }
163 }
164
165
166 @Override
167 public void aborted(String propertiesURL, Exception eee) {
168 if (LOG.isErrorEnabled()) {
169 LOG.error("Could not update from " + propertiesURL, eee);
170 }
171 throw ApplicationActionException.propagateError(action, eee);
172 }
173
174
175
176
177
178
179
180
181 protected boolean updateDoneI18n(Map<String, ApplicationInfo> appToUpdate, Map<String, Exception> appUpdateError) {
182 boolean doRestart = false;
183 Exception error = getError(UpdateType.I18N, appUpdateError);
184 if (error != null) {
185
186
187 throw ApplicationActionException.propagateError(
188 action, new ApplicationTechnicalException(t("quadrige2.applicationUpdater.i18n.error"), error));
189 }
190 ApplicationInfo info = getInfo(UpdateType.I18N, appToUpdate);
191 if (info != null) {
192
193 if (LOG.isInfoEnabled()) {
194 LOG.info(String.format(
195 "A i18n update was downloaded (oldVersion: %s, newVersion: %s), will restart application to use it",
196 info.oldVersion, info.newVersion));
197 }
198 doRestart = true;
199 }
200 return doRestart;
201 }
202
203
204
205
206
207
208
209
210 protected boolean updateDoneHelp(Map<String, ApplicationInfo> appToUpdate, Map<String, Exception> appUpdateError) {
211 boolean doRestart = false;
212 Exception error = getError(UpdateType.HELP, appUpdateError);
213 if (error != null) {
214
215
216 throw ApplicationActionException.propagateError(
217 action, new ApplicationTechnicalException(t("quadrige2.applicationUpdater.help.error"), error));
218 }
219 ApplicationInfo info = getInfo(UpdateType.HELP, appToUpdate);
220 if (info != null) {
221
222 if (LOG.isInfoEnabled()) {
223 LOG.info(String.format(
224 "A help update was downloaded (oldVersion: %s, newVersion: %s), will restart application to use it",
225 info.oldVersion, info.newVersion));
226 }
227 doRestart = true;
228
229 }
230 return doRestart;
231 }
232
233
234
235
236
237
238
239
240 protected boolean updateDoneConfig(Map<String, ApplicationInfo> appToUpdate,
241 Map<String, Exception> appUpdateError) {
242 boolean doRestart = false;
243 Exception error = getError(UpdateType.CONFIG, appUpdateError);
244 if (error != null) {
245
246
247 throw ApplicationActionException.propagateError(
248 action, new ApplicationTechnicalException(t("quadrige2.applicationUpdater.config.error"), error));
249 }
250 ApplicationInfo info = getInfo(UpdateType.CONFIG, appToUpdate);
251 if (info != null) {
252
253 if (LOG.isInfoEnabled()) {
254 LOG.info(String.format(
255 "A config update was downloaded (oldVersion: %s, newVersion: %s), will process it and application will restart",
256 info.oldVersion, info.newVersion));
257 }
258 doRestart = true;
259
260
261 try {
262
263
264 Properties p = new Properties();
265 File f = new File(info.destDir, "config/" + context.getConfiguration().getApplicationConfig().getConfigFileName());
266 p.load(Files.newReader(f, Charsets.UTF_8));
267
268
269 context.getConfiguration().overridesOptions(p);
270 context.getConfiguration().save();
271
272
273 ApplicationUpdater.createVersionFile(context.getConfiguration().getConfigDirectory(), info.newVersion);
274
275 } catch (IOException ex) {
276 throw ApplicationActionException.propagateError(
277 action, new ApplicationTechnicalException(t("quadrige2.applicationUpdater.config.io.error"), ex));
278 }
279 }
280 return doRestart;
281 }
282
283
284
285
286
287
288
289
290 protected ApplicationInfo getInfo(UpdateType type, Map<String, ApplicationInfo> appToUpdate) {
291 return appToUpdate.get(type.name().toLowerCase());
292 }
293
294
295
296
297
298
299
300
301 protected Exception getError(UpdateType type, Map<String, Exception> appUpdateError) {
302 return appUpdateError.get(type.name().toLowerCase());
303 }
304 }