diff -Natur bnd-5.1.1.REL-orig/maven/bnd-maven-plugin/src/main/java/aQute/bnd/maven/plugin/AbstractBndMavenPlugin.java bnd-5.1.1.REL/maven/bnd-maven-plugin/src/main/java/aQute/bnd/maven/plugin/AbstractBndMavenPlugin.java --- bnd-5.1.1.REL-orig/maven/bnd-maven-plugin/src/main/java/aQute/bnd/maven/plugin/AbstractBndMavenPlugin.java 2020-06-16 23:03:04.000000000 +0200 +++ bnd-5.1.1.REL/maven/bnd-maven-plugin/src/main/java/aQute/bnd/maven/plugin/AbstractBndMavenPlugin.java 2021-10-17 22:35:26.583884078 +0200 @@ -56,7 +56,6 @@ import aQute.bnd.build.Project; import aQute.bnd.header.OSGiHeader; -import aQute.bnd.maven.lib.configuration.BeanProperties; import aQute.bnd.osgi.Builder; import aQute.bnd.osgi.Constants; import aQute.bnd.osgi.FileResource; diff -Natur bnd-5.1.1.REL-orig/maven/bnd-maven-plugin/src/main/java/aQute/bnd/maven/plugin/BeanProperties.java bnd-5.1.1.REL/maven/bnd-maven-plugin/src/main/java/aQute/bnd/maven/plugin/BeanProperties.java --- bnd-5.1.1.REL-orig/maven/bnd-maven-plugin/src/main/java/aQute/bnd/maven/plugin/BeanProperties.java 1970-01-01 01:00:00.000000000 +0100 +++ bnd-5.1.1.REL/maven/bnd-maven-plugin/src/main/java/aQute/bnd/maven/plugin/BeanProperties.java 2021-10-17 22:35:31.151908789 +0200 @@ -0,0 +1,101 @@ +package aQute.bnd.maven.plugin; + +import static java.lang.invoke.MethodHandles.publicLookup; + +import java.lang.invoke.MethodHandle; +import java.lang.reflect.Array; +import java.lang.reflect.Modifier; +import java.util.Iterator; +import java.util.List; +import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BeanProperties extends Properties { + private static final Logger logger = LoggerFactory.getLogger(BeanProperties.class); + + private static final Pattern KEY_P = Pattern + .compile("(?[^\\.\\[]+)(?:\\[(?\\d+)\\])?\\.?"); + private static final long serialVersionUID = 1L; + + protected Properties defaults; + + public BeanProperties() { + this(null); + } + + public BeanProperties(Properties defaults) { + this.defaults = defaults; + } + + @Override + public String getProperty(String key) { + final Matcher m = KEY_P.matcher(key); + if (!m.find()) { + return defaultValue(key); + } + String name = m.group("name"); + Object value = value(name, get(name), m.group("index")); + while ((value != null) && m.find()) { + name = m.group("name"); + value = value(name, getField(value, name), m.group("index")); + } + return (value != null) ? value.toString() : defaultValue(key); + } + + private String defaultValue(String key) { + return (defaults != null) ? defaults.getProperty(key) : null; + } + + private Object getField(Object target, String fieldName) { + try { + String getterSuffix = Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1); + Class targetClass = target.getClass(); + while (!Modifier.isPublic(targetClass.getModifiers())) { + targetClass = targetClass.getSuperclass(); + } + MethodHandle mh; + try { + mh = publicLookup().unreflect(targetClass.getMethod("get" + getterSuffix)); + } catch (NoSuchMethodException nsme) { + mh = publicLookup().unreflect(targetClass.getMethod("is" + getterSuffix)); + } + return mh.invoke(target); + } catch (Error e) { + throw e; + } catch (Throwable e) { + logger.debug("Could not find getter method for field {}", fieldName, e); + } + return null; + } + + private Object value(String name, Object value, String index) { + if ((value == null) || (index == null)) { + return value; + } + try { + int i = Integer.parseInt(index); + if (value instanceof List) { + return ((List) value).get(i); + } else if (value instanceof Iterable) { + if (i < 0) { + throw new IndexOutOfBoundsException("index < 0"); + } + Iterator iter = ((Iterable) value).iterator(); + for (; i > 0; i--) { + iter.next(); + } + return iter.next(); + } else if (value.getClass() + .isArray()) { + return Array.get(value, i); + } + } catch (Exception e) { + logger.debug("Could not find field {}[{}]", name, index, e); + } + return value; + } +}