Skip to content

Commit 6a7379f

Browse files
committed
Add module service injection mechanism
- Introduced `ModuleService` annotation for marking injectable services. - Added `ModuleHolder` class to hold injected module services. - Implemented `ModuleServiceInjector` to dynamically inject beans annotated with `ModuleService` into `ModuleHolder`.
1 parent f4bde8a commit 6a7379f

5 files changed

Lines changed: 52 additions & 0 deletions

File tree

application-engine/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,5 @@ log/
143143
/src/main/resources/certificates/private.der
144144
/src/main/resources/certificates/public.crt
145145
/modules/
146+
!src/main/java/**/modules
147+
!src/main/groovy/**/modules
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.netgrif.application.engine.integration.modules
2+
3+
/**
4+
* A class where the module services are injected. The plugins are injected into metaclasses
5+
* */
6+
class ModuleHolder {
7+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.netgrif.application.engine.integration.modules
2+
3+
import com.netgrif.application.engine.configuration.ApplicationContextProvider
4+
import com.netgrif.application.engine.startup.ApplicationEngineFinishRunner
5+
import com.netgrif.application.engine.startup.annotation.RunnerOrder
6+
import org.slf4j.Logger
7+
import org.slf4j.LoggerFactory
8+
import org.springframework.boot.ApplicationArguments
9+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
10+
import org.springframework.stereotype.Component
11+
12+
@Component
13+
@RunnerOrder(209)
14+
@ConditionalOnProperty(value = "nae.modules.services.enabled", havingValue = "true", matchIfMissing = true)
15+
class ModuleServiceInjector implements ApplicationEngineFinishRunner {
16+
17+
private static final Logger log = LoggerFactory.getLogger(ModuleServiceInjector.class)
18+
19+
@Override
20+
void run(ApplicationArguments args) throws Exception {
21+
def injectableBeans = ApplicationContextProvider.getAppContext().getBeansWithAnnotation(ModuleService.class)
22+
if (!injectableBeans.isEmpty()) {
23+
MetaClass holderMetaClass = ModuleHolder.metaClass
24+
injectableBeans.forEach((key, value) -> {
25+
log.debug("Injecting module service {} into action delegate make it available under module.{}", key, key)
26+
holderMetaClass[key] = value
27+
})
28+
}
29+
}
30+
}

application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.netgrif.application.engine.petrinet.domain.dataset.logic.action
22

33
import com.netgrif.application.engine.auth.service.GroupService
44
import com.netgrif.application.engine.auth.service.UserService
5+
import com.netgrif.application.engine.integration.modules.ModuleHolder
56
import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService
67
import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService
78
import com.netgrif.application.engine.adapter.spring.workflow.domain.QCase
@@ -200,6 +201,8 @@ class ActionDelegate {
200201

201202
PluginHolder Plugin
202203

204+
ModuleHolder Module
205+
203206
/**
204207
* Reference of case and task in which current action is taking place.
205208
*/
@@ -222,6 +225,7 @@ class ActionDelegate {
222225
this.outcomes = new ArrayList<>()
223226
this.Frontend = new FrontendActionOutcome(this.useCase, this.task, this.outcomes)
224227
this.Plugin = new PluginHolder()
228+
this.Module = new ModuleHolder()
225229
}
226230

227231
def initFieldsMap(Map<String, String> fieldIds) {
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.netgrif.application.engine.integration.modules;
2+
3+
import java.lang.annotation.*;
4+
5+
@Documented
6+
@Target({ElementType.TYPE})
7+
@Retention(RetentionPolicy.RUNTIME)
8+
public @interface ModuleService {
9+
}

0 commit comments

Comments
 (0)