Fix background thread cleanup.
authorwassa <wassa@ab3bd59b-922f-494d-bb5f-6f0a3c29deca>
Tue, 10 Feb 2004 22:04:39 +0000 (22:04 +0000)
committerwassa <wassa@ab3bd59b-922f-494d-bb5f-6f0a3c29deca>
Tue, 10 Feb 2004 22:04:39 +0000 (22:04 +0000)
Cleanup threads will now be properly shutdown in the even of a context reload and when main() exits.
Cleanup threads are set to lower priority.

git-svn-id: https://subversion.switch.ch/svn/shibboleth/java-idp/trunk@892 ab3bd59b-922f-494d-bb5f-6f0a3c29deca

16 files changed:
src/edu/internet2/middleware/shibboleth/aa/AAResponder.java
src/edu/internet2/middleware/shibboleth/aa/AAServlet.java
src/edu/internet2/middleware/shibboleth/aa/arp/ArpEngine.java
src/edu/internet2/middleware/shibboleth/aa/arp/ArpRepository.java
src/edu/internet2/middleware/shibboleth/aa/arp/provider/BaseArpRepository.java
src/edu/internet2/middleware/shibboleth/aa/arp/provider/MemoryArpRepository.java
src/edu/internet2/middleware/shibboleth/aa/attrresolv/AttributeResolver.java
src/edu/internet2/middleware/shibboleth/aa/attrresolv/ResolverCache.java
src/edu/internet2/middleware/shibboleth/common/BaseNameIdentifierMapping.java
src/edu/internet2/middleware/shibboleth/common/NameIdentifierMapping.java
src/edu/internet2/middleware/shibboleth/common/NameMapper.java
src/edu/internet2/middleware/shibboleth/common/PrincipalNameIdentifier.java
src/edu/internet2/middleware/shibboleth/common/ResourceWatchdog.java
src/edu/internet2/middleware/shibboleth/hs/HandleServlet.java
src/edu/internet2/middleware/shibboleth/hs/provider/SharedMemoryShibHandle.java
src/edu/internet2/middleware/shibboleth/wayf/WayfService.java

index 20b9988..f9c6ebe 100755 (executable)
@@ -144,4 +144,12 @@ public class AAResponder {
                arpEngine.filterAttributes(attributeSet, principal, requester, resource);
                return attributeSet.getAttributes();
        }
+
+       /**
+        * Cleanup resources that won't be released when this object is garbage-collected
+        */
+       public void destroy() {
+               resolver.destroy();
+               arpEngine.destroy();
+       }
 }
index de1bd3a..e6ddeba 100755 (executable)
@@ -345,6 +345,12 @@ public class AAServlet extends OriginComponent {
 
                }
        }
+       
+       public void destroy() {
+               log.info("Cleaning up resources.");
+               responder.destroy();
+               nameMapper.destroy();
+       }
        public void sendResponse(
                HttpServletResponse resp,
                SAMLAttribute[] attrs,
index e522df4..5ac35f3 100755 (executable)
@@ -384,4 +384,11 @@ public class ArpEngine {
                return canonicalSpec;
        }
 
+       /**
+        * Cleanup resources that won't be released when this object is garbage-collected
+        */
+       public void destroy() {
+               repository.destroy();
+       }
+
 }
index eff02a4..b890de6 100755 (executable)
@@ -101,4 +101,9 @@ public interface ArpRepository {
 
        public void remove(Arp arp) throws ArpRepositoryException;
 
+       /**
+        * Cleanup resources that won't be released when this object is garbage-collected
+        */
+       public void destroy();
+
 }
