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.Preconditions;
28 import com.google.common.collect.Maps;
29 import fr.ifremer.quadrige2.core.security.AuthenticationInfo;
30 import fr.ifremer.quadrige2.ui.swing.common.ApplicationUIContext;
31 import fr.ifremer.quadrige2.ui.swing.common.action.AbstractMainUIAction;
32 import fr.ifremer.quadrige2.ui.swing.common.content.AbstractMainUIHandler;
33 import fr.ifremer.quadrige2.ui.swing.common.model.ProgressionModel;
34 import org.apache.commons.io.FileUtils;
35 import org.apache.commons.logging.Log;
36 import org.apache.commons.logging.LogFactory;
37 import org.nuiton.jaxx.application.ApplicationTechnicalException;
38 import org.nuiton.jaxx.application.swing.action.ApplicationActionException;
39 import org.nuiton.updater.ApplicationInfo;
40 import org.nuiton.updater.ApplicationUpdaterCallback;
41
42 import java.io.File;
43 import java.io.IOException;
44 import java.util.Map;
45
46 import static org.nuiton.i18n.I18n.n;
47 import static org.nuiton.i18n.I18n.t;
48
49
50
51
52
53
54 public class DatabaseUpdaterCallBack implements ApplicationUpdaterCallback {
55
56
57 private static final Log LOG =
58 LogFactory.getLog(DatabaseUpdaterCallBack.class);
59
60
61 public static final String DB_UPDATE_NAME = "db";
62
63 static {
64 n("quadrige2.update.db");
65 }
66
67 protected final ApplicationUIContext context;
68
69 protected final AbstractMainUIHandler handler;
70
71 protected final ProgressionModel progressionModel;
72
73 protected boolean dbInstalled;
74
75 protected boolean dbUpdated;
76
77 protected final AbstractMainUIAction action;
78
79
80
81
82
83
84
85 public DatabaseUpdaterCallBack(AbstractMainUIAction action, ProgressionModel progressionModel) {
86 this.action = action;
87 this.handler = action.getHandler();
88 this.context = action.getContext();
89 this.progressionModel = progressionModel;
90 }
91
92
93
94
95
96
97 public boolean isDbUpdated() {
98 return dbUpdated;
99 }
100
101
102
103
104
105
106 public boolean isDbInstalled() {
107 return dbInstalled;
108 }
109
110
111 @Override
112 public Map<String, ApplicationInfo> updateToDo(Map<String, ApplicationInfo> appToUpdate) {
113 Map<String, ApplicationInfo> result = Maps.newHashMap();
114
115 ApplicationInfo info = appToUpdate.get(DB_UPDATE_NAME);
116 if (info == null) {
117 dbInstalled = false;
118 dbUpdated = false;
119 } else {
120 result.put(info.name, info);
121
122 if (info.needAuthentication) {
123
124
125 AuthenticationInfo authenticationInfo = handler.askAuthenticationInfo(info.url);
126 if (authenticationInfo != null) {
127 info.setAuthentication(authenticationInfo.getLogin(), authenticationInfo.getPassword().toCharArray());
128 }
129 }
130
131 if (context.isDbExist()) {
132
133
134 dbUpdated = true;
135 } else {
136
137
138 dbInstalled = true;
139 }
140 }
141
142 return result;
143 }
144
145
146 @Override
147 public void startUpdate(ApplicationInfo info) {
148
149 if (dbInstalled) {
150 progressionModel.setMessage(t("quadrige2.applicationUpdater.startUpdate.db.installation", info.newVersion));
151 } else if (dbUpdated) {
152 progressionModel.setMessage(t("quadrige2.applicationUpdater.startUpdate.db.update", info.newVersion));
153 }
154 }
155
156
157 @Override
158 public void updateDone(Map<String, ApplicationInfo> appToUpdate,
159 Map<String, Exception> appUpdateError) {
160
161 ApplicationInfo info = appToUpdate.get(DB_UPDATE_NAME);
162 Exception error = appUpdateError.get(DB_UPDATE_NAME);
163 if (error != null) {
164
165
166 if (LOG.isErrorEnabled()) {
167 LOG.error("Could not update db", error);
168 }
169 String errorMessage;
170 if (info != null && info.needAuthentication) {
171 errorMessage = t("quadrige2.updateDb.error.with.auth");
172 } else {
173 errorMessage = t("quadrige2.updateDb.error.with.noauth");
174 }
175 throw ApplicationActionException.propagateError(
176 action, new ApplicationTechnicalException(errorMessage, error));
177 } else if (info != null) {
178
179 if (LOG.isInfoEnabled()) {
180 LOG.info(String.format(
181 "A db update was downloaded (oldVersion: %s, newVersion: %s), will process it.",
182 info.oldVersion, info.newVersion));
183 }
184
185 if (dbInstalled) {
186
187
188 prepareFirstDatabase(info);
189 } else if (dbUpdated) {
190
191 }
192 }
193 }
194
195
196 @Override
197 public void aborted(String propertiesURL, Exception eee) {
198 if (LOG.isErrorEnabled()) {
199 LOG.error("Could not update from " + propertiesURL, eee);
200 }
201 throw ApplicationActionException.propagateError(action, eee);
202 }
203
204
205
206
207
208
209
210 protected File getDbDirectory(ApplicationInfo info) {
211 File[] sources = info.destDir.listFiles();
212 Preconditions.checkState(
213 sources != null && sources.length == 1,
214 "Downloaded db should contains one directory at " + info.destDir);
215 return sources[0];
216 }
217
218
219
220
221
222
223 protected void prepareFirstDatabase(ApplicationInfo info) {
224 if (LOG.isInfoEnabled()) {
225 LOG.info("First time database was downloaded at version: " + info.newVersion);
226 }
227 File source = getDbDirectory(info);
228 File target = context.getConfiguration().getDbDirectory();
229 if (LOG.isInfoEnabled()) {
230 LOG.info(String.format("Copy from [%s] to [%s]", source , target));
231 }
232 try {
233 FileUtils.copyDirectory(source, target);
234 } catch (IOException e) {
235 throw new ApplicationTechnicalException(t("quadrige2.applicationUpdater.prepareFirstDB.copyDirectory.error", source, target), e);
236 }
237 try {
238 FileUtils.deleteDirectory(source.getParentFile());
239 } catch (IOException e) {
240 throw new ApplicationTechnicalException(t("quadrige2.applicationUpdater.prepareFirstDB.deleteDirectory.error", target), e);
241 }
242 }
243 }