This is an automated email from the ASF dual-hosted git repository. cschneider pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/aries-rsa.git
The following commit(s) were added to refs/heads/master by this push: new b4011a0 ARIES-1906 - Regression - export of superclass interface fails new 12ef918 Merge pull request #19 from amichair/ARIES-1906 b4011a0 is described below commit b4011a0b22855c26869476853bfcb5cc1e3d4720 Author: Amichai Rothman <amich...@amichais.net> AuthorDate: Thu Mar 28 14:49:36 2019 +0200 ARIES-1906 - Regression - export of superclass interface fails --- .../aries/rsa/core/RemoteServiceAdminCore.java | 42 +++++++++++++++------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java b/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java index 1586307..f5b6ef1 100644 --- a/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java +++ b/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java @@ -247,19 +247,35 @@ public class RemoteServiceAdminCore implements RemoteServiceAdmin { return new ExportRegistrationImpl(e, closeHandler, eventProducer); } } - - private Class<?>[] getInterfaces( - Object serviceO, - List<String> interfaceNames - ) throws ClassNotFoundException { - List<Class<?>> interfaces = new ArrayList<>(); - Class<?>[] allInterfaces = serviceO.getClass().getInterfaces(); - for (Class<?> iface : allInterfaces) { - if (interfaceNames.contains(iface.getName())) { - interfaces.add(iface); - } - } - return interfaces.toArray(new Class[]{}); + + /** + * Returns the interface classes corresponding to the given service's interface names. + * The classes are returned in the same order as the given names. + * + * @param service the service implementing the interfaces + * @param interfaceNames the interface names + * @return the interface classes corresponding to the interface names + * @throws ClassNotFoundException if the service does not implement any of the named interfaces + */ + private Class<?>[] getInterfaces(Object service, List<String> interfaceNames) throws ClassNotFoundException { + // prepare a map of all of the service's implemented interface names and classes + Map<String, Class<?>> interfaces = new HashMap<>(); + for (Class<?> cls = service.getClass(); cls != null; cls = cls.getSuperclass()) { + for (Class<?> interfaceClass : cls.getInterfaces()) { + interfaces.put(interfaceClass.getName(), interfaceClass); + } + } + // lookup the given names in order, ensuring all are found + List<Class<?>> interfaceClasses = new ArrayList<>(); + for (String interfaceName : interfaceNames) { + Class<?> interfaceClass = interfaces.get(interfaceName); + if (interfaceClass == null) { + throw new ClassNotFoundException("Service class " + service.getClass() + + " does not implement interface " + interfaceName); + } + interfaceClasses.add(interfaceClass); + } + return interfaceClasses.toArray(new Class[0]); } /**