Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / java / org / gvsig / app / extension / resourcesmanager / ResourcesLoaderPanel.java @ 46452

History | View | Annotate | Download (17.5 KB)

1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package org.gvsig.app.extension.resourcesmanager;
7

    
8
import java.awt.event.ActionEvent;
9
import java.awt.event.ActionListener;
10
import java.io.File;
11
import java.io.FileInputStream;
12
import java.io.IOException;
13
import java.util.Collection;
14
import java.util.Collections;
15
import java.util.List;
16
import java.util.logging.Level;
17
import javax.swing.DefaultListModel;
18
import javax.swing.DefaultListSelectionModel;
19
import javax.swing.ImageIcon;
20
import javax.swing.JComponent;
21
import javax.swing.JFileChooser;
22
import javax.swing.ListSelectionModel;
23
import javax.swing.event.ChangeEvent;
24
import javax.swing.event.ChangeListener;
25
import javax.swing.event.ListSelectionEvent;
26
import javax.swing.event.ListSelectionListener;
27
import org.apache.commons.io.FileUtils;
28
import org.apache.commons.io.IOUtils;
29
import org.apache.commons.lang3.ArrayUtils;
30
import org.gvsig.andami.PluginsLocator;
31
import org.gvsig.app.ApplicationLocator;
32
import org.gvsig.fmap.dal.DALLocator;
33
import org.gvsig.fmap.dal.DataManager;
34
import org.gvsig.fmap.dal.DataStore;
35
import org.gvsig.fmap.dal.DataStoreParameters;
36
import org.gvsig.fmap.dal.DatabaseWorkspaceManager;
37
import org.gvsig.fmap.dal.StoresRepository;
38
import org.gvsig.fmap.dal.exception.InitializeException;
39
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
40
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
41
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
42
import org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer;
43
import org.gvsig.fmap.dal.swing.DALSwingLocator;
44
import org.gvsig.tools.ToolsLocator;
45
import org.gvsig.tools.folders.FoldersManager;
46
import org.gvsig.tools.resourcesstorage.FilesResourcesStorage;
47
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
48
import org.gvsig.tools.swing.api.Component;
49
import org.gvsig.tools.swing.api.ListElement;
50
import org.gvsig.tools.swing.api.ToolsSwingLocator;
51
import org.gvsig.tools.swing.api.ToolsSwingManager;
52
import org.gvsig.tools.swing.api.ToolsSwingUtils;
53
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
54
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
55
import org.gvsig.tools.util.LabeledValue;
56
import org.gvsig.tools.util.LabeledValueImpl;
57
import org.slf4j.Logger;
58
import org.slf4j.LoggerFactory;
59

    
60
/**
61
 *
62
 * @author fdiaz
63
 */
