diff --git a/actions/pom.xml b/actions/pom.xml index 09b85908..73487d32 100644 --- a/actions/pom.xml +++ b/actions/pom.xml @@ -23,11 +23,11 @@ tools.dynamia tools.dynamia.parent - 5.4.8 + 5.4.9 tools.dynamia.actions - 5.4.8 + 5.4.9 DynamiaTools - Actions https://dynamia.tools/docs/actions @@ -65,12 +65,12 @@ tools.dynamia tools.dynamia.integration - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.commons - 5.4.8 + 5.4.9 diff --git a/app/pom.xml b/app/pom.xml index 29efa99f..3db4b8dd 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -23,11 +23,11 @@ tools.dynamia tools.dynamia.parent - 5.4.8 + 5.4.9 tools.dynamia.app - 5.4.8 + 5.4.9 DynamiaTools - App https://dynamia.tools/docs/app @@ -74,58 +74,58 @@ tools.dynamia tools.dynamia.actions - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.commons - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.crud - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.domain - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.integration - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.io - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.navigation - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.reports - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.templates - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.viewers - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.web - 5.4.8 + 5.4.9 org.springframework.data @@ -208,7 +208,7 @@ tools.dynamia tools.dynamia.domain.jpa - 5.4.8 + 5.4.9 test diff --git a/commons/pom.xml b/commons/pom.xml index 300c5761..1e0fa8d9 100644 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -22,11 +22,11 @@ tools.dynamia.commons jar - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.parent - 5.4.8 + 5.4.9 DynamiaTools - Commons https://dynamia.tools/docs/common diff --git a/crud/pom.xml b/crud/pom.xml index c4833691..9943e0d6 100644 --- a/crud/pom.xml +++ b/crud/pom.xml @@ -23,11 +23,11 @@ tools.dynamia tools.dynamia.parent - 5.4.8 + 5.4.9 tools.dynamia.crud - 5.4.8 + 5.4.9 DynamiaTools - CRUD https://dynamia.tools/docs/crud @@ -62,23 +62,23 @@ tools.dynamia tools.dynamia.actions - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.viewers - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.navigation - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.domain.jpa - 5.4.8 + 5.4.9 test diff --git a/domain-jpa/pom.xml b/domain-jpa/pom.xml index 3bc57661..d66217d8 100644 --- a/domain-jpa/pom.xml +++ b/domain-jpa/pom.xml @@ -23,13 +23,13 @@ tools.dynamia tools.dynamia.parent - 5.4.8 + 5.4.9 DynamiaTools - Domain JPA https://dynamia.tools/docs/domain tools.dynamia.domain.jpa - 5.4.8 + 5.4.9 jar diff --git a/domain/pom.xml b/domain/pom.xml index 26e16fda..cad08e8e 100644 --- a/domain/pom.xml +++ b/domain/pom.xml @@ -21,13 +21,13 @@ 4.0.0 tools.dynamia.domain - 5.4.8 + 5.4.9 jar tools.dynamia tools.dynamia.parent - 5.4.8 + 5.4.9 DynamiaTools - Domain https://dynamia.tools/docs/domain diff --git a/integration/pom.xml b/integration/pom.xml index 828faad0..2e8e453a 100644 --- a/integration/pom.xml +++ b/integration/pom.xml @@ -27,12 +27,12 @@ tools.dynamia tools.dynamia.parent - 5.4.8 + 5.4.9 DynamiaTools - Integration A set of classes and interfaces that help integrate modules - 5.4.8 + 5.4.9 https://dynamia.tools/docs/integration diff --git a/io/pom.xml b/io/pom.xml index bcc1ec4d..fe48fb56 100644 --- a/io/pom.xml +++ b/io/pom.xml @@ -28,11 +28,11 @@ tools.dynamia tools.dynamia.parent - 5.4.8 + 5.4.9 DynamiaTools - IO - 5.4.8 + 5.4.9 A set of classes and interfaces that help in any kind io task https://dynamia.tools/docs/io diff --git a/navigation/pom.xml b/navigation/pom.xml index d51c2a0d..3bf25d84 100644 --- a/navigation/pom.xml +++ b/navigation/pom.xml @@ -23,11 +23,11 @@ tools.dynamia tools.dynamia.parent - 5.4.8 + 5.4.9 tools.dynamia.navigation - 5.4.8 + 5.4.9 DynamiaTools - Navigation https://dynamia.tools/docs/navigation @@ -63,17 +63,17 @@ tools.dynamia tools.dynamia.commons - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.integration - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.actions - 5.4.8 + 5.4.9 diff --git a/pom.xml b/pom.xml index 67abafb4..eef41758 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ 4.0.0 tools.dynamia tools.dynamia.parent - 5.4.8 + 5.4.9 pom Dynamia Soluciones IT SAS diff --git a/reports/pom.xml b/reports/pom.xml index 51711b9e..cb33e98c 100644 --- a/reports/pom.xml +++ b/reports/pom.xml @@ -26,11 +26,11 @@ tools.dynamia tools.dynamia.parent - 5.4.8 + 5.4.9 DynamiaTools - Reports - 5.4.8 + 5.4.9 A set of classes and interfaces that help building Reports https://dynamia.tools/docs/reports diff --git a/starter/pom.xml b/starter/pom.xml index d27139b1..50e9251d 100644 --- a/starter/pom.xml +++ b/starter/pom.xml @@ -4,7 +4,7 @@ tools.dynamia tools.dynamia.parent - 5.4.8 + 5.4.9 dynamia-tools-starter DynamiaTools - Starter @@ -26,17 +26,17 @@ tools.dynamia tools.dynamia.app - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.zk - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.domain.jpa - 5.4.8 + 5.4.9 org.hibernate.validator diff --git a/templates/pom.xml b/templates/pom.xml index 2f2c066a..91aaa5b2 100644 --- a/templates/pom.xml +++ b/templates/pom.xml @@ -23,12 +23,12 @@ tools.dynamia.parent tools.dynamia - 5.4.8 + 5.4.9 tools.dynamia.templates - 5.4.8 + 5.4.9 DynamiaTools - Templates https://dynamia.tools/docs/templates @@ -64,12 +64,12 @@ tools.dynamia tools.dynamia.integration - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.commons - 5.4.8 + 5.4.9 diff --git a/ui/pom.xml b/ui/pom.xml index c53a218b..07b683ac 100644 --- a/ui/pom.xml +++ b/ui/pom.xml @@ -23,11 +23,11 @@ tools.dynamia tools.dynamia.parent - 5.4.8 + 5.4.9 tools.dynamia.ui - 5.4.8 + 5.4.9 DynamiaTools - UI https://dynamia.tools/docs/ui Helper classes for module integrations and messages @@ -64,17 +64,17 @@ tools.dynamia tools.dynamia.integration - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.commons - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.io - 5.4.8 + 5.4.9 diff --git a/viewers/pom.xml b/viewers/pom.xml index e6e0f95c..2c0b164a 100644 --- a/viewers/pom.xml +++ b/viewers/pom.xml @@ -23,13 +23,13 @@ tools.dynamia.viewers jar - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.parent - 5.4.8 + 5.4.9 DynamiaTools - Viewers @@ -67,27 +67,27 @@ tools.dynamia tools.dynamia.commons - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.integration - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.io - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.domain - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.actions - 5.4.8 + 5.4.9 org.yaml diff --git a/web/pom.xml b/web/pom.xml index 07aa3bbf..be5e838e 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -23,14 +23,14 @@ tools.dynamia.web jar - 5.4.8 + 5.4.9 A set of common classes and interfaces for web application development tools.dynamia tools.dynamia.parent - 5.4.8 + 5.4.9 DynamiaTools - Web @@ -88,27 +88,27 @@ tools.dynamia tools.dynamia.commons - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.integration - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.navigation - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.viewers - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.crud - 5.4.8 + 5.4.9 org.springframework diff --git a/zk/pom.xml b/zk/pom.xml index 4755d717..314a1825 100644 --- a/zk/pom.xml +++ b/zk/pom.xml @@ -21,12 +21,12 @@ tools.dynamia.parent tools.dynamia - 5.4.8 + 5.4.9 4.0.0 tools.dynamia.zk - 5.4.8 + 5.4.9 jar DynamiaTools - ZK https://dynamia.tools/docs/zk @@ -99,31 +99,31 @@ tools.dynamia tools.dynamia.web - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.navigation - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.ui - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.domain - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.viewers - 5.4.8 + 5.4.9 org.yaml @@ -134,19 +134,19 @@ tools.dynamia tools.dynamia.crud - 5.4.8 + 5.4.9 tools.dynamia tools.dynamia.reports - 5.4.8 + 5.4.9 compile tools.dynamia tools.dynamia.templates - 5.4.8 + 5.4.9 compile diff --git a/zk/src/main/java/tools/dynamia/zk/websocket/WebSocketGlobalCommandConfig.java b/zk/src/main/java/tools/dynamia/zk/websocket/WebSocketGlobalCommandConfig.java deleted file mode 100644 index b4c6cece..00000000 --- a/zk/src/main/java/tools/dynamia/zk/websocket/WebSocketGlobalCommandConfig.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2023 Dynamia Soluciones IT S.A.S - NIT 900302344-1 - * Colombia / South America - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package tools.dynamia.zk.websocket; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.socket.WebSocketHandler; -import org.springframework.web.socket.config.annotation.EnableWebSocket; -import org.springframework.web.socket.config.annotation.WebSocketConfigurer; -import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; -import tools.dynamia.commons.logger.LoggingService; -import tools.dynamia.commons.logger.SLF4JLoggingService; - -@Configuration -@EnableWebSocket -public class WebSocketGlobalCommandConfig implements WebSocketConfigurer { - - private final LoggingService logger = new SLF4JLoggingService(WebSocketGlobalCommandConfig.class); - - public WebSocketGlobalCommandConfig() { - logger.info("Starting " + getClass()); - } - - @Override - public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { - logger.info("Registering WS Handler for ZK Commands"); - registry.addHandler(globalCommandHandler(), "/ws-commands") - .setAllowedOrigins("*"); // Permitir todas las origenes, ajustar segĂșn necesidades de seguridad - } - - @Bean - public WebSocketHandler globalCommandHandler() { - return new WebSocketGlobalCommandHandler(); - } -} diff --git a/zk/src/main/java/tools/dynamia/zk/websocket/WebSocketGlobalCommandHandler.java b/zk/src/main/java/tools/dynamia/zk/websocket/WebSocketGlobalCommandHandler.java index ec43d0e1..9146f8ab 100644 --- a/zk/src/main/java/tools/dynamia/zk/websocket/WebSocketGlobalCommandHandler.java +++ b/zk/src/main/java/tools/dynamia/zk/websocket/WebSocketGlobalCommandHandler.java @@ -57,7 +57,7 @@ * } * } * - * @see WebSocketGlobalCommandConfig + * @see ZKWebSocketConfigurer * @see WebSocketPushSender */ public class WebSocketGlobalCommandHandler extends TextWebSocketHandler implements Loggable { diff --git a/zk/src/main/java/tools/dynamia/zk/websocket/WebSocketPushSender.java b/zk/src/main/java/tools/dynamia/zk/websocket/WebSocketPushSender.java index 84374625..93080fe6 100644 --- a/zk/src/main/java/tools/dynamia/zk/websocket/WebSocketPushSender.java +++ b/zk/src/main/java/tools/dynamia/zk/websocket/WebSocketPushSender.java @@ -122,7 +122,9 @@ public static void initWS() { if (ZKUtil.isInEventListener()) { try { LOGGER.info("Requesting to initialize Websocket connection"); - Clients.evalJavaScript("DynamiaToolsWS.init('/ws-commands');"); + var config = Containers.get().findObject(ZKWebSocketConfigurer.class); + var endpoint = config != null ? config.getEndpoint() : "/ws-commands"; + Clients.evalJavaScript("DynamiaToolsWS.init('" + endpoint + "');"); } catch (Exception e) { // } diff --git a/zk/src/main/java/tools/dynamia/zk/websocket/ZKWebSocketConfigurer.java b/zk/src/main/java/tools/dynamia/zk/websocket/ZKWebSocketConfigurer.java new file mode 100644 index 00000000..02a21c2d --- /dev/null +++ b/zk/src/main/java/tools/dynamia/zk/websocket/ZKWebSocketConfigurer.java @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2023 Dynamia Soluciones IT S.A.S - NIT 900302344-1 + * Colombia / South America + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package tools.dynamia.zk.websocket; + +import org.springframework.context.annotation.Bean; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; +import org.springframework.web.socket.server.support.DefaultHandshakeHandler; +import tools.dynamia.commons.logger.Loggable; + + +/** + * Spring WebSocket configurer for ZK global commands. + * + *

