Statistics
| Revision:

gvsig-raster / org.gvsig.raster / branches / org.gvsig.raster.2.4 / org.gvsig.raster / org.gvsig.raster.gdal / org.gvsig.raster.gdal.provider / src / main / java / org / gvsig / raster / gdal / provider / RasterGdalFileSystemServerProviderFactory.java @ 8697

History | View | Annotate | Download (5.6 KB)

1
package org.gvsig.raster.gdal.provider;
2

    
3
import java.io.File;
4
import java.util.Arrays;
5
import java.util.HashSet;
6
import java.util.Set;
7

    
8
import org.apache.commons.io.FilenameUtils;
9
import org.gdal.gdal.Driver;
10
import org.gdal.gdal.gdal;
11
import org.gdal.gdalconst.gdalconstConstants;
12
import org.gvsig.fmap.dal.DataServerExplorer;
13
import org.gvsig.fmap.dal.exception.InitializeException;
14
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider;
15
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProviderFactory;
16

    
17
/**
18
 * Factory for GDAL filesystem providers
19
 * @author dmartinezizquierdo
20
 *
21
 */
22
public class RasterGdalFileSystemServerProviderFactory
23
    implements FilesystemServerExplorerProviderFactory {
24

    
25
    private RasterGdalStoreProviderFactory providerFactory;
26
    private String newParams;
27
    private Set<String> validExtensions;
28

    
29
    /**
30
     * Constructor
31
     * @param providerFactory
32
     * @param newParams Definition name of the params used to create a new store
33
     */
34
    public RasterGdalFileSystemServerProviderFactory(RasterGdalStoreProviderFactory providerFactory, String newParams){
35
        this.providerFactory=providerFactory;
36
        this.newParams=newParams;
37
        init();
38
    }
39

    
40
    private void init(){
41
        this.validExtensions=new HashSet<String>();
42
        String driverExtension=(String)getDriver().GetMetadata_Dict().get(gdalconstConstants.GDAL_DMD_EXTENSION);
43
        //At least the driver given extension is always accepted (more can be defined in its parameters)
44
//      GDAL_DMD_EXTENSION only returns an extension. GDAL_DMD_EXTENSIONS should be used instead in GDAL 2.0.
45
//      GDAL_DMD_EXTENSIONS returns a list of accepted extensions separated by a blank
46
//      Meanwhile, most common extensions are added defined in the xml parameters
47
        if (driverExtension!=null){
48
            validExtensions.add(driverExtension);
49
        }
50
    }
51

    
52
    /**
53
     * Adds valid extensions to be accepted by the driver ({"jpg","jpeg","jp2",...})
54
     * @param extensions
55
     */
56
    public void addAcceptedExtensions(String[] extensions){
57
        if (extensions!=null){
58
            for (String extension:extensions){
59
                validExtensions.add(extension.trim());
60
            }
61
        }
62
    }
63

    
64
    @Override
65
    public FilesystemServerExplorerProvider createProvider() throws InitializeException {
66
         return new RasterGdalFileSystemServerProvider(this);
67
    }
68

    
69
    @Override
70
    public boolean accept(File file) {
71
        //If the driver is in the list to be avoided, it will not be opened
72
        String drvName=providerFactory.getDriver().getShortName();
73
        if ( Arrays.asList(RasterGdalLibrary.EXCLUDED_OPEN_DRIVERS).contains(drvName) ){
74
            return false;
75
        }
76

    
77
        if (isAcceptedExtension(file)){
78
            if (!file.exists()) {
79
                return true;
80
            }
81
            return isAcceptedByDriver(file);
82
            
83
            
84
        }
85

    
86
        return false;
87
    }
88

    
89
    private Driver getDriver(){
90
        return providerFactory.getDriver();
91
    }
92

    
93
    /**
94
     * Return true if the File extension is accepted by the FileSystemServerProvider
95
     * @param file
96
     * @return
97
     */
98
    private boolean isAcceptedExtension(File file) {
99
        if (file!=null){
100
            String extension=FilenameUtils.getExtension(file.getName());
101
            if (validExtensions != null && !validExtensions.isEmpty()) {
102
                for (String validExtension : validExtensions) {
103
                    if (validExtension.equalsIgnoreCase(extension)) {
104
                        return true;
105
                    }
106
                }
107
            } else {
108
                return true;
109
            }
110

    
111
        }
112
        return false;
113
    }
114

    
115
    /**
116
     * Returns true if the driver can open the file
117
     * @param file
118
     * @return
119
     */
120
    private boolean isAcceptedByDriver(File file) {
121
        String drvName=getDriver().getShortName();
122

    
123
        Driver openingDriver=null;
124
        openingDriver = gdal.IdentifyDriver(file.getAbsolutePath());
125

    
126
        if (openingDriver==null){
127
            return false;
128
        }
129
        String openingDrvName=openingDriver.getShortName();
130
        return drvName.equalsIgnoreCase(openingDrvName);
131
    }
132

    
133
    @Override
134
    public int allowCreate() {
135
        //If the driver is in the list to be avoided, it will not be created
136
        String drvName=getDriver().getShortName();
137
        if ( Arrays.asList(RasterGdalLibrary.EXCLUDED_STORE_DRIVERS).contains(drvName) ){
138
            return NO;
139
        }
140
        String allowCreate=(String)getDriver().GetMetadata_Dict().get(gdalconstConstants.GDAL_DCAP_CREATE);
141
        String allowCreateCopy=(String)getDriver().GetMetadata_Dict().get(gdalconstConstants.GDAL_DCAP_CREATECOPY);
142

    
143
        if  ( (allowCreate!=null && allowCreate.equalsIgnoreCase("YES")) ||
144
              (allowCreateCopy!=null && allowCreateCopy.equalsIgnoreCase("YES")) ){
145
            return YES;
146
        }else{
147
            return NO;
148
        }
149
    }
150

    
151
    @Override
152
    public String getName() {
153
        return providerFactory.getName();
154
    }
155

    
156
    @Override
157
    public String getDescription() {
158
        return providerFactory.getDescription();
159
    }
160

    
161
    @Override
162
    public int getMode() {
163
        return DataServerExplorer.MODE_RASTER;
164
    }
165

    
166
    @Override
167
    public boolean isMode(int mode) {
168
        return getMode()==mode;
169
    }
170

    
171
    String getNewParamsDefinitionName(){
172
        return newParams;
173
    }
174

    
175
    /**
176
     * Store Provider factory to be used to create a new store
177
     * @return RasterGdalStoreProviderFactory
178
     */
179
    public RasterGdalStoreProviderFactory getProviderFactory(){
180
        return this.providerFactory;
181
    }
182
}