64
public class ResourcesLoaderPanel extends ResourcesLoaderPanelView implements Component {
65

    
66
    private static final Logger LOGGER = LoggerFactory.getLogger(ResourcesLoaderPanel.class);
67

    
68
    private PickerController<JDBCServerExplorerParameters> connectionPicker;
69
    
70
    private JDBCServerExplorerParameters connection;
71
    private JDBCServerExplorer server;
72

    
73

    
74
    public ResourcesLoaderPanel() {
75
        translate();
76
        try {
77
            FileUtils.forceMkdir(getLocalResourcesPath());
78
        } catch (IOException ex) {
79
            LOGGER.warn("Can't create local resources path.", ex);
80
        }
81
        initComponents();
82
    }
83
    
84
    @Override
85
    public JComponent asJComponent() {
86
        return this;
87
    }
88
    
89
    private void translate() {
90
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
91
        swingManager.translate(this.lblConnection);
92
        swingManager.translate(this.lblDBResources);
93
        swingManager.translate(this.lblLocalResources);
94
        swingManager.translate(this.btnDownload);
95
        swingManager.translate(this.btnUpload);
96
        swingManager.translate(this.btnAddLocal);
97
        swingManager.translate(this.btnDeleteLocal);
98
        swingManager.translate(this.btnDeleteRemote);
99
        swingManager.translate(this.chkUseLocalResources);
100
    }
101

    
102

    
103
    private void initComponents() {
104
        this.connectionPicker = DALSwingLocator.getSwingManager().createJDBCConnectionPickerController(
105
                this.cboConnection,
106
                this.btnConnection
107
        );
108
        this.connectionPicker.addChangeListener(new ChangeListener() {
109
            @Override
110
            public void stateChanged(ChangeEvent e) {
111
                connection = null;
112
                if(!isValidSelectedConnection()){
113
                    connectionPicker.set(null);
114
                }
115
                chkUseLocalResources.setSelected(getUseLocalResources());
116
                refreshDBResources();
117
                doUpdateEnableComponents();
118
            }
119
        });
120
        
121
        DefaultListSelectionModel lstDBResourcesSelectionModel = new DefaultListSelectionModel();
122
        lstDBResourcesSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
123
        lstDBResources.setSelectionModel(lstDBResourcesSelectionModel);
124
        lstDBResourcesSelectionModel.addListSelectionListener(new ListSelectionListener() {
125
            @Override
126
            public void valueChanged(ListSelectionEvent e) {
127
                doUpdateEnableComponents();
128
            }
129
        });
130
        
131
        refreshLocalResources();
132

    
133
        DefaultListSelectionModel lstLocalResourcesSelectionModel = new DefaultListSelectionModel();
134
        lstLocalResourcesSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
135
        lstLocalResources.setSelectionModel(lstLocalResourcesSelectionModel);
136
        lstLocalResourcesSelectionModel.addListSelectionListener(new ListSelectionListener() {
137
            @Override
138
            public void valueChanged(ListSelectionEvent e) {
139
                doUpdateEnableComponents();
140
            }
141
        });
142
        
143
        btnDownload.addActionListener(new ActionListener() {
144
            @Override
145
            public void actionPerformed(ActionEvent e) {
146
                doDownload();
147
            }
148
        });
149
        btnUpload.addActionListener(new ActionListener() {
150
            @Override
151
            public void actionPerformed(ActionEvent e) {
152
                doUpload();
153
            }
154
        });
155
        btnDeleteLocal.addActionListener(new ActionListener() {
156
            @Override
157
            public void actionPerformed(ActionEvent e) {
158
                doDeleteLocal();
159
            }
160
        });
161
        btnDeleteRemote.addActionListener(new ActionListener() {
162
            @Override
163
            public void actionPerformed(ActionEvent e) {
164
                doDeleteRemote();
165
            }
166
        });
167
        btnAddLocal.addActionListener(new ActionListener() {
168
            @Override
169
            public void actionPerformed(ActionEvent e) {
170
                doAddlocal();
171
            }
172
        });
173
        
174
        chkUseLocalResources.addActionListener(new ActionListener() {
175
            @Override
176
            public void actionPerformed(ActionEvent e) {
177
                doChangeUseLocalResources();
178
            }
179

    
180
        });
181

    
182
        chkUseLocalResources.setSelected(getUseLocalResources());
183
        doUpdateEnableComponents();
184
        ToolsSwingUtils.ensureRowsCols(this, 20, 60);
185
    }
186

    
187
    private void doDownload() {
188
        LabeledValue selected = (LabeledValue) lstDBResources.getSelectedValue();
189
        if (selected != null) {
190
            String name = selected.getLabel();
191
            ResourcesStorage.Resource resource = (ResourcesStorage.Resource) selected.getValue();
192

    
193
            FilesResourcesStorage localResourcesStorage = getLocalResourcesStorage();
194
            if (localResourcesStorage != null) {
195
                try {
196
                    if (localResourcesStorage.exists(name)) {
197
                        ResourcesStorage.Resource localResource = localResourcesStorage.getResource(name);
198
                        copy(resource, localResource);
199
                    } else {
200
                        localResourcesStorage.add(name, resource.asInputStream());
201
                    }
202
                    refreshLocalResources();
203
                    refreshDocuments();
204
                } catch (IOException ex) {
205
                    LOGGER.warn("Can't download '" + name + "' resource'", ex);
206
                }
207
            }
208
        }
209
    }
210

    
211
    private void doUpload() {
212
        LabeledValue selected = (LabeledValue) lstLocalResources.getSelectedValue();
213
        if (selected != null) {
214
            String name = selected.getLabel();
215
            ResourcesStorage.Resource resource = (ResourcesStorage.Resource) selected.getValue();
216

    
217
            ResourcesStorage remoteResourcesStorage = getDBResourcesStorage();
218
            if (remoteResourcesStorage != null) {
219
                try {
220
                    if (remoteResourcesStorage.exists(name)) {
221
                        ResourcesStorage.Resource remoteResource = remoteResourcesStorage.getResource(name);
222
                        copy(resource, remoteResource);
223
                    } else {
224
                        remoteResourcesStorage.add(name, resource.asInputStream());
225
                    }
226
                    refreshDBResources();
227
                    refreshDocuments();
228
                } catch (IOException ex) {
229
                    LOGGER.warn("Can't upload '" + name + "' resource'", ex);
230
                }
231
            }
232
        }
233
    }
234

    
235
    private void doDeleteLocal() {
236
        LabeledValue selected = (LabeledValue) lstLocalResources.getSelectedValue();
237
        if (selected != null) {
238
            String name = selected.getLabel();
239

    
240
            FilesResourcesStorage localResourcesStorage = getLocalResourcesStorage();
241
            if (localResourcesStorage != null && localResourcesStorage.exists(name)) {
242
                localResourcesStorage.remove(name);
243
                refreshLocalResources();
244
            }
245
        }
246
    }
247

    
248
    private void doDeleteRemote() {
249
        LabeledValue selected = (LabeledValue) lstDBResources.getSelectedValue();
250
        if (selected != null) {
251
            String name = selected.getLabel();
252

    
253
            ResourcesStorage remoteResourcesStorage = getDBResourcesStorage();
254
            if (remoteResourcesStorage != null && remoteResourcesStorage.exists(name)) {
255
                remoteResourcesStorage.remove(name);
256
                refreshDBResources();
257
            }
258
        }
259
    }
260

    
261
    private void doAddlocal() {
262
        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
263
        FoldersManager folderManager = ToolsLocator.getFoldersManager();
264
        File[] f = dialogs.showChooserDialog(
265
                "_Resources_loader", //this.dialogTitle,
266
                JFileChooser.OPEN_DIALOG,
267
                JFileChooser.FILES_ONLY,
268
                false,
269
                null,
270
                null,
271
                true
272
        );
273

    
274
        if (ArrayUtils.isEmpty(f)) {
275
            return;
276
        }
277
        
278
        String name = f[0].getName();
279
        try {
280
            FileInputStream is = new FileInputStream(f[0]);
281

    
282
            FilesResourcesStorage localResourcesStorage = getLocalResourcesStorage();
283
            if (localResourcesStorage != null) {
284
                if (localResourcesStorage.exists(name)) {
285
                    ResourcesStorage.Resource localResource = localResourcesStorage.getResource(name);
286
                    IOUtils.copy(is, localResource.asOutputStream());
287
                    is.close();
288
                    localResource.close();
289
                } else {
290
                    localResourcesStorage.add(name, is);
291
                }
292
                refreshLocalResources();
293
            }
294
        } catch (IOException ex) {
295
            LOGGER.warn("Can't add '" + name + "' resource'", ex);
296
        }
297
    }
298

    
299
    private boolean getUseLocalResources() {
300
        DataManager manager = DALLocator.getDataManager();
301
        JDBCServerExplorerParameters con = getConnection();
302
        if(con == null){
303
            return false;
304
        }
305
        DatabaseWorkspaceManager ws = manager.getDatabaseWorkspace(con);
306
        if(ws == null){
307
            return false;
308
        }
309
        return ws.hasAlternativeResourcesStorage();
310
    }
311

    
312
    private boolean isValidSelectedConnection() {
313
        DataManager manager = DALLocator.getDataManager();
314
        JDBCServerExplorerParameters con = this.connectionPicker.get();
315

    
316
        if(con == null){
317
            return false;
318
        }
319
        DatabaseWorkspaceManager ws = manager.getDatabaseWorkspace(con);
320
        if(ws == null){
321
            return false;
322
        }
323
        return true;
324
    }
325

    
326
    private void doChangeUseLocalResources() {
327
        
328
        DataManager manager = DALLocator.getDataManager();
329
        JDBCServerExplorerParameters con = getConnection();
330
        if(con == null){
331
            return;
332
        }
333
        DatabaseWorkspaceManager ws = manager.getDatabaseWorkspace(con);
334
        
335
        if(chkUseLocalResources.isSelected()) {
336
            String s = "<%=$GVSIGHOMEFOLDER%>/plugins/org.gvsig.app.mainplugin/LocalResources";
337
            ws.setAlternativeResourcesStorage(s);
338
        } else {
339
            ws.setAlternativeResourcesStorage(null);
340
        }
341
        refreshDocuments();
342

    
343
    }
344

    
345
    private void refreshDocuments() {
346
        DataManager manager = DALLocator.getDataManager();
347
        JDBCServerExplorerParameters con = getConnection();
348
        if(con == null){
349
            return;
350
        }
351
        DatabaseWorkspaceManager ws = manager.getDatabaseWorkspace(con);
352
        StoresRepository repository = ws.getStoresRepository();
353
        for (String name : repository.keySet()) {
354
            DataStoreParameters params = repository.get(name);
355
            ApplicationLocator.getApplicationManager().refreshDocument(params);
356
        }
357
    }
358

    
359
    private void refreshDBResources() {
360
        ResourcesStorage resourcesStorage = getDBResourcesStorage();
361
        List<String> dbResourcesNames = resourcesStorage == null ? Collections.EMPTY_LIST : resourcesStorage.getResourceNames();
362
        DefaultListModel dBResourcesModel = new DefaultListModel();
363
        for (String resourceName : dbResourcesNames) {
364
            ResourcesStorage.Resource resource = resourcesStorage.getResource(resourceName);
365
            dBResourcesModel.addElement(new LabeledValueImpl<>(resourceName, resource));
366
        }
367
        lstDBResources.setModel(dBResourcesModel);
368
    }
369

    
370
    private void refreshLocalResources() {
371
        FilesResourcesStorage localResourcesStorage = getLocalResourcesStorage();
372
        List<String> localResourcesNames = localResourcesStorage.getResourceNames();
373
        DefaultListModel localResourcesModel = new DefaultListModel();
374
        for (String resourceName : localResourcesNames) {
375
            ResourcesStorage.Resource resource = localResourcesStorage.getResource(resourceName);
376
            localResourcesModel.addElement(new LabeledValueImpl<>(resourceName, resource));
377
        }
378
        lstLocalResources.setModel(localResourcesModel);
379
    }
380

    
381
    @Override
382
    public ImageIcon loadImage(String imageName) {
383
        return ToolsSwingUtils.loadImage(this, imageName);
384
    }  
385
    
386
    public JDBCServerExplorerParameters getConnection() {
387
        if (this.connection == null) {
388
            this.connection = this.connectionPicker.get();
389
        }
390
        return this.connection;
391
    }
392
    
393
    public String getConnectionLabel() {
394
        String label = "";
395
        if (this.getConnection() != null) {
396
            ListElement<JDBCServerExplorerParameters> item = (ListElement<JDBCServerExplorerParameters>) cboConnection.getSelectedItem();
397
            label = item.getLabel();
398
        }
399
        return label;
400
    }
401

    
402
    public JDBCServerExplorer getServer() {
403
        if (this.server == null) {
404
            try {
405
                DataManager dataManager = DALLocator.getDataManager();
406
                if (getConnection() != null) {
407
                    this.server = (JDBCServerExplorer) dataManager.openServerExplorer(
408
                            getConnection().getExplorerName(), getConnection()
409
                    );
410
                }
411
            } catch (InitializeException | ProviderNotRegisteredException | ValidateDataParametersException ex) {
412
                LOGGER.warn("Can't open server " + getConnection().getExplorerName());
413
            }
414
        }
415
        return this.server;
416
    }
417
    
418
    public ResourcesStorage getDBResourcesStorage() {
419
        JDBCServerExplorer theServer = getServer();
420
        return theServer==null?null:theServer.getResourcesStorage();
421
    }
422

    
423
    public final File getLocalResourcesPath() {
424
        File folder = PluginsLocator.getPluginsManager().getApplicationHomeFolder();
425
        File f = FileUtils.getFile(folder, "plugins","org.gvsig.app.mainplugin","LocalResources");
426
        return f;
427
    }
428
    
429
    public FilesResourcesStorage getLocalResourcesStorage() {
430
        File f = getLocalResourcesPath();
431
        FilesResourcesStorage resources = new FilesResourcesStorage(f.getAbsolutePath());
432
        return resources;
433
    }
434
    
435

    
436
    private void doUpdateEnableComponents() {
437
        ResourcesStorage dBResourcesStorage = getDBResourcesStorage();
438
        FilesResourcesStorage localResourcesStorage = getLocalResourcesStorage();
439
        this.chkUseLocalResources.setEnabled(dBResourcesStorage != null);
440
        this.btnDownload.setEnabled(
441
                dBResourcesStorage != null
442
                && localResourcesStorage != null
443
                && lstDBResources.getSelectedValue() != null);
444
        this.btnUpload.setEnabled(
445
                dBResourcesStorage != null
446
                && localResourcesStorage != null
447
                && lstLocalResources.getSelectedValue() != null);
448
        this.btnDeleteLocal.setEnabled(localResourcesStorage != null && lstLocalResources.getSelectedValue() != null);
449
        this.btnDeleteRemote.setEnabled(dBResourcesStorage != null && lstDBResources.getSelectedValue() != null);
450
    }
451
    
452
    private void copy(ResourcesStorage.Resource source, ResourcesStorage.Resource target) throws IOException {
453
        IOUtils.copy(source.asInputStream(), target.asOutputStream());
454
        source.close();
455
        target.close();
456
    }
457
}