You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2011/08/29 11:51:10 UTC

svn commit: r1162700 - /sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java

Author: fmeschbe
Date: Mon Aug 29 09:51:10 2011
New Revision: 1162700

URL: http://svn.apache.org/viewvc?rev=1162700&view=rev
Log:
SLING-2196 Add the main information from the servlet container's server info to the Sling server info.

Modified:
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java?rev=1162700&r1=1162699&r2=1162700&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java (original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java Mon Aug 29 09:51:10 2011
@@ -130,11 +130,22 @@ public class SlingMainServlet extends Ge
     private SlingServletContext slingServletContext;
 
     /**
+     * The product information part of the {@link #serverInfo} returns from the
+     * <code>ServletContext.getServerInfo()</code> method. This field defaults
+     * to {@link #PRODUCT_NAME} and is ammended with the major and minor version
+     * of the Sling Engine bundle while this component is being
+     * {@link #activate(BundleContext, Map)} activated}.
+     */
+    private String productInfo = PRODUCT_NAME;
+
+    /**
      * The server information to report in the {@link #getServerInfo()} method.
-     * By default this is just the {@link #PRODUCT_NAME}. The
-     * {@link #activate(org.osgi.service.component.ComponentContext)} method
-     * appends this value with the version (major and minor part) of this bundle
+     * By default this is just the {@link #PRODUCT_NAME} (same as
+     * {@link #productInfo}. During {@link #activate(BundleContext, Map)}
+     * activation} the field is updated with the full {@link #productInfo} value
      * as well as the operating system and java version it is running on.
+     * Finally during servlet initialization the product information from the
+     * servlet container's server info is added to the comment section.
      */
     private String serverInfo = PRODUCT_NAME;
 
@@ -249,10 +260,80 @@ public class SlingMainServlet extends Ge
 
     // ---------- Internal helper ----------------------------------------------
 
+    /**
+     * Sets the {@link #productInfo} field from the providing bundle's version
+     * and the {@link #PRODUCT_NAME}.
+     * <p>
+     * Also {@link #setServerInfo() updates} the {@link #serverInfo} based
+     * on the product info calculated.
+     *
+     * @param bundleContext Provides access to the "Bundle-Version" manifest
+     *            header of the containing bundle.
+     */
+    private void setProductInfo(final BundleContext bundleContext) {
+        final Dictionary<?, ?> props = bundleContext.getBundle().getHeaders();
+        final Version bundleVersion = Version.parseVersion((String) props.get(Constants.BUNDLE_VERSION));
+        final String productVersion = bundleVersion.getMajor() + "."
+            + bundleVersion.getMinor();
+        this.productInfo = PRODUCT_NAME + "/" + productVersion;
+
+        // update the server info
+        this.setServerInfo();
+    }
+
     public String getServerInfo() {
         return serverInfo;
     }
 
+    /**
+     * Sets up the server info to be returned for the
+     * <code>ServletContext.getServerInfo()</code> method for servlets and
+     * filters deployed inside Sling. The {@link SlingRequestProcessor} instance
+     * is also updated with the server information.
+     * <p>
+     * This server information is made up of the following components:
+     * <ol>
+     * <li>The {@link #productInfo} field as the primary product information</li>
+     * <li>The primary product information of the servlet container into which
+     * the Sling Main Servlet is deployed. If the servlet has not yet been
+     * deployed this will show as <i>unregistered</i>. If the servlet container
+     * does not provide a server info this will show as <i>unknown</i>.</li>
+     * <li>The name and version of the Java VM as reported by the
+     * <code>java.vm.name</code> and <code>java.vm.version</code> system
+     * properties</li>
+     * <li>The name, version, and architecture of the OS platform as reported by
+     * the <code>os.name</code>, <code>os.version</code>, and
+     * <code>os.arch</code> system properties</li>
+     * </ol>
+     */
+    private void setServerInfo() {
+        final String containerProductInfo;
+        if (getServletConfig() == null || getServletContext() == null) {
+            containerProductInfo = "unregistered";
+        } else {
+            final String containerInfo = getServletContext().getServerInfo();
+            if (containerInfo != null && containerInfo.length() > 0) {
+                int lbrace = containerInfo.indexOf('(');
+                if (lbrace < 0) {
+                    lbrace = containerInfo.length();
+                }
+                containerProductInfo = containerInfo.substring(0, lbrace).trim();
+            } else {
+                containerProductInfo = "unknown";
+            }
+        }
+
+        this.serverInfo = String.format("%s (%s, %s %s, %s %s %s)",
+            this.productInfo, containerProductInfo,
+            System.getProperty("java.vm.name"),
+            System.getProperty("java.version"), System.getProperty("os.name"),
+            System.getProperty("os.version"), System.getProperty("os.arch"));
+
+        if (this.requestProcessor != null) {
+            this.requestProcessor.setServerInfo(serverInfo);
+        }
+    }
+
     // ---------- Property Setter for SCR --------------------------------------
 
     @Activate
@@ -260,17 +341,7 @@ public class SlingMainServlet extends Ge
             final Map<String, Object> componentConfig) {
 
         // setup server info
-        final Dictionary<?, ?> props = bundleContext.getBundle().getHeaders();
-        final Version bundleVersion = Version.parseVersion((String) props.get(Constants.BUNDLE_VERSION));
-        final String productVersion = bundleVersion.getMajor() + "."
-            + bundleVersion.getMinor();
-        this.serverInfo = PRODUCT_NAME + "/" + productVersion + " ("
-            + System.getProperty("java.vm.name") + " "
-            + System.getProperty("java.version") + "; "
-            + System.getProperty("os.name") + " "
-            + System.getProperty("os.version") + " "
-            + System.getProperty("os.arch") + ")";
-        this.requestProcessor.setServerInfo(serverInfo);
+        setProductInfo(bundleContext);
 
         // prepare the servlet configuration from the component config
         final Hashtable<String, Object> configuration = new Hashtable<String, Object>(
@@ -278,8 +349,7 @@ public class SlingMainServlet extends Ge
 
         // ensure the servlet name
         if (!(configuration.get("servlet-name") instanceof String)) {
-            configuration.put("servlet-name", PRODUCT_NAME + " "
-                + productVersion);
+            configuration.put("servlet-name", this.productInfo);
         }
 
         // configure method filter
@@ -361,6 +431,11 @@ public class SlingMainServlet extends Ge
             SlingRequestProcessor.NAME, requestProcessor, srpProps);
     }
 
+    @Override
+    public void init() {
+        setServerInfo();
+    }
+
     @Deactivate
     protected void deactivate() {
         // unregister the sling request processor