Artifact Mapper implementation is now configurable.
authorwassa <wassa@ab3bd59b-922f-494d-bb5f-6f0a3c29deca>
Tue, 22 Mar 2005 21:33:46 +0000 (21:33 +0000)
committerwassa <wassa@ab3bd59b-922f-494d-bb5f-6f0a3c29deca>
Tue, 22 Mar 2005 21:33:46 +0000 (21:33 +0000)
git-svn-id: https://subversion.switch.ch/svn/shibboleth/java-idp/trunk@1330 ab3bd59b-922f-494d-bb5f-6f0a3c29deca

src/edu/internet2/middleware/shibboleth/artifact/ArtifactMapperFactory.java [new file with mode: 0644]
src/edu/internet2/middleware/shibboleth/artifact/provider/MemoryArtifactMapper.java
src/edu/internet2/middleware/shibboleth/idp/IdPProtocolSupport.java
src/edu/internet2/middleware/shibboleth/idp/IdPResponder.java
src/schemas/shibboleth-idpconfig-1.0.xsd

diff --git a/src/edu/internet2/middleware/shibboleth/artifact/ArtifactMapperFactory.java b/src/edu/internet2/middleware/shibboleth/artifact/ArtifactMapperFactory.java
new file mode 100644 (file)
index 0000000..f68ba9d
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * 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: 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. 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 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.
+ */
+
+package edu.internet2.middleware.shibboleth.artifact;
+
+import java.lang.reflect.Constructor;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Element;
+
+import edu.internet2.middleware.shibboleth.common.ShibbolethConfigurationException;
+
+/**
+ * Factory for generating instances of <code>ArtifactMapper</code>. Configuration is delegated to the implementation.
+ * Runtime options are passed to concrete constructors via an <ArtifactMapper/>DOM element.
+ * 
+ * @author Walter Hoehn
+ */
+public class ArtifactMapperFactory {
+
+       private static Logger log = Logger.getLogger(ArtifactMapperFactory.class.getName());
+
+       public static ArtifactMapper getInstance(Element config) throws ShibbolethConfigurationException {
+
+               if (config.getAttribute("implementation") == null) { throw new ShibbolethConfigurationException(
+                               "No ArtifactMapper implementaiton specified."); }
+               try {
+                       Class implementorClass = Class.forName(config.getAttribute("implementation"));
+                       Class[] params = new Class[1];
+                       params[0] = Class.forName("org.w3c.dom.Element");
+                       Constructor implementorConstructor = implementorClass.getConstructor(params);
+                       Object[] args = new Object[1];
+                       args[0] = config;
+                       log.debug("Initializing Artifact Mapper of type (" + implementorClass.getName() + ").");
+                       return (ArtifactMapper) implementorConstructor.newInstance(args);
+
+               } catch (NoSuchMethodException nsme) {
+                       log.error("Failed to instantiate an Artifact Mapper: ArtifactMapper "
+                                       + "implementation must contain a constructor that accepts an <ArtifactMapper/> element as "
+                                       + "configuration data.");
+                       throw new ShibbolethConfigurationException("Failed to instantiate an Artifact Mapper.");
+                       
+               } catch (Exception e) {
+                       log.error("Failed to instantiate an Artifact Mapper: " + e);
+                       throw new ShibbolethConfigurationException("Failed to instantiate an Artifact Mapper: " + e.getMessage());
+
+               }
+       }
+}
index b13860d..ce96847 100644 (file)
@@ -31,6 +31,7 @@ import java.util.Map;
 
 import org.apache.log4j.Logger;
 import org.opensaml.artifact.Artifact;
+import org.w3c.dom.Element;
 
 import edu.internet2.middleware.shibboleth.artifact.ArtifactMapper;
 import edu.internet2.middleware.shibboleth.artifact.ArtifactMapping;
@@ -47,6 +48,11 @@ public class MemoryArtifactMapper extends BaseArtifactMapper implements Artifact
 
                super();
        }
+       
+       public MemoryArtifactMapper(Element config) throws ShibbolethConfigurationException {
+
+               super();
+       }
 
        // TODO need to cleanup stale artifacts
        private static Logger log = Logger.getLogger(MemoryArtifactMapper.class.getName());
index 548a49d..06aeac7 100644 (file)
@@ -49,7 +49,6 @@ import edu.internet2.middleware.shibboleth.aa.arp.ArpEngine;
 import edu.internet2.middleware.shibboleth.aa.arp.ArpProcessingException;
 import edu.internet2.middleware.shibboleth.aa.attrresolv.AttributeResolver;
 import edu.internet2.middleware.shibboleth.artifact.ArtifactMapper;
