package com.constellio.app.services.schemas.bulkImport.data.xml; import java.io.File; import java.io.Reader; import java.util.ArrayList; import java.util.List; import com.constellio.app.services.schemas.bulkImport.data.ImportDataIterator; import com.constellio.app.services.schemas.bulkImport.data.ImportDataProvider; import com.constellio.data.io.IOServicesFactory; import com.constellio.data.io.services.facades.IOServices; import com.constellio.data.io.services.zip.ZipServiceException; import com.constellio.model.services.factories.ModelLayerFactory; public class XMLImportDataProvider implements ImportDataProvider { //TODO lock mechanism when importing data private static final String TEMP_FOLDER_STREAM_NAME = "XMLImportDataProvider-TempFolder"; private static final String FILE_READER_STREAM_NAME = "XMLImportDataProvider-FileReader"; private IOServicesFactory ioServicesFactory; private boolean deleteOnClose = true; private File xmlFile; private File zipFile; private File tempFolder; private String fileName; XMLImportDataProvider(File file, IOServicesFactory ioServicesFactory, boolean isZipFile, String fileName) { if (isZipFile) { this.zipFile = file; } else { this.xmlFile = file; } this.fileName = fileName; this.ioServicesFactory = ioServicesFactory; } public XMLImportDataProvider() { } public static XMLImportDataProvider forZipFile(ModelLayerFactory modelLayerFactory, File zipFile) { XMLImportDataProvider instance = new XMLImportDataProvider(); instance.zipFile = zipFile; instance.ioServicesFactory = modelLayerFactory.getIOServicesFactory(); return instance; } public static XMLImportDataProvider forFolderOfXml(ModelLayerFactory modelLayerFactory, File folder) { XMLImportDataProvider instance = new XMLImportDataProvider(); instance.tempFolder = folder; instance.deleteOnClose = false; instance.ioServicesFactory = modelLayerFactory.getIOServicesFactory(); return instance; } public static XMLImportDataProvider forSingleXMLFile(ModelLayerFactory modelLayerFactory, File xmlFile) { return forSingleXMLFile(modelLayerFactory, xmlFile, xmlFile.getName()); } public static XMLImportDataProvider forSingleXMLFile(ModelLayerFactory modelLayerFactory, File xmlFile, String fileName) { XMLImportDataProvider instance = new XMLImportDataProvider(); instance.xmlFile = xmlFile; instance.fileName = fileName; instance.deleteOnClose = false; instance.ioServicesFactory = modelLayerFactory.getIOServicesFactory(); return instance; } @Override public void initialize() { if (zipFile != null) { this.tempFolder = ioServicesFactory.newFileService().newTemporaryFolder(getTempFolderStreamName()); try { ioServicesFactory.newZipService().unzip(zipFile, tempFolder); } catch (ZipServiceException e) { throw new RuntimeException(e); } } } @Override public void close() { if (deleteOnClose) { ioServicesFactory.newIOServices().deleteQuietly(tempFolder); } } @Override public int size(String schemaType) { int size = 0; ImportDataIterator iterator = newDataIterator(schemaType); while (iterator.hasNext()) { iterator.next(); size++; } return size; } @Override public List<String> getAvailableSchemaTypes() { List<String> schemaTypes = new ArrayList<>(); if (tempFolder != null && tempFolder.listFiles() != null) { for (File file : tempFolder.listFiles()) { if (file.getName().endsWith(".xml")) { schemaTypes.add(file.getName().replace(".xml", "")); } } } if (xmlFile != null) { schemaTypes.add(xmlFile.getName().replace(".xml", "")); } return schemaTypes; } @Override public ImportDataIterator newDataIterator(String schemaType) { IOServices ioServices = ioServicesFactory.newIOServices(); File file; String currentFileName; if (xmlFile != null) { file = xmlFile; currentFileName = fileName; } else { file = new File(tempFolder, schemaType + ".xml"); currentFileName = schemaType; } Reader reader = ioServices.newBufferedFileReader(file, getFileReaderStreamName()); return getXMLFileImportDataIterator(reader, ioServices, currentFileName); } protected ImportDataIterator getXMLFileImportDataIterator(Reader reader, IOServices ioServices, String name) { return new XMLFileImportDataIterator(reader, ioServices); } protected String getFileReaderStreamName() { return FILE_READER_STREAM_NAME; } protected String getTempFolderStreamName() { return TEMP_FOLDER_STREAM_NAME; } }