View Javadoc
1   package fr.ifremer.quadrige2.synchro.server.pages.admin;
2   
3   /*-
4    * #%L
5    * Quadrige2 Core :: Quadrige2 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.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          // Progression panel
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         // Refresh last update date button
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                 // Refresh the last update date and get the new date
112                 startRefreshReferentialLastUpdateDate(target);
113             }
114         };
115         form.add(refreshLastUpdateDateButton);
116 
117         // New installation DB button
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         // auto refresh
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             // Refresh fields
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     /* -- internal methods -- */
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                 // Clearing cache
195                 ServiceLocator.instance().getCacheService().clearCache(ReferentialSynchroService.REFERENTIAL_UPDATE_DATE_CACHE);
196 
197                 // Then recompute the new value
198                 Timestamp updateDate = ServiceLocator.instance().getReferentialSynchroService().getLastUpdateDate(programCodes);
199 
200                 // Save it back to field
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         // Display that's running, and refresh page
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         // Refresh the last update date and get the new date
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         // Mask feedback panel, to avoid multiple message)
239         getFeedbackPanel().setVisibilityAllowed(false);
240 
241         target.add(ToolsPage.this);
242     }
243 
244 
245     protected void onNewInstallDbComplete(AjaxRequestTarget target) {
246         // Restore the UI
247         progressionPanel.setVisibilityAllowed(false);
248         getFeedbackPanel().setVisibilityAllowed(true);
249 
250         target.add(this);
251     }
252 }