-import edu.internet2.middleware.shibboleth.artifact.provider.MemoryArtifactMapper;
 import edu.internet2.middleware.shibboleth.common.Credential;
 import edu.internet2.middleware.shibboleth.common.NameMapper;
 import edu.internet2.middleware.shibboleth.common.RelyingParty;
@@ -79,7 +78,8 @@ public class IdPProtocolSupport implements Metadata {
        private Semaphore throttle;
 
        IdPProtocolSupport(IdPConfig config, Logger transactionLog, NameMapper nameMapper, ServiceProviderMapper spMapper,
-                       ArpEngine arpEngine, AttributeResolver resolver) throws ShibbolethConfigurationException {
+                       ArpEngine arpEngine, AttributeResolver resolver, ArtifactMapper artifactMapper)
+                       throws ShibbolethConfigurationException {
 
                this.transactionLog = transactionLog;
                this.config = config;
@@ -88,8 +88,7 @@ public class IdPProtocolSupport implements Metadata {
                spMapper.setMetadata(this);
                this.arpEngine = arpEngine;
                this.resolver = resolver;
-               // TODO make this pluggable... and clean up memory impl
-               artifactMapper = new MemoryArtifactMapper();
+               this.artifactMapper = artifactMapper;
 
                // Load a semaphore that throttles how many requests the IdP will handle at once
                throttle = new Semaphore(config.getMaxThreads());
index 424afb8..59349ed 100644 (file)
@@ -53,6 +53,9 @@ import edu.internet2.middleware.shibboleth.aa.arp.ArpEngine;
 import edu.internet2.middleware.shibboleth.aa.arp.ArpException;
 import edu.internet2.middleware.shibboleth.aa.attrresolv.AttributeResolver;
 import edu.internet2.middleware.shibboleth.aa.attrresolv.AttributeResolverException;
+import edu.internet2.middleware.shibboleth.artifact.ArtifactMapper;
+import edu.internet2.middleware.shibboleth.artifact.ArtifactMapperFactory;
+import edu.internet2.middleware.shibboleth.artifact.provider.MemoryArtifactMapper;
 import edu.internet2.middleware.shibboleth.common.Credentials;
 import edu.internet2.middleware.shibboleth.common.NameIdentifierMapping;
 import edu.internet2.middleware.shibboleth.common.NameIdentifierMappingException;
@@ -143,7 +146,7 @@ public class IdPResponder extends HttpServlet {
                                                "ReleasePolicyEngine");
 
                                if (itemElements.getLength() > 1) {
-                                       log.warn("Encountered multiple <ReleasePolicyEngine> configuration elements.  Using first...");
+                                       log.warn("Encountered multiple <ReleasePolicyEngine/> configuration elements.  Using first...");
                                }
                                if (itemElements.getLength() < 1) {
                                        arpEngine = new ArpEngine();
@@ -161,9 +164,23 @@ public class IdPResponder extends HttpServlet {
                                throw new ShibbolethConfigurationException("Could not load Attribute Resolver.");
                        }
 
+                       // Load artifact mapping implementation
+                       ArtifactMapper artifactMapper = null;
+                       itemElements = originConfig.getDocumentElement().getElementsByTagNameNS(IdPConfig.configNameSpace,
+                                       "ArtifactMapper");
+                       if (itemElements.getLength() > 1) {
+                               log.warn("Encountered multiple <ArtifactMapper/> configuration elements.  Using first...");
+                       }
+                       if (itemElements.getLength() > 0) {
+                               artifactMapper = ArtifactMapperFactory.getInstance((Element) itemElements.item(0));
+                       } else {
+                               log.debug("No Artifact Mapper configuration found.  Defaulting to Memory-based implementation.");
+                               artifactMapper = new MemoryArtifactMapper();
+                       }
+
                        // Load protocol handlers and support library
                        protocolSupport = new IdPProtocolSupport(configuration, transactionLog, nameMapper, spMapper, arpEngine,
-                                       resolver);
+                                       resolver, artifactMapper);
                        itemElements = originConfig.getDocumentElement().getElementsByTagNameNS(IdPConfig.configNameSpace,
                                        "ProtocolHandler");
 
index d037aac..82e8c47 100644 (file)
                                <xs:sequence>
                                        <xs:element ref="namemapper:NameMapping" maxOccurs="unbounded"/>
                                </xs:sequence>
+                               
+                               <xs:element name="ArtifactMapper" minOccurs="0" maxOccurs="1">
+                                       <xs:complexType>
+                                               <xs:sequence>
+                                                       <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+                                               </xs:sequence>
+                                               <xs:attribute name="implementation" type="xs:string" use="required"/>
+                                               <xs:anyAttribute namespace="##any" processContents="lax"/>
+                                       </xs:complexType>
+                               </xs:element>
 
                                <xs:element ref="credentials:Credentials"/>