[java-identity-provider] 01/27: Local work in progress.

Scott Cantor cantor.2 at osu.edu
Fri May 3 14:31:51 EDT 2019


This is an automated email from the git hooks/post-receive script.

scantor pushed a commit to branch feature/IDP-1434
in repository java-identity-provider.

View the commit online:
http://git.shibboleth.net/view/?p=java-identity-provider.git;a=commit;h=344e7fed07308441131f891c219292420ce80443

commit 344e7fed07308441131f891c219292420ce80443
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Thu Apr 4 10:10:38 2019 -0400

    Local work in progress.
---
 idp-admin-api/.project                             |   5 -
 idp-admin-impl/.project                            |   5 -
 idp-attribute-api/.project                         |   5 -
 .../shibboleth/idp/attribute/AttributeDecoder.java |  69 ++++++
 .../idp/attribute/AttributeDecodingException.java  |  62 ++++++
 .../transcoding/AbstractAttributeTranscoder.java   |  84 ++++++++
 .../attribute/transcoding/AttributeTranscoder.java |  78 +++++++
 .../transcoding/AttributeTranscoderRegistry.java   |  74 +++++++
 .../idp/attribute/transcoding/package-info.java    |  22 ++
 idp-attribute-filter-api/.project                  |   5 -
 idp-attribute-filter-impl/.project                 |   5 -
 idp-attribute-filter-spring/.project               |   5 -
 idp-attribute-impl/.project                        |   5 -
 idp-attribute-impl/pom.xml                         |   5 +
 .../impl/AttributeTranscoderRegistryImpl.java      | 187 +++++++++++++++++
 .../attribute/transcoding/impl/package-info.java   |  22 ++
 .../impl/AttributeTranscoderRegistryTest.java      |  60 ++++++
 idp-attribute-resolver-api/.project                |   5 -
 idp-attribute-resolver-impl/.project               |   5 -
 idp-attribute-resolver-spring/.project             |   5 -
 idp-authn-api/.project                             |   5 -
 idp-authn-impl/.project                            |   5 -
 idp-bom/.project                                   |   5 -
 idp-cas-api/.project                               |   5 -
 idp-cas-impl/.project                              |   5 -
 idp-conf/.project                                  |   5 -
 .../src/main/resources/conf/attribute-registry.xml |  42 ++++
 .../attribute/transcoding/impl/package-info.java   |  22 ++
 idp-consent-api/.project                           |   5 -
 idp-consent-impl/.project                          |   5 -
 idp-core/.project                                  |   5 -
 idp-installer/.project                             |   5 -
 idp-profile-api/.project                           |   5 -
 idp-profile-impl/.project                          |   5 -
 idp-profile-spring/.project                        |   5 -
 idp-saml-api/.project                              |   5 -
 idp-saml-api/pom.xml                               |   1 -
 .../AbstractSAML2AttributeTranscoder.java          |  91 ++++++++
 .../AbstractSAMLAttributeTranscoder.java           | 232 +++++++++++++++++++++
 .../saml/attribute/transcoding/package-info.java   |  22 ++
 idp-saml-impl/.project                             |   5 -
 .../impl/SAML2StringAttributeTranscoder.java       |  77 +++++++
 .../attribute/transcoding/impl/package-info.java   |  22 ++
 idp-schema/.project                                |   5 -
 idp-session-api/.project                           |   5 -
 idp-session-impl/.project                          |   5 -
 idp-ui/.project                                    |   5 -
 idp-war/.project                                   |   5 -
 48 files changed, 1171 insertions(+), 151 deletions(-)

