Author: cziegeler
Date: Fri Aug 27 08:36:15 2010
New Revision: 990068

URL: http://svn.apache.org/viewvc?rev=990068&view=rev
Log:
SLING-1699 : New default configuration is created on each startup

Added:
    
sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/WebConsolePrinter.java
   (with props)
Modified:
    sling/trunk/bundles/commons/threads/pom.xml
    
sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/Activator.java
    
sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/DefaultThreadPoolManager.java
    
sling/trunk/bundles/commons/threads/src/main/resources/OSGI-INF/metatype/metatype.xml

Modified: sling/trunk/bundles/commons/threads/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/commons/threads/pom.xml?rev=990068&r1=990067&r2=990068&view=diff
==============================================================================
--- sling/trunk/bundles/commons/threads/pom.xml (original)
+++ sling/trunk/bundles/commons/threads/pom.xml Fri Aug 27 08:36:15 2010
@@ -63,6 +63,9 @@
                         <Private-Package>
                             org.apache.sling.commons.threads.impl
                         </Private-Package>
+                        <Import-Package>
+                            org.apache.felix.webconsole;resolution:=optional, *
+                        </Import-Package>
                     </instructions>
                 </configuration>
             </plugin>
@@ -94,5 +97,11 @@
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.webconsole</artifactId>
+            <version>3.0.0</version>
+            <scope>provided</scope>
+        </dependency>
     </dependencies>
 </project>

Modified: 
sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/Activator.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/Activator.java?rev=990068&r1=990067&r2=990068&view=diff
==============================================================================
--- 
sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/Activator.java
 (original)
+++ 
sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/Activator.java
 Fri Aug 27 08:36:15 2010
@@ -54,12 +54,22 @@ public class Activator implements Bundle
         this.service = new DefaultThreadPoolManager(this.bundleContext, props);
         this.serviceReg = this.bundleContext.registerService(new String[] 
{ThreadPoolManager.class.getName(),
                 ManagedServiceFactory.class.getName()}, service, props);
