--- /dev/null
+/*
+ * 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());
+
+ }
+ }
+}
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;
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;
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());
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;
"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();
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");