Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 28 additions & 24 deletions distribution/src/main/feature/feature.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,17 @@
<feature dependency="true" version="${project.version}">unomi-elasticsearch-core</feature>
<feature dependency="true" version="${project.version}">unomi-persistence-core</feature>
<feature dependency="true" version="${project.version}">unomi-services</feature>
<feature dependency="true" version="${project.version}">unomi-rest-api</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-lists-extension</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-geonames-extension</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension</feature>
<feature dependency="true" version="${project.version}">unomi-elasticsearch-conditions</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-advanced-conditions</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension-services</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-base</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-request</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-mail</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-optimization-test</feature>
<feature dependency="true" version="${project.version}">unomi-rest-api</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension</feature>
<feature dependency="true" version="${project.version}">unomi-elasticsearch-conditions</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-advanced-conditions</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-lists-extension</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-geonames-extension</feature>
<feature dependency="true" version="${project.version}">unomi-shell-dev-commands</feature>
<feature dependency="true" version="${project.version}">unomi-wab</feature>
<feature dependency="true" version="${project.version}">unomi-web-tracker</feature>
Expand All @@ -55,16 +56,17 @@
<feature dependency="true" version="${project.version}">unomi-elasticsearch-core</feature>
<feature dependency="true" version="${project.version}">unomi-persistence-core</feature>
<feature dependency="true" version="${project.version}">unomi-services</feature>
<feature dependency="true" version="${project.version}">unomi-rest-api</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-lists-extension</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-geonames-extension</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension</feature>
<feature dependency="true" version="${project.version}">unomi-elasticsearch-conditions</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-advanced-conditions</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension-services</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-base</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-request</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-mail</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-optimization-test</feature>
<feature dependency="true" version="${project.version}">unomi-rest-api</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension</feature>
<feature dependency="true" version="${project.version}">unomi-elasticsearch-conditions</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-advanced-conditions</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-lists-extension</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-geonames-extension</feature>
<feature dependency="true" version="${project.version}">unomi-shell-dev-commands</feature>
<feature dependency="true" version="${project.version}">unomi-wab</feature>
<feature dependency="true" version="${project.version}">unomi-web-tracker</feature>
Expand All @@ -82,16 +84,17 @@
<feature dependency="true" version="${project.version}">unomi-opensearch-core</feature>
<feature dependency="true" version="${project.version}">unomi-persistence-core</feature>
<feature dependency="true" version="${project.version}">unomi-services</feature>
<feature dependency="true" version="${project.version}">unomi-rest-api</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-lists-extension</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-geonames-extension</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension</feature>
<feature dependency="true" version="${project.version}">unomi-opensearch-conditions</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-advanced-conditions</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension-services</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-base</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-request</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-mail</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-optimization-test</feature>
<feature dependency="true" version="${project.version}">unomi-rest-api</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension</feature>
<feature dependency="true" version="${project.version}">unomi-opensearch-conditions</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-advanced-conditions</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-lists-extension</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-geonames-extension</feature>
<feature dependency="true" version="${project.version}">unomi-shell-dev-commands</feature>
<feature dependency="true" version="${project.version}">unomi-wab</feature>
<feature dependency="true" version="${project.version}">unomi-web-tracker</feature>
Expand All @@ -108,16 +111,17 @@
<feature dependency="true" version="${project.version}">unomi-opensearch-core</feature>
<feature dependency="true" version="${project.version}">unomi-persistence-core</feature>
<feature dependency="true" version="${project.version}">unomi-services</feature>
<feature dependency="true" version="${project.version}">unomi-rest-api</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-lists-extension</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-geonames-extension</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension</feature>
<feature dependency="true" version="${project.version}">unomi-opensearch-conditions</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-advanced-conditions</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension-services</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-base</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-request</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-mail</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-optimization-test</feature>
<feature dependency="true" version="${project.version}">unomi-rest-api</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension</feature>
<feature dependency="true" version="${project.version}">unomi-opensearch-conditions</feature>
<feature dependency="true" version="${project.version}">unomi-plugins-advanced-conditions</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-lists-extension</feature>
<feature dependency="true" version="${project.version}">unomi-cxs-geonames-extension</feature>
<feature dependency="true" version="${project.version}">unomi-shell-dev-commands</feature>
<feature dependency="true" version="${project.version}">unomi-wab</feature>
<feature dependency="true" version="${project.version}">unomi-web-tracker</feature>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
package org.apache.unomi.groovy.actions;

