From 6dd92be2b8711c3848567aed30428e31d97b02c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20L=C3=A4ubrich?= Date: Tue, 7 May 2024 17:13:52 +0200 Subject: [PATCH] Add ManifestElement.parseBundleManifest without map parameter Currently the existing ManifestElement.parseBundleManifest with a wild mixture of parameters, some using access restricted maps, some use null some use a hashmap (what likely causes issue if case of headers is different than expected). This adds a new method that simply removes the map parameter and uses a CaseInsensitiveDictionaryMap that is also used internally in the framework and is most likely the most natural choice for this usecase. --- .../eclipse/osgi/util/ManifestElement.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/util/ManifestElement.java b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/util/ManifestElement.java index 439efc4f65a..0818fde49b8 100644 --- a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/util/ManifestElement.java +++ b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/util/ManifestElement.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; import java.util.StringTokenizer; +import java.util.TreeMap; import org.eclipse.osgi.internal.messages.Msg; import org.eclipse.osgi.internal.util.SupplementDebug; import org.eclipse.osgi.internal.util.Tokenizer; @@ -485,6 +486,26 @@ public static String[] getArrayFromList(String stringList, String separator) { return list.toArray(new String[list.size()]); } + /** + * Parses a bundle manifest and returns the header/value pairs into as case + * insensitive map. Only the main section of the manifest is parsed (up to the + * first blank line). All other sections are ignored. If a header is duplicated + * then only the last value is stored in the map. + *

+ * The supplied input stream is consumed by this method and will be closed. + *

+ * + * @param manifest an input stream for a bundle manifest. + * @throws BundleException if the manifest has an invalid syntax + * @throws IOException if an error occurs while reading the manifest + * @return the map with the header/value pairs from the bundle manifest + */ + public static Map parseBundleManifest(InputStream manifest) throws IOException, BundleException { + Map headers = new TreeMap<>(String::compareToIgnoreCase); + parseBundleManifest(manifest, headers); + return headers; + } + /** * Parses a bundle manifest and puts the header/value pairs into the supplied Map. * Only the main section of the manifest is parsed (up to the first blank line). All