This class implements {@link WebSocketConfigurer} and registers a WebSocket handler + * for ZK commands at a configurable endpoint. It exposes two beans: + *

    + *
  • {@link WebSocketGlobalCommandHandler}
  • + *
  • {@link DefaultHandshakeHandler}
  • + *
+ *

+ * Usage: + *

    + *
  • Extend this class in your own {@code @Configuration} to customize endpoint, + * allowed origins or handshake behavior.
  • + *
  • Or import it from another {@code @Configuration} class using + * {@code @Import(ZKWebSocketConfigurer.class)} to reuse the default configuration.
  • + *
+ *

+ * Important: When using this class as a Spring configuration (either by extending it + * or importing it), the hosting configuration must enable WebSocket support by being + * annotated with {@code @EnableWebSocket}. Without {@code @EnableWebSocket} Spring + * will not process WebSocket configuration. Examples: + * + *

{@code
+ * @Configuration
+ * @EnableWebSocket
+ * public class MyWsConfig extends ZKWebSocketConfigurer {
+ *     public MyWsConfig() {
+ *         setEndpoint("/my-ws");
+ *         setAllowedOrigins(new String[]{"https://example.com"});
+ *     }
+ * }
+ *
+ * @Configuration
+ * @EnableWebSocket
+ * @Import(ZKWebSocketConfigurer.class)
+ * public class AppConfig { }
+ * }
+ *

