Skip to content

Commit f23b48b

Browse files
committed
feature: [174] Integrate Antlr DSL into configs
1 parent 9871a53 commit f23b48b

11 files changed

Lines changed: 58 additions & 13 deletions

File tree

acl-engine/src/main/java/javasabr/mqtt/acl/engine/exception/AclConfigurationException.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,8 @@ public class AclConfigurationException extends RuntimeException {
55
public AclConfigurationException(String message) {
66
super(message);
77
}
8+
9+
public AclConfigurationException(String message, Throwable cause) {
10+
super(message, cause);
11+
}
812
}

acl-service/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ dependencies {
88
api projects.coreService
99
api libs.springboot.starter.autoconfigure
1010
compileOnlyApi projects.aclGroovyDsl
11+
compileOnlyApi projects.aclAntlrDsl
1112
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package javasabr.mqtt.acl.service.conifg;
2+
3+
import java.net.URI;
4+
import javasabr.mqtt.acl.java.dsl.AclRulesLoader;
5+
import javasabr.mqtt.acl.service.impl.UriLoaderAuthorizationService;
6+
import javasabr.mqtt.service.AuthorizationService;
7+
import lombok.CustomLog;
8+
import org.springframework.beans.factory.annotation.Value;
9+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
10+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
11+
import org.springframework.context.annotation.Bean;
12+
import org.springframework.context.annotation.Configuration;
13+
14+
@CustomLog
15+
@Configuration(proxyBeanMethods = false)
16+
@ConditionalOnProperty(name = "acl.engine.type", havingValue = "antlr-dsl")
17+
@ConditionalOnClass(name = "javasabr.mqtt.acl.java.dsl.AclRulesLoader")
18+
public class AntlrDslBasedAclServiceSpringConfig {
19+
20+
@Bean
21+
AuthorizationService authorizationService(@Value("${acl.engine.groovy.dsl.config}") URI aclConfigUri) {
22+
log.info("Initializing Antlr-DSL based AuthorizationService...");
23+
var authorizationService = new UriLoaderAuthorizationService(AclRulesLoader::load);
24+
authorizationService.loadFrom(aclConfigUri);
25+
return authorizationService;
26+
}
27+
}

acl-service/src/main/java/javasabr/mqtt/acl/service/conifg/GroovyDslBasedAclServiceSpringConfig.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package javasabr.mqtt.acl.service.conifg;
22

33
import java.net.URI;
4-
import javasabr.mqtt.acl.service.impl.GroovyDslBasedAuthorizationService;
4+
import javasabr.mqtt.acl.groovy.dsl.loader.AclRulesLoader;
5+
import javasabr.mqtt.acl.service.impl.UriLoaderAuthorizationService;
56
import javasabr.mqtt.service.AuthorizationService;
67
import lombok.CustomLog;
78
import org.springframework.beans.factory.annotation.Value;
@@ -19,7 +20,7 @@ public class GroovyDslBasedAclServiceSpringConfig {
1920
@Bean
2021
AuthorizationService authorizationService(@Value("${acl.engine.groovy.dsl.config}") URI aclConfigUri) {
2122
log.info("Initializing Groovy-DSL based AuthorizationService...");
22-
var authorizationService = new GroovyDslBasedAuthorizationService();
23+
var authorizationService = new UriLoaderAuthorizationService(AclRulesLoader::load);
2324
authorizationService.loadFrom(aclConfigUri);
2425
return authorizationService;
2526
}

acl-service/src/main/java/javasabr/mqtt/acl/service/impl/GroovyDslBasedAuthorizationService.java renamed to acl-service/src/main/java/javasabr/mqtt/acl/service/impl/UriLoaderAuthorizationService.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,24 @@
44
import java.nio.file.Files;
55
import java.nio.file.Path;
66
import java.util.Map;
7+
import java.util.function.Function;
78
import javasabr.mqtt.acl.engine.AclEngine;
89
import javasabr.mqtt.acl.engine.exception.AclConfigurationException;
910
import javasabr.mqtt.acl.engine.model.rule.AclRule;
10-
import javasabr.mqtt.acl.groovy.dsl.loader.AclRulesLoader;
1111
import javasabr.mqtt.acl.service.AclEngineBasedAuthorizationService;
1212
import javasabr.mqtt.model.acl.Operation;
1313
import javasabr.rlib.collections.array.Array;
14+
import lombok.AccessLevel;
1415
import lombok.CustomLog;
16+
import lombok.RequiredArgsConstructor;
17+
import lombok.experimental.FieldDefaults;
1518

1619
@CustomLog
17-
public class GroovyDslBasedAuthorizationService extends AclEngineBasedAuthorizationService {
20+
@RequiredArgsConstructor
21+
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
22+
public class UriLoaderAuthorizationService extends AclEngineBasedAuthorizationService {
23+
24+
Function<Path, Map<Operation, Array<AclRule>>> rulerLoader;
1825

1926
public void loadFrom(URI resource) {
2027
Path localFile = Path.of(resource);
@@ -23,16 +30,19 @@ public void loadFrom(URI resource) {
2330
} else if (Files.isDirectory(localFile)) {
2431
throw new AclConfigurationException("ACL configuration:[%s] is directory".formatted(resource));
2532
}
26-
Map<Operation, Array<AclRule>> loadedAclRulesMap = AclRulesLoader.load(localFile);
33+
Map<Operation, Array<AclRule>> loadedAclRulesMap = rulerLoader.apply(localFile);
2734
switchTo(new AclEngine(loadedAclRulesMap));
28-
log.info(resource, loadedAclRulesMap, GroovyDslBasedAuthorizationService::buildServiceDescription);
35+
log.info(resource, loadedAclRulesMap, UriLoaderAuthorizationService::buildServiceDescription);
2936
}
3037

3138
private static String buildServiceDescription(URI resource, Map<Operation, Array<AclRule>> aclRulesMap) {
3239
var builder = new StringBuilder();
3340
builder.append("{\n");
34-
builder.append(" \"SOURCE\":\"").append(resource).append("\",\n");
35-
41+
builder
42+
.append(" \"SOURCE\":\"")
43+
.append(resource)
44+
.append("\",\n");
45+
3646
int count = 0;
3747
for (Map.Entry<Operation, Array<AclRule>> entry : aclRulesMap.entrySet()) {
3848
Operation operation = entry.getKey();

application/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ description = "Standard configuration of standalone version of MQTT Broker"
1010
dependencies {
1111
implementation projects.coreService
1212
implementation projects.aclService
13-
implementation projects.aclGroovyDsl
13+
implementation projects.aclAntlrDsl
1414
implementation projects.authenticationService
1515
implementation libs.rlib.logger.slf4j
1616
implementation libs.springboot.starter.core

application/src/main/java/javasabr/mqtt/broker/application/config/MqttBrokerSpringConfig.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package javasabr.mqtt.broker.application.config;
22

33
import java.util.Collection;
4-
import javasabr.mqtt.acl.service.conifg.GroovyDslBasedAclServiceSpringConfig;
4+
import javasabr.mqtt.acl.service.conifg.AntlrDslBasedAclServiceSpringConfig;
55
import javasabr.mqtt.auth.api.AuthenticationService;
66
import javasabr.mqtt.auth.service.config.AuthenticationServiceSpringConfig;
77
import javasabr.mqtt.model.MqttProperties;
@@ -70,7 +70,7 @@
7070

7171
@Import({
7272
AuthenticationServiceSpringConfig.class,
73-
GroovyDslBasedAclServiceSpringConfig.class,
73+
AntlrDslBasedAclServiceSpringConfig.class,
7474
MqttExternalPlainNetworkConfig.class,
7575
MqttExternalTlsNetworkConfig.class
7676
})

application/src/test/resources/application-test.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ authentication.credentials-source.file.path=classpath:auth/credentials-test
77
mqtt.external.connection.shared.subscription.available=true
88
mqtt.external.connection.wildcard.subscription.available=true
99

10-
acl.engine.type=groovy-dsl
10+
acl.engine.type=antlr-dsl
1111
acl.engine.groovy.dsl.config=classpath:test-acl.gacl

core-service/src/test/groovy/javasabr/mqtt/service/publish/impl/InMemoryIncomingPublishStorageTest.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ class InMemoryIncomingPublishStorageTest extends UnitSpecification {
299299
def incomingPublish = createAndStorePublishWithRegisteredData(publishStorage, dataStorage)
300300
when:
301301
publishStorage.scheduleRemoval(incomingPublish, Duration.ofMillis(1))
302-
waitUntil(1000) {
302+
waitUntil(2000) {
303303
dataStorage.findById(incomingPublish.data().id()) == null
304304
}
305305
then:

settings.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ include(":embedded")
1111
include(":test-support")
1212
include(":test-coverage")
1313
include(":acl-groovy-dsl")
14+
include(":acl-antlr-dsl")
1415
include(":acl-engine")
1516
include(":acl-service")
1617
include(":authentication-api")

0 commit comments

Comments
 (0)