From 959f6f46871ab35134291dc1dcf8e4d9f9512669 Mon Sep 17 00:00:00 2001 From: alicecaron Date: Wed, 19 Feb 2025 15:26:06 +0100 Subject: [PATCH] Cgmes load zipped profiles mutualize stream (#3325) * Mutualize code to extract InputStream * try-with-resources through namespaceGetter function Signed-off-by: CARON Alice Co-authored-by: Florian Dupuy --- .../cgmes/model/CgmesOnDataSource.java | 85 ++++++------------- .../powsybl/cgmes/model/NamespaceReader.java | 10 ++- 2 files changed, 34 insertions(+), 61 deletions(-) diff --git a/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/CgmesOnDataSource.java b/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/CgmesOnDataSource.java index 57ead591694..fb58194c651 100644 --- a/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/CgmesOnDataSource.java +++ b/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/CgmesOnDataSource.java @@ -12,13 +12,12 @@ import com.powsybl.commons.datasource.CompressionFormat; import com.powsybl.commons.datasource.ReadOnlyDataSource; -import javax.xml.stream.XMLStreamException; import java.io.IOException; import java.io.InputStream; -import java.io.UncheckedIOException; -import java.util.HashSet; import java.util.Objects; import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; import java.util.zip.ZipInputStream; import static com.powsybl.cgmes.model.CgmesNamespace.*; @@ -91,23 +90,7 @@ private boolean existsNamespacesCim14(Set namespaces) { public String baseName() { // Get the base URI if present, else build an absolute URI from the data source base name return names().stream() - .map(n -> { - String fileExtension = n.substring(n.lastIndexOf('.') + 1); - if (fileExtension.equals(CompressionFormat.ZIP.getExtension())) { - ZipSecurityHelper.checkIfZipExtractionIsSafe(dataSource, n); - try (ZipInputStream is = new ZipInputStream(dataSource.newInputStream(n))) { - is.getNextEntry(); - return NamespaceReader.base(is); - } catch (IOException x) { - throw new UncheckedIOException(x); - } - } - try (InputStream is = dataSource.newInputStream(n)) { - return NamespaceReader.base(is); - } catch (IOException x) { - throw new UncheckedIOException(x); - } - }) + .map(n -> loadInputStreamAndGetNamespace(n, NamespaceReader::base)) .filter(Objects::nonNull) .findFirst() .orElseGet(() -> { @@ -138,51 +121,33 @@ private boolean existsInDatasource(String fileName) { } } - private boolean containsValidNamespace(String name) { - String fileExtension = name.substring(name.lastIndexOf('.') + 1); - if (fileExtension.equals(CompressionFormat.ZIP.getExtension())) { - ZipSecurityHelper.checkIfZipExtractionIsSafe(dataSource, name); - try (ZipInputStream is = new ZipInputStream(dataSource.newInputStream(name))) { - is.getNextEntry(); - Set ns = NamespaceReader.namespaces1(is); - return ns.contains(RDF_NAMESPACE) && ns.stream().anyMatch(CgmesNamespace::isValid); - } catch (XMLStreamException e) { - return false; - } catch (IOException x) { - throw new CgmesModelException(String.format(LISTING_CGMES_NAMES_IN_DATA_SOURCE, dataSource), x); - } - } - try (InputStream is = dataSource.newInputStream(name)) { - Set ns = NamespaceReader.namespaces1(is); - return ns.contains(RDF_NAMESPACE) && ns.stream().anyMatch(CgmesNamespace::isValid); - } catch (XMLStreamException e) { - return false; - } catch (IOException x) { - throw new CgmesModelException(String.format(LISTING_CGMES_NAMES_IN_DATA_SOURCE, dataSource), x); - } - } - - public Set namespaces() { - Set ns = new HashSet<>(); - names().forEach(n -> { + private T loadInputStreamAndGetNamespace(String n, Function namespaceGetter) { + try (InputStream in = dataSource.newInputStream(n)) { String fileExtension = n.substring(n.lastIndexOf('.') + 1); if (fileExtension.equals(CompressionFormat.ZIP.getExtension())) { ZipSecurityHelper.checkIfZipExtractionIsSafe(dataSource, n); - try (ZipInputStream is = new ZipInputStream(dataSource.newInputStream(n))) { - is.getNextEntry(); - ns.addAll(NamespaceReader.namespaces(is)); - return; - } catch (IOException x) { - throw new UncheckedIOException(x); + try (ZipInputStream zis = new ZipInputStream(in)) { + zis.getNextEntry(); + return namespaceGetter.apply(zis); } + } else { + return namespaceGetter.apply(in); } - try (InputStream is = dataSource.newInputStream(n)) { - ns.addAll(NamespaceReader.namespaces(is)); - } catch (IOException x) { - throw new UncheckedIOException(x); - } - }); - return ns; + } catch (IOException e) { + throw new CgmesModelException(String.format(LISTING_CGMES_NAMES_IN_DATA_SOURCE, dataSource), e); + } + } + + private boolean containsValidNamespace(String name) { + Set ns = loadInputStreamAndGetNamespace(name, NamespaceReader::namespacesOrEmpty); + return ns.contains(RDF_NAMESPACE) && ns.stream().anyMatch(CgmesNamespace::isValid); + } + + public Set namespaces() { + return names().stream() + .map(name -> loadInputStreamAndGetNamespace(name, NamespaceReader::namespaces)) + .flatMap(Set::stream) + .collect(Collectors.toSet()); } public String cimNamespace() { diff --git a/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/NamespaceReader.java b/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/NamespaceReader.java index 373eccc68a6..453b2e421a1 100644 --- a/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/NamespaceReader.java +++ b/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/NamespaceReader.java @@ -36,7 +36,15 @@ public static Set namespaces(InputStream is) { } } - public static Set namespaces1(InputStream is) throws XMLStreamException { + public static Set namespacesOrEmpty(InputStream is) { + try { + return namespaces1(is); + } catch (XMLStreamException x) { + return Set.of(); + } + } + + private static Set namespaces1(InputStream is) throws XMLStreamException { Set found = new HashSet<>(); XMLStreamReader xmlsr = XML_INPUT_FACTORY_SUPPLIER.get().createXMLStreamReader(is); try {