+ * This class is intentionally lightweight and provides sensible defaults. Override + * or extend behaviour when a project needs different endpoint paths, CORS rules + * or a custom handshake handler. + */ +public class ZKWebSocketConfigurer implements WebSocketConfigurer, Loggable { + + private String endpoint = "/ws-commands"; + private String[] allowedOrigins = new String[]{"*"}; + private String[] allowedOriginPatterns = null; + + + /** + * Creates a new ZKWebSocketConfigurer with default configuration values. + * A startup message is logged when an instance is created. + */ + public ZKWebSocketConfigurer() { + log("Starting " + getClass()); + } + + /** + * Register the WebSocket handlers into the provided {@link WebSocketHandlerRegistry}. + * This method configures the handler endpoint, allowed origins / origin patterns + * and the handshake handler. + * + * @param registry the WebSocketHandlerRegistry used to register handlers + */ + @Override + public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { + log("Registering WS Handler for ZK Commands"); + var reg = registry.addHandler(globalCommandHandler(), endpoint != null ? endpoint : "/ws-commands"); + if (allowedOrigins != null) { + reg.setAllowedOrigins(allowedOrigins); + } + if (allowedOriginPatterns != null) { + reg.setAllowedOriginPatterns(allowedOriginPatterns); + } + reg.setHandshakeHandler(handshakeHandler()); + } + + /** + * Exposes the {@link WebSocketGlobalCommandHandler} as a Spring bean. + * Override this method if you need to provide a custom handler implementation. + * + * @return a new instance of {@link WebSocketGlobalCommandHandler} + */ + @Bean + public WebSocketGlobalCommandHandler globalCommandHandler() { + return new WebSocketGlobalCommandHandler(); + } + + /** + * Exposes the {@link DefaultHandshakeHandler} as a Spring bean. + * Override this method to provide a custom handshake handler when needed. + * + * @return a new instance of {@link DefaultHandshakeHandler} + */ + @Bean + public DefaultHandshakeHandler handshakeHandler() { + return new DefaultHandshakeHandler(); + } + + /** + * Returns the configured WebSocket endpoint path. Default is {@code "/ws-commands"}. + * + * @return the endpoint path where the WebSocket handler is registered + */ + public String getEndpoint() { + return endpoint; + } + + /** + * Sets the WebSocket endpoint path where the handler will be registered. + * + * @param endpoint the endpoint path to set (e.g. {@code "/ws-commands"}) + */ + public void setEndpoint(String endpoint) { + this.endpoint = endpoint; + } + + /** + * Returns the allowed origins used for CORS. By default this is {@code new String[]{"*"}}. + * + * @return the allowed origins array or {@code null} if not set + */ + public String[] getAllowedOrigins() { + return allowedOrigins; + } + + /** + * Sets the allowed origins used for CORS. + * + * @param allowedOrigins an array of allowed origin strings + */ + public void setAllowedOrigins(String... allowedOrigins) { + this.allowedOrigins = allowedOrigins; + } + + /** + * Returns the allowed origin patterns used for CORS. If set, these patterns + * will be applied instead of {@link #allowedOrigins}. + * + * @return the allowed origin patterns array or {@code null} if not set + */ + public String[] getAllowedOriginPatterns() { + return allowedOriginPatterns; + } + + /** + * Sets the allowed origin patterns used for CORS. + * + * @param allowedOriginPatterns an array of allowed origin pattern strings + */ + public void setAllowedOriginPatterns(String... allowedOriginPatterns) { + this.allowedOriginPatterns = allowedOriginPatterns; + } +}