Skip to content

Commit 1a9c63e

Browse files
committed
resolve conflicts
2 parents 489b7d4 + be86ee9 commit 1a9c63e

29 files changed

+246
-95
lines changed

cloudnet-rest-module/build.gradle.kts

+4-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ repositories {
2828
dependencies {
2929
api(projects.webApi)
3030
moduleLibrary(libs.guava)
31+
moduleLibrary(libs.unirest)
32+
moduleLibrary(libs.caffeine)
3133

3234
implementation(projects.webJwtAuth)
3335
moduleLibrary(libs.jjwtApi)
@@ -53,8 +55,8 @@ dependencies {
5355
compileOnly(libs.logbackCore)
5456
compileOnly(libs.logbackClassic)
5557

56-
compileOnly("eu.cloudnetservice.cloudnet:node:4.0.0-RC12-SNAPSHOT")
57-
compileOnly("eu.cloudnetservice.cloudnet:bridge:4.0.0-RC12-SNAPSHOT")
58+
compileOnly("eu.cloudnetservice.cloudnet:node-impl:4.0.0-RC12-SNAPSHOT")
59+
compileOnly("eu.cloudnetservice.cloudnet:bridge-impl:4.0.0-RC12-SNAPSHOT")
5860
}
5961

6062
tasks.withType<Test> {

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/CloudNetRestModule.java

+43-18
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,17 @@
1616

1717
package eu.cloudnetservice.ext.modules.rest;
1818

19-
import dev.derklaro.aerogel.SpecifiedInjector;
20-
import dev.derklaro.aerogel.binding.BindingBuilder;
21-
import eu.cloudnetservice.common.language.I18n;
19+
import dev.derklaro.aerogel.Injector;
2220
import eu.cloudnetservice.driver.document.DocumentFactory;
2321
import eu.cloudnetservice.driver.event.EventManager;
2422
import eu.cloudnetservice.driver.inject.InjectionLayer;
23+
import eu.cloudnetservice.driver.language.I18n;
24+
import eu.cloudnetservice.driver.language.PropertiesTranslationProvider;
2525
import eu.cloudnetservice.driver.module.ModuleLifeCycle;
2626
import eu.cloudnetservice.driver.module.ModuleProvider;
2727
import eu.cloudnetservice.driver.module.ModuleTask;
2828
import eu.cloudnetservice.driver.module.driver.DriverModule;
29+
import eu.cloudnetservice.driver.registry.Service;
2930
import eu.cloudnetservice.ext.modules.rest.config.RestConfiguration;
3031
import eu.cloudnetservice.ext.modules.rest.listener.CloudNetBridgeInitializer;
3132
import eu.cloudnetservice.ext.modules.rest.listener.RestUserUpdateListener;
@@ -48,10 +49,16 @@
4849
import eu.cloudnetservice.ext.rest.api.auth.RestUserManagementLoader;
4950
import eu.cloudnetservice.ext.rest.api.factory.HttpComponentFactoryLoader;
5051
import eu.cloudnetservice.ext.rest.validation.ValidationHandlerMethodContextDecorator;
51-
import eu.cloudnetservice.node.TickLoop;
5252
import eu.cloudnetservice.node.command.CommandProvider;
53+
import eu.cloudnetservice.node.tick.Scheduler;
54+
import eu.cloudnetservice.utils.base.io.FileUtil;
55+
import eu.cloudnetservice.utils.base.resource.ResourceResolver;
5356
import jakarta.inject.Named;
5457
import jakarta.inject.Singleton;
58+
import java.io.IOException;
59+
import java.nio.file.Files;
60+
import java.nio.file.Path;
61+
import java.util.Locale;
5562
import lombok.NonNull;
5663
import org.slf4j.Logger;
5764
import org.slf4j.LoggerFactory;
@@ -61,9 +68,28 @@ public final class CloudNetRestModule extends DriverModule {
6168

6269
private static final Logger LOGGER = LoggerFactory.getLogger(CloudNetRestModule.class);
6370

71+
public static void loadTranslations(@NonNull I18n i18n) {
72+
var resourcePath = Path.of(ResourceResolver.resolveCodeSourceOfClass(CloudNetRestModule.class));
73+
FileUtil.openZipFile(resourcePath, fs -> {
74+
var langDir = fs.getPath("lang/");
75+
if (Files.notExists(langDir) || !Files.isDirectory(langDir)) {
76+
throw new IllegalStateException("lang/ must be an existing directory inside the jar to load");
77+
}
78+
79+
FileUtil.walkFileTree(langDir, ($, sub) -> {
80+
try (var stream = Files.newInputStream(sub)) {
81+
var lang = sub.getFileName().toString().replace('_', '-').replace(".properties", "");
82+
i18n.registerProvider(Locale.forLanguageTag(lang), PropertiesTranslationProvider.fromProperties(stream));
83+
} catch (IOException exception) {
84+
LOGGER.error("Unable to open language file for reading @ {}", sub, exception);
85+
}
86+
}, false, "*.properties");
87+
});
88+
}
89+
6490
@ModuleTask(order = 127, lifecycle = ModuleLifeCycle.LOADED)
65-
public void loadLanguageFile() {
66-
I18n.loadFromLangPath(this.getClass());
91+
public void loadLanguageFile(@NonNull @Service I18n i18n) {
92+
loadTranslations(i18n);
6793
}
6894

6995
@ModuleTask(order = 127, lifecycle = ModuleLifeCycle.STARTED)
@@ -79,17 +105,16 @@ public void initHttpServer(@Named("module") @NonNull InjectionLayer<?> injection
79105
// registers the validation-enabling context decorator
80106
var validationDecorator = ValidationHandlerMethodContextDecorator.withDefaultValidator();
81107
server.annotationParser().registerHandlerContextDecorator(validationDecorator);
108+
server.annotationParser().registerAnnotationProcessor(new CloudNetLoggerInterceptor());
82109

83-
// bind the server and register it for injection
110+
// bind the server listeners
84111
restConfig.httpListeners().forEach(listener -> server.addListener(listener).join());
85-
injectionLayer.install(BindingBuilder.create().bind(HttpServer.class).toInstance(server));
86-
87-
// add the cloudnet logger interceptor
88-
server.annotationParser().registerAnnotationProcessor(new CloudNetLoggerInterceptor());
89112

90-
// bind the rest user management for injection
113+
// register required instances for injection
91114
var restUserManagement = RestUserManagementLoader.load();
92-
injectionLayer.install(BindingBuilder.create().bind(RestUserManagement.class).toInstance(restUserManagement));
115+
var bindingBuilder = injectionLayer.injector().createBindingBuilder();
116+
injectionLayer.install(bindingBuilder.bind(HttpServer.class).toInstance(server));
117+
injectionLayer.install(bindingBuilder.bind(RestUserManagement.class).toInstance(restUserManagement));
93118
}
94119

95120
@ModuleTask(order = 107, lifecycle = ModuleLifeCycle.STARTED)
@@ -132,13 +157,13 @@ public void registerRestCommand(@NonNull CommandProvider commandProvider) {
132157

133158
@ModuleTask(lifecycle = ModuleLifeCycle.STARTED)
134159
public void scheduleBridgeInitialization(
135-
@NonNull TickLoop tickLoop,
160+
@NonNull Scheduler scheduler,
136161
@NonNull ModuleProvider moduleProvider,
137162
@NonNull HttpServer server,
138-
@NonNull @Named("module") InjectionLayer<SpecifiedInjector> moduleLayer
163+
@NonNull @Named("module") InjectionLayer<Injector> moduleLayer
139164
) {
140165
// we want to register the bridge handlers after all modules are started
141-
tickLoop.runTask(() -> CloudNetBridgeInitializer.installBridgeHandler(moduleProvider, server, moduleLayer));
166+
scheduler.runTask(() -> CloudNetBridgeInitializer.installBridgeHandler(moduleProvider, server, moduleLayer));
142167
}
143168

144169
@ModuleTask(lifecycle = ModuleLifeCycle.STARTED)
@@ -149,11 +174,11 @@ public void registerListener(@NonNull EventManager eventManager) {
149174
@ModuleTask(lifecycle = ModuleLifeCycle.STOPPED)
150175
public void unregisterModule(
151176
@NonNull HttpServer httpServer,
152-
@Named("module") InjectionLayer<SpecifiedInjector> layer
177+
@Named("module") InjectionLayer<Injector> layer
153178
) {
154179
try {
155180
httpServer.close();
156-
layer.injector().removeConstructedBindings();
181+
layer.injector().close();
157182
} catch (Exception exception) {
158183
LOGGER.error("Unable to close http server while disabling cloudnet rest module.", exception);
159184
}

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/RestCommand.java

+18-15
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616

1717
package eu.cloudnetservice.ext.modules.rest;
1818

19-
import eu.cloudnetservice.common.language.I18n;
19+
import eu.cloudnetservice.driver.language.I18n;
20+
import eu.cloudnetservice.driver.registry.Service;
2021
import eu.cloudnetservice.ext.modules.rest.auth.DefaultRestUser;
2122
import eu.cloudnetservice.ext.rest.api.auth.AuthProvider;
2223
import eu.cloudnetservice.ext.rest.api.auth.AuthProviderLoader;
@@ -45,11 +46,13 @@
4546
@Description("module-rest-command-description")
4647
public final class RestCommand {
4748

49+
private final I18n i18n;
4850
private final AuthProvider authProvider;
4951
private final RestUserManagement restUserManagement;
5052

5153
@Inject
52-
public RestCommand(@NonNull RestUserManagement restUserManagement) {
54+
public RestCommand(@NonNull @Service I18n i18n, @NonNull RestUserManagement restUserManagement) {
55+
this.i18n = i18n;
5356
this.restUserManagement = restUserManagement;
5457
this.authProvider = AuthProviderLoader.resolveAuthProvider("basic");
5558
}
@@ -59,15 +62,15 @@ public RestCommand(@NonNull RestUserManagement restUserManagement) {
5962
var username = input.readString();
6063
var user = this.restUserManagement.restUserByUsername(username);
6164
if (user == null) {
62-
throw new ArgumentNotAvailableException(I18n.trans("module-rest-user-not-found", username));
65+
throw new ArgumentNotAvailableException(this.i18n.translate("module-rest-user-not-found", username));
6366
}
6467

6568
// this implementation is based on our rest user implementation
6669
if (user instanceof DefaultRestUser defaultRestUser) {
6770
return defaultRestUser;
6871
}
6972

70-
throw new ArgumentNotAvailableException(I18n.trans(
73+
throw new ArgumentNotAvailableException(this.i18n.translate(
7174
"module-rest-unknown-user-type",
7275
user.getClass().getSimpleName()));
7376
}
@@ -79,7 +82,7 @@ public RestCommand(@NonNull RestUserManagement restUserManagement) {
7982
return scope;
8083
}
8184

82-
throw new ArgumentNotAvailableException(I18n.trans(
85+
throw new ArgumentNotAvailableException(this.i18n.translate(
8386
"argument-parse-failure-regex",
8487
RestUser.SCOPE_NAMING_PATTERN.pattern(),
8588
scope));
@@ -92,7 +95,7 @@ public void createRestUser(
9295
@Argument("password") @Regex(DefaultRestUser.PASSWORD_REGEX) @NonNull String password
9396
) {
9497
if (this.restUserManagement.restUserByUsername(username) != null) {
95-
source.sendMessage(I18n.trans("module-rest-user-already-existing", username));
98+
source.sendMessage(this.i18n.translate("module-rest-user-already-existing", username));
9699
return;
97100
}
98101

@@ -105,13 +108,13 @@ public void createRestUser(
105108
.build();
106109
this.restUserManagement.saveRestUser(user);
107110

108-
source.sendMessage(I18n.trans("module-rest-user-create-successful", username));
111+
source.sendMessage(this.i18n.translate("module-rest-user-create-successful", username));
109112
}
110113

111114
@Command("rest user delete <username>")
112115
public void deleteRestUser(@NonNull CommandSource source, @Argument("username") @NonNull DefaultRestUser restUser) {
113116
this.restUserManagement.deleteRestUser(restUser.id());
114-
source.sendMessage(I18n.trans("module-rest-user-delete-successful", restUser.username()));
117+
source.sendMessage(this.i18n.translate("module-rest-user-delete-successful", restUser.username()));
115118
}
116119

117120
@Command("rest user <username>")
@@ -130,13 +133,13 @@ public void addScope(
130133
@Argument(value = "scope", parserName = "restUserScope") @NonNull String scope
131134
) {
132135
this.updateRestUser(source, restUser, builder -> builder.scope(scope));
133-
source.sendMessage(I18n.trans("module-rest-user-add-scope-successful", restUser.username(), scope));
136+
source.sendMessage(this.i18n.translate("module-rest-user-add-scope-successful", restUser.username(), scope));
134137
}
135138

136139
@Command("rest user <username> clear scopes")
137140
public void clearScopes(@NonNull CommandSource source, @Argument("username") @NonNull DefaultRestUser restUser) {
138141
this.updateRestUser(source, restUser, builder -> builder.scopes(Set.of()));
139-
source.sendMessage(I18n.trans("module-rest-user-clear-scopes-successful", restUser.username()));
142+
source.sendMessage(this.i18n.translate("module-rest-user-clear-scopes-successful", restUser.username()));
140143
}
141144

142145
@Command("rest user <username> remove scope <scope>")
@@ -146,7 +149,7 @@ public void removeScope(
146149
@Argument("scope") @NonNull String scope
147150
) {
148151
this.updateRestUser(source, restUser, builder -> builder.modifyScopes(scopes -> scopes.remove(scope)));
149-
source.sendMessage(I18n.trans("module-rest-user-remove-scope-successful", restUser.username(), scope));
152+
source.sendMessage(this.i18n.translate("module-rest-user-remove-scope-successful", restUser.username(), scope));
150153
}
151154

152155
@Command("rest user <username> set password <password>")
@@ -156,7 +159,7 @@ public void setPassword(
156159
@Argument("password") @NonNull String password
157160
) {
158161
this.updateRestUser(source, restUser, builder -> builder.password(password));
159-
source.sendMessage(I18n.trans("module-rest-user-password-changed", restUser.username()));
162+
source.sendMessage(this.i18n.translate("module-rest-user-password-changed", restUser.username()));
160163
}
161164

162165
@Command("rest user <username> verifyPassword <password>")
@@ -168,12 +171,12 @@ public void verifyPassword(
168171
if (this.authProvider instanceof BasicAuthProvider basicAuthProvider) {
169172
var valid = basicAuthProvider.validatePassword(restUser, password.getBytes(StandardCharsets.UTF_8));
170173
if (valid) {
171-
source.sendMessage(I18n.trans("module-rest-user-password-match", restUser.username()));
174+
source.sendMessage(this.i18n.translate("module-rest-user-password-match", restUser.username()));
172175
} else {
173-
source.sendMessage(I18n.trans("module-rest-user-password-mismatch", restUser.username()));
176+
source.sendMessage(this.i18n.translate("module-rest-user-password-mismatch", restUser.username()));
174177
}
175178
} else {
176-
source.sendMessage(I18n.trans("module-rest-user-verify-basic-auth-provider-missing"));
179+
source.sendMessage(this.i18n.translate("module-rest-user-verify-basic-auth-provider-missing"));
177180
}
178181
}
179182

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/auth/DefaultRestUser.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
package eu.cloudnetservice.ext.modules.rest.auth;
1818

1919
import com.google.common.base.Preconditions;
20-
import eu.cloudnetservice.common.util.StringUtil;
2120
import eu.cloudnetservice.ext.modules.rest.UUIDv7;
2221
import eu.cloudnetservice.ext.modules.rest.auth.util.PasswordEncryptionUtil;
2322
import eu.cloudnetservice.ext.rest.api.auth.RestUser;
2423
import eu.cloudnetservice.ext.rest.api.response.Response;
2524
import eu.cloudnetservice.ext.rest.api.response.type.JsonResponse;
25+
import eu.cloudnetservice.utils.base.StringUtil;
2626
import java.time.OffsetDateTime;
2727
import java.util.Collection;
2828
import java.util.HashMap;
@@ -194,8 +194,8 @@ Builder id(@NonNull UUID id) {
194194
public @NonNull Builder password(@NonNull String password) {
195195
this.validatePassword(password);
196196
var hashedPasswordInfo = PasswordEncryptionUtil.encrypt(password);
197-
this.properties.put(PASSWORD_KEY, hashedPasswordInfo.second());
198-
this.properties.put(PASSWORD_SALT_KEY, hashedPasswordInfo.first());
197+
this.properties.put(PASSWORD_KEY, hashedPasswordInfo._2());
198+
this.properties.put(PASSWORD_SALT_KEY, hashedPasswordInfo._1());
199199
return this;
200200
}
201201

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/auth/DefaultRestUserManagement.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import eu.cloudnetservice.ext.rest.api.auth.RestUser;
2727
import eu.cloudnetservice.ext.rest.api.auth.RestUserManagement;
2828
import eu.cloudnetservice.node.database.LocalDatabase;
29-
import eu.cloudnetservice.node.database.NodeDatabaseProvider;
29+
import eu.cloudnetservice.node.impl.database.NodeDatabaseProvider;
3030
import java.time.Duration;
3131
import java.util.Collection;
3232
import java.util.UUID;

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/auth/util/PasswordEncryptionUtil.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package eu.cloudnetservice.ext.modules.rest.auth.util;
1818

19-
import eu.cloudnetservice.common.tuple.Tuple2;
19+
import io.vavr.Tuple2;
2020
import java.security.NoSuchAlgorithmException;
2121
import java.security.SecureRandom;
2222
import java.security.spec.InvalidKeySpecException;

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/config/ConnectionInfoResolverConfiguration.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717
package eu.cloudnetservice.ext.modules.rest.config;
1818

1919
import com.google.common.net.HttpHeaders;
20-
import eu.cloudnetservice.common.util.StringUtil;
2120
import eu.cloudnetservice.driver.document.Document;
2221
import eu.cloudnetservice.driver.document.property.DefaultedDocPropertyHolder;
2322
import eu.cloudnetservice.driver.document.property.DocProperty;
2423
import eu.cloudnetservice.ext.rest.api.connection.HttpConnectionInfoResolver;
2524
import eu.cloudnetservice.ext.rest.api.connection.parse.ForwardedSyntaxConnectionInfoResolver;
2625
import eu.cloudnetservice.ext.rest.api.connection.parse.HostHeaderConnectionInfoResolver;
2726
import eu.cloudnetservice.ext.rest.api.connection.parse.XForwardSyntaxConnectionInfoResolver;
27+
import eu.cloudnetservice.utils.base.StringUtil;
2828
import lombok.NonNull;
2929
import org.jetbrains.annotations.Nullable;
3030

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/dto/JsonConfigurationDto.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
package eu.cloudnetservice.ext.modules.rest.dto;
1818

1919
import eu.cloudnetservice.driver.document.Document;
20-
import eu.cloudnetservice.node.config.JsonConfiguration;
20+
import eu.cloudnetservice.node.impl.config.JsonConfiguration;
2121
import jakarta.validation.Valid;
2222
import jakarta.validation.constraints.NotBlank;
2323
import jakarta.validation.constraints.NotNull;

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/dto/version/ServiceVersionDto.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
import eu.cloudnetservice.driver.document.Document;
2020
import eu.cloudnetservice.ext.modules.rest.dto.Dto;
21-
import eu.cloudnetservice.node.version.ServiceVersion;
21+
import eu.cloudnetservice.node.impl.version.ServiceVersion;
2222
import jakarta.validation.constraints.NotBlank;
2323
import jakarta.validation.constraints.NotNull;
2424
import java.util.Map;

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/dto/version/ServiceVersionTypeDto.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
package eu.cloudnetservice.ext.modules.rest.dto.version;
1818

1919
import eu.cloudnetservice.ext.modules.rest.dto.Dto;
20-
import eu.cloudnetservice.node.version.ServiceVersionType;
21-
import eu.cloudnetservice.node.version.execute.InstallStep;
20+
import eu.cloudnetservice.node.impl.version.ServiceVersionType;
21+
import eu.cloudnetservice.node.impl.version.execute.InstallStep;
2222
import jakarta.validation.Valid;
2323
import jakarta.validation.constraints.NotNull;
2424
import java.util.Collection;

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/listener/CloudNetBridgeInitializer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package eu.cloudnetservice.ext.modules.rest.listener;
1818

19-
import dev.derklaro.aerogel.SpecifiedInjector;
19+
import dev.derklaro.aerogel.Injector;
2020
import eu.cloudnetservice.driver.inject.InjectionLayer;
2121
import eu.cloudnetservice.driver.module.ModuleLifeCycle;
2222
import eu.cloudnetservice.driver.module.ModuleProvider;
@@ -35,7 +35,7 @@ public class CloudNetBridgeInitializer {
3535
public static void installBridgeHandler(
3636
@NonNull ModuleProvider moduleProvider,
3737
@NonNull HttpServer server,
38-
@NonNull InjectionLayer<SpecifiedInjector> moduleLayer
38+
@NonNull InjectionLayer<Injector> moduleLayer
3939
) {
4040
var bridgeModule = moduleProvider.module(BRIDGE_MODULE_NAME);
4141
if (bridgeModule == null || bridgeModule.moduleLifeCycle() != ModuleLifeCycle.STARTED) {

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/page/PageSortingMode.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package eu.cloudnetservice.ext.modules.rest.page;
1818

19-
import eu.cloudnetservice.common.util.StringUtil;
19+
import eu.cloudnetservice.utils.base.StringUtil;
2020
import java.util.Comparator;
2121
import java.util.function.Function;
2222
import lombok.NonNull;

0 commit comments

Comments
 (0)