+        try {
+            WebConsolePrinter.initPlugin(this.bundleContext, this.service);
+        } catch (Throwable ignore) {
+            // we just ignore this
+        }
     }
 
     /**
      * @see 
org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
      */
     public void stop(BundleContext context) {
+        try {
+            WebConsolePrinter.destroyPlugin();
+        } catch (Throwable ignore) {
+            // we just ignore this
+        }
         if ( this.serviceReg != null ) {
             this.serviceReg.unregister();
             this.serviceReg = null;

Modified: 
sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/DefaultThreadPoolManager.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/DefaultThreadPoolManager.java?rev=990068&r1=990067&r2=990068&view=diff
==============================================================================
--- 
sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/DefaultThreadPoolManager.java
 (original)
+++ 
sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/DefaultThreadPoolManager.java
 Fri Aug 27 08:36:15 2010
@@ -16,10 +16,8 @@
  */
 package org.apache.sling.commons.threads.impl;
 
-import java.io.IOException;
 import java.util.Dictionary;
 import java.util.HashMap;
-import java.util.Hashtable;
 import java.util.Map;
 import java.util.UUID;
 
@@ -31,11 +29,8 @@ import org.apache.sling.commons.threads.
 import org.apache.sling.commons.threads.ThreadPoolConfig.ThreadPriority;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
-import org.osgi.service.cm.Configuration;
-import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.cm.ConfigurationException;
 import org.osgi.service.cm.ManagedServiceFactory;
-import org.osgi.util.tracker.ServiceTracker;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -58,18 +53,13 @@ public class DefaultThreadPoolManager
     /** The bundle context. */
     protected final BundleContext bundleContext;
 
-    /** Service tracker for the config admin. */
-    protected final ServiceTracker configAdminTracker;
-
     /**
      * Constructor and activate this component.
      */
     public DefaultThreadPoolManager(final BundleContext bc, final 
Dictionary<String, Object> props) {
         this.properties = props;
         this.bundleContext = bc;
-        this.configAdminTracker = new ServiceTracker(bc, 
ConfigurationAdmin.class.getName(), null);
-        this.configAdminTracker.open();
-        this.logger.info("Started Apache Sling Thread Pool Manager: {}", 
getPid());
+        this.logger.info("Started Apache Sling Thread Pool Manager");
     }
 
     /**
@@ -78,42 +68,13 @@ public class DefaultThreadPoolManager
     public void destroy() {
         this.logger.debug("Disposing all thread pools");
 
-        this.configAdminTracker.close();
-
         synchronized ( this.pools ) {
             for (final Entry entry : this.pools.values()) {
                 entry.shutdown();
             }
             this.pools.clear();
         }
-        this.logger.info("Stopped Apache Sling Thread Pool Manager.");
-    }
-
-    /**
-     * Helper method to get the pid
-     */
-    private String getPid() {
-        // as the activator put a string in the props we know that this is a 
string
-        return this.properties.get(Constants.SERVICE_PID).toString();
-    }
-
-    /**
-     * Create a dictionary with configuration properties for the configuration
-     */
-    private Dictionary<String, Object> getProperties(final String poolName, 
final ThreadPoolConfig config) {
-        final Dictionary<String, Object> props = new Hashtable<String, 
Object>();
-        props.put(ModifiableThreadPoolConfig.PROPERTY_MIN_POOL_SIZE, 
config.getMinPoolSize());
-        props.put(ModifiableThreadPoolConfig.PROPERTY_MAX_POOL_SIZE, 
config.getMaxPoolSize());
-        props.put(ModifiableThreadPoolConfig.PROPERTY_QUEUE_SIZE, 
config.getQueueSize());
-        props.put(ModifiableThreadPoolConfig.PROPERTY_KEEP_ALIVE_TIME, 
config.getKeepAliveTime());
-        props.put(ModifiableThreadPoolConfig.PROPERTY_BLOCK_POLICY, 
config.getBlockPolicy().toString());
-        props.put(ModifiableThreadPoolConfig.PROPERTY_SHUTDOWN_GRACEFUL, 
config.isShutdownGraceful());
-        props.put(ModifiableThreadPoolConfig.PROPERTY_SHUTDOWN_WAIT_TIME, 
config.getShutdownWaitTimeMs());
-        props.put(ModifiableThreadPoolConfig.PROPERTY_PRIORITY, 
config.getPriority().toString());
-        props.put(ModifiableThreadPoolConfig.PROPERTY_DAEMON, 
config.isDaemon());
-        props.put(ModifiableThreadPoolConfig.PROPERTY_NAME, poolName);
-
-        return props;
+        this.logger.info("Stopped Apache Sling Thread Pool Manager");
     }
 
     /**
@@ -162,30 +123,11 @@ public class DefaultThreadPoolManager
             if ( entry == null ) {
                 this.logger.debug("Creating new pool with name {}", poolName);
                 final ModifiableThreadPoolConfig config = new 
ModifiableThreadPoolConfig();
-                // check for config admin
-                final ConfigurationAdmin ca = (ConfigurationAdmin) 
this.configAdminTracker.getService();
-                if ( ca != null ) {
-                    try {
-                        final Configuration caConfig = 
ca.createFactoryConfiguration(getPid());
-                        caConfig.update(this.getProperties(poolName, config));
-                        entry = new 
Entry(caConfig.getProperties().get(Constants.SERVICE_PID).toString(), config, 
poolName);
-                    } catch (IOException e) {
-                        // there is not much we can do if we get an io 
exception
-                        // just log and continue
-                        this.logger.error("Unable to create configuration for 
thread pool " + poolName, e);
-                    }
-                } else {
-                    this.logger.error("Configuration admin is not available.");
-                }
-                // sanity check - if CA is not available or a problem occured 
during persisting
-                // we don't have an entry
-                if ( entry == null ) {
-                    entry = new Entry(null, config, poolName);
-                }
+                entry = new Entry(null, config, poolName);
+
                 this.pools.put(poolName, entry);
             }
             return entry.incUsage();
-
         }
     }
 
@@ -227,6 +169,15 @@ public class DefaultThreadPoolManager
     }
 
     /**
+     * Return all configurations for the web console printer
+     */
+    public Entry[] getConfigurations() {
+        synchronized ( this.pools ) {
+            return this.pools.values().toArray(new Entry[this.pools.size()]);
+        }
+    }
+
+    /**
      * @see 
org.osgi.service.cm.ManagedServiceFactory#updated(java.lang.String, 
java.util.Dictionary)
      */
     @SuppressWarnings("unchecked")
@@ -238,15 +189,26 @@ public class DefaultThreadPoolManager
         }
         this.logger.debug("Updating {} with {}", pid, properties);
         synchronized ( this.pools ) {
+            final ThreadPoolConfig config = this.createConfig(properties);
+
             Entry foundEntry = null;
-            // we have to search the config by using the pid!
+            // we have to search the config by using the pid first!
             for (final Entry entry : this.pools.values()) {
                 if ( pid.equals(entry.getPid()) ) {
                     foundEntry = entry;
                     break;
                 }
             }
-            final ThreadPoolConfig config = this.createConfig(properties);
+            // if we haven't found it by pid we search by name
+            if ( foundEntry == null ) {
+                for (final Entry entry : this.pools.values()) {
+                    if ( name.equals(entry.getName()) ) {
+                        foundEntry = entry;
+                        break;
+                    }
+                }
+            }
+
             if ( foundEntry != null ) {
                 // if the name changed - we have to reregister(!)
                 if ( !name.equals(foundEntry.getName()) ) {
@@ -254,7 +216,7 @@ public class DefaultThreadPoolManager
                     this.pools.put(name, foundEntry);
                 }
                 // update
-                foundEntry.update(config, name);
+                foundEntry.update(config, name, pid);
             } else {
                 // create
                 this.pools.put(name, new Entry(pid, config, name));
@@ -283,16 +245,16 @@ public class DefaultThreadPoolManager
                 if ( foundEntry.isUsed() ) {
                     // we register this with a new name
                     final String name = "ThreadPool-" + 
UUID.randomUUID().toString();
-                    foundEntry.update(new ModifiableThreadPoolConfig(), name);
+                    foundEntry.update(new ModifiableThreadPoolConfig(), name, 
null);
                     this.pools.put(name, foundEntry);
                 }
             }
         }
     }
 