diff --git a/idp-admin-api/.project b/idp-admin-api/.project
index 4efaa10..9dbebd9 100644
--- a/idp-admin-api/.project
+++ b/idp-admin-api/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-admin-impl/.project b/idp-admin-impl/.project
index 90b3f69..e76252e 100644
--- a/idp-admin-impl/.project
+++ b/idp-admin-impl/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-attribute-api/.project b/idp-attribute-api/.project
index ed92a0d..733bbbb 100644
--- a/idp-attribute-api/.project
+++ b/idp-attribute-api/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributeDecoder.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributeDecoder.java
new file mode 100644
index 0000000..2af7beb
--- /dev/null
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributeDecoder.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID 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 net.shibboleth.idp.attribute;
+
+import java.util.function.Predicate;
+
+import javax.annotation.Nonnull;
+import javax.annotation.concurrent.ThreadSafe;
+
+import org.opensaml.profile.context.ProfileRequestContext;
+
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+
+/**
+ * Attribute decoders convert a protocol specific object into an {@link IdPAttribute}. Implementations must take
+ * into account that objects may contain data of multiple types. An implementation encountering a value type it
+ * does not understand may either decide to ignore it or throw an {@link AttributeDecodingException}.
+ * 
+ * <p>Decoders implement a {@link Predicate} interface to determine their applicability to a request.</p>
+ * 
+ * <p>Decoders <strong>MUST</strong> be thread-safe and stateless and <strong>MUST</strong> implement appropriate
+ * {@link Object#equals(Object)} and {@link Object#hashCode()} methods.</p>
+ * 
+ * @param <DecodedType> the type of object supported
+ */
+ at ThreadSafe
+public interface AttributeDecoder<DecodedType> {
+
+    /**
+     * Get the identifier of the protocol targeted by this decoder.
+     * 
+     * @return identifier of the protocol targeted by this encounter
+     */
+    @Nonnull @NotEmpty String getProtocol();
+        
+    /**
+     * Get an activation condition for this decoder.
+     * 
+     * @return  a predicate indicating whether the decoder should be applied
+     */
+    @Nonnull Predicate<ProfileRequestContext> getActivationCondition();
+
+    /**
+     * Decode the supplied object into a protocol-neutral representation.
+     * 
+     * @param input the object to decode
+     * 
+     * @return the object the attribute was decoded into
+     * 
+     * @throws AttributeDecodingException if unable to successfully decode object
+     */
+    @Nonnull IdPAttribute decode(@Nonnull final DecodedType input) throws AttributeDecodingException;
+
+}
\ No newline at end of file
diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributeDecodingException.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributeDecodingException.java
new file mode 100644
index 0000000..ea56273
--- /dev/null
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributeDecodingException.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID 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 net.shibboleth.idp.attribute;
+
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.ThreadSafe;
+
+/** Indicates a problem during decoding into an attribute. */
+ at ThreadSafe
+public class AttributeDecodingException extends AttributeException {
+
+    /** Serialization ID. */
+    private static final long serialVersionUID = -7129079905857690466L;
+
+    /** Constructor. */
+    public AttributeDecodingException() {
+        super();
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param message exception message
+     */
+    public AttributeDecodingException(@Nullable final String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param wrappedException exception to be wrapped by this one
+     */
+    public AttributeDecodingException(@Nullable final Exception wrappedException) {
+        super(wrappedException);
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param message exception message
+     * @param wrappedException exception to be wrapped by this one
+     */
+    public AttributeDecodingException(@Nullable final String message, @Nullable final Exception wrappedException) {
+        super(message, wrappedException);
+    }
+}
\ No newline at end of file
diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AbstractAttributeTranscoder.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AbstractAttributeTranscoder.java
new file mode 100644
index 0000000..a333a1a
--- /dev/null
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AbstractAttributeTranscoder.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID 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 net.shibboleth.idp.attribute.transcoding;
+
+import java.util.function.Predicate;
+
+import javax.annotation.Nonnull;
+
+import net.shibboleth.idp.attribute.IdPAttribute;
+import net.shibboleth.idp.attribute.IdPAttributeValue;
+import net.shibboleth.utilities.java.support.component.AbstractInitializableComponent;
+import net.shibboleth.utilities.java.support.component.ComponentSupport;
+import net.shibboleth.utilities.java.support.logic.Constraint;
+
+import org.opensaml.profile.context.ProfileRequestContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Predicates;
+
+/**
+ * Base class for transcoders.
+ * 
+ * @param <T> type of object supported
+ */
+public abstract class AbstractAttributeTranscoder<T> extends AbstractInitializableComponent
+        implements AttributeTranscoder<T> {
+
+    /** Class logger. */
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractAttributeTranscoder.class);
+
+    /** Condition for use of this encoder. */
+    @Nonnull private Predicate<ProfileRequestContext> activationCondition;
+    
+    /** Constructor. */
+    public AbstractAttributeTranscoder() {
+        activationCondition = Predicates.alwaysTrue();
+    }
+    
+    /** {@inheritDoc} */
+    @Nonnull public Predicate<ProfileRequestContext> getActivationCondition() {
+        return activationCondition;
+    }
+    
+    /**
+     * Set the activation condition for this encoder.
+     * 
+     * @param condition condition to set
+     */
+    public void setActivationCondition(@Nonnull final Predicate<ProfileRequestContext> condition) {
+        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        
+        activationCondition = Constraint.isNotNull(condition, "Activation condition cannot be null");
+    }
+    
+    /**
+     * Checks if the given value can be handled by the transcoder.
+     * 
+     * <p>In many cases this is simply a check to see if the given object is of the right type.</p>
+     * 
+     * @param idpAttribute the attribute being encoded, never null
+     * @param value the value to check, never null
+     * 
+     * @return true if the transcoder can encode this value, false if not
+     */
+    protected abstract boolean canEncodeValue(@Nonnull final IdPAttribute idpAttribute,
+            @Nonnull final IdPAttributeValue value);
+
+}
\ No newline at end of file
diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoder.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoder.java
new file mode 100644
index 0000000..fed32e9
--- /dev/null
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoder.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID 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 net.shibboleth.idp.attribute.transcoding;
+
+import java.util.Properties;
+import java.util.function.Predicate;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.ThreadSafe;
+
+import org.opensaml.profile.context.ProfileRequestContext;
+
+import net.shibboleth.idp.attribute.AttributeDecodingException;
+import net.shibboleth.idp.attribute.AttributeEncodingException;
+import net.shibboleth.idp.attribute.IdPAttribute;
+
+/**
+ * Transcoders are objects that support both attribute encoding and decoding for bidirectional
+ * translation between {@link IdPAttribute} format and technology-specific formats.
+ * 
+ * <p>Implementations must take into account values of multiple types. An implementation encountering
+ * a value type it does not understand may either decide to ignore it or throw exceptions.</p>
+ * 
+ * <p>Transcoders implement a {@link Predicate} interface to determine their applicability to a request.</p>
+ * 
+ * <p>Transcoders <strong>MUST</strong> be thread-safe and stateless.</p>
+ * 
+ * @param <T> the type of object supported
+ */
+ at ThreadSafe
+public interface AttributeTranscoder<T> {
+
+    /**
+     * Encode the supplied attribute into a protocol specific representation.
+     * 
+     * @param profileRequestContext current profile request context
+     * @param attribute the attribute to encode
+     * @param properties properties governing the encoding process, principally the resulting object's naming
+     * 
+     * @return the Object the attribute was encoded into
+     * 
+     * @throws AttributeEncodingException if unable to successfully encode attribute
+     */
+    @Nullable T encode(@Nonnull final ProfileRequestContext profileRequestContext,
+            @Nonnull final IdPAttribute attribute, @Nonnull final Properties properties)
+                    throws AttributeEncodingException;
+    
+    /**
+     * Decode the supplied object into a protocol-neutral representation.
+     * 
+     * @param profileRequestContext current profile request context
+     * @param input the object to decode
+     * @param properties properties governing the decoding process, principally the resulting attribute's naming
+     * 
+     * @return the attribute the object was decoded into
+     * 
+     * @throws AttributeDecodingException if unable to successfully decode object
+     */
+    @Nullable IdPAttribute decode(@Nonnull final ProfileRequestContext profileRequestContext,
+            @Nonnull final T input, @Nonnull final Properties properties) throws AttributeDecodingException;
+    
+}
\ No newline at end of file
diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoderRegistry.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoderRegistry.java
new file mode 100644
index 0000000..6e8728d
--- /dev/null
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoderRegistry.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID 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 net.shibboleth.idp.attribute.transcoding;
+
+import java.util.Collection;
+import java.util.Properties;
+
+import javax.annotation.Nonnull;
+import javax.annotation.concurrent.ThreadSafe;
+
+import net.shibboleth.idp.attribute.IdPAttribute;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
+import net.shibboleth.utilities.java.support.component.IdentifiedComponent;
+
+
+/**
+ * The transcoder registry provides access to "instructions" for converting between
+ * the {@link IdPAttribute} "neutral" representation within the IdP and protocol-specific
+ * forms such as SAML Attributes or OIDC claims.
+ */
+ at ThreadSafe
+public interface AttributeTranscoderRegistry extends IdentifiedComponent {
+    
+    /** Property name for accessing {@link AttributeTranscoder} object to use. */
+    @Nonnull @NotEmpty static final String PROP_TRANSCODER = "transcoder";
+    
+    /**
+     * Obtains a set of instructions for encoding an input {@link IdPAttribute} into a target type.
+     * 
+     * <p>The principal property useful to a caller is {@link #PROP_TRANSCODER} to obtain an instance
+     * of the appropriate {@link AttributeTranscoder} to call, passing in the properties to drive that
+     * call.</p>
+     * 
+     * @param from the input object to encode
+     * @param to class of object being encoded
+     * 
+     * @return a collection of {@link Properties} objects, possibly empty
+     */
+    @Nonnull @NonnullElements @Unmodifiable
+    Collection<Properties> getTranscodingProperties(@Nonnull final IdPAttribute from, @Nonnull final Class<?> to);
+    
+
+    /**
+     * Obtains a set of instructions for decoding an input object into an {@link IdPAttribute}.
+     * 
+     * <p>The principal property useful to a caller is {@link #PROP_TRANSCODER} to obtain an instance
+     * of the appropriate {@link AttributeTranscoder} to call, passing in the properties to drive that
+     * call.</p>
+     * 
+     * @param <T> the type of object to decode
+     * @param from object to decode
+     * 
+     * @return a collection of {@link Properties} objects, possibly empty
+     */
+    @Nonnull @NonnullElements @Unmodifiable <T> Collection<Properties> getTranscodingProperties(@Nonnull final T from);
+        
+}
\ No newline at end of file
diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/package-info.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/package-info.java
new file mode 100644
index 0000000..ca23131
--- /dev/null
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID 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.
+ */
+
+/**
+ * APIs for transcoding of attributes.
+ */
+
+package net.shibboleth.idp.attribute.transcoding;
\ No newline at end of file
diff --git a/idp-attribute-filter-api/.project b/idp-attribute-filter-api/.project
index a33e638..4b2ce71 100644
--- a/idp-attribute-filter-api/.project
+++ b/idp-attribute-filter-api/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-attribute-filter-impl/.project b/idp-attribute-filter-impl/.project
index 0815e7a..70a90af 100644
--- a/idp-attribute-filter-impl/.project
+++ b/idp-attribute-filter-impl/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-attribute-filter-spring/.project b/idp-attribute-filter-spring/.project
index 142d855..200fb1b 100644
--- a/idp-attribute-filter-spring/.project
+++ b/idp-attribute-filter-spring/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-attribute-impl/.project b/idp-attribute-impl/.project
index 93b9a0c..3d22eed 100644
--- a/idp-attribute-impl/.project
+++ b/idp-attribute-impl/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.springframework.ide.eclipse.boot.validation.springbootbuilder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-attribute-impl/pom.xml b/idp-attribute-impl/pom.xml
index a5329d5..7a9d95a 100644
--- a/idp-attribute-impl/pom.xml
+++ b/idp-attribute-impl/pom.xml
@@ -24,6 +24,11 @@
             <version>${project.version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>net.shibboleth.ext</groupId>
+            <artifactId>spring-extensions</artifactId>
+        </dependency>
+
         <!-- Provided Dependencies -->
 
         <!-- Runtime Dependencies -->
diff --git a/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
new file mode 100644
index 0000000..a5391f7
--- /dev/null
+++ b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
@@ -0,0 +1,187 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID 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 net.shibboleth.idp.attribute.transcoding.impl;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Function;
+
+import javax.annotation.Nonnull;
+import javax.annotation.concurrent.ThreadSafe;
+
+import net.shibboleth.ext.spring.service.AbstractServiceableComponent;
+import net.shibboleth.idp.attribute.AttributeDecoder;
+import net.shibboleth.idp.attribute.AttributeEncoder;
+import net.shibboleth.idp.attribute.IdPAttribute;
+import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.utilities.java.support.annotation.ParameterName;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
+import net.shibboleth.utilities.java.support.collection.ClassToInstanceMultiMap;
+import net.shibboleth.utilities.java.support.component.ComponentSupport;
+import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/** Service implementation of the {@link AttributeTranscoderRegistry} interface. */
+ at ThreadSafe
+public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponent<AttributeTranscoderRegistry>
+        implements AttributeTranscoderRegistry {
+
+    /** Class logger. */
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AttributeTranscoderRegistryImpl.class);
+    
+    /** Registry of encoders for a given attribute ID and type of encoder. */
+    @Nonnull private final Map<String,ClassToInstanceMultiMap<AttributeEncoder>> attributeEncoders;
+
+    /** Registry of decoders for a given object "name" and type of decoder. */
+    @Nonnull private final Map<String,ClassToInstanceMultiMap<AttributeDecoder>> attributeDecoders;
+    
+    /** Registry of transcoder types and naming for supported object types. */
+    @Nonnull private final Map<Class<?>,TypeInfo> typeInfoRegistry;
+
+    /**
+     * Constructor.
+     * 
+     * @param id ID of this service
+     */
+    public AttributeTranscoderRegistryImpl(@Nonnull @NotEmpty final String id) {
+        setId(id);
+        attributeEncoders = new HashMap<>();
+        attributeDecoders = new HashMap<>();
+        typeInfoRegistry = new HashMap<>();
+    }
+    
+    /** {@inheritDoc} */
+    @Override @Nonnull public AttributeTranscoderRegistry getComponent() {
+        return this;
+    }
+
+    public void setTypeRegistry(@Nonnull @NonnullElements Map<Class<?>,TypeInfo<?>> registry) {
+        
+    }
+
+    public void setTranscoderRegistry(@Nonnull @NonnullElements Map<String,Collection<?>> registry) {
+        
+    }
+    
+    /** {@inheritDoc} */
+    @Nonnull @NonnullElements @Unmodifiable
+    public <T> Collection<AttributeEncoder<T>> getEncoders(@Nonnull final IdPAttribute from,
+            @Nonnull final Class<T> to) {
+        ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
+        
+        final TypeInfo<T> typeInfo = typeInfoRegistry.get(to);
+        if (typeInfo == null) {
+            log.warn("Unsupported object type: {}", to.getName());
+            return Collections.emptyList();
+        }
+        
+        final ClassToInstanceMultiMap<AttributeEncoder> encoders = attributeEncoders.get(from.getId());
+                
+        return encoders != null ? encoders.get(typeInfo.getEncoderType()) : Collections.emptyList();
+    }
+
+    /** {@inheritDoc} */
+    @Nonnull @NonnullElements @Unmodifiable
+    public <T> Collection<AttributeDecoder<T>> getDecoders(@Nonnull final T from) {
+        ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
+        
+        final TypeInfo<T> typeInfo = typeInfoRegistry.get(from.getClass());
+        if (typeInfo == null) {
+            log.warn("Unsupported object type: {}", from.getClass().getName());
+            return Collections.emptyList();
+        }
+        
+        final String id = StringSupport.trimOrNull(typeInfo.getNamingFunction().apply(from));
+        if (id == null) {
+            log.warn("Object of type {} did not have a canonical name", from.getClass().getName());
+            return Collections.emptyList();
+        }
+        
+        final ClassToInstanceMultiMap<AttributeDecoder> decoders = attributeDecoders.get(id);
+        
+        return decoders != null ? decoders.get(typeInfo.getDecoderType()) : Collections.emptyList();
+    }
+
+    /**
+     * Metadata connecting data types to naming functions and codec types.
+     * 
+     * @param <T> object type
+     */
+    public static class TypeInfo<T> {
+        
+        /** Function to derive a canonical name. */
+        @Nonnull private final Function<T,String> namingFunction;
+        
+        /** Type of encoder. */
+        @Nonnull private final Class<AttributeEncoder<T>> encoderType;
+        
+        /** Type of decoder. */
+        @Nonnull private final Class<AttributeDecoder<T>> decoderType;
+        
+        /**
+         * Constructor.
+         *
+         * @param naming canonical naming function
+         * @param encoder encoder type
+         * @param decoder decoder type
+         */
+        public TypeInfo(@Nonnull @ParameterName(name="naming") final Function<T,String> naming,
+                @Nonnull @ParameterName(name="encoder") final Class<AttributeEncoder<T>> encoder,
+                @Nonnull @ParameterName(name="decoder") final Class<AttributeDecoder<T>> decoder) {
+            
+            namingFunction = Constraint.isNotNull(naming, "Naming function cannot be null");
+            encoderType = Constraint.isNotNull(encoder, "Encoder type cannot be null");
+            decoderType = Constraint.isNotNull(decoder, "Decoder type cannot be null");
+        }
+        
+        /**
+         * Gets the function deriving a canonical name for an object.
+         * 
+         * @return function deriving a canonical name for an object
+         */
+        @Nonnull public Function<T,String> getNamingFunction() {
+            return namingFunction;
+        }
+
+        /**
+         * Gets the type of encoder supporting an object.
+         * 
+         * @return type of encoder supporting an object
+         */
+        @Nonnull public Class<AttributeEncoder<T>> getEncoderType() {
+            return encoderType;
+        }
+
+        /**
+         * Gets the type of decoder supporting an object.
+         * 
+         * @return type of decoder supporting an object
+         */
+        @Nonnull public Class<AttributeDecoder<T>> getDecoderType() {
+            return decoderType;
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/package-info.java b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/package-info.java
new file mode 100644
index 0000000..b0a62a2
--- /dev/null
+++ b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID 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.
+ */
+
+/**
+ * Implementation classes for attribute transcoding.
+ */
+
+package net.shibboleth.idp.attribute.transcoding.impl;
\ No newline at end of file
diff --git a/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/impl/AttributeTranscoderRegistryTest.java b/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/impl/AttributeTranscoderRegistryTest.java
new file mode 100644
index 0000000..6429bc8
--- /dev/null
+++ b/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/impl/AttributeTranscoderRegistryTest.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID 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 net.shibboleth.idp.attribute.impl;
+
+import java.util.Collection;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import net.shibboleth.idp.attribute.AttributeDecoder;
+import net.shibboleth.idp.attribute.AttributeDecodingException;
+import net.shibboleth.idp.attribute.AttributeEncoder;
+import net.shibboleth.idp.attribute.AttributeEncodingException;
+import net.shibboleth.idp.attribute.IdPAttribute;
+import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
+import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
+
+/**
+ * Test for {@link AttributeTranscoderRegistry}.
+ */
+public class AttributeTranscoderRegistryTest {
+
+
+    @Test void testEncode() throws AttributeEncodingException {
+        
+        final AttributeTranscoderRegistry registry = new AttributeTranscoderRegistryImpl("test");
+        
+        final IdPAttribute foo = new IdPAttribute("foo");
+        
+        final Collection<AttributeEncoder<String>> encoders = registry.getEncoders(foo, String.class);
+        
+        final String s = encoders.iterator().next().encode(foo);
+    }
+   
+    @Test void testDecode() throws AttributeDecodingException {
+        
+        final AttributeTranscoderRegistry registry = new AttributeTranscoderRegistryImpl("test");
+        
+        final String foo = new String("foo");
+        
+        final Collection<AttributeDecoder<String>> decoders = registry.getDecoders(foo);
+        
+        final IdPAttribute a = decoders.iterator().next().decode(foo);
+    }
+}
\ No newline at end of file
diff --git a/idp-attribute-resolver-api/.project b/idp-attribute-resolver-api/.project
index f1c493c..de89ab8 100644
--- a/idp-attribute-resolver-api/.project
+++ b/idp-attribute-resolver-api/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-attribute-resolver-impl/.project b/idp-attribute-resolver-impl/.project
index dcea4b2..fe73535 100644
--- a/idp-attribute-resolver-impl/.project
+++ b/idp-attribute-resolver-impl/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-attribute-resolver-spring/.project b/idp-attribute-resolver-spring/.project
index e323203..d7c71e4 100644
--- a/idp-attribute-resolver-spring/.project
+++ b/idp-attribute-resolver-spring/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-authn-api/.project b/idp-authn-api/.project
index eac45e1..8b15bc1 100644
--- a/idp-authn-api/.project
+++ b/idp-authn-api/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-authn-impl/.project b/idp-authn-impl/.project
index 93f0107..14170b7 100644
--- a/idp-authn-impl/.project
+++ b/idp-authn-impl/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-bom/.project b/idp-bom/.project
index f286c93..937f4e2 100644
--- a/idp-bom/.project
+++ b/idp-bom/.project
@@ -6,11 +6,6 @@
 	</projects>
 	<buildSpec>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-cas-api/.project b/idp-cas-api/.project
index 23cfd9c..7db0de0 100644
--- a/idp-cas-api/.project
+++ b/idp-cas-api/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-cas-impl/.project b/idp-cas-impl/.project
index 22f763b..2adfe34 100644
--- a/idp-cas-impl/.project
+++ b/idp-cas-impl/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-conf/.project b/idp-conf/.project
index 1f94f11..4c8f229 100644
--- a/idp-conf/.project
+++ b/idp-conf/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-conf/src/main/resources/conf/attribute-registry.xml b/idp-conf/src/main/resources/conf/attribute-registry.xml
new file mode 100644
index 0000000..e1e8eaf
--- /dev/null
+++ b/idp-conf/src/main/resources/conf/attribute-registry.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:util="http://www.springframework.org/schema/util"
+       xmlns:p="http://www.springframework.org/schema/p"
+       xmlns:c="http://www.springframework.org/schema/c"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
+                           
+       default-init-method="initialize"
+       default-destroy-method="destroy">
+
+    <bean id="SAML1.Attribute" class="java.lang.Class" factory-method="forName"
+        c:_0="org.opensaml.saml.saml1.core.Attribute" />
+
+    <bean id="SAML2.Attribute" class="java.lang.Class" factory-method="forName"
+        c:_0="org.opensaml.saml.saml2.core.Attribute" />
+        
+    <bean id="SAML2StringTranscoder"
+        class="net.shibboleth.idp.saml.attribute.transcoding.impl.SAML2StringAttributeTranscoder" />
+   
+    <util:map id="shibboleth.DefaultAttributeRegistry">
+    
+        <entry key="uid">
+            <map>
+                <entry>
+                    <key>
+                        <ref>SAML2.Attribute</ref>
+                    </key>
+                    <map>
+                        <entry key="transcoder" ref="SAML2StringTranscoder" />
+                        <entry key="name" value="urn:oid:0.9.2342.19200300.100.1.1" />
+                    </map>
+                </entry>
+            </map>
+        </entry>
+            
+    </util:map>
+
+</beans>
diff --git a/idp-conf/src/main/resources/net/shibboleth/idp/attribute/transcoding/impl/package-info.java b/idp-conf/src/main/resources/net/shibboleth/idp/attribute/transcoding/impl/package-info.java
new file mode 100644
index 0000000..d516ac8
--- /dev/null
+++ b/idp-conf/src/main/resources/net/shibboleth/idp/attribute/transcoding/impl/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID 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.
+ */
+
+/**
+ * Implementations of attribute transcoding functionality.
+ */
+
+package net.shibboleth.idp.attribute.transcoding.impl;
\ No newline at end of file
diff --git a/idp-consent-api/.project b/idp-consent-api/.project
index 62a8236..b2139c1 100644
--- a/idp-consent-api/.project
+++ b/idp-consent-api/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-consent-impl/.project b/idp-consent-impl/.project
index 2201166..31861b6 100644
--- a/idp-consent-impl/.project
+++ b/idp-consent-impl/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-core/.project b/idp-core/.project
index d914eaf..df54311 100644
--- a/idp-core/.project
+++ b/idp-core/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-installer/.project b/idp-installer/.project
index e3f990e..bba0631 100644
--- a/idp-installer/.project
+++ b/idp-installer/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-profile-api/.project b/idp-profile-api/.project
index 818e804..6a29367 100644
--- a/idp-profile-api/.project
+++ b/idp-profile-api/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-profile-impl/.project b/idp-profile-impl/.project
index 8f46927..4a93d08 100644
--- a/idp-profile-impl/.project
+++ b/idp-profile-impl/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-profile-spring/.project b/idp-profile-spring/.project
index 585e593..a586093 100644
--- a/idp-profile-spring/.project
+++ b/idp-profile-spring/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-saml-api/.project b/idp-saml-api/.project
index dc7374d..4fdf337 100644
--- a/idp-saml-api/.project
+++ b/idp-saml-api/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-saml-api/pom.xml b/idp-saml-api/pom.xml
index 525ed29..3b02eba 100644
--- a/idp-saml-api/pom.xml
+++ b/idp-saml-api/pom.xml
@@ -76,7 +76,6 @@
             <groupId>${opensaml.groupId}</groupId>
             <artifactId>opensaml-xmlsec-api</artifactId>
         </dependency>
-
         <dependency>
             <groupId>${spring.groupId}</groupId>
             <artifactId>spring-beans</artifactId>
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML2AttributeTranscoder.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML2AttributeTranscoder.java
new file mode 100644
index 0000000..d32b635
--- /dev/null
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML2AttributeTranscoder.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID 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 net.shibboleth.idp.saml.attribute.transcoding;
+
+import java.util.List;
+import java.util.Properties;
+
+import javax.annotation.Nonnull;
+
+import net.shibboleth.idp.attribute.AttributeEncodingException;
+import net.shibboleth.idp.attribute.IdPAttribute;
+import net.shibboleth.idp.attribute.IdPAttributeValue;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.logic.ConstraintViolationException;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
+import org.opensaml.profile.context.ProfileRequestContext;
+import org.opensaml.saml.common.SAMLObjectBuilder;
+import org.opensaml.saml.saml2.core.Attribute;
+
+import com.google.common.base.Strings;
+
+/**
+ * Base class for transcoders that operate on a SAML 2 {@link Attribute}.
+ * 
+ * @param <EncodedType> the type of data that can be handled by the transcoder
+ */
+public abstract class AbstractSAML2AttributeTranscoder<EncodedType extends IdPAttributeValue> extends
+        AbstractSAMLAttributeTranscoder<Attribute,EncodedType> {
+
+    /** A friendly, human readable, name for the attribute. */
+    @Nonnull @NotEmpty public static final String PROP_FRIENDLY_NAME = "friendlyName";
+
+    /** The format of the attribute name. */
+    @Nonnull @NotEmpty public static final String PROP_NAME_FORMAT = "nameFormat";
+
+    /** Builder used to construct {@link Attribute} objects. */
+    @Nonnull private final SAMLObjectBuilder<Attribute> attributeBuilder;
+
+    /** Constructor. */
+    public AbstractSAML2AttributeTranscoder() {
+        attributeBuilder =
+                (SAMLObjectBuilder<Attribute>) XMLObjectProviderRegistrySupport.getBuilderFactory().getBuilder(
+                        Attribute.TYPE_NAME);
+        if (attributeBuilder == null) {
+            throw new ConstraintViolationException("SAML 2 Attribute builder is unavailable");
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    @Nonnull protected Attribute buildAttribute(@Nonnull final ProfileRequestContext profileRequestContext,
+            @Nonnull final IdPAttribute attribute, @Nonnull final Properties properties,
+            @Nonnull @NonnullElements final List<XMLObject> attributeValues) throws AttributeEncodingException {
+
+        final String name = properties.getProperty(PROP_NAME);
+        if (Strings.isNullOrEmpty(name)) {
+            throw new AttributeEncodingException("Required transcoder property 'name' not found");
+        }
+                
+        final Attribute samlAttribute = attributeBuilder.buildObject();
+        samlAttribute.setName(name);
+        samlAttribute.setNameFormat(properties.getProperty(PROP_NAME_FORMAT, Attribute.URI_REFERENCE));
+        samlAttribute.getAttributeValues().addAll(attributeValues);
+        
+        final String friendlyName = properties.getProperty(PROP_FRIENDLY_NAME, attribute.getId());
+        if (!friendlyName.isBlank()) {
+            samlAttribute.setFriendlyName(friendlyName);
+        }
+        
+        return samlAttribute;
+    }
+
+}
\ No newline at end of file
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAMLAttributeTranscoder.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAMLAttributeTranscoder.java
new file mode 100644
index 0000000..eeb12c1
--- /dev/null
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAMLAttributeTranscoder.java
@@ -0,0 +1,232 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID 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 net.shibboleth.idp.saml.attribute.transcoding;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.shibboleth.idp.attribute.AttributeDecodingException;
+import net.shibboleth.idp.attribute.AttributeEncodingException;
+import net.shibboleth.idp.attribute.IdPAttribute;
+import net.shibboleth.idp.attribute.IdPAttributeValue;
+import net.shibboleth.idp.attribute.transcoding.AbstractAttributeTranscoder;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.component.ComponentSupport;
+import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.utilities.java.support.xml.DOMTypeSupport;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.core.xml.schema.XSAny;
+import org.opensaml.core.xml.schema.XSBase64Binary;
+import org.opensaml.core.xml.schema.XSBoolean;
+import org.opensaml.core.xml.schema.XSDateTime;
+import org.opensaml.core.xml.schema.XSInteger;
+import org.opensaml.core.xml.schema.XSString;
+import org.opensaml.core.xml.schema.XSURI;
+import org.opensaml.profile.context.ProfileRequestContext;
+import org.opensaml.saml.common.SAMLObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Base class for transcoders that support SAML attributes.
+ * 
+ * @param <AttributeType> type of object produced
+ * @param <EncodedType> the type of data that can be handled by the transcoder
+ */
+public abstract class AbstractSAMLAttributeTranscoder<AttributeType extends SAMLObject,
+        EncodedType extends IdPAttributeValue> extends AbstractAttributeTranscoder<AttributeType> {
+
+    /** The attribute name. */
+    @Nonnull @NotEmpty public static final String PROP_NAME = "name";
+
+    /** Whether to encode the xsi:type. */
+    @Nonnull @NotEmpty public static final String PROP_ENCODE_TYPE = "encodeType";
+
+    /** Class logger. */
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractSAMLAttributeTranscoder.class);
+        
+    /** {@inheritDoc} */
+    @Nullable public AttributeType encode(@Nonnull final ProfileRequestContext profileRequestContext,
+            @Nonnull final IdPAttribute attribute, @Nonnull final Properties properties)
+                    throws AttributeEncodingException {
+        ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
+        Constraint.isNotNull(attribute, "Attribute to encode cannot be null");
+
+        final String attributeId = attribute.getId();
+
+        if (!getActivationCondition().test(profileRequestContext)) {
+            log.debug("Encoder for attribute {} inactive", attributeId);
+            return null;
+        }
+        
+        log.debug("Beginning to encode attribute {}", attributeId);
+
+        if (attribute.getValues().isEmpty()) {
+            log.warn("Unable to encode {} attribute, contains no values", attributeId);
+            return null;
+        }
+
+        final List<XMLObject> samlAttributeValues = new ArrayList<>();
+
+        EncodedType attributeValue;
+        XMLObject samlAttributeValue;
+        for (final IdPAttributeValue o : attribute.getValues()) {
+            if (o == null) {
+                // filtered out upstream leave in test for sanity
+                log.debug("Skipping null value of attribute {}", attributeId);
+                continue;
+            }
+
+            if (!canEncodeValue(attribute, o)) {
+                log.warn("Skipping value of attribute '{}'; Type {} cannot be encoded by this encoder ({}).",
+                        attributeId, o.getClass().getName(), this.getClass().getName());
+                continue;
+            }
+
+            attributeValue = (EncodedType) o;
+            samlAttributeValue = encodeValue(profileRequestContext, attribute, properties, attributeValue);
+            if (samlAttributeValue == null) {
+                log.debug("Skipping empty value for attribute {}", attributeId);
+            } else {
+                samlAttributeValues.add(samlAttributeValue);
+            }
+        }
+
+        if (samlAttributeValues.isEmpty()) {
+            log.warn("Attribute {} did not contain any encodable values", attributeId);
+            return null;
+        }
+
+        log.debug("Completed encoding {} values for attribute {}", samlAttributeValues.size(), attributeId);
+        return buildAttribute(profileRequestContext, attribute, properties, samlAttributeValues);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public IdPAttribute decode(@Nonnull final ProfileRequestContext profileRequestContext,
+            @Nonnull final AttributeType input, @Nonnull final Properties properties)
+                    throws AttributeDecodingException {
+        
+        return null;
+    }
+
+    /**
+     * Function to return an XML object in string form.
+     * 
+     * @param object object to decode
+     * 
+     * @return decoded string, or null
+     */
+// Checkstyle: CyclomaticComplexity OFF
+    @Nullable protected String getStringValue(@Nonnull final XMLObject object) {
+        String retVal = null;
+
+        if (object instanceof XSString) {
+
+            retVal = ((XSString) object).getValue();
+
+        } else if (object instanceof XSURI) {
+
+            retVal = ((XSURI) object).getValue();
+
+        } else if (object instanceof XSBoolean) {
+
+            retVal = ((XSBoolean) object).getValue().getValue() ? "1" : "0";
+
+        } else if (object instanceof XSInteger) {
+
+            retVal = ((XSInteger) object).getValue().toString();
+
+        } else if (object instanceof XSDateTime) {
+
+            final Instant dt = ((XSDateTime) object).getValue();
+            if (dt != null) {
+                retVal = DOMTypeSupport.instantToString(dt);
+            } else {
+                retVal = null;
+            }
+
+        } else if (object instanceof XSBase64Binary) {
+
+            retVal = ((XSBase64Binary) object).getValue();
+
+        } else if (object instanceof XSAny) {
+
+            final XSAny wc = (XSAny) object;
+            if (wc.getUnknownAttributes().isEmpty() && wc.getUnknownXMLObjects().isEmpty()) {
+                retVal = wc.getTextContent();
+            } else {
+                retVal = null;
+            }
+        }
+
+        if (null == retVal) {
+            log.info("Value of type {} could not be converted", object.getClass().toString());
+        }
+        return retVal;
+    }
+// Checkstyle: CyclomaticComplexity ON
+    
+    /**
+     * Encodes an attribute value in to a SAML attribute value element.
+     * 
+     * @param profileRequestContext current profile request
+     * @param attribute the attribute being encoded
+     * @param properties properties to control encoding
+     * @param value the value to encoder
+     * 
+     * @return the attribute value or null if the resulting attribute value would be empty
+     * 
+     * @throws AttributeEncodingException thrown if there is a problem encoding the attribute value
+     */
+    @Nullable protected abstract XMLObject encodeValue(@Nonnull final ProfileRequestContext profileRequestContext,
+            @Nonnull final IdPAttribute attribute, @Nonnull final Properties properties,
+            @Nonnull final EncodedType value) throws AttributeEncodingException;
+
+    /**
+     * Builds a SAML attribute element from the given attribute values.
+     * 
+     * @param profileRequestContext current profile request
+     * @param attribute the attribute being encoded
+     * @param properties properties to control encoding
+     * @param attributeValues the encoded values for the attribute, never null or containing null elements
+     * 
+     * @return the SAML attribute element
+     * 
+     * @throws AttributeEncodingException thrown if there is a problem constructing the SAML attribute
+     */
+    @Nonnull protected abstract AttributeType buildAttribute(@Nonnull final ProfileRequestContext profileRequestContext,
+            @Nonnull final IdPAttribute attribute, @Nonnull final Properties properties,
+            @Nonnull @NonnullElements final List<XMLObject> attributeValues) throws AttributeEncodingException;
+    
+    /**
+     * Function to decode a single {@link XMLObject} into an {@link IdPAttributeValue}.
+     * 
+     * @param object the object to decode
+     * 
+     * @return the returned final {@link IdPAttributeValue} or null if decoding failed
+     */
+    @Nullable protected abstract IdPAttributeValue<?> decodeValue(@Nullable final XMLObject object);
+
+}
\ No newline at end of file
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/package-info.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/package-info.java
new file mode 100644
index 0000000..4c9f4e9
--- /dev/null
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID 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.
+ */
+
+/** 
+ * Base classes for SAML {@link net.shibboleth.idp.attribute.transcoding.AttributeTranscoder} classes.
+ */
+
+package net.shibboleth.idp.saml.attribute.transcoding;
\ No newline at end of file
diff --git a/idp-saml-impl/.project b/idp-saml-impl/.project
index 1b5d236..a9a4b04 100644
--- a/idp-saml-impl/.project
+++ b/idp-saml-impl/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2StringAttributeTranscoder.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2StringAttributeTranscoder.java
new file mode 100644
index 0000000..a63c08d
--- /dev/null
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2StringAttributeTranscoder.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID 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 net.shibboleth.idp.saml.attribute.transcoding.impl;
+
+import java.util.Properties;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.shibboleth.idp.attribute.AttributeEncodingException;
+import net.shibboleth.idp.attribute.IdPAttribute;
+import net.shibboleth.idp.attribute.IdPAttributeValue;
+import net.shibboleth.idp.attribute.LocalizedStringAttributeValue;
+import net.shibboleth.idp.attribute.ScopedStringAttributeValue;
+import net.shibboleth.idp.attribute.StringAttributeValue;
+import net.shibboleth.idp.saml.attribute.encoding.SAMLEncoderSupport;
+import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.profile.context.ProfileRequestContext;
+import org.opensaml.saml.saml2.core.AttributeValue;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link net.shibboleth.idp.attribute.AttributeTranscoder} that produces a SAML 2 Attribute from an
+ * {@link IdPAttribute} that contains <code>String</code> values.
+ */
+public class SAML2StringAttributeTranscoder extends AbstractSAML2AttributeTranscoder<StringAttributeValue> {
+
+    /** Class logger. */
+    @Nonnull private final Logger log = LoggerFactory.getLogger(SAML2StringAttributeTranscoder.class);
+
+    /** {@inheritDoc} */
+    @Override protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute,
+            @Nonnull final IdPAttributeValue value) {
+        return value instanceof StringAttributeValue;
+    }
+
+    /** {@inheritDoc} */
+    @Override @Nullable protected XMLObject encodeValue(@Nonnull final ProfileRequestContext profileRequestContext,
+            @Nonnull final IdPAttribute attribute, @Nonnull final Properties properties,
+            @Nonnull final StringAttributeValue value) throws AttributeEncodingException {
+        
+        if (value instanceof LocalizedStringAttributeValue || value instanceof ScopedStringAttributeValue) {
+            log.warn("Attribute '{}': Lossy encoding of attribute value of type {} to SAML2 String Attribute",
+                    attribute.getId(), value.getClass().getName());
+        }
+        
+        final Object encodeType = properties.getOrDefault(PROP_ENCODE_TYPE, Boolean.TRUE);
+        
+        return SAMLEncoderSupport.encodeStringValue(attribute,
+                AttributeValue.DEFAULT_ELEMENT_NAME, value.getValue(),
+                encodeType instanceof Boolean ? (Boolean) encodeType : true);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable protected IdPAttributeValue<?> decodeValue(@Nullable final XMLObject object) {
+        return StringAttributeValue.valueOf(getStringValue(object));
+    }
+    
+}
\ No newline at end of file
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/package-info.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/package-info.java
new file mode 100644
index 0000000..d7ff608
--- /dev/null
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID 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.
+ */
+
+/**
+ * Implementations of SAML transcoders.
+ */
+
+package net.shibboleth.idp.saml.attribute.transcoding.impl;
\ No newline at end of file
diff --git a/idp-schema/.project b/idp-schema/.project
index c89db8c..dc76e99 100644
--- a/idp-schema/.project
+++ b/idp-schema/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-session-api/.project b/idp-session-api/.project
index 62a1f7f..5e64ebd 100644
--- a/idp-session-api/.project
+++ b/idp-session-api/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-session-impl/.project b/idp-session-impl/.project
index 8a48a91..eae928f 100644
--- a/idp-session-impl/.project
+++ b/idp-session-impl/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-ui/.project b/idp-ui/.project
index b903b34..a5da135 100644
--- a/idp-ui/.project
+++ b/idp-ui/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
diff --git a/idp-war/.project b/idp-war/.project
index 3f1824d..5294722 100644
--- a/idp-war/.project
+++ b/idp-war/.project
@@ -16,11 +16,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.springframework.ide.eclipse.core.springbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list