FELIX-4078 Search a method known to be implemented as part of a service in the class hierarchy instead of just the implementation class. This affects the ConfigurationPrinter.getTitle method.

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1486804 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/inventory/src/main/java/org/apache/felix/inventory/impl/webconsole/ConfigurationPrinterAdapter.java b/inventory/src/main/java/org/apache/felix/inventory/impl/webconsole/ConfigurationPrinterAdapter.java
index 2148f32..1ada58e 100644
--- a/inventory/src/main/java/org/apache/felix/inventory/impl/webconsole/ConfigurationPrinterAdapter.java
+++ b/inventory/src/main/java/org/apache/felix/inventory/impl/webconsole/ConfigurationPrinterAdapter.java
@@ -86,7 +86,7 @@
             {
                 modes = ref.getProperty(ConsoleConstants.PROPERTY_MODES);
             }
-            final Method titleMethod = getMethod(service.getClass(), "getTitle", null);
+            final Method titleMethod = getMethod(service.getClass(), "getTitle", null, false);
             if (titleMethod == null)
             {
                 return null;
@@ -104,7 +104,7 @@
 
         // first: printConfiguration(PrintWriter, String)
         final Method method2Params = getMethod(service.getClass(), "printConfiguration", new Class[]
-            { PrintWriter.class, String.class });
+            { PrintWriter.class, String.class }, true);
         if (method2Params != null)
         {
             cfgPrinter = service;
@@ -115,7 +115,7 @@
         {
             // second: printConfiguration(PrintWriter)
             final Method method1Params = getMethod(service.getClass(), "printConfiguration", new Class[]
-                { PrintWriter.class });
+                { PrintWriter.class }, true);
             if (method1Params != null)
             {
                 cfgPrinter = service;
@@ -187,7 +187,7 @@
 
             return new ConfigurationPrinterAdapter(cfgPrinter, printMethod, getMethod(cfgPrinter.getClass(),
                 "getAttachments", new Class[]
-                    { String.class }), title, (label instanceof String ? (String) label : null), modesArray,
+                    { String.class }, true), title, (label instanceof String ? (String) label : null), modesArray,
                 !webUnescaped);
         }
         return null;
@@ -279,16 +279,21 @@
         return title + " (" + printer.getClass() + ")";
     }
 
-    private static Method getMethod(final Class clazz, final String mName, final Class[] params)
+    private static Method getMethod(final Class clazz, final String mName, final Class[] params, final boolean declaredByClass)
     {
         try
         {
-            final Method m = clazz.getDeclaredMethod(mName, params);
-            if (Modifier.isPublic(m.getModifiers()))
+            if (declaredByClass)
             {
-                return m;
+                final Method m = clazz.getDeclaredMethod(mName, params);
+                if (Modifier.isPublic(m.getModifiers()))
+                {
+                    return m;
+                }
             }
-        }
+
+            return clazz.getMethod(mName, params);
+       }
         catch (Throwable nsme)
         {
             // ignore, we catch Throwable above to not only catch