Author: cziegeler
Date: Fri Mar 31 09:38:12 2017
New Revision: 1789646

URL: http://svn.apache.org/viewvc?rev=1789646&view=rev
Log:
SLING-6760 : Improve logging if servlet can't be get from the registry

Modified:
    
sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
    
sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java

Modified: 
sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java?rev=1789646&r1=1789645&r2=1789646&view=diff
==============================================================================
--- 
sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
 (original)
+++ 
sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
 Fri Mar 31 09:38:12 2017
@@ -964,31 +964,29 @@ public class SlingServletResolver
         }
     }
 
-    private boolean createServlet(final ServiceReference<Servlet> reference) {
 
+    private boolean createServlet(final ServiceReference<Servlet> reference) {
         // check for a name, this is required
         final String name = getName(reference);
-        if (name == null) {
-            LOGGER.error("bindServlet: Cannot register servlet {} without a 
servlet name", reference);
-            return false;
-        }
 
         // check for Sling properties in the service registration
-        ServletResourceProvider provider = 
servletResourceProviderFactory.create(reference);
+        final ServletResourceProvider provider = 
servletResourceProviderFactory.create(reference);
         if (provider == null) {
             // this is expected if the servlet is not destined for Sling
             return false;
         }
 
         // only now try to access the servlet service, this may still fail
+        Throwable exception = null;
         Servlet servlet = null;
         try {
             servlet = context.locateService(REF_SERVLET, reference);
         } catch (Throwable t) {
-            LOGGER.warn("bindServlet: Failed getting the service for reference 
" + reference, t);
+            exception = t;
         }
         if (servlet == null) {
-            LOGGER.error("bindServlet: Servlet service not available from 
reference {}", reference);
+            LOGGER.error("bindServlet: Servlet service not available from 
reference "
+                      + 
ServletResourceProviderFactory.getServiceReferenceInfo(reference), exception);
             return false;
         }
 
@@ -998,12 +996,12 @@ public class SlingServletResolver
         // initialize now
         try {
             servlet.init(new SlingServletConfig(servletContext, reference, 
name));
-            LOGGER.debug("bindServlet: Servlet {} added", name);
+            LOGGER.debug("bindServlet: Servlet {} initialized", name);
         } catch (ServletException ce) {
-            LOGGER.error("bindServlet: Component " + name + " failed to 
initialize", ce);
+            LOGGER.error("bindServlet: Servlet " + 
ServletResourceProviderFactory.getServiceReferenceInfo(reference) + " failed to 
initialize", ce);
             return false;
         } catch (Throwable t) {
-            LOGGER.error("bindServlet: Unexpected problem initializing 
component " + name, t);
+            LOGGER.error("bindServlet: Unexpected problem initializing servlet 
" + ServletResourceProviderFactory.getServiceReferenceInfo(reference), t);
             return false;
         }
 
@@ -1016,7 +1014,9 @@ public class SlingServletResolver
                 createServiceProperties(reference, provider, root));
             regs.add(reg);
         }
-        LOGGER.debug("Registered {}", provider.toString());
+        if ( LOGGER.isDebugEnabled() ) {
+            LOGGER.debug("Registered {}", provider.toString());
+        }
         synchronized (this.servletsByReference) {
             servletsByReference.put(reference, new ServletReg(servlet, regs));
         }
@@ -1107,6 +1107,7 @@ public class SlingServletResolver
      * Looks for a name value in the service reference properties. See the
      * class comment at the top for the list of properties checked by this
      * method.
+     * @return The servlet name. This method never returns {@code null}
      */
     private static String getName(final ServiceReference<Servlet> reference) {
         String servletName = null;

Modified: 
sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java?rev=1789646&r1=1789645&r2=1789646&view=diff
==============================================================================
--- 
sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java
 (original)
+++ 
sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java
 Fri Mar 31 09:38:12 2017
@@ -20,10 +20,12 @@ package org.apache.sling.servlets.resolv
 
 import static 
org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_EXTENSIONS;
 import static 
org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_METHODS;
+import static 
org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_NAME;
 import static 
org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_PATHS;
 import static 
org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_PREFIX;
 import static 
org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES;
 import static 
org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_SELECTORS;
+import static org.osgi.service.component.ComponentConstants.COMPONENT_NAME;
 
 import java.util.HashSet;
 import java.util.Set;
@@ -33,9 +35,9 @@ import javax.servlet.Servlet;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.api.servlets.HttpConstants;
 import org.apache.sling.commons.osgi.PropertiesUtil;
+import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
-import org.osgi.service.component.ComponentConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -132,14 +134,14 @@ public class ServletResourceProviderFact
             if (log.isDebugEnabled()) {
                 log.debug(
                     "create({}): ServiceReference has no registration 
settings, ignoring",
-                    getServiceIdentifier(ref));
+                    getServiceReferenceInfo(ref));
             }
             return null;
         }
 
         if (log.isDebugEnabled()) {
             log.debug("create({}): Registering servlet for paths {}",
-                getServiceIdentifier(ref), pathSet);
+                    getServiceReferenceInfo(ref), pathSet);
         }
 
         return new ServletResourceProvider(pathSet);
@@ -172,7 +174,7 @@ public class ServletResourceProviderFact
                 if ( !isNumber ) {
                     if (log.isDebugEnabled()) {
                         log.debug("getPrefix({}): Configuration property is 
ignored {}",
-                            getServiceIdentifier(ref), value);
+                                getServiceReferenceInfo(ref), value);
                     }
                     if ( this.servletRoot != null ) {
                         return this.servletRoot;
@@ -221,7 +223,7 @@ public class ServletResourceProviderFact
         if (types == null || types.length == 0) {
             if (log.isDebugEnabled()) {
                 log.debug("addByType({}): no resource types declared",
-                    getServiceIdentifier(ref));
+                        getServiceReferenceInfo(ref));
             }
             return;
         }
@@ -244,7 +246,7 @@ public class ServletResourceProviderFact
                 if (log.isDebugEnabled()) {
                     log.debug(
                         "addByType({}): No methods declared, assuming 
GET/HEAD",
-                        getServiceIdentifier(ref));
+                        getServiceReferenceInfo(ref));
                 }
                 methods = DEFAULT_SERVLET_METHODS;
             }
@@ -252,7 +254,7 @@ public class ServletResourceProviderFact
         } else if (methods.length == 1 && ALL_METHODS.equals(methods[0])) {
             if (log.isDebugEnabled()) {
                 log.debug("addByType({}): Assuming all methods for '*'",
-                    getServiceIdentifier(ref));
+                        getServiceReferenceInfo(ref));
             }
             methods = null;
         }
@@ -315,18 +317,69 @@ public class ServletResourceProviderFact
         }
     }
 
