Leyendo un shapefile ESRI de un archivo zip durante el tiempo de ejecución en Java – DataStoreFinder.getDataStore (connectParameters) devuelve null

Estamos creando un servicio para cargar archivos zip que contienen un archivo de forma ESRI. El servicio debe poder leer el shapefile y hacer cosas con su contenido. Así que he creado una clase que descomprime el archivo zip en la carpeta temporal (subcarpeta de System.getProperty (“java.io.tmpdir”)).

Otra clase llama al método Unzip de la clase Unzip y luego intenta leer el shapefile desempaquetado usando Geotools. Utiliza el método Geotools DataStoreFinder.getDataStore (Map params) para crear un almacén de datos desde el shapefile descomprimido. Aquí se produce el problema: el método getDataStore devuelve nulo. He probado la URL, se ve bien. El archivo del cual deriva la URL existe, es un archivo y puede ser leído por la aplicación (probado usando shapefile.exists (), shapefile.isFile (), shapefile.canRead ()). Entonces, ¿qué podría estar mal? ¿Por qué me devuelven nulo?

Aquí está el código (relevante):

import java.io.File; import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.geotools.data.DataStore; import org.geotools.data.DataStoreFinder; import org.geotools.data.FeatureSource; import org.geotools.feature.FeatureCollection; import org.geotools.feature.FeatureIterator; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import com.geodan.equus.entity.dataset.BasicFeature; import com.geodan.equus.exception.EquusException; import com.geodan.equus.processor.EquusProcessor; import com.geodan.util.io.UnzipUtils; import com.vividsolutions.jts.geom.Geometry; public class ShapefileProcessor implements EquusProcessor { private static final File TEMP_UNZIP_DIR = new File( System.getProperty("java.io.tmpdir") + File.separator + "atlas_temp_unzip_dir"); public static Set importFeatures(final File zipFile) throws EquusException { // Check if the input file has the zipfile extension if (!zipFile.getName().endsWith(".zip")) { throw new EquusException( "The file is not a zipfile. It cannot be processed."); } // Unzip the file try { UnzipUtils.unzip(zipFile, TEMP_UNZIP_DIR); } catch (IOException error) { throw new EquusException("The zipfile cannot be unzipped.", error); } // Validate whether the unzipped folder contains a shapefile and return it File shapefile = new File(""); try { shapefile = findShapefile(TEMP_UNZIP_DIR); } catch (IOException error) { throw new EquusException( "The zipfile does not contain a shapefile. Cannot process its contents.", error); } // Collect the features from the shapefile and put them into an iterator FeatureIterator featureIterator; try { featureIterator = readShapefile(shapefile); } catch (EquusException e) { throw new EquusException(e.getMessage(), e); } // Create a Set filled with the features in the FeatureIterator Set features = createFeatureSet(featureIterator); return features; } private static File findShapefile(File unzipPath) throws IOException { File shapefile = new File(""); // Find first .shp file in the unzip folder File[] unzippedFiles = unzipPath.listFiles(); for (int i = 0; i < unzippedFiles.length; i++) { if (unzippedFiles[i].getName().endsWith(".shp")) { shapefile = new File(unzipPath + File.separator + unzippedFiles[i].getName()); break; } } if (shapefile.toString() == "") { throw new IOException("No shapefile present in '" + unzipPath + "'."); } return shapefile; } private static FeatureIterator readShapefile(File shapefile) throws EquusException { // Collects the features from a shapefile and puts them into an iterator FeatureCollection featureCollection; try { Map connectParameters = new HashMap(); connectParameters.put("url", shapefile.toURI().toURL()); DataStore dataStore = DataStoreFinder.getDataStore(connectParameters); String typeName = dataStore.getTypeNames()[0]; FeatureSource featureSource = dataStore.getFeatureSource(typeName); featureCollection = featureSource.getFeatures(); } catch (Exception e) { throw new EquusException( "Features cannot be retrieved from the shapefile.", e); } return featureCollection.features(); } private static Set createFeatureSet( FeatureIterator featureIterator) { SimpleFeature simpleFeature = null; Set features = new HashSet(); while (featureIterator.hasNext()) { simpleFeature = featureIterator.next(); BasicFeature feature = new BasicFeature(); feature.setGeometry((Geometry) simpleFeature.getDefaultGeometry()); features.add(feature); } return features; } }