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'");
+    }
 }

Reply via email to