View Javadoc
1   package fr.ifremer.dali.ui.swing.content.manage.program.strategies;
2   
3   /*
4    * #%L
5    * Dali :: UI
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2014 - 2015 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  import fr.ifremer.dali.dto.configuration.programStrategy.ProgramDTO;
27  import fr.ifremer.dali.dto.configuration.programStrategy.StrategyDTO;
28  import fr.ifremer.dali.ui.swing.action.AbstractCheckModelAction;
29  import fr.ifremer.dali.ui.swing.action.AbstractDaliSaveAction;
30  import fr.ifremer.dali.ui.swing.content.manage.program.ProgramsUI;
31  import fr.ifremer.dali.ui.swing.content.manage.program.ProgramsUIModel;
32  import fr.ifremer.dali.ui.swing.content.manage.program.SaveAction;
33  import fr.ifremer.dali.ui.swing.content.manage.program.menu.SearchAction;
34  import fr.ifremer.dali.ui.swing.content.manage.program.strategies.duplicate.SelectProgramUI;
35  import fr.ifremer.quadrige3.ui.core.dto.QuadrigeBeans;
36  import org.apache.commons.logging.Log;
37  import org.apache.commons.logging.LogFactory;
38  import org.nuiton.jaxx.application.swing.AbstractApplicationUIHandler;
39  
40  import static org.nuiton.i18n.I18n.t;
41  
42  /**
43   * Action permettant de dupliquer une stratégie.
44   */
45  public class DuplicateStrategyAction extends AbstractCheckModelAction<StrategiesTableUIModel, StrategiesTableUI, StrategiesTableUIHandler> {
46  
47      private static final Log LOG = LogFactory.getLog(DuplicateStrategyAction.class);
48  
49      private StrategyDTO strategyToDuplicate;
50      private StrategyDTO duplicateStrategy;
51      private ProgramDTO sourceProgram;
52      private ProgramDTO targetProgram;
53      private boolean localToNational;
54  
55      /**
56       * Constructor.
57       *
58       * @param handler Controleur
59       */
60      public DuplicateStrategyAction(final StrategiesTableUIHandler handler) {
61          super(handler, false);
62      }
63  
64      private ProgramsUI getProgramsUI() {
65          return getUI().getParentContainer(ProgramsUI.class);
66      }
67  
68      /**
69       * {@inheritDoc}
70       */
71      @Override
72      protected Class<? extends AbstractDaliSaveAction> getSaveActionClass() {
73          return SaveAction.class;
74      }
75  
76      /**
77       * {@inheritDoc}
78       */
79      @Override
80      protected boolean isModelModify() {
81          final ProgramsUIModel model = getModel().getParentModel();
82          return model != null && model.isModify();
83      }
84  
85      /**
86       * {@inheritDoc}
87       */
88      @Override
89      protected void setModelModify(boolean modelModify) {
90          final ProgramsUIModel model = getModel().getParentModel();
91          if (model != null) {
92              model.setModify(modelModify);
93          }
94      }
95  
96      /**
97       * {@inheritDoc}
98       */
99      @Override
100     protected boolean isModelValid() {
101         final ProgramsUIModel model = getModel().getParentModel();
102         return model == null || model.isValid();
103     }
104 
105     /**
106      * {@inheritDoc}
107      */
108     @Override
109     protected AbstractApplicationUIHandler<?, ?> getSaveHandler() {
110         return getProgramsUI().getHandler();
111     }
112 
113     /**
114      * {@inheritDoc}
115      */
116     @Override
117     public boolean prepareAction() throws Exception {
118         if (!super.prepareAction()) {
119             return false;
120         }
121 
122         if (getModel().getParentModel().getProgramsUIModel().getSingleSelectedRow() == null || getModel().getSelectedRows().size() != 1) {
123             return false;
124         }
125 
126         duplicateStrategy = null;
127         strategyToDuplicate = getModel().getSelectedRows().iterator().next().toBean();
128         sourceProgram = getModel().getParentModel().getProgramsUIModel().getSingleSelectedRow().toBean();
129 
130         // Open select program UI
131         SelectProgramUI selectProgramUI = new SelectProgramUI(getContext());
132         selectProgramUI.getModel().setSourceProgram(sourceProgram);
133         selectProgramUI.getModel().setSourceStrategy(strategyToDuplicate);
134         getHandler().openDialog(selectProgramUI);
135         targetProgram = selectProgramUI.getModel().getTargetProgram();
136         if (targetProgram == null) {
137             // mantis 27906
138             return false;
139         }
140 
141         // Test the status
142         localToNational = QuadrigeBeans.isLocalStatus(sourceProgram.getStatus()) && !QuadrigeBeans.isLocalStatus(targetProgram.getStatus());
143         if (localToNational) {
144             getContext().getDialogHelper().showWarningDialog(t("dali.action.duplicate.strategy.warning.localReferential", decorate(strategyToDuplicate)));
145         }
146 
147         return true;
148     }
149 
150     /**
151      * {@inheritDoc}
152      */
153     @Override
154     public void doAction() throws Exception {
155 
156         // Do not load target program if same as source
157         if (!sourceProgram.equals(targetProgram)) {
158 
159             // force loading state to be able to wait strategies loading
160             getProgramsUI().getMenuUI().getModel().setLoading(true);
161             getModel().setLoading(true);
162             // Select the target program
163             getProgramsUI().getMenuUI().getProgramCodeCombo().setSelectedItem(targetProgram);
164             getProgramsUI().getMenuUI().getModel().setLoading(false);
165             // Do search
166             getActionEngine().runFullInternalAction(
167                     getActionFactory().createLogicAction(getProgramsUI().getMenuUI().getHandler(), SearchAction.class)
168             );
169 
170             // wait for strategies loading
171             while (getModel().isLoading()) {
172                 // do nothing
173                 try {
174                     Thread.sleep(100);
175                 } catch (InterruptedException ignored) {
176                 }
177             }
178         }
179 
180         // duplicate
181         duplicateStrategy = getContext().getProgramStrategyService().duplicateStrategy(strategyToDuplicate, targetProgram, localToNational);
182 
183     }
184 
185     /**
186      * {@inheritDoc}
187      */
188     @Override
189     public void postSuccessAction() {
190         super.postSuccessAction();
191 
192         if (duplicateStrategy == null) {
193             LOG.error("the strategy to duplicate is null, duplication aborted !");
194             return;
195         }
196 
197         // Add duplicate observation to table
198         StrategiesTableRowModel row = getModel().addNewRow(duplicateStrategy);
199 
200         getModel().setModify(true);
201 
202         // Add focus on duplicate row
203         getHandler().setFocusOnCell(row);
204     }
205 }