X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fconfig%2Fconfig-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfig%2Fmanager%2Fimpl%2Futil%2FInterfacesHelper.java;h=059ba45ec9b79956fa4a3f07a0adad98888d6a3c;hp=76cb64cf9349ae62cc99d7f66eb12e7f66a0ed74;hb=2d60632f7cf63712e8357a3cf3fc40d83366e5e6;hpb=b2d4575c4425e3b3d5aeaf1190e01e5d5a5286aa diff --git a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/util/InterfacesHelper.java b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/util/InterfacesHelper.java index 76cb64cf93..059ba45ec9 100644 --- a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/util/InterfacesHelper.java +++ b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/util/InterfacesHelper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * Copyright (c) 2013, 2017 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, @@ -7,48 +7,63 @@ */ package org.opendaylight.controller.config.manager.impl.util; +import com.google.common.collect.ImmutableSet; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.Set; - import javax.management.JMX; - import org.opendaylight.controller.config.api.annotations.AbstractServiceInterface; import org.opendaylight.controller.config.api.annotations.ServiceInterfaceAnnotation; import org.opendaylight.controller.config.spi.Module; +import org.opendaylight.controller.config.spi.ModuleFactory; -public class InterfacesHelper { +public final class InterfacesHelper { + + private InterfacesHelper() { + } public static Set> getAllInterfaces(Class clazz) { if (clazz.isInterface()) { - throw new IllegalArgumentException(clazz - + " should not be an interface"); + throw new IllegalArgumentException(clazz + " should not be an interface"); } // getInterfaces gets interfaces implemented directly by this class Set> toBeInspected = new HashSet<>(); - while (clazz.equals(Object.class) == false) { + while (!clazz.equals(Object.class)) { toBeInspected.addAll(Arrays.asList(clazz.getInterfaces())); // get parent class clazz = clazz.getSuperclass(); } + return getAllSuperInterfaces(toBeInspected); + + } + + private static Set> getAllSuperInterfaces(final Set> ifcs) { + Set> interfaces = new HashSet<>(ifcs); // create copy to modify // each interface can extend other interfaces - Set> inspected = new HashSet<>(); - while (toBeInspected.size() > 0) { - Iterator> iterator = toBeInspected.iterator(); + Set> result = new HashSet<>(); + while (!interfaces.isEmpty()) { + Iterator> iterator = interfaces.iterator(); Class ifc = iterator.next(); iterator.remove(); - toBeInspected.addAll(Arrays.asList(ifc.getInterfaces())); - inspected.add(ifc); + if (!ifc.isInterface()) { + throw new IllegalArgumentException(ifc + " should be an interface"); + } + interfaces.addAll(Arrays.asList(ifc.getInterfaces())); + result.add(ifc); } - return inspected; + return result; } /** * Get interfaces that this class is derived from that are JMX interfaces. + * + * @param configBeanClass + * config bean class + * @return set containing classes */ - public static Set> getMXInterfaces( - Class configBeanClass) { + public static Set> getMXInterfaces(final Class configBeanClass) { Set> allInterfaces = getAllInterfaces(configBeanClass); Set> result = new HashSet<>(); for (Class clazz : allInterfaces) { @@ -63,15 +78,17 @@ public class InterfacesHelper { * Get all implemented interfaces that have * {@link org.opendaylight.controller.config.api.annotations.ServiceInterfaceAnnotation} * annotation. + * + * @param configBeanClass + * config bean class + * @return set containing classes */ - public static Set> getServiceInterfaces( - Class configBeanClass) { + public static Set> getServiceInterfaces(final Class configBeanClass) { Set> allInterfaces = getAllInterfaces(configBeanClass); Set> result = new HashSet<>(); for (Class clazz : allInterfaces) { if (AbstractServiceInterface.class.isAssignableFrom(clazz)) { - ServiceInterfaceAnnotation annotation = clazz - .getAnnotation(ServiceInterfaceAnnotation.class); + ServiceInterfaceAnnotation annotation = clazz.getAnnotation(ServiceInterfaceAnnotation.class); if (annotation != null) { result.add(clazz); } @@ -80,22 +97,77 @@ public class InterfacesHelper { return result; } + public static Set> getAllAbstractServiceClasses( + final Class configBeanClass) { + + Set> foundGeneratedSIClasses = new HashSet<>(); + for (Class clazz : getAllInterfaces(configBeanClass)) { + if (AbstractServiceInterface.class.isAssignableFrom(clazz) + && !AbstractServiceInterface.class.equals(clazz)) { + foundGeneratedSIClasses.add((Class) clazz); + } + } + return getAllAbstractServiceInterfaceClasses(foundGeneratedSIClasses); + } + /** * Get OSGi registration types under which config bean instance should be * registered. This is specified in * {@link org.opendaylight.controller.config.api.annotations.ServiceInterfaceAnnotation#osgiRegistrationType()} + * + * @param configBeanClass config bean class + * @return set of classes */ - public static Set> getOsgiRegistrationTypes( - Class configBeanClass) { - // TODO test with service interface hierarchy + public static Set> getOsgiRegistrationTypes(final Class configBeanClass) { Set> serviceInterfaces = getServiceInterfaces(configBeanClass); Set> result = new HashSet<>(); for (Class clazz : serviceInterfaces) { - ServiceInterfaceAnnotation annotation = clazz - .getAnnotation(ServiceInterfaceAnnotation.class); + ServiceInterfaceAnnotation annotation = clazz.getAnnotation(ServiceInterfaceAnnotation.class); result.add(annotation.osgiRegistrationType()); } return result; } + public static Set getQNames(final Set siAnnotations) { + Set names = new HashSet<>(); + for (ServiceInterfaceAnnotation sia : siAnnotations) { + names.add(sia.value()); + } + return ImmutableSet.copyOf(names); + } + + public static Set getServiceInterfaceAnnotations(final ModuleFactory factory) { + Set> implementedServiceIntefaces = Collections + .unmodifiableSet(factory.getImplementedServiceIntefaces()); + return getServiceInterfaceAnnotations(implementedServiceIntefaces); + } + + private static Set getServiceInterfaceAnnotations( + final Set> implementedServiceIntefaces) { + Set> inspected = getAllAbstractServiceInterfaceClasses( + implementedServiceIntefaces); + Set result = new HashSet<>(); + // SIs can form hierarchies, inspect superclass until it does not extend + // AbstractSI + for (Class clazz : inspected) { + ServiceInterfaceAnnotation annotation = clazz.getAnnotation(ServiceInterfaceAnnotation.class); + if (annotation != null) { + result.add(annotation); + } + } + return Collections.unmodifiableSet(result); + } + + static Set> getAllAbstractServiceInterfaceClasses( + final Set> directlyImplementedAbstractSIs) { + + Set> allInterfaces = getAllSuperInterfaces(directlyImplementedAbstractSIs); + Set> result = new HashSet<>(); + for (Class ifc : allInterfaces) { + if (AbstractServiceInterface.class.isAssignableFrom(ifc) && !ifc.equals(AbstractServiceInterface.class)) { + result.add((Class) ifc); + } + } + return result; + } }