index 080faf0..8dea046 100755 (executable)
@@ -1,48 +1,38 @@
 /*
- * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation
- * for Advanced Internet Development, Inc. All rights reserved
+ * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation for Advanced Internet Development, Inc.
+ * All rights reserved
  * 
  * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+ * following conditions are met:
  * 
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+ * disclaimer.
  * 
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution, if any, must include
- * the following acknowledgment: "This product includes software developed by
- * the University Corporation for Advanced Internet Development
- * <http://www.ucaid.edu> Internet2 Project. Alternately, this acknowledegement
- * may appear in the software itself, if and wherever such third-party
- * acknowledgments normally appear.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the distribution, if any, must include the
+ * following acknowledgment: "This product includes software developed by the University Corporation for Advanced
+ * Internet Development <http://www.ucaid.edu> Internet2 Project. Alternately, this acknowledegement may appear in the
+ * software itself, if and wherever such third-party acknowledgments normally appear.
  * 
- * Neither the name of Shibboleth nor the names of its contributors, nor
- * Internet2, nor the University Corporation for Advanced Internet Development,
- * Inc., nor UCAID may be used to endorse or promote products derived from this
- * software without specific prior written permission. For written permission,
- * please contact shibboleth@shibboleth.org
+ * Neither the name of Shibboleth nor the names of its contributors, nor Internet2, nor the University Corporation for
+ * Advanced Internet Development, Inc., nor UCAID may be used to endorse or promote products derived from this software
+ * without specific prior written permission. For written permission, please contact shibboleth@shibboleth.org
  * 
- * Products derived from this software may not be called Shibboleth, Internet2,
- * UCAID, or the University Corporation for Advanced Internet Development, nor
- * may Shibboleth appear in their name, without prior written permission of the
+ * Products derived from this software may not be called Shibboleth, Internet2, UCAID, or the University Corporation
+ * for Advanced Internet Development, nor may Shibboleth appear in their name, without prior written permission of the
  * University Corporation for Advanced Internet Development.
  * 
  * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK
- * OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH LICENSEE.
- * IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
- * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND WITH ALL FAULTS. ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK OF SATISFACTORY QUALITY, PERFORMANCE,
+ * ACCURACY, AND EFFORT IS WITH LICENSEE. IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
+ * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 package edu.internet2.middleware.shibboleth.aa.arp.provider;
@@ -65,8 +55,7 @@ import edu.internet2.middleware.shibboleth.aa.arp.ArpRepository;
 import edu.internet2.middleware.shibboleth.aa.arp.ArpRepositoryException;
 
 /**
- * Provides marshalling/unmarshalling functionality common among <code>ArpRepository</code>
- * implementations.
+ * Provides marshalling/unmarshalling functionality common among <code>ArpRepository</code> implementations.
  * 
  * @author Walter Hoehn (wassa@columbia.edu)
  */
