Statistics
| Revision:

gvsig-projects-pool / org.gvsig.online / trunk / org.gvsig.online / org.gvsig.online.swing / org.gvsig.online.swing.impl / src / main / java / org / gvsig / online / swing / impl / download / OnlineJDownloadImpl.java @ 9512

History | View | Annotate | Download (16.4 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (c) 2007-2020 gvSIG Association
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.online.swing.impl.download;
25

    
26
import java.util.ArrayList;
27
import java.util.Collections;
28
import java.util.List;
29
import java.util.stream.Collectors;
30
import javax.swing.ImageIcon;
31
import javax.swing.JComponent;
32
import javax.swing.SwingUtilities;
33
import javax.swing.event.ChangeEvent;
34
import javax.swing.event.TableModelEvent;
35
import org.apache.commons.collections4.CollectionUtils;
36
import org.apache.commons.lang3.StringUtils;
37
import org.gvsig.fmap.dal.swing.DALSwingLocator;
38
import org.gvsig.fmap.dal.swing.DataSwingManager;
39
import org.gvsig.fmap.mapcontrol.MapControl;
40
import org.gvsig.online.lib.api.OnlineLayer;
41
import org.gvsig.online.lib.api.OnlineLocator;
42
import org.gvsig.online.lib.api.OnlineManager;
43
import static org.gvsig.online.lib.api.OnlineManager.ERR_NO_ERROR;
44
import org.gvsig.online.lib.api.OnlineProject;
45
import org.gvsig.online.lib.api.workingcopy.OnlineWorkingcopy;
46
import org.gvsig.online.lib.api.workingcopy.WorkingArea;
47
import org.gvsig.online.swing.api.OnlineJDownload;
48
import org.gvsig.online.swing.api.OnlineSwingLocator;
49
import org.gvsig.online.swing.api.OnlineSwingManager;
50
import org.gvsig.online.swing.api.OnlineSwingServices;
51
import org.gvsig.online.swing.impl.OnlineSwingCommons;
52
import static org.gvsig.online.swing.impl.OnlineSwingCommons.notInSwingThreadInvokeLater;
53
import org.gvsig.online.swing.impl.initworkspace.LayersTableModel;
54
import org.gvsig.online.swing.impl.workingarea.WorkingAreaPickerControllerImpl;
55
import org.gvsig.tools.ToolsLocator;
56
import org.gvsig.tools.i18n.I18nManager;
57
import org.gvsig.tools.swing.api.Component;
58
import org.gvsig.tools.swing.api.ToolsSwingLocator;
59
import org.gvsig.tools.swing.api.ToolsSwingManager;
60
import org.gvsig.tools.swing.api.ToolsSwingUtils;
61
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
62
import org.gvsig.tools.swing.api.task.TaskStatusController;
63
import org.gvsig.tools.swing.api.task.TaskStatusSwingManager;
64
import org.gvsig.tools.swing.api.windowmanager.Dialog;
65
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
66
import org.gvsig.tools.task.SimpleTaskStatus;
67
import org.gvsig.tools.task.UserCancelTaskException;
68
import org.gvsig.tools.util.LabeledValue;
69
import org.slf4j.LoggerFactory;
70

    
71
/**
72
 *
73
 * @author gvSIG Team
74
 */
75
@SuppressWarnings("UseSpecificCatch")
76
public class OnlineJDownloadImpl extends OnlineJDownloadView
77
        implements Component, OnlineJDownload  {
78
    
79
    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(OnlineJDownloadImpl.class);
80

    
81
    private Dialog dialog;
82

    
83
    private WorkingAreaPickerControllerImpl workingAreaPicker;
84
    private TaskStatusController taskStatusController;
85
    private PickerController<OnlineWorkingcopy> workingcopyPicker;
86
    private List<String> defaultTablesSelection;
87
    private boolean processing;
88

    
89
    public OnlineJDownloadImpl() {
90
        translate();
91
        
92
        initComponents();
93
        
94
    }
95
    
96
    public OnlineJDownloadImpl(OnlineWorkingcopy workspace, List<String> tableNames, Boolean overwrite) {
97
        processing = false;
98
        translate();
99
        if( tableNames==null ) {
100
            this.defaultTablesSelection = Collections.EMPTY_LIST;
101
        } else {
102
            this.defaultTablesSelection = tableNames;
103
        }
104
        initComponents();
105
        SwingUtilities.invokeLater(() -> {
106
            this.workingcopyPicker.set(workspace);
107
//            if( overwrite!=null ) {
108
//                this.chkOverwriteTable.setSelected(overwrite);
109
//            }
110
        });
111
    }
112
    
113
    private void initComponents() {
114
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
115
        TaskStatusSwingManager taskStatusManager = ToolsSwingLocator.getTaskStatusSwingManager();
116
        DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
117
        OnlineSwingManager swingManager = OnlineSwingLocator.getOnlineSwingManager();
118
        OnlineSwingServices onlineservices = OnlineSwingLocator.getOnlineSwingManager().getDefaultServices();
119

    
120
        this.taskStatusController = taskStatusManager.createTaskStatusController(
121
                null,
122
                this.lblStatusTitle,
123
                this.lblStatusMessages,
124
                this.pbStatus,
125
                this.btnStatusCancel,
126
                null
127
        );
128
        this.taskStatusController.setShowCancelButton(false);
129
        this.taskStatusController.setShowRemoveTaskButton(false);
130
//        this.taskStatusController.bind(ToolsLocator.getTaskStatusManager());
131
        SwingUtilities.invokeLater(() -> {this.setVisibleStatus(false); });        
132

    
133
        this.tblLayers.setModel(new LayersTableModel());
134

    
135
        this.workingcopyPicker = swingManager.createPickerWorkspaceController(cboWorkingcopy);
136

    
137
        this.workingcopyPicker.addChangeListener((ChangeEvent e) -> {
138
            this.clearMessage();
139
            doChangeWorkingcopy();
140
        });
141
        
142
        this.txtWorkspaceName.setText("");
143
        this.txtWorkspaceName.setEditable(false);
144
        this.workingAreaPicker = new WorkingAreaPickerControllerImpl(
145
            () -> {return this.getWorkingcopy().getSite();},
146
            txtWorkingAreaLabel,
147
            txtWorkingArea,
148
            btnWorkingAreaFromView,
149
            btnWorkingAreaDialog,
150
            btnWorkingAreaHistory,
151
            btnWorkingAreaBookmarks,
152
            () -> {
153
                LabeledValue<MapControl> n = onlineservices.getActiveMapControl();
154
                return (n == null) ? null : n.getValue();
155
            },
156
            () -> {
157
                List<OnlineLayer> selectedLayers = getLayersModel().getSelectedLayers();
158
                if (selectedLayers.isEmpty()) {
159
                    return null;
160
                }
161
                return selectedLayers;
162
            }
163
        );
164
        this.workingAreaPicker.addChangeListener((ChangeEvent e) -> {
165
            this.getWorkingcopy().setCurrentWorkingArea(this.workingAreaPicker.getWithoutAddHistory());
166
            doUpdateEnableComponents();
167
        });
168
        
169
        SwingUtilities.invokeLater(() -> { clearMessage(); });
170
        ToolsSwingUtils.ensureRowsCols(this, 15, 40, 25, 100);
171

    
172
    }
173

    
174
    @Override
175
    public void setDialog(Dialog dialog) {
176
        this.dialog = dialog;
177
        this.doUpdateEnableComponents();
178
    }
179

    
180
    private void doUpdateEnableComponents() {
181
        message("");
182
        
183
        boolean enableAll = true;
184
        
185
        boolean isThereWorkingcopy = false;
186
        boolean isThereSelectedsLayers = false;
187
        boolean isThereWorkingArea = false;
188
        
189
        // 0. Check is processing
190
        enableAll = !this.isProcessing();
191
        
192
        // 1. Check workingcopy
193
        if( enableAll ) {
194
            OnlineWorkingcopy w = this.getWorkingcopy();
195
            isThereWorkingcopy = (w != null);
196
            if( !isThereWorkingcopy ) {
197
                message2(enableAll, "_You_must_select_a_workingcopy");
198
            }
199
            enableAll = enableAll && isThereWorkingcopy;
200
        }
201
                   
202
        // 2. Check layers selected
203
        if( enableAll ) {
204
            isThereSelectedsLayers = !this.getLayersModel().isSelectionEmpty();
205
            if( !isThereSelectedsLayers ) {
206
                message2(enableAll, "_You_must_select_some_layer");
207
            }
208
            enableAll = isThereWorkingcopy && isThereSelectedsLayers;
209
        }
210
        
211
        // 3. Check selected working area
212
        if( enableAll ) {
213
            WorkingArea workingArea = this.workingAreaPicker.getWithoutAddHistory();
214
            isThereWorkingArea = (workingArea != null && workingArea.getValue() != null);
215
            if( !isThereWorkingArea ) {
216
                message2(enableAll, "_You_must_select_a_working_area");
217
            }
218
            enableAll = isThereWorkingcopy && isThereWorkingArea;
219
        }
220
        
221
        
222
        this.tblLayers.setEnabled(isThereWorkingcopy);
223
        this.txtWorkingAreaLabel.setEnabled(isThereWorkingcopy);
224
        
225
        this.txtWorkingArea.setEnabled(isThereWorkingcopy);
226
        this.btnWorkingAreaFromView.setEnabled(isThereWorkingcopy);
227
        this.btnWorkingAreaDialog.setEnabled(isThereSelectedsLayers && isThereWorkingcopy);
228
        
229
        if (this.dialog != null) {
230
            this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK,enableAll);
231
        }
232
    }
233

    
234
    
235
    @Override
236
    public JComponent asJComponent() {
237
        return this;
238
    }
239

    
240
    private void translate() {
241
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
242
        swingManager.translate(this.lblWorkspaceName);
243
        swingManager.translate(this.lblProjects);
244
        swingManager.translate(this.lblLayers);
245
        swingManager.translate(this.lblWorkingArea);
246
        swingManager.translate(this.btnWorkingAreaFromView);
247
        swingManager.translate(this.btnWorkingAreaDialog);
248
    }
249
    
250
    @Override
251
    public int actionPerformed() {
252
        I18nManager i18n = ToolsLocator.getI18nManager();
253
        OnlineManager manager = OnlineLocator.getOnlineManager();
254
        
255
        OnlineWorkingcopy workingcopy = this.getWorkingcopy();
256
        if( workingcopy==null ) {
257
            return OnlineManager.ERR_WORKINGCOPY_REQUIRED;
258
        }
259
        WorkingArea workingArea = this.workingAreaPicker.get();
260
        if (workingArea==null ) {
261
            return OnlineManager.ERR_WORKINGAREA_REQUIRED;
262
        }
263
        int err = ERR_NO_ERROR;
264
        SimpleTaskStatus status = this.getTaskStatus();
265
        try {
266
            status.setTitle(i18n.getTranslation("_Initializing_workspace"));
267
            LayersTableModel model = (LayersTableModel) this.tblLayers.getModel();
268
            List<OnlineLayer> selectedLayers = model.getSelectedLayers();
269
            if( !CollectionUtils.isEmpty(selectedLayers) ) {
270
                status.setRangeOfValues(0, selectedLayers.size());
271
                status.setCurValue(0);
272
                
273
                for (OnlineLayer layer : selectedLayers) {
274
                    status.incrementCurrentValue();
275
                    if( status.isCancellationRequested() ) {
276
                        status.cancel();
277
                        throw new UserCancelTaskException();
278
                    }
279
                    if( workingcopy.getEntity(layer.getName())==null ) {
280
                        status.setTitle(i18n.getTranslation("_Adding_layer")+" "+layer.getName());
281
                        String fieldForLabel = "ogc_fid"; // FIXME: Pedir en el GUI
282
                        String label = layer.getName(); // FIXME: Pedir en el GUI
283
                        int tileSize = layer.calculateTileSize(5000, status);
284
                        workingcopy.addEntity(
285
                                layer.getFeatureType(), 
286
                                layer.getName(), 
287
                                layer.getTitle(), 
288
                                fieldForLabel, 
289
                                label, 
290
                                layer.getPkName(),
291
                                tileSize
292
                        );
293
                    }
294
                }
295
                
296
                status.setRangeOfValues(0, selectedLayers.size());
297
                status.setCurValue(0);
298
                for (OnlineLayer layer : selectedLayers) {
299
                    status.incrementCurrentValue();
300
                    status.setTitle(i18n.getTranslation("_Downloading_layer")+" "+layer.getName());
301
                    if( status.isCancellationRequested() ) {
302
                        status.cancel();
303
                        throw new UserCancelTaskException();
304
                    }
305
                    err = workingcopy.download(layer.getName(),workingArea.getValue(), status);
306
                    if (err != ERR_NO_ERROR ) {
307
                        // TODO: Que hacer aqui si da error
308
                    }
309
                }
310
            }
311
            OnlineSwingServices services = OnlineSwingLocator.getOnlineSwingManager().getDefaultServices();
312
            services.refreshDocuments();
313
        } catch (UserCancelTaskException ex) {
314
            LOGGER.info("Cancelled by user.");
315
            err = OnlineManager.ERR_CANCELLED_BY_USER;
316
        } catch (Exception ex) {
317
            LOGGER.info("Can't initialize workspace", ex);
318
            err = OnlineManager.ERR_EXCEPTION;
319
        }
320
        return err;
321
    }
322

    
323
    public static void selfRegister() {
324

    
325
    }
326

    
327
    @Override
328
    public boolean isProcessing() {
329
        return false;
330
    }
331

    
332
    private void message2(boolean doMessage, String s) {
333
        if( doMessage ) {
334
            message(s);
335
        }
336
    }
337
    
338
    private void message(String message) {
339
        if( notInSwingThreadInvokeLater(() -> {message(message);}) ) {
340
            return;
341
        }
342
        String s = message;
343
        if( StringUtils.startsWith(s, "_") ) {
344
            I18nManager i18n = ToolsLocator.getI18nManager();
345
            s = i18n.getTranslation(s);
346
        }
347
        this.lblStatusMessages.setText(s);
348
//        this.lblStatusMessages.setToolTipText(toolTipText);        
349
        
350
    }
351

    
352
    @Override
353
    public ImageIcon loadImage(String imageName) {
354
        return OnlineSwingCommons.loadImage(imageName);
355
    }
356

    
357
    private void clearLayers() {
358
        LayersTableModel model = new LayersTableModel();
359
        this.tblLayers.setModel(model);
360
    }
361
    
362
//    private WorkingArea getWorkingArea() {
363
//        return this.workingAreaPicker.get();
364
//    }
365

    
366
    private LayersTableModel getLayersModel() {
367
        return (LayersTableModel) this.tblLayers.getModel();
368
    }
369
    
370
    private SimpleTaskStatus getTaskStatus() {
371
        SimpleTaskStatus taskStatus = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus("_Create_workingcopy");
372
        taskStatus.setAutoremove(true);
373
        taskStatus.add();
374
        taskStatus.setIndeterminate();
375
        this.taskStatusController.bind(taskStatus);
376
        return taskStatus;
377
    }
378

    
379
    public void setVisibleStatus(boolean visible) {
380
        if( notInSwingThreadInvokeLater(() -> {setVisibleStatus(visible);}) ) {
381
            return;
382
        }
383
        this.lblStatusTitle.setVisible(visible);
384
        this.pbStatus.setVisible(visible);
385
        this.lblStatusMessages.setVisible(true);
386
    }
387
    
388
    private void clearMessage() {
389
        message(" ");
390
    }
391

    
392
    @Override
393
    public OnlineWorkingcopy getWorkingcopy() {
394
        OnlineWorkingcopy w = this.workingcopyPicker.get();
395
        return w;
396
    }
397

    
398
    @Override
399
    public List<String> getSelectedLayers() {
400
        OnlineWorkingcopy w = this.getWorkingcopy();
401
        if( w == null ) {
402
            return Collections.EMPTY_LIST;
403
        }
404
        LayersTableModel model = (LayersTableModel) this.tblLayers.getModel();
405
        List<OnlineLayer> selectedLayers = model.getSelectedLayers();
406
        if( CollectionUtils.isEmpty(selectedLayers) ) {
407
            return Collections.EMPTY_LIST;
408
        }
409
        return selectedLayers.stream().map((OnlineLayer t) -> t.getName()).collect(Collectors.toList());
410
    }
411

    
412
    private void doChangeWorkingcopy() {
413
        OnlineWorkingcopy w = this.getWorkingcopy();
414
        if( w == null ) {
415
            return;
416
        }
417
        OnlineProject project = w.getProject();
418

    
419
        List<OnlineLayer> layers = new ArrayList<>();
420
        for (OnlineLayer layer : project.layers()) {
421
            if( layer.isHidden() ) {
422
                continue;
423
            }
424
            layers.add(layer);
425
        }
426
        layers.sort((OnlineLayer o1, OnlineLayer o2) -> o1.getLabel().compareTo(o2.getLabel()));
427
        LayersTableModel model = new LayersTableModel(layers);
428
        model.addTableModelListener((TableModelEvent e) -> {
429
            doUpdateEnableComponents();
430
        });
431
        this.txtWorkspaceName.setText(w.getLabel());
432
        this.tblLayers.setModel(model);
433
        this.workingAreaPicker.set(w.getCurrentWorkingArea());
434
        doUpdateEnableComponents();    
435
    }
436

    
437
}