View Javadoc
1   package fr.ifremer.quadrige3.synchro.server.pages.admin;
2   
3   /*-
4    * #%L
5    * Quadrige3 Core :: Quadrige3 Synchro server
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2017 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU Affero General Public License as published by
13   * the Free Software Foundation, either version 3 of the License, or
14   * (at your option) any later version.
15   * 
16   * This program is distributed in the hope that it will be useful,
17   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   * GNU General Public License for more details.
20   * 
21   * You should have received a copy of the GNU Affero General Public License
22   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23   * #L%
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          // Progression panel
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         // Refresh last update date button
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                 // Refresh the last update date and get the new date
108                 startRefreshReferentialLastUpdateDate(target);
109             }
110         };
111         form.add(refreshLastUpdateDateButton);
112 
113         // New installation DB button
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         // auto refresh
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             // Refresh fields
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     /* -- internal methods -- */
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             // Clearing cache
188             ServiceLocator.instance().getCacheService().clearCache(ReferentialSynchroService.REFERENTIAL_UPDATE_DATE_CACHE);
189 
190             // Then recompute the new value
191             Timestamp updateDate = ServiceLocator.instance().getReferentialSynchroService().getLastUpdateDate(programCodes);
192 
193             // Save it back to field
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         // Display that's running, and refresh page
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         // Refresh the last update date and get the new date
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         // Mask feedback panel, to avoid multiple message)
231         getFeedbackPanel().setVisibilityAllowed(false);
232 
233         target.add(ToolsPage.this);
234     }
235 
236 
237     protected void onNewInstallDbComplete(AjaxRequestTarget target) {
238         // Restore the UI
239         progressionPanel.setVisibilityAllowed(false);
240         getFeedbackPanel().setVisibilityAllowed(true);
241 
242         target.add(this);
243     }
244 }