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 / initworkspace / OnlineJInitWorkingcopyImpl.java @ 9515

History | View | Annotate | Download (30.7 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.initworkspace;
25

    
26
import java.awt.event.ActionEvent;
27
import java.awt.event.ActionListener;
28
import java.awt.event.FocusEvent;
29
import java.awt.event.FocusListener;
30
import java.io.File;
31
import java.io.IOException;
32
import java.net.URL;
33
import java.util.ArrayList;
34
import java.util.List;
35
import javax.swing.DefaultComboBoxModel;
36
import javax.swing.ImageIcon;
37
import javax.swing.JComponent;
38
import javax.swing.JOptionPane;
39
import javax.swing.SwingUtilities;
40
import javax.swing.event.ChangeEvent;
41
import javax.swing.event.ChangeListener;
42
import javax.swing.event.TableModelEvent;
43
import javax.swing.event.TableModelListener;
44
import org.apache.commons.collections4.CollectionUtils;
45
import org.apache.commons.lang3.StringUtils;
46
import org.gvsig.fmap.dal.store.h2.H2SpatialUtils;
47
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
48
import org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer;
49
import org.gvsig.fmap.dal.swing.DALSwingLocator;
50
import org.gvsig.fmap.dal.swing.DataSwingManager;
51
import org.gvsig.fmap.geom.primitive.Envelope;
52
import org.gvsig.fmap.mapcontrol.MapControl;
53
import org.gvsig.online.lib.api.OnlineLayer;
54
import org.gvsig.online.lib.api.OnlineLocator;
55
import org.gvsig.online.lib.api.OnlineManager;
56
import static org.gvsig.online.lib.api.OnlineManager.AUTH_MODE_ONLINE;
57
import static org.gvsig.online.lib.api.OnlineManager.ERR_NO_ERROR;
58
import static org.gvsig.online.lib.api.OnlineManager.ERR_PROJECT_REQUIRED;
59
import static org.gvsig.online.lib.api.OnlineManager.ERR_WORKINGAREA_REQUIRED;
60
import org.gvsig.online.lib.api.OnlineProject;
61
import org.gvsig.online.lib.api.OnlineSite;
62
import org.gvsig.online.lib.api.OnlineUserIdentificationRequester;
63
import org.gvsig.online.lib.api.OnlineUserIdentificationRequester.OnlineUserIdentificationRequesterFactory;
64
import org.gvsig.online.lib.api.workingcopy.OnlineWorkingcopy;
65
import org.gvsig.online.lib.api.workingcopy.OnlineWorkingcopyDescriptor;
66
import org.gvsig.online.lib.api.workingcopy.WorkingArea;
67
import org.gvsig.online.swing.api.OnlineJInitWorkingcopy;
68
import org.gvsig.online.swing.api.OnlineSwingLocator;
69
import org.gvsig.online.swing.api.OnlineSwingServices;
70
import org.gvsig.online.swing.impl.OnlineSwingCommons;
71
import static org.gvsig.online.swing.impl.OnlineSwingCommons.notInSwingThreadInvokeLater;
72
import org.gvsig.online.swing.impl.workingarea.WorkingAreaPickerControllerImpl;
73
import org.gvsig.tools.ToolsLocator;
74
import org.gvsig.tools.dataTypes.CoercionException;
75
import org.gvsig.tools.dataTypes.DataTypes;
76
import org.gvsig.tools.dataTypes.DataTypesManager;
77
import org.gvsig.tools.dispose.DisposeUtils;
78
import org.gvsig.tools.i18n.I18nManager;
79
import org.gvsig.tools.swing.api.Component;
80
import org.gvsig.tools.swing.api.ToolsSwingLocator;
81
import org.gvsig.tools.swing.api.ToolsSwingManager;
82
import org.gvsig.tools.swing.api.ToolsSwingUtils;
83
import org.gvsig.tools.swing.api.bookmarkshistory.TextFieldWithHistoryAndBookmarkController;
84
import org.gvsig.tools.swing.api.pickercontroller.FilePickerController;
85
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
86
import org.gvsig.tools.swing.api.task.TaskStatusController;
87
import org.gvsig.tools.swing.api.task.TaskStatusSwingManager;
88
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
89
import org.gvsig.tools.swing.api.windowmanager.Dialog;
90
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
91
import org.gvsig.tools.task.SimpleTaskStatus;
92
import org.gvsig.tools.task.UserCancelTaskException;
93
import org.gvsig.tools.util.LabeledValue;
94
import org.gvsig.tools.util.LabeledValueImpl;
95
import org.slf4j.LoggerFactory;
96

    
97
/**
98
 *
99
 * @author gvSIG Team
100
 */
101
@SuppressWarnings("UseSpecificCatch")
102
public class OnlineJInitWorkingcopyImpl extends OnlineJInitWorkingcopyView
103
        implements Component, OnlineJInitWorkingcopy  {
104
    
105
    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(OnlineJInitWorkingcopyImpl.class);
106

    
107
    private Dialog dialog;
108

    
109
    private OnlineSite site;
110
    private JDBCServerExplorer workspaceServer;
111
    
112
    private FilePickerController workspaceFilePicker;
113
    private PickerController<JDBCServerExplorerParameters> workspaceServerPicker;
114
    private TextFieldWithHistoryAndBookmarkController siteURLController;
115
    private WorkingAreaPickerControllerImpl workingAreaPicker;
116
    private TaskStatusController taskStatusController;
117
    private OnlineUserIdentificationRequester.OnlineUserIdentificationRequesterConfig authenticationRequesterConfig;
118

    
119

    
120
    public OnlineJInitWorkingcopyImpl() {
121
        translate();
122
        
123
        initComponents();
124
        
125
    }
126
    
127
    private void initComponents() {
128
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
129
        TaskStatusSwingManager taskStatusManager = ToolsSwingLocator.getTaskStatusSwingManager();
130
        OnlineSwingServices onlineservices = OnlineSwingLocator.getOnlineSwingManager().getDefaultServices();
131
        OnlineManager onlineManager = OnlineLocator.getOnlineManager();
132

    
133
        this.taskStatusController = taskStatusManager.createTaskStatusController(
134
                null,
135
                this.lblStatusTitle,
136
                this.lblStatusMessages,
137
                this.pbStatus,
138
                this.btnStatusCancel,
139
                null
140
        );
141
        this.taskStatusController.setShowCancelButton(false);
142
        this.taskStatusController.setShowRemoveTaskButton(false);
143
//        this.taskStatusController.bind(ToolsLocator.getTaskStatusManager());
144
        SwingUtilities.invokeLater(() -> {this.setVisibleStatus(false); });        
145
        
146
        this.workspaceFilePicker = toolsSwingManager.createFilePickerController(
147
                txtWorkspaceFile, 
148
                btnWorkspaceFile
149
        );
150
        this.workspaceFilePicker.addChangeListener((ChangeEvent e) -> {
151
            if (StringUtils.isBlank(this.txtWorkspaceName.getText())) {
152
                File file = this.workspaceFilePicker.get();
153
                if(file != null){
154
                    this.txtWorkspaceName.setText(H2SpatialUtils.removeH2FileNameExtension(file.getName()));
155
                }
156
            }
157
            doUpdateComponents();
158
        });
159
        
160
        this.txtWorkspaceFile.addFocusListener(new FocusListener() {
161
            @Override
162
            public void focusGained(FocusEvent e) {
163
                //DO NOTHING
164
            }
165

    
166
            @Override
167
            public void focusLost(FocusEvent e) {
168
                doUpdateComponents();
169
            }
170
        });
171
        
172
        this.txtWorkspaceName.addActionListener((ActionEvent e) -> {
173
            doUpdateComponents();
174
        });
175
        
176
        this.txtWorkspaceName.addFocusListener(new FocusListener() {
177
            @Override
178
            public void focusGained(FocusEvent e) {
179
                //DO NOTHING
180
            }
181

    
182
            @Override
183
            public void focusLost(FocusEvent e) {
184
                doUpdateComponents();
185
            }
186
        });
187

    
188
        this.siteURLController = toolsSwingManager.createTextFieldWithHistoryAndBookmarkController(
189
                OnlineSwingCommons.BOOKMARKSANDHISTORY_SITE_URL,
190
                txtSiteURL,
191
                btnSiteURLRefresh,
192
                btnSiteURLHistory,
193
                btnSiteURLBookmarks
194
        );
195
        this.siteURLController.setEnabled(true);
196
        this.siteURLController.addActionListener((ActionEvent e) -> {
197
            doChangeSiteURL();
198
        });
199
        
200
        OnlineUserIdentificationRequesterFactory defaultAuthenticationFactory = null;
201
        DefaultComboBoxModel<LabeledValue<OnlineUserIdentificationRequesterFactory>> userIdentificationRequestersModel = new DefaultComboBoxModel<>();
202
        for (OnlineUserIdentificationRequesterFactory factory : onlineManager.getUserIdentificationRequesters()) {
203
            userIdentificationRequestersModel.addElement(
204
                    new LabeledValueImpl<OnlineUserIdentificationRequesterFactory>(
205
                            factory.getName(), factory
206
                    )
207
            );
208
            if( defaultAuthenticationFactory == null || StringUtils.equalsIgnoreCase(factory.getName(), AUTH_MODE_ONLINE)) {
209
                defaultAuthenticationFactory = factory;
210
            }
211
        }
212
        this.authenticationRequesterConfig = null;
213
        this.cboAuthentication.setModel(userIdentificationRequestersModel);
214
        this.cboAuthentication.setSelectedIndex(-1);
215
        
216
        this.cboAuthentication.addActionListener((ActionEvent e) -> {
217
            doChangeAuthentication();
218
        });
219
        this.btnAuthentication.addActionListener((ActionEvent e) -> {
220
            doAuthenticationRequesterConfig();            
221
        });
222
        this.btnAuthenticationTest.addActionListener((ActionEvent e) -> {
223
                doAuthenticationTest();
224
        });
225
        
226
        this.cboProjects.addActionListener((ActionEvent e) -> {
227
            SwingUtilities.invokeLater(() -> {doChangeProject();});
228
        });
229
        
230
        this.workingAreaPicker = new WorkingAreaPickerControllerImpl(
231
            () -> {return getSite();},
232
            txtWorkingAreaLabel,
233
            txtWorkingArea,
234
            btnWorkingAreaFromView,
235
            btnWorkingAreaDialog,
236
            btnWorkingAreaHistory,
237
            btnWorkingAreaBookmarks,
238
            () -> {
239
                LabeledValue<MapControl> n = onlineservices.getActiveMapControl();
240
                return (n == null) ? null : n.getValue();
241
            },
242
            () -> {
243
                List<OnlineLayer> selectedLayers = getLayersModel().getSelectedLayers();
244
                if (selectedLayers.isEmpty()) {
245
                    return null;
246
                }
247
                return selectedLayers;
248
            }
249
        );
250
        this.workingAreaPicker.addChangeListener((ChangeEvent e) -> {
251
            doUpdateComponents();
252
        });
253
        
254
        SwingUtilities.invokeLater(() -> { clearMessage(); });
255
        ToolsSwingUtils.ensureRowsCols(this, 15, 40, 25, 100);
256

    
257
    }
258

    
259
    @Override
260
    public void setDialog(Dialog dialog) {
261
        this.dialog = dialog;
262
        this.doUpdateComponents();
263
    }
264

    
265
    private void doUpdateComponents() {
266
        message("");
267
        
268
        boolean enableAll = true;
269
        
270
        boolean isThereURL = false;
271
        boolean isThereAuth = false;
272
        boolean isThereSite = false;
273
        boolean isThereProject = false;
274
        boolean isThereDbfile = false;
275
        boolean isThereWsName = false;
276
        boolean isThereSelectedsLayers = false;
277
        boolean isThereWorkingArea = false;
278
        
279
        // 0. Check is processing
280
        enableAll = !this.isProcessing();
281
        
282
        // 1. Check Site URL
283
        if( enableAll ) {
284
            URL url = this.getSiteURL();
285
            isThereURL = (url != null);
286
            if( !isThereURL ) {
287
                if( StringUtils.isBlank(this.txtSiteURL.getText()) ) {
288
                    message2(enableAll, "_The_site_url_is_blank");
289
                } else {
290
                    message2(enableAll, "_Invalid_site_url");
291
                }
292
            }
293
            enableAll = enableAll && isThereURL;
294
        }
295
            
296
        // Check auth
297
        if( enableAll ) {
298
            isThereAuth = (this.authenticationRequesterConfig != null);
299
            if( !isThereAuth ) {
300
                message2(enableAll, "_Select_a_Online_authentication_mode");
301
            }
302
            enableAll = enableAll && isThereAuth;
303
        }
304

    
305
        // Check site
306
        if( enableAll ) {
307
            isThereSite = (this.getSite() != null);
308
            if( !isThereSite ) {
309
                message2(enableAll, "_Select_a_valid_Online_url_and_authentication_mode");
310
            }
311
            enableAll = enableAll && isThereSite;
312
        }
313

    
314
        // 2. Check online project
315
        if( enableAll ) {
316
            OnlineProject project = this.getProject();
317
            isThereProject = (project != null);
318
            if( !isThereProject ) {
319
                message2(enableAll, "_Select_a_Online_project");
320
            }
321
            enableAll = enableAll && isThereProject;
322
        }
323

    
324
        // 3. Check workspace file
325
        if( enableAll ) {
326
            File f = this.getWorkspaceFile();
327
            isThereDbfile = (f!=null);
328
            if( !isThereDbfile ) {
329
                message2(enableAll, "_Selected_working_copy_file_is_not_valid");
330
            } else {
331
                f = H2SpatialUtils.normalizeH2File(f);
332
                if( f.exists() ) {
333
                    message2(enableAll, "_Selected_working_copy_file_already_exists");
334
                    isThereDbfile = false;
335
                }
336
            }
337
            enableAll = enableAll && isThereDbfile;
338
        }
339
        
340
        // 4. Check workspace name        
341
        if( enableAll ) {
342
            String wsname = this.getWorkspaceName();
343
            isThereWsName = StringUtils.isNotBlank(wsname);
344
            if( !isThereWsName ) {
345
                message2(enableAll, "_Need_a_working_copy_name");
346
            } else {
347
                OnlineManager manager = OnlineLocator.getOnlineManager();
348
                OnlineWorkingcopyDescriptor ws = manager.getWorkingcopyDescriptor(wsname);
349
                if( ws!=null ) {
350
                    message2(enableAll, "_A_working_copy_with_that_name_already_exists");
351
                    isThereWsName = false;
352
                }
353
            }
354
            enableAll = isThereURL && isThereWsName;
355
        }
356

    
357
        
358
        // 5. Check layers selected
359
        if( enableAll || isThereProject ) {
360
            isThereSelectedsLayers = !this.getLayersModel().isSelectionEmpty();
361
            if( !isThereSelectedsLayers ) {
362
                message2(enableAll, "_You_must_select_some_layer");
363
            }
364
            enableAll = isThereURL && isThereSelectedsLayers;
365
        }
366
        
367
        // 6. Check selected working area
368
        if( enableAll || isThereProject ) {
369
            WorkingArea workingArea = this.workingAreaPicker.getWithoutAddHistory();
370
            isThereWorkingArea = (workingArea != null && workingArea.getValue() != null);
371
            if( !isThereWorkingArea ) {
372
                message2(enableAll, "_You_must_select_a_working_area");
373
            }
374
            enableAll = isThereURL && isThereWorkingArea;
375
        }
376
        
377
        
378
        this.siteURLController.setEnabled(!this.isProcessing());
379
        this.cboAuthentication.setEnabled(isThereURL);
380
        this.btnAuthentication.setEnabled(isThereAuth && this.authenticationRequesterConfig.hasIdentificationConfig());
381
        this.btnAuthenticationTest.setEnabled(isThereAuth);
382
        this.cboProjects.setEnabled(isThereURL && this.cboProjects.getModel().getSize()>0 );
383
        this.workspaceFilePicker.setEnabled(isThereProject);
384
        this.chkCreateConnectionToDatabase.setEnabled(isThereProject && isThereDbfile);
385
        this.txtWorkspaceName.setEnabled(isThereProject && isThereDbfile);
386
        this.tblLayers.setEnabled(isThereURL && isThereProject);
387
        this.txtWorkingAreaLabel.setEnabled(isThereProject);
388
        
389
        this.txtWorkingArea.setEnabled(isThereProject);
390
        this.btnWorkingAreaFromView.setEnabled(isThereProject);
391
        this.btnWorkingAreaDialog.setEnabled(isThereSelectedsLayers);
392
        
393
        if (this.dialog != null) {
394
            this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK,enableAll);
395
        }
396
    }
397

    
398
    
399
    @Override
400
    public JComponent asJComponent() {
401
        return this;
402
    }
403

    
404
    private void translate() {
405
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
406
        swingManager.translate(this.chkCreateConnectionToDatabase);
407
        swingManager.translate(this.lblWorkspaceName);
408
        swingManager.translate(this.lblSiteUrl);
409
        swingManager.translate(this.lblProjects);
410
        swingManager.translate(this.lblWorkspaceFile);
411
        swingManager.translate(this.lblLayers);
412
        swingManager.translate(this.lblWorkspaceFile);
413
        swingManager.translate(this.lblWorkingArea);
414
        swingManager.translate(this.btnWorkingAreaFromView);
415
        swingManager.translate(this.btnWorkingAreaDialog);
416
    }
417
    
418
    private URL getSiteURL() {
419
        if(siteURLController.isEnabled()){
420
            String value = this.siteURLController.getText();
421

    
422
            URL url;
423
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
424
            try {
425
                 url = (URL) manager.coerce(DataTypes.URL, value);
426
            } catch (CoercionException ex) {
427
                String s = (value==null)? "null":StringUtils.abbreviate(value, 100);
428
                LOGGER.warn("Can't coerce value ("+s+") to "+DataTypes.URL_NAME+".", ex);
429
                return null;
430
            }
431

    
432
            return url;
433
        }
434
        return null;
435
    }
436

    
437
    private File getWorkspaceFile() {
438
        File file = this.workspaceFilePicker.get();
439
        return file;
440
    }
441

    
442
    @Override
443
    public int actionPerformed() {
444
        I18nManager i18n = ToolsLocator.getI18nManager();
445
        OnlineManager manager = OnlineLocator.getOnlineManager();
446
        OnlineProject theProject = this.getProject();
447
        WorkingArea workingArea = this.workingAreaPicker.get();
448
        if (theProject == null ) {
449
            return ERR_PROJECT_REQUIRED;
450
        }
451
        if (workingArea==null ) {
452
            return ERR_WORKINGAREA_REQUIRED;
453
        }
454
        int err = ERR_NO_ERROR;
455
        SimpleTaskStatus status = this.getTaskStatus();
456
        try {
457
            File file = this.getWorkspaceFile();
458
            if (file != null) {
459
                status.setTitle(i18n.getTranslation("_Initializing_workspace"));
460
                err = manager.initWorkingcopy(file, theProject, getWorkspaceName(), getTaskStatus());
461
                if (err == ERR_NO_ERROR ) {
462
                    OnlineWorkingcopy ws = manager.openWorkingcopy(file);
463
                    if( this.chkCreateConnectionToDatabase.isSelected() ) {
464
                        ws.addToConnectionPool();
465
                    }
466
                    ws.download_config(true, status);
467
                    ws.download_resources(true, status);
468
                    ws.setCurrentWorkingArea(workingArea);
469
                    LayersTableModel model = (LayersTableModel) this.tblLayers.getModel();
470
                    List<OnlineLayer> selectedLayers = model.getSelectedLayers();
471
                    if( !CollectionUtils.isEmpty(selectedLayers) ) {
472
                        status.setRangeOfValues(0, selectedLayers.size());
473
                        status.setCurValue(0);
474
                        for (OnlineLayer layer : selectedLayers) {
475
                            status.incrementCurrentValue();
476
                            status.setTitle(i18n.getTranslation("_Adding_layer")+" "+layer.getName());
477
                            if( status.isCancellationRequested() ) {
478
                                status.cancel();
479
                                throw new UserCancelTaskException();
480
                            }
481
                            String fieldForLabel = "ogc_fid"; // FIXME: Pedir en el GUI
482
                            String label = layer.getName(); // FIXME: Pedir en el GUI
483
                            int tileSize = layer.calculateTileSize(5000, status);
484
                            ws.addEntity(
485
                                    layer.getFeatureType(), 
486
                                    layer.getName(), 
487
                                    layer.getTitle(), 
488
                                    fieldForLabel, 
489
                                    label, 
490
                                    layer.getPkName(),
491
                                    tileSize
492
                            );
493
                        }
494

    
495
                        status.setRangeOfValues(0, selectedLayers.size());
496
                        status.setCurValue(0);
497
                        for (OnlineLayer layer : selectedLayers) {
498
                            status.incrementCurrentValue();
499
                            status.setTitle(i18n.getTranslation("_Downloading_layer")+" "+layer.getName());
500
                            if( status.isCancellationRequested() ) {
501
                                status.cancel();
502
                                throw new UserCancelTaskException();
503
                            }
504
                            err = ws.download(layer.getName(),workingArea.getValue(), status);
505
                            if (err != ERR_NO_ERROR ) {
506
                                // TODO: Que hacer aqui si da error
507
                            }
508
                        }
509
                    }
510
                }
511

    
512
            }
513
        } catch (UserCancelTaskException ex) {
514
            LOGGER.info("Cancelled by user.");
515
            err = OnlineManager.ERR_CANCELLED_BY_USER;
516
        } catch (Exception ex) {
517
            LOGGER.info("Can't initialize workspace", ex);
518
            err = OnlineManager.ERR_EXCEPTION;
519
        }
520
        if( err==ERR_NO_ERROR || err == OnlineManager.ERR_CANCELLED_BY_USER) {
521
            URL siteurl = getSiteURL();
522
            if( siteurl != null ) {
523
                this.siteURLController.addHistory(siteurl.toString());
524
            }
525
        }
526
        return err;
527
    }
528

    
529
    private OnlineSite createSite() {
530
        try {
531
            OnlineManager manager = OnlineLocator.getOnlineManager();
532
            URL url = getSiteURL();
533
            if (url != null){
534
                return manager.connectSite(this.authenticationRequesterConfig, url);
535
            }
536
        } catch (IOException ex) {
537
            LOGGER.warn("Can't connect to site '"+this.txtSiteURL.getText()+"'", ex);
538
        }
539
        return null;
540
    }
541

    
542
    private OnlineSite getSite() {
543
        if (site == null){
544
            this.site = createSite();
545
        }
546
        return site;
547
    }
548

    
549
    private OnlineProject getProject() {
550
        OnlineSite theSite = this.getSite();
551
        if( theSite == null ) {
552
            return null;
553
        }
554
        LabeledValue<Integer> item = (LabeledValue<Integer>) this.cboProjects.getSelectedItem();
555
        if( item == null ) {
556
            return null;
557
        }
558
        return theSite.getProject(item.getValue());
559
    }
560

    
561
    @Override
562
    public String getWorkspaceName() {
563
        return txtWorkspaceName.getText();
564
    }
565

    
566
    public static void selfRegister() {
567

    
568
    }
569

    
570
    @Override
571
    public boolean isProcessing() {
572
        return false;
573
    }
574

    
575
    private void message2(boolean doMessage, String s) {
576
        if( doMessage ) {
577
            message(s);
578
        }
579
    }
580
    
581
    private void message(String message) {
582
        if( notInSwingThreadInvokeLater(() -> {message(message);}) ) {
583
            return;
584
        }
585
        String s = message;
586
        if( StringUtils.startsWith(s, "_") ) {
587
            I18nManager i18n = ToolsLocator.getI18nManager();
588
            s = i18n.getTranslation(s);
589
        }
590
        this.lblStatusMessages.setText(s);
591
//        this.lblStatusMessages.setToolTipText(toolTipText);        
592
        
593
    }
594

    
595
    @Override
596
    public ImageIcon loadImage(String imageName) {
597
        return OnlineSwingCommons.loadImage(imageName);
598
    }
599

    
600
    private void doChangeSiteURL() {
601
        URL url = null;
602
        try {
603
            OnlineManager onlineManager = OnlineLocator.getOnlineManager();            
604
            url = this.getSiteURL();
605
            if( url == null || this.authenticationRequesterConfig==null ) {
606
                DisposeUtils.dispose(this.site);
607
                this.site = null;
608
                return;
609
            }
610
            this.site = onlineManager.connectSite(this.authenticationRequesterConfig,url);
611
            this.siteURLController.addHistory(url.toString());
612
            doFillProjects();
613
            doUpdateComponents();
614
        } catch (Exception ex) {
615
            LOGGER.warn("Can't chage site url ("+url+").",ex);
616
        }        
617
    }
618
    
619
    private void doFillProjects() {
620
        OnlineSite theSite = this.getSite();
621
        if( theSite == null ) {
622
            return;
623
        }
624
        List<LabeledValue<Integer>> projects = new ArrayList<>();
625
        for (OnlineProject project : theSite.projects()) {
626
            projects.add(new LabeledValueImpl<>(project.getTitle(),project.getId()));
627
        }
628
        projects.sort((LabeledValue<Integer> o1, LabeledValue<Integer> o2) -> o1.getLabel().compareTo(o2.getLabel()));
629
        DefaultComboBoxModel<LabeledValue<Integer>> model = new DefaultComboBoxModel<>();
630
        for (LabeledValue<Integer> project : projects) {
631
            model.addElement(project);
632
        }
633
        this.cboProjects.setModel(model);
634
        this.cboProjects.setSelectedIndex(-1);
635
        this.workspaceFilePicker.set(null);
636
        this.txtWorkspaceName.setText("");
637
        this.clearLayers();
638
    }
639
    
640
    private void doChangeProject() {
641
        OnlineSite theSite = this.getSite();
642
        LabeledValue<Integer> selected = (LabeledValue<Integer>) this.cboProjects.getSelectedItem();
643
        if( selected == null || theSite == null ) {
644
            this.workspaceFilePicker.set(null);
645
            this.txtWorkspaceName.setText("");
646
            this.clearLayers();
647
            return;
648
        }
649
        int projectId = selected.getValue();
650
        OnlineProject project = theSite.getProject(projectId);
651

    
652
        List<OnlineLayer> layers = new ArrayList<>();
653
        for (OnlineLayer layer : project.layers()) {
654
            if( layer.isHidden() ) {
655
                continue;
656
            }
657
            layers.add(layer);
658
        }
659
        layers.sort((OnlineLayer o1, OnlineLayer o2) -> o1.getLabel().compareTo(o2.getLabel()));
660
        LayersTableModel model = new LayersTableModel(layers);
661
        model.addTableModelListener(new TableModelListener() {
662
            @Override
663
            public void tableChanged(TableModelEvent e) {
664
                doUpdateComponents();
665
            }
666
        });
667
        this.tblLayers.setModel(model);
668
        doUpdateComponents();
669
    }
670

    
671
    private void clearLayers() {
672
        LayersTableModel model = new LayersTableModel();
673
        this.tblLayers.setModel(model);
674
    }
675
    
676
    private LayersTableModel getLayersModel() {
677
        return (LayersTableModel) this.tblLayers.getModel();
678
    }
679
    
680
    private SimpleTaskStatus getTaskStatus() {
681
        SimpleTaskStatus taskStatus = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus("_Create_workingcopy");
682
        taskStatus.setAutoremove(true);
683
        taskStatus.add();
684
        taskStatus.setIndeterminate();
685
        this.taskStatusController.bind(taskStatus);
686
        return taskStatus;
687
    }
688

    
689
    public void setVisibleStatus(boolean visible) {
690
        if( notInSwingThreadInvokeLater(() -> {setVisibleStatus(visible);}) ) {
691
            return;
692
        }
693
        this.lblStatusTitle.setVisible(visible);
694
        this.pbStatus.setVisible(visible);
695
        this.lblStatusMessages.setVisible(true);
696
    }
697
    
698
    private void clearMessage() {
699
        message(" ");
700
    }
701
    
702
    private void doChangeAuthentication() {
703
        LabeledValue<OnlineUserIdentificationRequesterFactory> item = (LabeledValue<OnlineUserIdentificationRequesterFactory>) this.cboAuthentication.getSelectedItem();
704
        if (item == null) {
705
            return;
706
        }
707
        OnlineUserIdentificationRequesterFactory factory = item.getValue();
708
        if (this.authenticationRequesterConfig!=null && StringUtils.equalsIgnoreCase(factory.getName(), this.authenticationRequesterConfig.getName())) {
709
            return;
710
        }
711
        URL url = null;
712
        try {
713
            url = this.getSiteURL();
714
            if( url == null ) {
715
                return;
716
            }
717
            this.authenticationRequesterConfig = factory.create(url.toString());
718
            OnlineManager onlineManager = OnlineLocator.getOnlineManager();
719
            if (url == null || this.authenticationRequesterConfig == null) {
720
                DisposeUtils.dispose(this.site);
721
                this.site = null;
722
                return;
723
            }
724
            this.site = onlineManager.connectSite(this.authenticationRequesterConfig, url);
725
            doFillProjects();
726
            doUpdateComponents();
727
        } catch (Exception ex) {
728
            LOGGER.warn("Can't chage autentication mode.", ex);
729
        }
730
    }
731

    
732
    private void doAuthenticationRequesterConfig() {
733
        if( this.getSiteURL()==null || this.authenticationRequesterConfig==null ) {
734
            return;
735
        }
736
        if( !this.authenticationRequesterConfig.hasIdentificationConfig() ) {
737
            return;
738
        }
739
        if( this.authenticationRequesterConfig.requestIdentificationConfig() ) {
740
            // reconstruimos el site con la nueva configuaracion.
741
            this.site = this.createSite();
742
        }
743
    }
744
    
745
    private void doAuthenticationTest() {
746
        if( this.getSiteURL()==null || this.authenticationRequesterConfig==null ) {
747
            LOGGER.warn("Can't run authentication test. Configure authentication.");
748
            return;
749
        }
750
        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
751
        I18nManager i18n = ToolsLocator.getI18nManager();
752
        OnlineUserIdentificationRequester requester = this.authenticationRequesterConfig.createUserIdentificationRequester();
753
        if( requester==null ) {
754
//            LOGGER.warn("Can't run authentication test. Configure authentication.");
755
            dialogs.messageDialog(
756
                    i18n.getTranslation("_Cant_run_authentication_test") 
757
                            + "\n"
758
                            + i18n.getTranslation("_Review_the_authentication_settings"), 
759
                    i18n.getTranslation(i18n.getTranslation("_Authentication_testing")), 
760
                    JOptionPane.WARNING_MESSAGE
761
            );
762
            return;
763
        }
764
        if( !requester.requestIdentification() ) {
765
//            LOGGER.warn("Test authentication failed");
766
            dialogs.messageDialog(
767
                    i18n.getTranslation("_Test_authentication_failed"), 
768
                    i18n.getTranslation(i18n.getTranslation("_Authentication_testing")), 
769
                    JOptionPane.WARNING_MESSAGE
770
            );
771
            return;
772
        }
773
//        LOGGER.warn("Test authentication ok");
774
        dialogs.messageDialog(
775
                i18n.getTranslation("_Passed_the_authentication_test"), 
776
                i18n.getTranslation(i18n.getTranslation("_Authentication_testing")), 
777
                JOptionPane.WARNING_MESSAGE
778
        );
779
    }
780
}