import groovy.lang.Script;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.nio.charset.StandardCharsets;
Expand All @@ -29,9 +28,12 @@
* This class encapsulates all metadata associated with a compiled Groovy script,
* including content hash for efficient change detection and the compiled class
* for direct execution without recompilation.
* </p>
*
* <p>
* Thread Safety: This class is immutable and thread-safe. All fields are final
* and the class provides no methods to modify its state after construction.
* </p>
*
* @since 2.7.0
*/
Expand Down Expand Up @@ -90,6 +92,7 @@ private String calculateHash(String content) {
* <p>
* This method uses SHA-256 hash comparison for efficient change detection
* without storing or comparing the full script content.
* </p>
*
* @param newContent the new script content to compare against
* @return {@code true} if content has changed, {@code false} if unchanged
Expand Down Expand Up @@ -143,10 +146,11 @@ public long getCreationTime() {
* <p>
* This class can be used to create new script instances for execution
* without requiring recompilation.
* </p>
*
* @return the compiled script class, never null
*/
public Class<? extends Script> getCompiledClass() {
return compiledClass;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,23 @@
* This service provides functionality to load, compile, cache, and execute
* Groovy scripts as actions within the Apache Unomi framework. It implements
* optimized compilation and caching strategies to achieve high performance.
* </p>
*
* <p>
* Key features:
* </p>
* <ul>
* <li>Pre-compilation of scripts at startup</li>
* <li>Hash-based change detection for selective recompilation</li>
* <li>Thread-safe compilation and execution</li>
* <li>Unified caching architecture for compiled scripts</li>
* </ul>
*
* <p>
* Thread Safety: Implementations must be thread-safe as this service
* is accessed concurrently during script execution.
* </p>
*
* @see GroovyAction
* @see ScriptMetadata
* @since 2.7.0
Expand All @@ -50,6 +56,8 @@ public interface GroovyActionsService {
* This method compiles the script, validates it has the required
* annotations, persists it, and updates the internal cache.
* If the script content hasn't changed, recompilation is skipped.
* </p>
*
* @param actionName the unique identifier for the action
* @param groovyScript the Groovy script source code
* @throws IllegalArgumentException if actionName or groovyScript is null
Expand All @@ -62,6 +70,8 @@ public interface GroovyActionsService {
* <p>
* This method removes the action from both the cache and persistent storage,
* and cleans up any registered action types in the definitions service.
* </p>
*
* @param actionName the unique identifier of the action to remove
* @throws IllegalArgumentException if id is null
*/
Expand All @@ -73,6 +83,8 @@ public interface GroovyActionsService {
* This is the preferred method for script execution as it returns
* pre-compiled classes without any compilation overhead. Returns
* {@code null} if the script is not found in the cache.
* </p>
*
* @param actionName the unique identifier of the action
* @return the compiled script class, or {@code null} if not found in cache
* @throws IllegalArgumentException if id is null
Expand All @@ -85,6 +97,8 @@ public interface GroovyActionsService {
* The returned metadata includes content hash, compilation timestamp,
* and the compiled class reference. This is useful for monitoring
* tools and debugging.
* </p>
*
* @param actionName the unique identifier of the action
* @return the script metadata, or {@code null} if not found
* @throws IllegalArgumentException if actionName is null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,9 @@ public PartialList<Metadata> getListMetadatas(Query query) {
if (query.isForceRefresh()) {
persistenceService.refreshIndex(UserList.class);
}
definitionsService.resolveConditionType(query.getCondition());
if (query.getCondition() != null) {
definitionsService.getConditionValidationService().validate(query.getCondition());
}
PartialList<UserList> userLists = persistenceService.query(query.getCondition(), query.getSortby(), UserList.class, query.getOffset(), query.getLimit());
List<Metadata> metadata = new LinkedList<>();
for (UserList definition : userLists.getList()) {
Expand Down
Loading