[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