16
16
17
17
package eu .cloudnetservice .ext .modules .rest ;
18
18
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 ;
22
20
import eu .cloudnetservice .driver .document .DocumentFactory ;
23
21
import eu .cloudnetservice .driver .event .EventManager ;
24
22
import eu .cloudnetservice .driver .inject .InjectionLayer ;
23
+ import eu .cloudnetservice .driver .language .I18n ;
24
+ import eu .cloudnetservice .driver .language .PropertiesTranslationProvider ;
25
25
import eu .cloudnetservice .driver .module .ModuleLifeCycle ;
26
26
import eu .cloudnetservice .driver .module .ModuleProvider ;
27
27
import eu .cloudnetservice .driver .module .ModuleTask ;
28
28
import eu .cloudnetservice .driver .module .driver .DriverModule ;
29
+ import eu .cloudnetservice .driver .registry .Service ;
29
30
import eu .cloudnetservice .ext .modules .rest .config .RestConfiguration ;
30
31
import eu .cloudnetservice .ext .modules .rest .listener .CloudNetBridgeInitializer ;
31
32
import eu .cloudnetservice .ext .modules .rest .listener .RestUserUpdateListener ;
48
49
import eu .cloudnetservice .ext .rest .api .auth .RestUserManagementLoader ;
49
50
import eu .cloudnetservice .ext .rest .api .factory .HttpComponentFactoryLoader ;
50
51
import eu .cloudnetservice .ext .rest .validation .ValidationHandlerMethodContextDecorator ;
51
- import eu .cloudnetservice .node .TickLoop ;
52
52
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 ;
53
56
import jakarta .inject .Named ;
54
57
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 ;
55
62
import lombok .NonNull ;
56
63
import org .slf4j .Logger ;
57
64
import org .slf4j .LoggerFactory ;
@@ -61,9 +68,28 @@ public final class CloudNetRestModule extends DriverModule {
61
68
62
69
private static final Logger LOGGER = LoggerFactory .getLogger (CloudNetRestModule .class );
63
70
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
+
64
90
@ 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 );
67
93
}
68
94
69
95
@ ModuleTask (order = 127 , lifecycle = ModuleLifeCycle .STARTED )
@@ -79,17 +105,16 @@ public void initHttpServer(@Named("module") @NonNull InjectionLayer<?> injection
79
105
// registers the validation-enabling context decorator
80
106
var validationDecorator = ValidationHandlerMethodContextDecorator .withDefaultValidator ();
81
107
server .annotationParser ().registerHandlerContextDecorator (validationDecorator );
108
+ server .annotationParser ().registerAnnotationProcessor (new CloudNetLoggerInterceptor ());
82
109
83
- // bind the server and register it for injection
110
+ // bind the server listeners
84
111
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 ());
89
112
90
- // bind the rest user management for injection
113
+ // register required instances for injection
91
114
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 ));
93
118
}
94
119
95
120
@ ModuleTask (order = 107 , lifecycle = ModuleLifeCycle .STARTED )
@@ -132,13 +157,13 @@ public void registerRestCommand(@NonNull CommandProvider commandProvider) {
132
157
133
158
@ ModuleTask (lifecycle = ModuleLifeCycle .STARTED )
134
159
public void scheduleBridgeInitialization (
135
- @ NonNull TickLoop tickLoop ,
160
+ @ NonNull Scheduler scheduler ,
136
161
@ NonNull ModuleProvider moduleProvider ,
137
162
@ NonNull HttpServer server ,
138
- @ NonNull @ Named ("module" ) InjectionLayer <SpecifiedInjector > moduleLayer
163
+ @ NonNull @ Named ("module" ) InjectionLayer <Injector > moduleLayer
139
164
) {
140
165
// 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 ));
142
167
}
143
168
144
169
@ ModuleTask (lifecycle = ModuleLifeCycle .STARTED )
@@ -149,11 +174,11 @@ public void registerListener(@NonNull EventManager eventManager) {
149
174
@ ModuleTask (lifecycle = ModuleLifeCycle .STOPPED )
150
175
public void unregisterModule (
151
176
@ NonNull HttpServer httpServer ,
152
- @ Named ("module" ) InjectionLayer <SpecifiedInjector > layer
177
+ @ Named ("module" ) InjectionLayer <Injector > layer
153
178
) {
154
179
try {
155
180
httpServer .close ();
156
- layer .injector ().removeConstructedBindings ();
181
+ layer .injector ().close ();
157
182
} catch (Exception exception ) {
158
183
LOGGER .error ("Unable to close http server while disabling cloudnet rest module." , exception );
159
184
}
0 commit comments