From 4592e911ca8762e056ffd277ea9f463d106ed226 Mon Sep 17 00:00:00 2001 From: Daniel Knowles Date: Sat, 16 Aug 2025 08:33:03 -0400 Subject: [PATCH 1/5] Band Grouping: modified to support more options such as starts with --- .../datamodel/group/BandGroupingPath.java | 47 ++++++++++++++++--- .../core/datamodel/group/EndsWithEntry.java | 15 ++++++ .../snap/core/datamodel/group/ExactEntry.java | 15 ++++++ .../core/datamodel/group/StartsWithEntry.java | 15 ++++++ 4 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 snap-core/src/main/java/eu/esa/snap/core/datamodel/group/EndsWithEntry.java create mode 100644 snap-core/src/main/java/eu/esa/snap/core/datamodel/group/ExactEntry.java create mode 100644 snap-core/src/main/java/eu/esa/snap/core/datamodel/group/StartsWithEntry.java diff --git a/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/BandGroupingPath.java b/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/BandGroupingPath.java index 20d6ef50cc3..a59de40adfa 100644 --- a/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/BandGroupingPath.java +++ b/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/BandGroupingPath.java @@ -10,17 +10,50 @@ public class BandGroupingPath { BandGroupingPath(String[] groups) { this.groups = groups; entries = new Entry[groups.length]; + + // Default for SNAP and SeaDAS differs here, SeaDAS uses 'true', SNAP uses 'false' + // Ideally this would be defined in preferences + boolean useStartsWithInsteadOfContains = false; + for (int i = 0; i < groups.length; i++) { final String groupPattern = groups[i]; - if (groupPattern.contains("*") || groupPattern.contains("?")) { + if (groupPattern.contains("*") || groupPattern.contains("?")) { + // Wildcard Matching entries[i] = new WildCardEntry(groupPattern); - } else if (groupPattern.contains("#")) { - final String[] split = StringUtils.split(groupPattern, new char[]{'#'}, true); - final String groupName = split[0]; - this.groups[i] = groupName; - entries[i] = new BandNamesEntry(groupName, split[1]); + } else if (groupPattern.contains("#") || groupPattern.contains(",")) { + // BandNames Matching + if (groupPattern.contains("#")) { + // Rename the group + final String[] split = StringUtils.split(groupPattern, new char[]{'#'}, true); + final String groupName = split[0]; + this.groups[i] = groupName; + // todo this is problematic, although it does work, the Band 'Properties' editor reads it as only the name and not the full expression + entries[i] = new BandNamesEntry(groupName, split[1]); + } else { + // Maintain the original group expression as the group name + entries[i] = new BandNamesEntry(groupPattern, groupPattern); + } + } else if (groupPattern.startsWith("^") && groupPattern.endsWith("$")) { + // Exact Matching + String groupTrimmed = groupPattern.substring(1, groupPattern.length() -1); + entries[i] = new ExactEntry(groupTrimmed); + } else if (groupPattern.startsWith("^")) { + // StartsWith Matching + String groupTrimmed = groupPattern.substring(1); + entries[i] = new StartsWithEntry(groupTrimmed); + } else if (groupPattern.endsWith("$")) { + // EndsWith Matching + String groupTrimmed = groupPattern.substring(0, groupPattern.length() - 1); + entries[i] = new EndsWithEntry(groupTrimmed); } else { - entries[i] = new EntryImpl(groupPattern); + // Default Matching + if (useStartsWithInsteadOfContains) { + // StartsWith Matching + entries[i] = new StartsWithEntry(groupPattern); + } else { + // Contains Matching + entries[i] = new EntryImpl(groupPattern); + } } } } diff --git a/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/EndsWithEntry.java b/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/EndsWithEntry.java new file mode 100644 index 00000000000..37e2a515d10 --- /dev/null +++ b/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/EndsWithEntry.java @@ -0,0 +1,15 @@ +package eu.esa.snap.core.datamodel.group; + +class EndsWithEntry implements Entry { + + private final String group; + + protected EndsWithEntry(String group) { + this.group = group; + } + + @Override + public boolean matches(String name) { + return name.endsWith(group); + } +} diff --git a/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/ExactEntry.java b/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/ExactEntry.java new file mode 100644 index 00000000000..aefa6322af7 --- /dev/null +++ b/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/ExactEntry.java @@ -0,0 +1,15 @@ +package eu.esa.snap.core.datamodel.group; + +class ExactEntry implements Entry { + + private final String group; + + protected ExactEntry(String group) { + this.group = group; + } + + @Override + public boolean matches(String name) { + return name.equals(group); + } +} diff --git a/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/StartsWithEntry.java b/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/StartsWithEntry.java new file mode 100644 index 00000000000..3b8b9c71eb5 --- /dev/null +++ b/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/StartsWithEntry.java @@ -0,0 +1,15 @@ +package eu.esa.snap.core.datamodel.group; + +class StartsWithEntry implements Entry { + + private final String group; + + protected StartsWithEntry(String group) { + this.group = group; + } + + @Override + public boolean matches(String name) { + return name.startsWith(group); + } +} From 747ddaf0d6526071cad9977af0cf8f7c4dd126f7 Mon Sep 17 00:00:00 2001 From: Daniel Knowles Date: Mon, 18 Aug 2025 10:08:37 -0400 Subject: [PATCH 2/5] Band Grouping: commented out bad naming convention which is now address in PNGroupNode --- .../eu/esa/snap/core/datamodel/group/BandGroupingPath.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/BandGroupingPath.java b/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/BandGroupingPath.java index a59de40adfa..a6c187b07d0 100644 --- a/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/BandGroupingPath.java +++ b/snap-core/src/main/java/eu/esa/snap/core/datamodel/group/BandGroupingPath.java @@ -26,8 +26,8 @@ public class BandGroupingPath { // Rename the group final String[] split = StringUtils.split(groupPattern, new char[]{'#'}, true); final String groupName = split[0]; - this.groups[i] = groupName; - // todo this is problematic, although it does work, the Band 'Properties' editor reads it as only the name and not the full expression + // comment this out as this is problematic, although it does work, the Band 'Properties' editor reads it as only the name and not the full expression +// this.groups[i] = groupName; entries[i] = new BandNamesEntry(groupName, split[1]); } else { // Maintain the original group expression as the group name From fa7869ce80171b42b981d7a5b1f585e8cd3d179d Mon Sep 17 00:00:00 2001 From: Daniel Knowles Date: Mon, 18 Aug 2025 13:49:49 -0400 Subject: [PATCH 3/5] Band Grouping: added string utility for stripping down the group expression into a simple name --- .../org/esa/snap/core/util/StringUtils.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/snap-core/src/main/java/org/esa/snap/core/util/StringUtils.java b/snap-core/src/main/java/org/esa/snap/core/util/StringUtils.java index 107d6428a8a..ccee95b57a4 100644 --- a/snap-core/src/main/java/org/esa/snap/core/util/StringUtils.java +++ b/snap-core/src/main/java/org/esa/snap/core/util/StringUtils.java @@ -1073,4 +1073,41 @@ static String toProperCase(String s) { return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase(); } + + + static public String cleanUpGroupName(String displayName) { + if (displayName == null) { + return null; + } + + if (displayName.contains("#")) { + final String[] split = StringUtils.split(displayName, new char[]{'#'}, true); + final String groupName = split[0]; + if (groupName.length() > 0) { + displayName = groupName; + } + } else { + if (displayName.startsWith("^")) { + displayName = displayName.substring(0); + } + + if (displayName.endsWith("$")) { + displayName = displayName.substring(0, displayName.length() - 1); + } + + if (displayName.startsWith("*")) { + displayName = displayName.substring(0); + } + + if (displayName.endsWith("*")) { + displayName = displayName.substring(0, displayName.length() - 1); + } + + if (displayName.endsWith("_")) { + displayName = displayName.substring(0, displayName.length() - 1); + } + } + + return displayName; + } } From 7fcaaf69efdeeb958bbf3198e742091d457f2880 Mon Sep 17 00:00:00 2001 From: Daniel Knowles Date: Fri, 27 Feb 2026 08:32:37 -0500 Subject: [PATCH 4/5] Band Grouping: revised to remove some of the match criteria from the display name --- .../java/org/esa/snap/core/util/StringUtils.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/snap-core/src/main/java/org/esa/snap/core/util/StringUtils.java b/snap-core/src/main/java/org/esa/snap/core/util/StringUtils.java index ccee95b57a4..2cde1c8ae24 100644 --- a/snap-core/src/main/java/org/esa/snap/core/util/StringUtils.java +++ b/snap-core/src/main/java/org/esa/snap/core/util/StringUtils.java @@ -1075,7 +1075,16 @@ static String toProperCase(String s) { } + /** + * Creates a more user friendly folder name for the band group with the match criteria being removed. + * For example: if the band grouping was "^a_" (which would match a_442, a_460, etc.) then the returned + * displayName would be "a" + * + * @param displayName current display name of the particular group + * @return a modified display name which has removed characters intended for the match criteria + */ static public String cleanUpGroupName(String displayName) { + if (displayName == null) { return null; } @@ -1088,7 +1097,7 @@ static public String cleanUpGroupName(String displayName) { } } else { if (displayName.startsWith("^")) { - displayName = displayName.substring(0); + displayName = displayName.substring(1); } if (displayName.endsWith("$")) { @@ -1096,7 +1105,7 @@ static public String cleanUpGroupName(String displayName) { } if (displayName.startsWith("*")) { - displayName = displayName.substring(0); + displayName = displayName.substring(1); } if (displayName.endsWith("*")) { From 8cb2981193218e1263e082842d9cc11af5e0f9a9 Mon Sep 17 00:00:00 2001 From: Daniel Knowles Date: Fri, 27 Feb 2026 09:10:08 -0500 Subject: [PATCH 5/5] Band Grouping: minor revision to support removal of leading underscore in folder name --- .../src/main/java/org/esa/snap/core/util/StringUtils.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/snap-core/src/main/java/org/esa/snap/core/util/StringUtils.java b/snap-core/src/main/java/org/esa/snap/core/util/StringUtils.java index 2cde1c8ae24..cecd07d1b87 100644 --- a/snap-core/src/main/java/org/esa/snap/core/util/StringUtils.java +++ b/snap-core/src/main/java/org/esa/snap/core/util/StringUtils.java @@ -1112,6 +1112,10 @@ static public String cleanUpGroupName(String displayName) { displayName = displayName.substring(0, displayName.length() - 1); } + if (displayName.startsWith("_")) { + displayName = displayName.substring(1); + } + if (displayName.endsWith("_")) { displayName = displayName.substring(0, displayName.length() - 1); }