From 2332c6d0b35c9b18a13e8c0bce4a3a18e78c590d Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Fri, 20 Mar 2020 14:57:31 +0100 Subject: [PATCH] [New] Added tx.getPolicyDef(PolicyDef, PolicyDef) --- .../persistence/api/AbstractTransaction.java | 5 +++++ .../persistence/api/StrolchTransaction.java | 14 ++++++++++++++ .../li/strolch/policy/DefaultPolicyHandler.java | 12 +++++++++++- .../java/li/strolch/policy/PolicyHandler.java | 15 +++++++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/li.strolch.agent/src/main/java/li/strolch/persistence/api/AbstractTransaction.java b/li.strolch.agent/src/main/java/li/strolch/persistence/api/AbstractTransaction.java index a6427ed99..1e07f5e80 100644 --- a/li.strolch.agent/src/main/java/li/strolch/persistence/api/AbstractTransaction.java +++ b/li.strolch.agent/src/main/java/li/strolch/persistence/api/AbstractTransaction.java @@ -385,6 +385,11 @@ public abstract class AbstractTransaction implements StrolchTransaction { return getContainer().getComponent(PolicyHandler.class).getPolicy(policyDef, this); } + @Override + public T getPolicy(PolicyDef policyDef, PolicyDef defaultDef) { + return getContainer().getComponent(PolicyHandler.class).getPolicy(policyDef, defaultDef, this); + } + private void assertQueryAllowed(StrolchQuery query) { try { getPrivilegeContext().validateAction(query); diff --git a/li.strolch.agent/src/main/java/li/strolch/persistence/api/StrolchTransaction.java b/li.strolch.agent/src/main/java/li/strolch/persistence/api/StrolchTransaction.java index a58b82fbb..c67000426 100644 --- a/li.strolch.agent/src/main/java/li/strolch/persistence/api/StrolchTransaction.java +++ b/li.strolch.agent/src/main/java/li/strolch/persistence/api/StrolchTransaction.java @@ -184,6 +184,20 @@ public interface StrolchTransaction extends AutoCloseable { */ T getPolicy(PolicyDef policyDef); + /** + * Instantiates the policy using the given {@link PolicyDef}, or if not available, the default policy + * + * @param policyDef + * the policy definition + * @param defaultDef + * the default policy definition if the given policy definition is unavailable + * @param + * the type of policy to return + * + * @return the policy + */ + T getPolicy(PolicyDef policyDef, PolicyDef defaultDef); + /** * Returns the currently set {@link TransactionCloseStrategy} * diff --git a/li.strolch.agent/src/main/java/li/strolch/policy/DefaultPolicyHandler.java b/li.strolch.agent/src/main/java/li/strolch/policy/DefaultPolicyHandler.java index 6e8c6d9a8..4cc4fed64 100644 --- a/li.strolch.agent/src/main/java/li/strolch/policy/DefaultPolicyHandler.java +++ b/li.strolch.agent/src/main/java/li/strolch/policy/DefaultPolicyHandler.java @@ -94,11 +94,21 @@ public class DefaultPolicyHandler extends StrolchComponent implements PolicyHand @Override public T getPolicy(PolicyDef policyDef, StrolchTransaction tx) { + return getPolicy(policyDef, null, tx); + } + + @Override + public T getPolicy(PolicyDef policyDef, PolicyDef defaultDef, StrolchTransaction tx) { DBC.PRE.assertNotNull("policyDef must not be null!", policyDef); DBC.PRE.assertNotNull("tx must not be null!", tx); try { - Class clazz = policyDef.accept(this); + Class clazz; + if (defaultDef != null && !isPolicyDefAvailable(policyDef)) + clazz = defaultDef.accept(this); + else + clazz = policyDef.accept(this); + @SuppressWarnings("unchecked") Constructor constructor = (Constructor) getConstructorForPolicy(clazz); if (constructor.getParameterCount() == 1) diff --git a/li.strolch.agent/src/main/java/li/strolch/policy/PolicyHandler.java b/li.strolch.agent/src/main/java/li/strolch/policy/PolicyHandler.java index 59b6b3602..cf7bc17af 100644 --- a/li.strolch.agent/src/main/java/li/strolch/policy/PolicyHandler.java +++ b/li.strolch.agent/src/main/java/li/strolch/policy/PolicyHandler.java @@ -73,6 +73,21 @@ public interface PolicyHandler { */ T getPolicy(PolicyDef policyDef, StrolchTransaction tx); + /** + * Instantiates the actual policy by resolving the {@link PolicyDef} using a {@link PolicyDefVisitor}, or if not + * available, using the default policy definition + * + * @param policyDef + * the {@link PolicyDef} referencing a concrete policy + * @param defaultDef + * the default {@link PolicyDef} to use if the other is not available + * @param tx + * the current transaction for which the policy is instantiated + * + * @return the instantiated instance of the referenced policy + */ + T getPolicy(PolicyDef policyDef, PolicyDef defaultDef, StrolchTransaction tx); + /** * Returns true, if the policy definition is known *