1 package fr.ifremer.quadrige3.synchro.server.pages.admin;
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 fr.ifremer.quadrige3.synchro.server.application.WebSession;
28 import fr.ifremer.quadrige3.synchro.server.components.progression.ProgressionPanel;
29 import fr.ifremer.quadrige3.synchro.server.pages.BasePage;
30 import fr.ifremer.quadrige3.synchro.server.service.ServiceLocator;
31 import fr.ifremer.quadrige3.synchro.server.service.synchro.ReferentialSynchroService;
32 import fr.ifremer.quadrige3.synchro.server.service.synchro.job.SynchroNewInstallDbJob;
33 import fr.ifremer.quadrige3.synchro.vo.SynchroProgressionModel;
34 import fr.ifremer.quadrige3.synchro.vo.SynchroProgressionStatus;
35 import org.apache.wicket.ajax.AbstractAjaxTimerBehavior;
36 import org.apache.wicket.ajax.AjaxRequestTarget;
37 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
38 import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
39 import org.apache.wicket.markup.html.form.Form;
40 import org.apache.wicket.model.CompoundPropertyModel;
41 import org.apache.wicket.model.IModel;
42 import org.apache.wicket.model.Model;
43 import org.apache.wicket.model.StringResourceModel;
44 import org.apache.wicket.request.mapper.parameter.PageParameters;
45 import org.apache.wicket.util.time.Duration;
46 import org.springframework.core.task.AsyncTaskExecutor;
47
48 import java.sql.Timestamp;
49 import java.text.DateFormat;
50 import java.util.Date;
51 import java.util.Set;
52
53 @AuthorizeInstantiation("ROLE_ADMIN")
54 public class ToolsPage extends BasePage {
55 private static final long serialVersionUID = 1L;
56
57 private final ProgressionPanel progressionPanel;
58
59 private boolean isRefreshLastUpdateRunning;
60
61 private boolean isNewInstallDbRunning;
62
63 private String lastUpdateDate;
64
65 private ImportProgressionModel progressionModel;
66
67 private AbstractAjaxTimerBehavior selfUpdatingTimer;
68
69 public ToolsPage(final PageParameters parameters) {
70 super(parameters);
71
72 IModel<ToolsPage> model = new CompoundPropertyModel<>(this);
73
74 isRefreshLastUpdateRunning = false;
75 isNewInstallDbRunning = false;
76
77
78 progressionModel = new ImportProgressionModel(getSession().getId());
79 progressionPanel = new ProgressionPanel("progress", progressionModel) {
80 private static final long serialVersionUID = 1L;
81 @Override
82 protected void onConfigure() {
83 super.onConfigure();
84 setVisibilityAllowed(isNewInstallDbRunning);
85 }
86
87 @Override
88 public void onComplete(AjaxRequestTarget target) {
89 ToolsPage.this.onNewInstallDbComplete(target);
90 }
91 };
92 progressionPanel.setOutputMarkupId(true);
93 progressionPanel.setOutputMarkupPlaceholderTag(true);
94 add(progressionPanel);
95
96 Form<ToolsPage> form = new Form<>("form", model);
97 form.setOutputMarkupId(true);
98 add(form);
99
100
101 AjaxButton refreshLastUpdateDateButton = new AjaxButton("refreshLastUpdateDateButton", form) {
102 private static final long serialVersionUID = 1L;
103
104 @Override
105 protected void onAfterSubmit(AjaxRequestTarget target, Form<?> form) {
106 super.onAfterSubmit(target, form);
107
108 startRefreshReferentialLastUpdateDate(target);
109 }
110 };
111 form.add(refreshLastUpdateDateButton);
112
113
114 AjaxButton newInstallDbButton = new AjaxButton("newInstallDbButton", form) {
115 private static final long serialVersionUID = 1L;
116
117 @Override
118 protected void onAfterSubmit(AjaxRequestTarget target, Form<?> form) {
119 super.onAfterSubmit(target, form);
120
121 startNewInstallDb(target);
122 }
123 };
124 form.add(newInstallDbButton);
125
126
127
128 selfUpdatingTimer = new AbstractAjaxTimerBehavior(Duration.seconds(5)) {
129 @Override
130 protected void onTimer(AjaxRequestTarget target) {
131 String message;
132 if (isRefreshLastUpdateRunning) {
133 message = new StringResourceModel("tools.refreshLastUpdateDate.running", ToolsPage.this, null).getString();
134 }
135 else {
136 message = new StringResourceModel("tools.refreshLastUpdateDate.done", ToolsPage.this, new Model<>(ToolsPage.this)).getString();
137 stop(target);
138 }
139
140 info(message);
141 target.add(ToolsPage.this);
142 }
143 };
144 selfUpdatingTimer.stop(null);
145 add(selfUpdatingTimer);
146 }
147
148 @Override
149 protected void onConfigure() {
150 super.onConfigure();
151 SynchroProgressionModel progression = progressionModel.getObject();
152
153 if (progression != null) {
154
155 isNewInstallDbRunning = progression.getStatus() == SynchroProgressionStatus.WAITING_EXECUTION || progression.getStatus() == SynchroProgressionStatus.RUNNING;
156 if (isNewInstallDbRunning) {
157 getFeedbackPanel().setVisibilityAllowed(false);
158 }
159 }
160 else {
161 isNewInstallDbRunning = false;
162 }
163 }
164
165
166
167 protected IModel<String> getTitleModel() {
168 return new StringResourceModel("tools.title", this, null);
169 }
170
171 public String getLastUpdateDate() {
172 return lastUpdateDate;
173 }
174
175 protected WebSession getWebSession() {
176 return (WebSession)getSession();
177 }
178
179
180
181 protected void startRefreshReferentialLastUpdateDate(AjaxRequestTarget target) {
182 final DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, getWebSession().getLocale());
183
184 final Set<String> programCodes = getConfiguration().getSynchroProgramCodeIncludes();
185
186 Runnable job = () -> {
187
188 ServiceLocator.instance().getCacheService().clearCache(ReferentialSynchroService.REFERENTIAL_UPDATE_DATE_CACHE);
189
190
191 Timestamp updateDate = ServiceLocator.instance().getReferentialSynchroService().getLastUpdateDate(programCodes);
192
193
194 try {
195 lastUpdateDate = dateFormat.format(new Date(updateDate.getTime()));
196 }
197 catch(Exception e) {
198 lastUpdateDate = null;
199 }
200 finally {
201 isRefreshLastUpdateRunning = false;
202 }
203 };
204
205 AsyncTaskExecutor taskExecutor = ServiceLocator.instance().getTaskExecutor();
206 taskExecutor.submit(job);
207
208 isRefreshLastUpdateRunning = true;
209 selfUpdatingTimer.restart(target);
210
211
212 getFeedbackPanel().getFeedbackMessages().clear();
213 info(new StringResourceModel("tools.refreshLastUpdateDate.running", ToolsPage.this, null).getString());
214 target.add(ToolsPage.this);
215
216 }
217
218 protected void startNewInstallDb(AjaxRequestTarget target) {
219 isRefreshLastUpdateRunning = true;
220
221
222 WebSession session = getWebSession();
223 SynchroNewInstallDbJob job = ServiceLocator.instance().getSynchroJobService().startNewInstallDb(
224 session.getId(),
225 session.getLocale());
226
227 progressionPanel.setDefaultModelObject(job.getProgressionModel());
228 progressionPanel.restart(target);
229
230
231 getFeedbackPanel().setVisibilityAllowed(false);
232
233 target.add(ToolsPage.this);
234 }
235
236
237 protected void onNewInstallDbComplete(AjaxRequestTarget target) {
238
239 progressionPanel.setVisibilityAllowed(false);
240 getFeedbackPanel().setVisibilityAllowed(true);
241
242 target.add(this);
243 }
244 }