This is an automated email from the ASF dual-hosted git repository. coheigea pushed a commit to branch coheigea/saml-refactor-new in repository https://gitbox.apache.org/repos/asf/ws-wss4j.git
commit b1be8a1c8c9e1dfc47ee52462e100919b7a2171c Author: Colm O hEigeartaigh <cohei...@apache.org> AuthorDate: Thu Jun 19 15:29:02 2025 +0100 Switching Actions over to ServiceLoader --- .../java/org/apache/wss4j/dom/action/Action.java | 1 + .../apache/wss4j/dom/action/CustomTokenAction.java | 6 +++ .../apache/wss4j/dom/action/EncryptionAction.java | 6 +++ .../wss4j/dom/action/EncryptionDerivedAction.java | 5 ++ .../wss4j/dom/action/SAMLTokenSignedAction.java | 5 ++ .../wss4j/dom/action/SAMLTokenUnsignedAction.java | 6 +++ .../apache/wss4j/dom/action/SignatureAction.java | 4 ++ .../dom/action/SignatureConfirmationAction.java | 5 ++ .../wss4j/dom/action/SignatureDerivedAction.java | 5 ++ .../apache/wss4j/dom/action/TimestampAction.java | 6 +++ .../wss4j/dom/action/UsernameTokenAction.java | 5 ++ .../dom/action/UsernameTokenSignedAction.java | 5 ++ .../org/apache/wss4j/dom/engine/WSSConfig.java | 63 +++++----------------- .../services/org.apache.wss4j.dom.action.Action | 11 ++++ .../org/apache/wss4j/dom/common/CustomAction.java | 6 +++ 15 files changed, 90 insertions(+), 49 deletions(-) diff --git a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/Action.java b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/Action.java index 488c0cce8..a4d6be291 100644 --- a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/Action.java +++ b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/Action.java @@ -33,4 +33,5 @@ public interface Action { RequestData reqData ) throws WSSecurityException; + Integer[] getSupportedActions(); } diff --git a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/CustomTokenAction.java b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/CustomTokenAction.java index 0551d9079..0138cefe0 100644 --- a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/CustomTokenAction.java +++ b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/CustomTokenAction.java @@ -22,6 +22,7 @@ package org.apache.wss4j.dom.action; import org.apache.wss4j.common.SecurityActionToken; import org.apache.wss4j.common.ext.WSPasswordCallback; import org.apache.wss4j.common.ext.WSSecurityException; +import org.apache.wss4j.dom.WSConstants; import org.apache.wss4j.dom.handler.RequestData; import org.w3c.dom.Element; @@ -67,4 +68,9 @@ public class CustomTokenAction implements Action { "empty", new Object[] {"Error appending custom token"}); } } + + @Override + public Integer[] getSupportedActions() { + return new Integer[]{WSConstants.CUSTOM_TOKEN}; + } } diff --git a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/EncryptionAction.java b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/EncryptionAction.java index 8179dde15..82438dea5 100644 --- a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/EncryptionAction.java +++ b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/EncryptionAction.java @@ -33,6 +33,7 @@ import org.apache.wss4j.common.crypto.CryptoType; import org.apache.wss4j.common.ext.WSPasswordCallback; import org.apache.wss4j.common.ext.WSSecurityException; import org.apache.wss4j.common.util.KeyUtils; +import org.apache.wss4j.dom.WSConstants; import org.apache.wss4j.dom.handler.RequestData; import org.apache.wss4j.dom.handler.WSHandlerConstants; import org.apache.wss4j.dom.message.WSSecEncrypt; @@ -149,4 +150,9 @@ public class EncryptionAction implements Action { new Object[] {"Error during encryption: "}); } } + + @Override + public Integer[] getSupportedActions() { + return new Integer[]{WSConstants.ENCR}; + } } diff --git a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/EncryptionDerivedAction.java b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/EncryptionDerivedAction.java index 4ce59bd7c..673d7a71d 100644 --- a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/EncryptionDerivedAction.java +++ b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/EncryptionDerivedAction.java @@ -187,4 +187,9 @@ public class EncryptionDerivedAction extends AbstractDerivedAction implements Ac return passwordCallback.getKey(); } } + + @Override + public Integer[] getSupportedActions() { + return new Integer[]{WSConstants.DKT_ENCR}; + } } diff --git a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenSignedAction.java b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenSignedAction.java index 379ba538c..78f575593 100644 --- a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenSignedAction.java +++ b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenSignedAction.java @@ -113,4 +113,9 @@ public class SAMLTokenSignedAction implements Action { } } + @Override + public Integer[] getSupportedActions() { + return new Integer[]{WSConstants.ST_SIGNED}; + } + } diff --git a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenUnsignedAction.java b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenUnsignedAction.java index 9c26d4743..497d17550 100644 --- a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenUnsignedAction.java +++ b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SAMLTokenUnsignedAction.java @@ -26,6 +26,7 @@ import org.apache.wss4j.common.ext.WSSecurityException; import org.apache.wss4j.common.saml.SamlAssertionWrapper; import org.apache.wss4j.common.saml.SAMLCallback; import org.apache.wss4j.common.saml.SAMLUtil; +import org.apache.wss4j.dom.WSConstants; import org.apache.wss4j.dom.handler.RequestData; import org.apache.wss4j.dom.message.WSSecSAMLToken; @@ -68,4 +69,9 @@ public class SAMLTokenUnsignedAction implements Action { reqData.getSignatureValues().add(signatureValue); } } + + @Override + public Integer[] getSupportedActions() { + return new Integer[]{WSConstants.ST_UNSIGNED}; + } } diff --git a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SignatureAction.java b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SignatureAction.java index 5bffc2fc2..9b5f317ae 100644 --- a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SignatureAction.java +++ b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SignatureAction.java @@ -172,4 +172,8 @@ public class SignatureAction implements Action { } } + @Override + public Integer[] getSupportedActions() { + return new Integer[]{WSConstants.SIGN}; + } } diff --git a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SignatureConfirmationAction.java b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SignatureConfirmationAction.java index 2647f7c9b..e06c50a3a 100644 --- a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SignatureConfirmationAction.java +++ b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SignatureConfirmationAction.java @@ -91,4 +91,9 @@ public class SignatureConfirmationAction implements Action { reqData.getMsgContext().put(WSHandlerConstants.SIG_CONF_DONE, ""); } + @Override + public Integer[] getSupportedActions() { + return new Integer[]{WSConstants.SC}; + } + } diff --git a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SignatureDerivedAction.java b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SignatureDerivedAction.java index e905ec65a..2e83c4ccc 100644 --- a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SignatureDerivedAction.java +++ b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/SignatureDerivedAction.java @@ -221,4 +221,9 @@ public class SignatureDerivedAction extends AbstractDerivedAction implements Act return passwordCallback.getKey(); } } + + @Override + public Integer[] getSupportedActions() { + return new Integer[]{WSConstants.DKT_SIGN}; + } } diff --git a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/TimestampAction.java b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/TimestampAction.java index 338fef35b..5cd1aff6c 100644 --- a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/TimestampAction.java +++ b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/TimestampAction.java @@ -21,6 +21,7 @@ package org.apache.wss4j.dom.action; import org.apache.wss4j.common.SecurityActionToken; import org.apache.wss4j.common.ext.WSSecurityException; +import org.apache.wss4j.dom.WSConstants; import org.apache.wss4j.dom.handler.RequestData; import org.apache.wss4j.dom.message.WSSecTimestamp; @@ -40,4 +41,9 @@ public class TimestampAction implements Action { timeStampBuilder.setExpandXopInclude(reqData.isExpandXopInclude()); timeStampBuilder.build(); } + + @Override + public Integer[] getSupportedActions() { + return new Integer[]{WSConstants.TS}; + } } diff --git a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/UsernameTokenAction.java b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/UsernameTokenAction.java index 934e4c92c..d953708ab 100644 --- a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/UsernameTokenAction.java +++ b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/UsernameTokenAction.java @@ -68,4 +68,9 @@ public class UsernameTokenAction implements Action { builder.build(); } + + @Override + public Integer[] getSupportedActions() { + return new Integer[]{WSConstants.UT, WSConstants.UT_NOPASSWORD}; + } } diff --git a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/UsernameTokenSignedAction.java b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/UsernameTokenSignedAction.java index 0f4ae3367..a30f7310c 100644 --- a/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/UsernameTokenSignedAction.java +++ b/ws-security-dom/src/main/java/org/apache/wss4j/dom/action/UsernameTokenSignedAction.java @@ -146,4 +146,9 @@ public class UsernameTokenSignedAction implements Action { Arrays.fill(salt, (byte)0); } + + @Override + public Integer[] getSupportedActions() { + return new Integer[]{WSConstants.UT_SIGN}; + } } diff --git a/ws-security-dom/src/main/java/org/apache/wss4j/dom/engine/WSSConfig.java b/ws-security-dom/src/main/java/org/apache/wss4j/dom/engine/WSSConfig.java index 028367fef..28e076aeb 100644 --- a/ws-security-dom/src/main/java/org/apache/wss4j/dom/engine/WSSConfig.java +++ b/ws-security-dom/src/main/java/org/apache/wss4j/dom/engine/WSSConfig.java @@ -71,60 +71,25 @@ public final class WSSConfig { org.slf4j.LoggerFactory.getLogger(WSSConfig.class); /** - * The default collection of actions supported by the toolkit. + * The default collection of actions supported by the toolkit + * + * Instead of hard-coding, you can use Java's ServiceLoader mechanism to discover Action implementations + * at runtime. Each Action implementation should be registered in + * META-INF/services/org.apache.wss4j.dom.action.Action with its fully qualified class name. + * + * You will still need to map Integers to Action classes. This can be done by having each Action + * implementation provide a method (e.g., getSupportedActions()) that returns the Integer actions it supports. */ private static final Map<Integer, Class<?>> DEFAULT_ACTIONS; static { final Map<Integer, Class<?>> tmp = new HashMap<>(); try { - tmp.put( - WSConstants.UT, - org.apache.wss4j.dom.action.UsernameTokenAction.class - ); - tmp.put( - WSConstants.UT_NOPASSWORD, - org.apache.wss4j.dom.action.UsernameTokenAction.class - ); - tmp.put( - WSConstants.ENCR, - org.apache.wss4j.dom.action.EncryptionAction.class - ); - tmp.put( - WSConstants.SIGN, - org.apache.wss4j.dom.action.SignatureAction.class - ); - tmp.put( - WSConstants.DKT_SIGN, - org.apache.wss4j.dom.action.SignatureDerivedAction.class - ); - tmp.put( - WSConstants.DKT_ENCR, - org.apache.wss4j.dom.action.EncryptionDerivedAction.class - ); - tmp.put( - WSConstants.ST_SIGNED, - org.apache.wss4j.dom.action.SAMLTokenSignedAction.class - ); - tmp.put( - WSConstants.ST_UNSIGNED, - org.apache.wss4j.dom.action.SAMLTokenUnsignedAction.class - ); - tmp.put( - WSConstants.TS, - org.apache.wss4j.dom.action.TimestampAction.class - ); - tmp.put( - WSConstants.UT_SIGN, - org.apache.wss4j.dom.action.UsernameTokenSignedAction.class - ); - tmp.put( - WSConstants.SC, - org.apache.wss4j.dom.action.SignatureConfirmationAction.class - ); - tmp.put( - WSConstants.CUSTOM_TOKEN, - org.apache.wss4j.dom.action.CustomTokenAction.class - ); + java.util.ServiceLoader<Action> loader = java.util.ServiceLoader.load(Action.class); + for (Action action : loader) { + for (Integer supportedAction : action.getSupportedActions()) { + tmp.put(supportedAction, action.getClass()); + } + } } catch (final Exception ex) { LOG.debug(ex.getMessage(), ex); } diff --git a/ws-security-dom/src/main/resources/META-INF/services/org.apache.wss4j.dom.action.Action b/ws-security-dom/src/main/resources/META-INF/services/org.apache.wss4j.dom.action.Action new file mode 100644 index 000000000..e7d7ae6d2 --- /dev/null +++ b/ws-security-dom/src/main/resources/META-INF/services/org.apache.wss4j.dom.action.Action @@ -0,0 +1,11 @@ +org.apache.wss4j.dom.action.CustomTokenAction +org.apache.wss4j.dom.action.EncryptionAction +org.apache.wss4j.dom.action.EncryptionDerivedAction +org.apache.wss4j.dom.action.SAMLTokenSignedAction +org.apache.wss4j.dom.action.SAMLTokenUnsignedAction +org.apache.wss4j.dom.action.SignatureAction +org.apache.wss4j.dom.action.SignatureConfirmationAction +org.apache.wss4j.dom.action.SignatureDerivedAction +org.apache.wss4j.dom.action.TimestampAction +org.apache.wss4j.dom.action.UsernameTokenAction +org.apache.wss4j.dom.action.UsernameTokenSignedAction diff --git a/ws-security-dom/src/test/java/org/apache/wss4j/dom/common/CustomAction.java b/ws-security-dom/src/test/java/org/apache/wss4j/dom/common/CustomAction.java index fac9d212a..bf6ba716f 100644 --- a/ws-security-dom/src/test/java/org/apache/wss4j/dom/common/CustomAction.java +++ b/ws-security-dom/src/test/java/org/apache/wss4j/dom/common/CustomAction.java @@ -44,4 +44,10 @@ public class CustomAction implements Action { reqData.setMsgContext(Map.of("bread", "crumb")); } } + + @Override + public Integer[] getSupportedActions() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getSupportedActions'"); + } }