-    private static final class Entry {
+    protected static final class Entry {
         /** The configuration pid. (might be null for anonymous pools.*/
-        private final String pid;
+        private volatile String pid;
 
         /** Usage count. */
         private volatile int count;
@@ -338,7 +300,7 @@ public class DefaultThreadPoolManager
             }
         }
 
-        public void update(final ThreadPoolConfig config, final String name) {
+        public void update(final ThreadPoolConfig config, final String name, 
final String pid) {
             if ( this.pool != null ) {
                 this.pool.setName(name);
                 if ( !this.config.equals(config) ) {
@@ -347,6 +309,7 @@ public class DefaultThreadPoolManager
             }
             this.config = config;
             this.name = name;
+            this.pid = pid;
         }
 
         public String getName() {
@@ -356,5 +319,9 @@ public class DefaultThreadPoolManager
         public boolean isUsed() {
             return this.count > 0;
         }
+
+        public ThreadPoolConfig getConfig() {
+            return this.config;
+        }
     }
 }

Added: 
sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/WebConsolePrinter.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/WebConsolePrinter.java?rev=990068&view=auto
==============================================================================
--- 
sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/WebConsolePrinter.java
 (added)
+++ 
sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/WebConsolePrinter.java
 Fri Aug 27 08:36:15 2010
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.commons.threads.impl;
+
+import java.io.PrintWriter;
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.apache.felix.webconsole.ConfigurationPrinter;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * This is a configuration printer for the web console which
+ * prints out the thread pools.
+ *
+ */
+public class WebConsolePrinter implements ConfigurationPrinter {
+
+    private static ServiceRegistration plugin;
+
+    public static void initPlugin(final BundleContext bundleContext,
+            final DefaultThreadPoolManager dtpm) {
+        final WebConsolePrinter propertiesPrinter = new 
WebConsolePrinter(dtpm);
+        final Dictionary<String, String> props = new Hashtable<String, 
String>();
+        props.put(Constants.SERVICE_DESCRIPTION,
+            "Apache Sling Thread Pool Configuration Printer");
+        props.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation");
+
+        plugin = 
bundleContext.registerService(ConfigurationPrinter.class.getName(),
+                                               propertiesPrinter, props);
+    }
+
+    public static void destroyPlugin() {
+        if ( plugin != null) {
+            plugin.unregister();
+            plugin = null;
+        }
+    }
+
+    private static String HEADLINE = "Apache Sling Thread Pools";
+
+    private final DefaultThreadPoolManager mgr;
+
+    public WebConsolePrinter(final DefaultThreadPoolManager dtpm) {
+        this.mgr = dtpm;
+    }
+
+    /**
+     * @see org.apache.felix.webconsole.ConfigurationPrinter#getTitle()
+     */
+    public String getTitle() {
+        return "Sling Thread Pools";
+    }
+
+    /**
+     * Print out the servlet filter chains.
+     * @see 
org.apache.felix.webconsole.ConfigurationPrinter#printConfiguration(java.io.PrintWriter)
+     */
+    public void printConfiguration(PrintWriter pw) {
+        pw.println(HEADLINE);
+        pw.println();
+        final DefaultThreadPoolManager.Entry[] configs = 
this.mgr.getConfigurations();
+        if ( configs.length > 0 ) {
+            for(final DefaultThreadPoolManager.Entry entry : configs ) {
+                pw.print("Pool ");
+                pw.println(entry.getName());
+                if ( entry.getPid() != null ) {
+                    pw.print("- from configuration : ");
+                    pw.println(entry.getPid());
+                }
+                pw.print("- used : ");
+                pw.println(entry.isUsed());
+                pw.print("- min pool size : ");
+                pw.println(entry.getConfig().getMinPoolSize());
+                pw.print("- max pool size : ");
+                pw.println(entry.getConfig().getMaxPoolSize());
+                pw.print("- queue size : ");
+                pw.println(entry.getConfig().getQueueSize());
+                pw.print("- keep alive time : ");
+                pw.println(entry.getConfig().getKeepAliveTime());
+                pw.print("- block policy : ");
+                pw.println(entry.getConfig().getBlockPolicy());
+                pw.print("- priority : ");
+                pw.println(entry.getConfig().getPriority());
+                pw.print("- shutdown graceful : ");
+                pw.println(entry.getConfig().isShutdownGraceful());
+                pw.print("- shutdown wait time : ");
+                pw.println(entry.getConfig().getShutdownWaitTimeMs());
+                pw.print("- daemon : ");
+                pw.println(entry.getConfig().isDaemon());
+                pw.println();
+            }
+        } else {
+            pw.println("No pools configured.");
+        }
+    }
+}

Propchange: 
sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/WebConsolePrinter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/WebConsolePrinter.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Propchange: 
sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/WebConsolePrinter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
sling/trunk/bundles/commons/threads/src/main/resources/OSGI-INF/metatype/metatype.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/commons/threads/src/main/resources/OSGI-INF/metatype/metatype.xml?rev=990068&r1=990067&r2=990068&view=diff
==============================================================================
--- 
sling/trunk/bundles/commons/threads/src/main/resources/OSGI-INF/metatype/metatype.xml
 (original)
+++ 
sling/trunk/bundles/commons/threads/src/main/resources/OSGI-INF/metatype/metatype.xml
 Fri Aug 27 08:36:15 2010
@@ -32,7 +32,7 @@
             type="Integer" default="5" name="%minPoolSize.name"
             description="%minPoolSize.description"/>
         <metatype:AD id="maxPoolSize"
-            type="Integer" default="5" name="%queueSize.name"
+            type="Integer" default="5" name="%maxPoolSize.name"
             description="%maxPoolSize.description" />
         <metatype:AD id="queueSize"
             type="Integer" default="-1" name="%queueSize.name"
@@ -52,10 +52,10 @@
             type="Boolean" default="false" name="%shutdownGraceful.name"
             description="%shutdownGraceful.description" />
         <metatype:AD id="daemon"
-            type="Integer" default="-1" name="%daemon.name"
+            type="Boolean" default="false" name="%daemon.name"
             description="%daemon.description" />
         <metatype:AD id="shutdownWaitTime"
-            type="Boolean" default="false" name="%shutdownWaitTime.name"
+            type="Integer" default="-1" name="%shutdownWaitTime.name"
             description="%shutdownWaitTime.description" />
         <metatype:AD id="priority"
             type="String" default="NORM" name="%priority.name"


Reply via email to