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