@@ -83,6 +72,7 @@ public abstract class BaseArpRepository implements ArpRepository {
                try {
                        if (rawArpTTL != null && !rawArpTTL.equals("")) {
                                arpTTL = Long.parseLong(rawArpTTL);
+                               log.debug("ARP TTL set to: (" + arpTTL + ").");
                        }
                } catch (NumberFormatException e) {
                        log.error("ARP TTL must be set to a long integer.");
@@ -162,6 +152,10 @@ public abstract class BaseArpRepository implements ArpRepository {
         */
        protected abstract Element retrieveSiteArpXml() throws IOException, SAXException;
 
+       public void destroy() {
+               arpCache.destroy();
+       }
+
        /**
         * @see edu.internet2.middleware.shibboleth.aa.arp.ArpRepository#getUserPolicy(Principal)
         */
@@ -281,9 +275,15 @@ class ArpCache {
         */
        protected void finalize() throws Throwable {
                super.finalize();
+               destroy();
+       }
+
+       public void destroy() {
                synchronized (cleaner) {
-                       cleaner.shutdown = true;
-                       cleaner.interrupt();
+                       if (cleaner != null) {
+                               cleaner.shutdown = true;
+                               cleaner.interrupt();
+                       }
                }
        }
 
@@ -325,21 +325,31 @@ class ArpCache {
        private class ArpCacheCleaner extends Thread {
 
                private boolean shutdown = false;
+               private Thread master;
 
                public ArpCacheCleaner() {
-                       super();
+                       super("edu.internet2.middleware.shibboleth.aa.arp.provider.BaseArpRepository.ArpCache.ArpCacheCleaner");
+                       master = Thread.currentThread();
+                       setDaemon(true);
+                       if (getPriority() > Thread.MIN_PRIORITY) {
+                               setPriority(getPriority() - 1);
+                       }
                        log.debug("Starting ArpCache Cleanup Thread.");
                        start();
                }
 
                public void run() {
                        try {
-                               sleep(5 * 60 * 1000);
+                               sleep(60 * 1000); //one minute
                        } catch (InterruptedException e) {
                                log.debug("ArpCache Cleanup interrupted.");
                        }
                        while (true) {
                                try {
+                                       if (master == null) {
+                                               log.debug("ArpCache cache cleaner is orphaned.");
+                                               shutdown = true;
+                                       }
                                        if (shutdown) {
                                                log.debug("Stopping ArpCache Cleanup Thread.");
                                                return;
@@ -370,7 +380,7 @@ class ArpCache {
                                                }
                                        }
 
-                                       sleep(5 * 60 * 1000);
+                                       sleep(60 * 1000); //one minute
                                } catch (InterruptedException e) {
                                        log.debug("ArpCache Cleanup interrupted.");
                                }
index 9284d90..5830a04 100755 (executable)
@@ -156,5 +156,9 @@ public class MemoryArpRepository implements ArpRepository {
 
                userPolicies.put(arp.getPrincipal(), arp);
        }
+       
+       public void destroy() {
+               //do nothing
+       }
 
 }
index 3c62b3f..5d3ab2f 100644 (file)
@@ -706,4 +706,10 @@ public class AttributeResolver {
                }
        }
 
+       /**
+        * Cleanup resources that won't be released when this object is garbage-collected
+        */
+       public void destroy() {
+               resolverCache.destroy();
+       }
 }
index 4530b32..00b80e3 100644 (file)
@@ -1,49 +1,37 @@
-/* 
- * The Shibboleth License, Version 1. 
- * Copyright (c) 2002 
- * University Corporation for Advanced Internet Development, Inc. 
+/*
+ * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation for Advanced Internet Development, Inc.
  * All rights reserved
  * 
  * 
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions are met:
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+ * following conditions are met:
  * 
- * Redistributions of source code must retain the above copyright notice, this 
- * list of conditions and the following disclaimer.
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+ * disclaimer.
  * 
- * Redistributions in binary form must reproduce the above copyright notice, 
- * this list of conditions and the following disclaimer in the documentation 
- * and/or other materials provided with the distribution, if any, must include 
- * the following acknowledgment: "This product includes software developed by 
- * the University Corporation for Advanced Internet Development 
- * <http://www.ucaid.edu>Internet2 Project. Alternately, this acknowledegement 
- * may appear in the software itself, if and wherever such third-party 
- * acknowledgments normally appear.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the distribution, if any, must include the
+ * following acknowledgment: "This product includes software developed by the University Corporation for Advanced
+ * Internet Development <http://www.ucaid.edu> Internet2 Project. Alternately, this acknowledegement may appear in the
+ * software itself, if and wherever such third-party acknowledgments normally appear.
  * 
- * Neither the name of Shibboleth nor the names of its contributors, nor 
- * Internet2, nor the University Corporation for Advanced Internet Development, 
- * Inc., nor UCAID may be used to endorse or promote products derived from this 
- * software without specific prior written permission. For written permission, 
- * please contact shibboleth@shibboleth.org
+ * Neither the name of Shibboleth nor the names of its contributors, nor Internet2, nor the University Corporation for
+ * Advanced Internet Development, Inc., nor UCAID may be used to endorse or promote products derived from this software
+ * without specific prior written permission. For written permission, please contact shibboleth@shibboleth.org
  * 
- * Products derived from this software may not be called Shibboleth, Internet2, 
- * UCAID, or the University Corporation for Advanced Internet Development, nor 
- * may Shibboleth appear in their name, without prior written permission of the 
+ * Products derived from this software may not be called Shibboleth, Internet2, UCAID, or the University Corporation
+ * for Advanced Internet Development, nor may Shibboleth appear in their name, without prior written permission of the
  * University Corporation for Advanced Internet Development.
  * 
  * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
- * AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
- * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK 
- * OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH LICENSEE. 
- * IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY 
- * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, 
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND WITH ALL FAULTS. ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK OF SATISFACTORY QUALITY, PERFORMANCE,
+ * ACCURACY, AND EFFORT IS WITH LICENSEE. IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
+ * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
@@ -60,11 +48,10 @@ import javax.naming.directory.Attributes;
 import org.apache.log4j.Logger;
 
 /**
- * Rudimentary mechanism for caching objects created by the various
- * Resolution PlugIns.
+ * Rudimentary mechanism for caching objects created by the various Resolution PlugIns.
  * 
  * @author Walter Hoehn (wassa@columbia.edu)
- *
+ *  
  */
 public class ResolverCache {
 
@@ -72,7 +59,7 @@ public class ResolverCache {
        //Hashtable handles synchronization for us
        private Hashtable attributeDataCache = new Hashtable();
        private Hashtable connectorDataCache = new Hashtable();
-       private Cleaner cleaner = new Cleaner(Thread.currentThread());
+       private Cleaner cleaner = new Cleaner();
 
        ResolverCache() {
                log.info("Initializing the Attribute Resolver cache.");
@@ -175,9 +162,18 @@ public class ResolverCache {
         */
        protected void finalize() throws Throwable {
                super.finalize();
+               destroy();
+       }
+
+       /**
+        * Cleanup resources that won't be released when this object is garbage-collected
+        */
+       protected void destroy() {
                synchronized (cleaner) {
-                       cleaner.shutdown = true;
-                       cleaner.interrupt();
+                       if (cleaner != null) {
+                               cleaner.shutdown = true;
+                               cleaner.interrupt();
+                       }
                }
        }
 
@@ -234,6 +230,7 @@ public class ResolverCache {
 
                /**
                 * Method getPlugInId.
+                * 
                 * @return Object
                 */
                private String getPlugInId() {
@@ -242,6 +239,7 @@ public class ResolverCache {
 
                /**
                 * Method getPrincipal.
+                * 
                 * @return Object
                 */
                private Principal getPrincipal() {
@@ -260,26 +258,30 @@ public class ResolverCache {
        private class Cleaner extends Thread {
 
                private boolean shutdown = false;
-               private Thread master;
+               private Object master;
 
-               public Cleaner(Thread master) {
-                       super();
-                       log.debug("Starting Resolver Cache cleanup thread.");
-                       this.master = master;
+               public Cleaner() {
+                       super("edu.internet2.middleware.shibboleth.aa.attrresolv.ResolverCacher.Cleaner");
+                       master = Thread.currentThread();
                        setDaemon(true);
+                       if (getPriority() > Thread.MIN_PRIORITY) {
+                               setPriority(getPriority() - 1);
+                       }
+                       log.debug("Starting Resolver Cache cleanup thread.");
                        start();
                }
 
                public void run() {
                        try {
-                               sleep(5 * 60 * 1000);
+                               sleep(60 * 1000); //one minute
                        } catch (InterruptedException e) {
                                log.debug("Resolver Cache Cleanup interrupted.");
                        }
 
                        while (true) {
                                try {
-                                       if (!master.isAlive()) {
+                                       if (master == null) {
+                                               log.debug("Resolver cache cleaner is orphaned.");
                                                shutdown = true;
                                        }
                                        if (shutdown) {
@@ -321,7 +323,7 @@ public class ResolverCache {
                                                }
                                        }
 
-                                       sleep(5 * 60 * 1000);
+                                       sleep(60 * 1000); //one minute
 
                                } catch (InterruptedException e) {
                                        log.debug("Resolver Cache Cleanup interrupted.");
index f6cfd7a..b878819 100644 (file)
@@ -1,48 +1,38 @@
 /*
- * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation
- * for Advanced Internet Development, Inc. All rights reserved
+ * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation for Advanced Internet Development, Inc.
+ * All rights reserved
  * 
  * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+ * following conditions are met:
  * 
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+ * disclaimer.
  * 
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution, if any, must include
- * the following acknowledgment: "This product includes software developed by
- * the University Corporation for Advanced Internet Development
- * <http://www.ucaid.edu> Internet2 Project. Alternately, this acknowledegement
- * may appear in the software itself, if and wherever such third-party
- * acknowledgments normally appear.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the distribution, if any, must include the
+ * following acknowledgment: "This product includes software developed by the University Corporation for Advanced
+ * Internet Development <http://www.ucaid.edu> Internet2 Project. Alternately, this acknowledegement may appear in the
+ * software itself, if and wherever such third-party acknowledgments normally appear.
  * 
- * Neither the name of Shibboleth nor the names of its contributors, nor
- * Internet2, nor the University Corporation for Advanced Internet Development,
- * Inc., nor UCAID may be used to endorse or promote products derived from this
- * software without specific prior written permission. For written permission,
- * please contact shibboleth@shibboleth.org
+ * Neither the name of Shibboleth nor the names of its contributors, nor Internet2, nor the University Corporation for
+ * Advanced Internet Development, Inc., nor UCAID may be used to endorse or promote products derived from this software
+ * without specific prior written permission. For written permission, please contact shibboleth@shibboleth.org
  * 
- * Products derived from this software may not be called Shibboleth, Internet2,
- * UCAID, or the University Corporation for Advanced Internet Development, nor
- * may Shibboleth appear in their name, without prior written permission of the
+ * Products derived from this software may not be called Shibboleth, Internet2, UCAID, or the University Corporation
+ * for Advanced Internet Development, nor may Shibboleth appear in their name, without prior written permission of the
  * University Corporation for Advanced Internet Development.
  * 
  * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK
- * OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH LICENSEE.
- * IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
- * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND WITH ALL FAULTS. ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK OF SATISFACTORY QUALITY, PERFORMANCE,
+ * ACCURACY, AND EFFORT IS WITH LICENSEE. IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
+ * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 package edu.internet2.middleware.shibboleth.common;
@@ -57,7 +47,7 @@ import edu.internet2.middleware.shibboleth.hs.HSNameIdentifierMapping;
 
 /**
  * Base class for processing name identifier mapping configuration.
- *
+ * 
  * @author Walter Hoehn
  */
 public abstract class BaseNameIdentifierMapping implements NameIdentifierMapping {
@@ -96,4 +86,7 @@ public abstract class BaseNameIdentifierMapping implements NameIdentifierMapping
                return format;
        }
 
+       public void destroy() {
+               //nothing to do
+       }
 }
index 0d13b86..983f3a0 100644 (file)
@@ -75,4 +75,9 @@ public interface NameIdentifierMapping {
        public AuthNPrincipal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
                throws NameIdentifierMappingException, InvalidNameIdentifierException;
 
+       /**
+        * Cleanup resources that won't be released when this object is garbage-collected
+        */
+       public void destroy();
+
 }
index 8880521..6ee5d99 100644 (file)
@@ -43,6 +43,7 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 
 import org.apache.log4j.Logger;
@@ -174,7 +175,7 @@ public class NameMapper {
        }
 
        /**
-         * Adds a {@link NameIdentifierMapping} to this name mapper, registering it according to its format.
+        * Adds a {@link NameIdentifierMapping}to this name mapper, registering it according to its format.
         * 
         * @param mapping
         *            the mapping to add
@@ -192,7 +193,7 @@ public class NameMapper {
        }
 
        /**
-        * Returns the {@link NameIdentifierMapping} registered for a given format.
+        * Returns the {@link NameIdentifierMapping}registered for a given format.
         * 
         * @param format
         *            the registered format
@@ -241,9 +242,9 @@ public class NameMapper {
         *            the provider handling the request
         * @return the local principal
         * @throws NameIdentifierMappingException
-        *             If the {@link NameMapper} encounters an internal error
+        *             If the {@link NameMapper}encounters an internal error
         * @throws InvalidNameIdentifierException
-        *             If the {@link SAMLNameIdentifier} contains invalid data
+        *             If the {@link SAMLNameIdentifier}contains invalid data
         */
        public AuthNPrincipal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
                throws NameIdentifierMappingException, InvalidNameIdentifierException {
@@ -260,4 +261,14 @@ public class NameMapper {
                return mapping.getPrincipal(nameId, sProv, idProv);
        }
 
+       /**
+        * Cleanup resources that won't be released when this object is garbage-collected
+        */
+       public void destroy() {
+                       Iterator mappingIterator = byFormat.values().iterator();
+                       while (mappingIterator.hasNext()) {
+                               ((NameIdentifierMapping)mappingIterator.next()).destroy();
+                       }
+       }
+
 }
index e77749d..65551bd 100644 (file)
@@ -67,5 +67,4 @@ public class PrincipalNameIdentifier extends BaseNameIdentifierMapping {
 
                return new AuthNPrincipal(nameId.getName());
        }
-
 }
index 9faef42..193c28b 100644 (file)
@@ -77,6 +77,9 @@ public abstract class ResourceWatchdog extends Thread {
                this.resource = resource;
                setDaemon(true);
                setDelay(DEFAULT_DELAY);
+               if (getPriority() > Thread.MIN_PRIORITY) {
+                       setPriority(getPriority() - 1);
+               }
                this.maxRetries = DEFAULT_MAX_RETRIES;
                lastModified = System.currentTimeMillis();
        }
index 0b59091..5033185 100644 (file)
@@ -238,6 +238,11 @@ public class HandleServlet extends OriginComponent {
                        throttle.exit();
                }
        }
+       
+       public void destroy() {
+               log.info("Cleaning up resources.");
+               nameMapper.destroy();
+       }
 
        protected byte[] generateAssertion(
                HSRelyingParty relyingParty,
index 912416a..432543a 100644 (file)
@@ -1,48 +1,38 @@
 /*
- * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation
- * for Advanced Internet Development, Inc. All rights reserved
+ * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation for Advanced Internet Development, Inc.
+ * All rights reserved
  * 
  * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+ * following conditions are met:
  * 
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+ * disclaimer.
  * 
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution, if any, must include
- * the following acknowledgment: "This product includes software developed by
- * the University Corporation for Advanced Internet Development
- * <http://www.ucaid.edu> Internet2 Project. Alternately, this acknowledegement
- * may appear in the software itself, if and wherever such third-party
- * acknowledgments normally appear.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the distribution, if any, must include the
+ * following acknowledgment: "This product includes software developed by the University Corporation for Advanced
+ * Internet Development <http://www.ucaid.edu> Internet2 Project. Alternately, this acknowledegement may appear in the
+ * software itself, if and wherever such third-party acknowledgments normally appear.
  * 
- * Neither the name of Shibboleth nor the names of its contributors, nor
- * Internet2, nor the University Corporation for Advanced Internet Development,
- * Inc., nor UCAID may be used to endorse or promote products derived from this
- * software without specific prior written permission. For written permission,
- * please contact shibboleth@shibboleth.org
+ * Neither the name of Shibboleth nor the names of its contributors, nor Internet2, nor the University Corporation for
+ * Advanced Internet Development, Inc., nor UCAID may be used to endorse or promote products derived from this software
+ * without specific prior written permission. For written permission, please contact shibboleth@shibboleth.org
  * 
- * Products derived from this software may not be called Shibboleth, Internet2,
- * UCAID, or the University Corporation for Advanced Internet Development, nor
- * may Shibboleth appear in their name, without prior written permission of the
+ * Products derived from this software may not be called Shibboleth, Internet2, UCAID, or the University Corporation
+ * for Advanced Internet Development, nor may Shibboleth appear in their name, without prior written permission of the
  * University Corporation for Advanced Internet Development.
  * 
  * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK
- * OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH LICENSEE.
- * IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
- * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND WITH ALL FAULTS. ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK OF SATISFACTORY QUALITY, PERFORMANCE,
+ * ACCURACY, AND EFFORT IS WITH LICENSEE. IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
+ * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 package edu.internet2.middleware.shibboleth.hs.provider;
 
@@ -67,8 +57,8 @@ import edu.internet2.middleware.shibboleth.common.ServiceProvider;
 import edu.internet2.middleware.shibboleth.hs.HSNameIdentifierMapping;
 
 /**
- * {@link HSNameIdentifierMapping} implementation that uses an in-memory cache to store mappings between principal names
- * and Shibboleth Attribute Query Handles.
+ * {@link HSNameIdentifierMapping}implementation that uses an in-memory cache to store mappings between principal
+ * names and Shibboleth Attribute Query Handles.
  * 
  * @author Walter Hoehn
  */
@@ -132,6 +122,10 @@ public class SharedMemoryShibHandle extends AQHNameIdentifierMapping implements
                        return handleEntry.principal;
                }
        }
+       
+       public void destroy() {
+               cache.destroy();
+       }
 
 }
 
@@ -152,39 +146,54 @@ class HandleCache {
                }
                return instance;
        }
-       /**
-        * @see java.lang.Object#finalize()
-        */
+
        protected void finalize() throws Throwable {
                super.finalize();
+               destroy();
+       }
+       
+       protected void destroy() {
                synchronized (cleaner) {
-                       cleaner.shutdown = true;
-                       cleaner.interrupt();
+                       if (cleaner != null) {
+                               cleaner.shutdown = true;
+                               cleaner.interrupt();
+                       }
                }
        }
 
        private class MemoryRepositoryCleaner extends Thread {
 
                private boolean shutdown = false;
+               private Thread master;
 
                public MemoryRepositoryCleaner() {
-                       super();
+                       super("edu.internet2.middleware.shibboleth.hs.provider.SharedMemoryShibHandle.HandleCache.MemoryRepositoryCleaner");
+                       this.master = Thread.currentThread();
+                       setDaemon(true);
+                       if (getPriority() > Thread.MIN_PRIORITY) {
+                               setPriority(getPriority() - 1);
+                       }
                        log.debug("Starting memory-based shib handle cache cleanup thread.");
                        start();
                }
 
                public void run() {
                        try {
-                               sleep(1 * 60 * 1000);
+                               sleep(60 * 1000); //one minute
                        } catch (InterruptedException e) {
                                log.debug("Memory-based shib handle cache cleanup interrupted.");
                        }
                        while (true) {
                                try {
+                                       if (!master.isAlive()) {
+                                               shutdown = true;
+                                               log.debug("Memory-based shib handle cache cleaner is orphaned.");
+                                       }
                                        if (shutdown) {
                                                log.debug("Stopping Memory-based shib handle cache cleanup thread.");
                                                return;
                                        }
+                                       log.debug("Memory cache handle cache cleanup thread searching for stale entries.");
                                        Set needsDeleting = new HashSet();
                                        synchronized (handleEntries) {
                                                Iterator iterator = handleEntries.entrySet().iterator();
@@ -204,7 +213,7 @@ class HandleCache {
                                                        }
                                                }
                                        }
-                                       sleep(1 * 60 * 1000);
+                                       sleep(60 * 1000); //one minute
                                } catch (InterruptedException e) {
                                        log.debug("Memory-based shib handle cache cleanup interrupted.");
                                }
index e9e5f7b..e89cbed 100755 (executable)
@@ -83,6 +83,7 @@ public class WayfService extends HttpServlet {
        private WayfOrigins originConfig;
        private WayfCacheOptions wOptions = new WayfCacheOptions();
        private static Logger log = Logger.getLogger(WayfService.class.getName());
+       ResourceWatchdog watchdog;
 
        /**
         * @see GenericServlet#init()
@@ -97,7 +98,7 @@ public class WayfService extends HttpServlet {
 
                log.info("Initailizing site metadata watchdog.");
                try {
-                       ResourceWatchdog watchdog = new SitesFileWatchdog(siteConfigFileLocation, this);
+                       watchdog = new SitesFileWatchdog(siteConfigFileLocation, this);
                        watchdog.start();
                } catch (ResourceNotAvailableException e) {
                        log.error("Sites file watchdog could not be initialized: " + e);
@@ -212,6 +213,12 @@ public class WayfService extends HttpServlet {
                        handleError(req, res, we);
                }
        }
+       
+       public void destroy() {
+               if (watchdog != null && watchdog.isAlive()) {
+                       watchdog.interrupt();
+               }
+       }
 
        /**
         * Displays a WAYF selection page.