-    private String getServiceIdentifier(ServiceReference<Servlet> ref) {
-        Object id = ref.getProperty(ComponentConstants.COMPONENT_NAME);
-        if (id != null) {
-            return id.toString();
+    public static String getServiceReferenceInfo(final 
ServiceReference<Servlet> reference) {
+        final StringBuilder sb = new StringBuilder("service ");
+        sb.append(String.valueOf(reference.getProperty(Constants.SERVICE_ID)));
+        final Object servletName = reference.getProperty(SLING_SERVLET_NAME);
+        final Object pid = reference.getProperty(Constants.SERVICE_PID);
+        Object componentName = reference.getProperty(COMPONENT_NAME);
+        if ( pid != null && pid.equals(componentName) ) {
+            componentName = null;
+        }
+        if ( servletName != null || pid != null || componentName != null ) {
+            sb.append(" (");
+            boolean needsComma = false;
+            if ( servletName != null ) {
+                sb.append("name=");
+                sb.append(servletName);
+                needsComma = true;
+            }
+            if ( pid != null ) {
+                if ( needsComma ) {
+                    sb.append(", ");
+                }
+                sb.append("pid=");
+                sb.append(pid);
+                needsComma = true;
+            }
+            if ( componentName != null ) {
+                if ( needsComma ) {
+                    sb.append(", ");
+                }
+                sb.append("component=");
+                sb.append(componentName);
+                needsComma = true;
+            }
+            sb.append(")");
+        }
+        sb.append(" from ");
+        final Bundle bundle = reference.getBundle();
+        if ( bundle == null ) {
+            sb.append("uninstalled bundle");
+        } else {
+            sb.append("bundle ");
+            if ( bundle.getSymbolicName() == null ) {
+                sb.append(String.valueOf(bundle.getBundleId()));
+            } else {
+                sb.append(bundle.getSymbolicName());
+                sb.append(":");
+                sb.append(bundle.getVersion());
+                sb.append(" (");
+                sb.append(String.valueOf(bundle.getBundleId()));
+                sb.append(") ");
+            }
         }
-
-        id = ref.getProperty(Constants.SERVICE_PID);
-        if (id != null) {
-            return id.toString();
+        final String[] ocs = (String[]) reference.getProperty("objectClass");
+        if ( ocs != null ) {
+            sb.append("[");
+            for(int i = 0; i < ocs.length; i++) {
+                sb.append(ocs[i]);
+                if (i < ocs.length - 1) {
+                    sb.append(", ");
+                }
+            }
+            sb.append("]");
         }
-
-        // service.id is guaranteed to be set by the framework
-        return ref.getProperty(Constants.SERVICE_ID).toString();
+        return sb.toString();
     }
 }


Reply via email to