This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch CAMEL-22086 in repository https://gitbox.apache.org/repos/asf/camel.git
commit ce90e987753a7c42562d0c58112ce021355a3e10 Author: Sebastian Steinfeld <[email protected]> AuthorDate: Mon Sep 22 17:37:32 2025 +0200 CAMEL-22086 - migrate to current milo version --- .../milo/browse/MiloBrowseComponentConfigurer.java | 76 ++++----- .../milo/browse/MiloBrowseEndpointConfigurer.java | 88 +++++------ .../milo/client/MiloClientComponentConfigurer.java | 88 +++++------ .../milo/client/MiloClientEndpointConfigurer.java | 96 ++++++------ .../milo/converter/ValueConverterLoader.java | 4 +- .../milo/server/MiloServerComponentConfigurer.java | 36 ++--- .../services/org/apache/camel/component.properties | 2 +- .../camel/component/milo/browse/milo-browse.json | 2 +- .../camel/component/milo/client/milo-client.json | 4 +- .../camel/component/milo/server/milo-server.json | 2 +- .../milo/client/MiloClientConfiguration.java | 12 +- .../milo/client/MonitorFilterConfiguration.java | 7 +- .../milo/client/internal/SubscriptionManager.java | 169 ++++++++++++++------- .../component/milo/server/MiloServerComponent.java | 169 ++++++++++++++------- .../component/milo/server/internal/CallMethod.java | 2 +- .../milo/server/internal/CamelNamespace.java | 12 +- .../milo/server/internal/CamelServerItem.java | 6 +- .../camel/component/milo/call/CallClientTest.java | 90 ++++++----- .../camel/component/milo/call/MockCallMethod.java | 2 +- .../component/milo/call/MockCamelNamespace.java | 8 +- .../milo/call/TestCertificateFactory.java | 79 ++++++++++ .../camel/component/milo/client/NodeIdTest.java | 12 +- 22 files changed, 588 insertions(+), 378 deletions(-) diff --git a/components/camel-milo/src/generated/java/org/apache/camel/component/milo/browse/MiloBrowseComponentConfigurer.java b/components/camel-milo/src/generated/java/org/apache/camel/component/milo/browse/MiloBrowseComponentConfigurer.java index 15d217eb5675..0d248a6b7917 100644 --- a/components/camel-milo/src/generated/java/org/apache/camel/component/milo/browse/MiloBrowseComponentConfigurer.java +++ b/components/camel-milo/src/generated/java/org/apache/camel/component/milo/browse/MiloBrowseComponentConfigurer.java @@ -29,52 +29,52 @@ public class MiloBrowseComponentConfigurer extends PropertyConfigurerSupport imp MiloBrowseComponent target = (MiloBrowseComponent) obj; switch (ignoreCase ? name.toLowerCase() : name) { case "allowedsecuritypolicies": - case "allowedSecurityPolicies": getOrCreateConfiguration(target).setAllowedSecurityPolicies(property(camelContext, java.lang.String.class, value)); return true; + case "allowedSecurityPolicies": getOrCreateConfiguration(target).setAllowedSecurityPolicies(property(camelContext, String.class, value)); return true; case "applicationname": - case "applicationName": getOrCreateConfiguration(target).setApplicationName(property(camelContext, java.lang.String.class, value)); return true; + case "applicationName": getOrCreateConfiguration(target).setApplicationName(property(camelContext, String.class, value)); return true; case "applicationuri": - case "applicationUri": getOrCreateConfiguration(target).setApplicationUri(property(camelContext, java.lang.String.class, value)); return true; + case "applicationUri": getOrCreateConfiguration(target).setApplicationUri(property(camelContext, String.class, value)); return true; case "autowiredenabled": case "autowiredEnabled": target.setAutowiredEnabled(property(camelContext, boolean.class, value)); return true; case "channellifetime": - case "channelLifetime": getOrCreateConfiguration(target).setChannelLifetime(property(camelContext, java.lang.Long.class, value)); return true; + case "channelLifetime": getOrCreateConfiguration(target).setChannelLifetime(property(camelContext, Long.class, value)); return true; case "clientid": - case "clientId": getOrCreateConfiguration(target).setClientId(property(camelContext, java.lang.String.class, value)); return true; + case "clientId": getOrCreateConfiguration(target).setClientId(property(camelContext, String.class, value)); return true; case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.milo.client.MiloClientConfiguration.class, value)); return true; case "discoveryendpointsuffix": - case "discoveryEndpointSuffix": getOrCreateConfiguration(target).setDiscoveryEndpointSuffix(property(camelContext, java.lang.String.class, value)); return true; + case "discoveryEndpointSuffix": getOrCreateConfiguration(target).setDiscoveryEndpointSuffix(property(camelContext, String.class, value)); return true; case "discoveryendpointuri": - case "discoveryEndpointUri": getOrCreateConfiguration(target).setDiscoveryEndpointUri(property(camelContext, java.lang.String.class, value)); return true; + case "discoveryEndpointUri": getOrCreateConfiguration(target).setDiscoveryEndpointUri(property(camelContext, String.class, value)); return true; case "keyalias": - case "keyAlias": getOrCreateConfiguration(target).setKeyAlias(property(camelContext, java.lang.String.class, value)); return true; + case "keyAlias": getOrCreateConfiguration(target).setKeyAlias(property(camelContext, String.class, value)); return true; case "keypassword": - case "keyPassword": getOrCreateConfiguration(target).setKeyPassword(property(camelContext, java.lang.String.class, value)); return true; + case "keyPassword": getOrCreateConfiguration(target).setKeyPassword(property(camelContext, String.class, value)); return true; case "keystorepassword": - case "keyStorePassword": getOrCreateConfiguration(target).setKeyStorePassword(property(camelContext, java.lang.String.class, value)); return true; + case "keyStorePassword": getOrCreateConfiguration(target).setKeyStorePassword(property(camelContext, String.class, value)); return true; case "keystoretype": - case "keyStoreType": getOrCreateConfiguration(target).setKeyStoreType(property(camelContext, java.lang.String.class, value)); return true; + case "keyStoreType": getOrCreateConfiguration(target).setKeyStoreType(property(camelContext, String.class, value)); return true; case "keystoreurl": - case "keyStoreUrl": getOrCreateConfiguration(target).setKeyStoreUrl(property(camelContext, java.lang.String.class, value)); return true; + case "keyStoreUrl": getOrCreateConfiguration(target).setKeyStoreUrl(property(camelContext, String.class, value)); return true; case "lazystartproducer": case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true; case "maxpendingpublishrequests": - case "maxPendingPublishRequests": getOrCreateConfiguration(target).setMaxPendingPublishRequests(property(camelContext, java.lang.Long.class, value)); return true; + case "maxPendingPublishRequests": getOrCreateConfiguration(target).setMaxPendingPublishRequests(property(camelContext, Long.class, value)); return true; case "maxresponsemessagesize": - case "maxResponseMessageSize": getOrCreateConfiguration(target).setMaxResponseMessageSize(property(camelContext, java.lang.Long.class, value)); return true; + case "maxResponseMessageSize": getOrCreateConfiguration(target).setMaxResponseMessageSize(property(camelContext, Long.class, value)); return true; case "miloclientconnectionmanager": case "miloClientConnectionManager": target.setMiloClientConnectionManager(property(camelContext, org.apache.camel.component.milo.client.MiloClientConnectionManager.class, value)); return true; case "overridehost": case "overrideHost": getOrCreateConfiguration(target).setOverrideHost(property(camelContext, boolean.class, value)); return true; case "producturi": - case "productUri": getOrCreateConfiguration(target).setProductUri(property(camelContext, java.lang.String.class, value)); return true; + case "productUri": getOrCreateConfiguration(target).setProductUri(property(camelContext, String.class, value)); return true; case "requesttimeout": - case "requestTimeout": getOrCreateConfiguration(target).setRequestTimeout(property(camelContext, java.lang.Long.class, value)); return true; + case "requestTimeout": getOrCreateConfiguration(target).setRequestTimeout(property(camelContext, Long.class, value)); return true; case "requestedpublishinginterval": - case "requestedPublishingInterval": getOrCreateConfiguration(target).setRequestedPublishingInterval(property(camelContext, java.lang.Double.class, value)); return true; + case "requestedPublishingInterval": getOrCreateConfiguration(target).setRequestedPublishingInterval(property(camelContext, Double.class, value)); return true; case "sessionname": - case "sessionName": getOrCreateConfiguration(target).setSessionName(property(camelContext, java.lang.String.class, value)); return true; + case "sessionName": getOrCreateConfiguration(target).setSessionName(property(camelContext, String.class, value)); return true; case "sessiontimeout": - case "sessionTimeout": getOrCreateConfiguration(target).setSessionTimeout(property(camelContext, java.lang.Long.class, value)); return true; + case "sessionTimeout": getOrCreateConfiguration(target).setSessionTimeout(property(camelContext, Long.class, value)); return true; default: return false; } } @@ -88,52 +88,52 @@ public class MiloBrowseComponentConfigurer extends PropertyConfigurerSupport imp public Class<?> getOptionType(String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { case "allowedsecuritypolicies": - case "allowedSecurityPolicies": return java.lang.String.class; + case "allowedSecurityPolicies": return String.class; case "applicationname": - case "applicationName": return java.lang.String.class; + case "applicationName": return String.class; case "applicationuri": - case "applicationUri": return java.lang.String.class; + case "applicationUri": return String.class; case "autowiredenabled": case "autowiredEnabled": return boolean.class; case "channellifetime": - case "channelLifetime": return java.lang.Long.class; + case "channelLifetime": return Long.class; case "clientid": - case "clientId": return java.lang.String.class; + case "clientId": return String.class; case "configuration": return org.apache.camel.component.milo.client.MiloClientConfiguration.class; case "discoveryendpointsuffix": - case "discoveryEndpointSuffix": return java.lang.String.class; + case "discoveryEndpointSuffix": return String.class; case "discoveryendpointuri": - case "discoveryEndpointUri": return java.lang.String.class; + case "discoveryEndpointUri": return String.class; case "keyalias": - case "keyAlias": return java.lang.String.class; + case "keyAlias": return String.class; case "keypassword": - case "keyPassword": return java.lang.String.class; + case "keyPassword": return String.class; case "keystorepassword": - case "keyStorePassword": return java.lang.String.class; + case "keyStorePassword": return String.class; case "keystoretype": - case "keyStoreType": return java.lang.String.class; + case "keyStoreType": return String.class; case "keystoreurl": - case "keyStoreUrl": return java.lang.String.class; + case "keyStoreUrl": return String.class; case "lazystartproducer": case "lazyStartProducer": return boolean.class; case "maxpendingpublishrequests": - case "maxPendingPublishRequests": return java.lang.Long.class; + case "maxPendingPublishRequests": return Long.class; case "maxresponsemessagesize": - case "maxResponseMessageSize": return java.lang.Long.class; + case "maxResponseMessageSize": return Long.class; case "miloclientconnectionmanager": case "miloClientConnectionManager": return org.apache.camel.component.milo.client.MiloClientConnectionManager.class; case "overridehost": case "overrideHost": return boolean.class; case "producturi": - case "productUri": return java.lang.String.class; + case "productUri": return String.class; case "requesttimeout": - case "requestTimeout": return java.lang.Long.class; + case "requestTimeout": return Long.class; case "requestedpublishinginterval": - case "requestedPublishingInterval": return java.lang.Double.class; + case "requestedPublishingInterval": return Double.class; case "sessionname": - case "sessionName": return java.lang.String.class; + case "sessionName": return String.class; case "sessiontimeout": - case "sessionTimeout": return java.lang.Long.class; + case "sessionTimeout": return Long.class; default: return null; } } diff --git a/components/camel-milo/src/generated/java/org/apache/camel/component/milo/browse/MiloBrowseEndpointConfigurer.java b/components/camel-milo/src/generated/java/org/apache/camel/component/milo/browse/MiloBrowseEndpointConfigurer.java index 5923b0b853a5..a6578f035091 100644 --- a/components/camel-milo/src/generated/java/org/apache/camel/component/milo/browse/MiloBrowseEndpointConfigurer.java +++ b/components/camel-milo/src/generated/java/org/apache/camel/component/milo/browse/MiloBrowseEndpointConfigurer.java @@ -22,58 +22,58 @@ public class MiloBrowseEndpointConfigurer extends PropertyConfigurerSupport impl MiloBrowseEndpoint target = (MiloBrowseEndpoint) obj; switch (ignoreCase ? name.toLowerCase() : name) { case "allowedsecuritypolicies": - case "allowedSecurityPolicies": target.getConfiguration().setAllowedSecurityPolicies(property(camelContext, java.lang.String.class, value)); return true; + case "allowedSecurityPolicies": target.getConfiguration().setAllowedSecurityPolicies(property(camelContext, String.class, value)); return true; case "applicationname": - case "applicationName": target.getConfiguration().setApplicationName(property(camelContext, java.lang.String.class, value)); return true; + case "applicationName": target.getConfiguration().setApplicationName(property(camelContext, String.class, value)); return true; case "applicationuri": - case "applicationUri": target.getConfiguration().setApplicationUri(property(camelContext, java.lang.String.class, value)); return true; + case "applicationUri": target.getConfiguration().setApplicationUri(property(camelContext, String.class, value)); return true; case "channellifetime": - case "channelLifetime": target.getConfiguration().setChannelLifetime(property(camelContext, java.lang.Long.class, value)); return true; + case "channelLifetime": target.getConfiguration().setChannelLifetime(property(camelContext, Long.class, value)); return true; case "clientid": - case "clientId": target.getConfiguration().setClientId(property(camelContext, java.lang.String.class, value)); return true; + case "clientId": target.getConfiguration().setClientId(property(camelContext, String.class, value)); return true; case "depth": target.setDepth(property(camelContext, int.class, value)); return true; case "direction": target.setDirection(property(camelContext, org.eclipse.milo.opcua.stack.core.types.enumerated.BrowseDirection.class, value)); return true; case "discoveryendpointsuffix": - case "discoveryEndpointSuffix": target.getConfiguration().setDiscoveryEndpointSuffix(property(camelContext, java.lang.String.class, value)); return true; + case "discoveryEndpointSuffix": target.getConfiguration().setDiscoveryEndpointSuffix(property(camelContext, String.class, value)); return true; case "discoveryendpointuri": - case "discoveryEndpointUri": target.getConfiguration().setDiscoveryEndpointUri(property(camelContext, java.lang.String.class, value)); return true; - case "filter": target.setFilter(property(camelContext, java.lang.String.class, value)); return true; + case "discoveryEndpointUri": target.getConfiguration().setDiscoveryEndpointUri(property(camelContext, String.class, value)); return true; + case "filter": target.setFilter(property(camelContext, String.class, value)); return true; case "includesubtypes": case "includeSubTypes": target.setIncludeSubTypes(property(camelContext, boolean.class, value)); return true; case "keyalias": - case "keyAlias": target.getConfiguration().setKeyAlias(property(camelContext, java.lang.String.class, value)); return true; + case "keyAlias": target.getConfiguration().setKeyAlias(property(camelContext, String.class, value)); return true; case "keypassword": - case "keyPassword": target.getConfiguration().setKeyPassword(property(camelContext, java.lang.String.class, value)); return true; + case "keyPassword": target.getConfiguration().setKeyPassword(property(camelContext, String.class, value)); return true; case "keystorepassword": - case "keyStorePassword": target.getConfiguration().setKeyStorePassword(property(camelContext, java.lang.String.class, value)); return true; + case "keyStorePassword": target.getConfiguration().setKeyStorePassword(property(camelContext, String.class, value)); return true; case "keystoretype": - case "keyStoreType": target.getConfiguration().setKeyStoreType(property(camelContext, java.lang.String.class, value)); return true; + case "keyStoreType": target.getConfiguration().setKeyStoreType(property(camelContext, String.class, value)); return true; case "keystoreurl": - case "keyStoreUrl": target.getConfiguration().setKeyStoreUrl(property(camelContext, java.lang.String.class, value)); return true; + case "keyStoreUrl": target.getConfiguration().setKeyStoreUrl(property(camelContext, String.class, value)); return true; case "lazystartproducer": case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true; case "maxnodeidsperrequest": case "maxNodeIdsPerRequest": target.setMaxNodeIdsPerRequest(property(camelContext, int.class, value)); return true; case "maxpendingpublishrequests": - case "maxPendingPublishRequests": target.getConfiguration().setMaxPendingPublishRequests(property(camelContext, java.lang.Long.class, value)); return true; + case "maxPendingPublishRequests": target.getConfiguration().setMaxPendingPublishRequests(property(camelContext, Long.class, value)); return true; case "maxresponsemessagesize": - case "maxResponseMessageSize": target.getConfiguration().setMaxResponseMessageSize(property(camelContext, java.lang.Long.class, value)); return true; - case "node": target.setNode(property(camelContext, java.lang.String.class, value)); return true; + case "maxResponseMessageSize": target.getConfiguration().setMaxResponseMessageSize(property(camelContext, Long.class, value)); return true; + case "node": target.setNode(property(camelContext, String.class, value)); return true; case "nodeclasses": - case "nodeClasses": target.setNodeClasses(property(camelContext, java.lang.String.class, value)); return true; + case "nodeClasses": target.setNodeClasses(property(camelContext, String.class, value)); return true; case "overridehost": case "overrideHost": target.getConfiguration().setOverrideHost(property(camelContext, boolean.class, value)); return true; case "producturi": - case "productUri": target.getConfiguration().setProductUri(property(camelContext, java.lang.String.class, value)); return true; + case "productUri": target.getConfiguration().setProductUri(property(camelContext, String.class, value)); return true; case "recursive": target.setRecursive(property(camelContext, boolean.class, value)); return true; case "requesttimeout": - case "requestTimeout": target.getConfiguration().setRequestTimeout(property(camelContext, java.lang.Long.class, value)); return true; + case "requestTimeout": target.getConfiguration().setRequestTimeout(property(camelContext, Long.class, value)); return true; case "requestedpublishinginterval": - case "requestedPublishingInterval": target.getConfiguration().setRequestedPublishingInterval(property(camelContext, java.lang.Double.class, value)); return true; + case "requestedPublishingInterval": target.getConfiguration().setRequestedPublishingInterval(property(camelContext, Double.class, value)); return true; case "sessionname": - case "sessionName": target.getConfiguration().setSessionName(property(camelContext, java.lang.String.class, value)); return true; + case "sessionName": target.getConfiguration().setSessionName(property(camelContext, String.class, value)); return true; case "sessiontimeout": - case "sessionTimeout": target.getConfiguration().setSessionTimeout(property(camelContext, java.lang.Long.class, value)); return true; + case "sessionTimeout": target.getConfiguration().setSessionTimeout(property(camelContext, Long.class, value)); return true; default: return false; } } @@ -82,58 +82,58 @@ public class MiloBrowseEndpointConfigurer extends PropertyConfigurerSupport impl public Class<?> getOptionType(String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { case "allowedsecuritypolicies": - case "allowedSecurityPolicies": return java.lang.String.class; + case "allowedSecurityPolicies": return String.class; case "applicationname": - case "applicationName": return java.lang.String.class; + case "applicationName": return String.class; case "applicationuri": - case "applicationUri": return java.lang.String.class; + case "applicationUri": return String.class; case "channellifetime": - case "channelLifetime": return java.lang.Long.class; + case "channelLifetime": return Long.class; case "clientid": - case "clientId": return java.lang.String.class; + case "clientId": return String.class; case "depth": return int.class; case "direction": return org.eclipse.milo.opcua.stack.core.types.enumerated.BrowseDirection.class; case "discoveryendpointsuffix": - case "discoveryEndpointSuffix": return java.lang.String.class; + case "discoveryEndpointSuffix": return String.class; case "discoveryendpointuri": - case "discoveryEndpointUri": return java.lang.String.class; - case "filter": return java.lang.String.class; + case "discoveryEndpointUri": return String.class; + case "filter": return String.class; case "includesubtypes": case "includeSubTypes": return boolean.class; case "keyalias": - case "keyAlias": return java.lang.String.class; + case "keyAlias": return String.class; case "keypassword": - case "keyPassword": return java.lang.String.class; + case "keyPassword": return String.class; case "keystorepassword": - case "keyStorePassword": return java.lang.String.class; + case "keyStorePassword": return String.class; case "keystoretype": - case "keyStoreType": return java.lang.String.class; + case "keyStoreType": return String.class; case "keystoreurl": - case "keyStoreUrl": return java.lang.String.class; + case "keyStoreUrl": return String.class; case "lazystartproducer": case "lazyStartProducer": return boolean.class; case "maxnodeidsperrequest": case "maxNodeIdsPerRequest": return int.class; case "maxpendingpublishrequests": - case "maxPendingPublishRequests": return java.lang.Long.class; + case "maxPendingPublishRequests": return Long.class; case "maxresponsemessagesize": - case "maxResponseMessageSize": return java.lang.Long.class; - case "node": return java.lang.String.class; + case "maxResponseMessageSize": return Long.class; + case "node": return String.class; case "nodeclasses": - case "nodeClasses": return java.lang.String.class; + case "nodeClasses": return String.class; case "overridehost": case "overrideHost": return boolean.class; case "producturi": - case "productUri": return java.lang.String.class; + case "productUri": return String.class; case "recursive": return boolean.class; case "requesttimeout": - case "requestTimeout": return java.lang.Long.class; + case "requestTimeout": return Long.class; case "requestedpublishinginterval": - case "requestedPublishingInterval": return java.lang.Double.class; + case "requestedPublishingInterval": return Double.class; case "sessionname": - case "sessionName": return java.lang.String.class; + case "sessionName": return String.class; case "sessiontimeout": - case "sessionTimeout": return java.lang.Long.class; + case "sessionTimeout": return Long.class; default: return null; } } diff --git a/components/camel-milo/src/generated/java/org/apache/camel/component/milo/client/MiloClientComponentConfigurer.java b/components/camel-milo/src/generated/java/org/apache/camel/component/milo/client/MiloClientComponentConfigurer.java index 1f6b384409e9..8c635f17e2cc 100644 --- a/components/camel-milo/src/generated/java/org/apache/camel/component/milo/client/MiloClientComponentConfigurer.java +++ b/components/camel-milo/src/generated/java/org/apache/camel/component/milo/client/MiloClientComponentConfigurer.java @@ -17,9 +17,9 @@ import org.apache.camel.support.component.PropertyConfigurerSupport; @SuppressWarnings("unchecked") public class MiloClientComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { - private org.apache.camel.component.milo.client.MiloClientConfiguration getOrCreateConfiguration(MiloClientComponent target) { + private MiloClientConfiguration getOrCreateConfiguration(MiloClientComponent target) { if (target.getConfiguration() == null) { - target.setConfiguration(new org.apache.camel.component.milo.client.MiloClientConfiguration()); + target.setConfiguration(new MiloClientConfiguration()); } return target.getConfiguration(); } @@ -29,54 +29,54 @@ public class MiloClientComponentConfigurer extends PropertyConfigurerSupport imp MiloClientComponent target = (MiloClientComponent) obj; switch (ignoreCase ? name.toLowerCase() : name) { case "allowedsecuritypolicies": - case "allowedSecurityPolicies": getOrCreateConfiguration(target).setAllowedSecurityPolicies(property(camelContext, java.lang.String.class, value)); return true; + case "allowedSecurityPolicies": getOrCreateConfiguration(target).setAllowedSecurityPolicies(property(camelContext, String.class, value)); return true; case "applicationname": - case "applicationName": getOrCreateConfiguration(target).setApplicationName(property(camelContext, java.lang.String.class, value)); return true; + case "applicationName": getOrCreateConfiguration(target).setApplicationName(property(camelContext, String.class, value)); return true; case "applicationuri": - case "applicationUri": getOrCreateConfiguration(target).setApplicationUri(property(camelContext, java.lang.String.class, value)); return true; + case "applicationUri": getOrCreateConfiguration(target).setApplicationUri(property(camelContext, String.class, value)); return true; case "autowiredenabled": case "autowiredEnabled": target.setAutowiredEnabled(property(camelContext, boolean.class, value)); return true; case "bridgeerrorhandler": case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true; case "channellifetime": - case "channelLifetime": getOrCreateConfiguration(target).setChannelLifetime(property(camelContext, java.lang.Long.class, value)); return true; + case "channelLifetime": getOrCreateConfiguration(target).setChannelLifetime(property(camelContext, Long.class, value)); return true; case "clientid": - case "clientId": getOrCreateConfiguration(target).setClientId(property(camelContext, java.lang.String.class, value)); return true; - case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.milo.client.MiloClientConfiguration.class, value)); return true; + case "clientId": getOrCreateConfiguration(target).setClientId(property(camelContext, String.class, value)); return true; + case "configuration": target.setConfiguration(property(camelContext, MiloClientConfiguration.class, value)); return true; case "discoveryendpointsuffix": - case "discoveryEndpointSuffix": getOrCreateConfiguration(target).setDiscoveryEndpointSuffix(property(camelContext, java.lang.String.class, value)); return true; + case "discoveryEndpointSuffix": getOrCreateConfiguration(target).setDiscoveryEndpointSuffix(property(camelContext, String.class, value)); return true; case "discoveryendpointuri": - case "discoveryEndpointUri": getOrCreateConfiguration(target).setDiscoveryEndpointUri(property(camelContext, java.lang.String.class, value)); return true; + case "discoveryEndpointUri": getOrCreateConfiguration(target).setDiscoveryEndpointUri(property(camelContext, String.class, value)); return true; case "keyalias": - case "keyAlias": getOrCreateConfiguration(target).setKeyAlias(property(camelContext, java.lang.String.class, value)); return true; + case "keyAlias": getOrCreateConfiguration(target).setKeyAlias(property(camelContext, String.class, value)); return true; case "keypassword": - case "keyPassword": getOrCreateConfiguration(target).setKeyPassword(property(camelContext, java.lang.String.class, value)); return true; + case "keyPassword": getOrCreateConfiguration(target).setKeyPassword(property(camelContext, String.class, value)); return true; case "keystorepassword": - case "keyStorePassword": getOrCreateConfiguration(target).setKeyStorePassword(property(camelContext, java.lang.String.class, value)); return true; + case "keyStorePassword": getOrCreateConfiguration(target).setKeyStorePassword(property(camelContext, String.class, value)); return true; case "keystoretype": - case "keyStoreType": getOrCreateConfiguration(target).setKeyStoreType(property(camelContext, java.lang.String.class, value)); return true; + case "keyStoreType": getOrCreateConfiguration(target).setKeyStoreType(property(camelContext, String.class, value)); return true; case "keystoreurl": - case "keyStoreUrl": getOrCreateConfiguration(target).setKeyStoreUrl(property(camelContext, java.lang.String.class, value)); return true; + case "keyStoreUrl": getOrCreateConfiguration(target).setKeyStoreUrl(property(camelContext, String.class, value)); return true; case "lazystartproducer": case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true; case "maxpendingpublishrequests": - case "maxPendingPublishRequests": getOrCreateConfiguration(target).setMaxPendingPublishRequests(property(camelContext, java.lang.Long.class, value)); return true; + case "maxPendingPublishRequests": getOrCreateConfiguration(target).setMaxPendingPublishRequests(property(camelContext, Long.class, value)); return true; case "maxresponsemessagesize": - case "maxResponseMessageSize": getOrCreateConfiguration(target).setMaxResponseMessageSize(property(camelContext, java.lang.Long.class, value)); return true; + case "maxResponseMessageSize": getOrCreateConfiguration(target).setMaxResponseMessageSize(property(camelContext, Long.class, value)); return true; case "miloclientconnectionmanager": - case "miloClientConnectionManager": target.setMiloClientConnectionManager(property(camelContext, org.apache.camel.component.milo.client.MiloClientConnectionManager.class, value)); return true; + case "miloClientConnectionManager": target.setMiloClientConnectionManager(property(camelContext, MiloClientConnectionManager.class, value)); return true; case "overridehost": case "overrideHost": getOrCreateConfiguration(target).setOverrideHost(property(camelContext, boolean.class, value)); return true; case "producturi": - case "productUri": getOrCreateConfiguration(target).setProductUri(property(camelContext, java.lang.String.class, value)); return true; + case "productUri": getOrCreateConfiguration(target).setProductUri(property(camelContext, String.class, value)); return true; case "requesttimeout": - case "requestTimeout": getOrCreateConfiguration(target).setRequestTimeout(property(camelContext, java.lang.Long.class, value)); return true; + case "requestTimeout": getOrCreateConfiguration(target).setRequestTimeout(property(camelContext, Long.class, value)); return true; case "requestedpublishinginterval": - case "requestedPublishingInterval": getOrCreateConfiguration(target).setRequestedPublishingInterval(property(camelContext, java.lang.Double.class, value)); return true; + case "requestedPublishingInterval": getOrCreateConfiguration(target).setRequestedPublishingInterval(property(camelContext, Double.class, value)); return true; case "sessionname": - case "sessionName": getOrCreateConfiguration(target).setSessionName(property(camelContext, java.lang.String.class, value)); return true; + case "sessionName": getOrCreateConfiguration(target).setSessionName(property(camelContext, String.class, value)); return true; case "sessiontimeout": - case "sessionTimeout": getOrCreateConfiguration(target).setSessionTimeout(property(camelContext, java.lang.Long.class, value)); return true; + case "sessionTimeout": getOrCreateConfiguration(target).setSessionTimeout(property(camelContext, Long.class, value)); return true; default: return false; } } @@ -90,54 +90,54 @@ public class MiloClientComponentConfigurer extends PropertyConfigurerSupport imp public Class<?> getOptionType(String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { case "allowedsecuritypolicies": - case "allowedSecurityPolicies": return java.lang.String.class; + case "allowedSecurityPolicies": return String.class; case "applicationname": - case "applicationName": return java.lang.String.class; + case "applicationName": return String.class; case "applicationuri": - case "applicationUri": return java.lang.String.class; + case "applicationUri": return String.class; case "autowiredenabled": case "autowiredEnabled": return boolean.class; case "bridgeerrorhandler": case "bridgeErrorHandler": return boolean.class; case "channellifetime": - case "channelLifetime": return java.lang.Long.class; + case "channelLifetime": return Long.class; case "clientid": - case "clientId": return java.lang.String.class; - case "configuration": return org.apache.camel.component.milo.client.MiloClientConfiguration.class; + case "clientId": return String.class; + case "configuration": return MiloClientConfiguration.class; case "discoveryendpointsuffix": - case "discoveryEndpointSuffix": return java.lang.String.class; + case "discoveryEndpointSuffix": return String.class; case "discoveryendpointuri": - case "discoveryEndpointUri": return java.lang.String.class; + case "discoveryEndpointUri": return String.class; case "keyalias": - case "keyAlias": return java.lang.String.class; + case "keyAlias": return String.class; case "keypassword": - case "keyPassword": return java.lang.String.class; + case "keyPassword": return String.class; case "keystorepassword": - case "keyStorePassword": return java.lang.String.class; + case "keyStorePassword": return String.class; case "keystoretype": - case "keyStoreType": return java.lang.String.class; + case "keyStoreType": return String.class; case "keystoreurl": - case "keyStoreUrl": return java.lang.String.class; + case "keyStoreUrl": return String.class; case "lazystartproducer": case "lazyStartProducer": return boolean.class; case "maxpendingpublishrequests": - case "maxPendingPublishRequests": return java.lang.Long.class; + case "maxPendingPublishRequests": return Long.class; case "maxresponsemessagesize": - case "maxResponseMessageSize": return java.lang.Long.class; + case "maxResponseMessageSize": return Long.class; case "miloclientconnectionmanager": - case "miloClientConnectionManager": return org.apache.camel.component.milo.client.MiloClientConnectionManager.class; + case "miloClientConnectionManager": return MiloClientConnectionManager.class; case "overridehost": case "overrideHost": return boolean.class; case "producturi": - case "productUri": return java.lang.String.class; + case "productUri": return String.class; case "requesttimeout": - case "requestTimeout": return java.lang.Long.class; + case "requestTimeout": return Long.class; case "requestedpublishinginterval": - case "requestedPublishingInterval": return java.lang.Double.class; + case "requestedPublishingInterval": return Double.class; case "sessionname": - case "sessionName": return java.lang.String.class; + case "sessionName": return String.class; case "sessiontimeout": - case "sessionTimeout": return java.lang.Long.class; + case "sessionTimeout": return Long.class; default: return null; } } diff --git a/components/camel-milo/src/generated/java/org/apache/camel/component/milo/client/MiloClientEndpointConfigurer.java b/components/camel-milo/src/generated/java/org/apache/camel/component/milo/client/MiloClientEndpointConfigurer.java index 3c2798f3b289..f4e3ee921521 100644 --- a/components/camel-milo/src/generated/java/org/apache/camel/component/milo/client/MiloClientEndpointConfigurer.java +++ b/components/camel-milo/src/generated/java/org/apache/camel/component/milo/client/MiloClientEndpointConfigurer.java @@ -22,69 +22,69 @@ public class MiloClientEndpointConfigurer extends PropertyConfigurerSupport impl MiloClientEndpoint target = (MiloClientEndpoint) obj; switch (ignoreCase ? name.toLowerCase() : name) { case "allowedsecuritypolicies": - case "allowedSecurityPolicies": target.getConfiguration().setAllowedSecurityPolicies(property(camelContext, java.lang.String.class, value)); return true; + case "allowedSecurityPolicies": target.getConfiguration().setAllowedSecurityPolicies(property(camelContext, String.class, value)); return true; case "applicationname": - case "applicationName": target.getConfiguration().setApplicationName(property(camelContext, java.lang.String.class, value)); return true; + case "applicationName": target.getConfiguration().setApplicationName(property(camelContext, String.class, value)); return true; case "applicationuri": - case "applicationUri": target.getConfiguration().setApplicationUri(property(camelContext, java.lang.String.class, value)); return true; + case "applicationUri": target.getConfiguration().setApplicationUri(property(camelContext, String.class, value)); return true; case "bridgeerrorhandler": case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true; case "channellifetime": - case "channelLifetime": target.getConfiguration().setChannelLifetime(property(camelContext, java.lang.Long.class, value)); return true; + case "channelLifetime": target.getConfiguration().setChannelLifetime(property(camelContext, Long.class, value)); return true; case "clientid": - case "clientId": target.getConfiguration().setClientId(property(camelContext, java.lang.String.class, value)); return true; + case "clientId": target.getConfiguration().setClientId(property(camelContext, String.class, value)); return true; case "datachangefilterdeadbandtype": case "dataChangeFilterDeadbandType": target.getMonitorFilterConfiguration().setDataChangeFilterDeadbandType(property(camelContext, org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UInteger.class, value)); return true; case "datachangefilterdeadbandvalue": - case "dataChangeFilterDeadbandValue": target.getMonitorFilterConfiguration().setDataChangeFilterDeadbandValue(property(camelContext, java.lang.Double.class, value)); return true; + case "dataChangeFilterDeadbandValue": target.getMonitorFilterConfiguration().setDataChangeFilterDeadbandValue(property(camelContext, Double.class, value)); return true; case "datachangefiltertrigger": case "dataChangeFilterTrigger": target.getMonitorFilterConfiguration().setDataChangeFilterTrigger(property(camelContext, org.eclipse.milo.opcua.stack.core.types.enumerated.DataChangeTrigger.class, value)); return true; case "defaultawaitwrites": case "defaultAwaitWrites": target.setDefaultAwaitWrites(property(camelContext, boolean.class, value)); return true; case "discoveryendpointsuffix": - case "discoveryEndpointSuffix": target.getConfiguration().setDiscoveryEndpointSuffix(property(camelContext, java.lang.String.class, value)); return true; + case "discoveryEndpointSuffix": target.getConfiguration().setDiscoveryEndpointSuffix(property(camelContext, String.class, value)); return true; case "discoveryendpointuri": - case "discoveryEndpointUri": target.getConfiguration().setDiscoveryEndpointUri(property(camelContext, java.lang.String.class, value)); return true; + case "discoveryEndpointUri": target.getConfiguration().setDiscoveryEndpointUri(property(camelContext, String.class, value)); return true; case "exceptionhandler": case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true; case "exchangepattern": case "exchangePattern": target.setExchangePattern(property(camelContext, org.apache.camel.ExchangePattern.class, value)); return true; case "keyalias": - case "keyAlias": target.getConfiguration().setKeyAlias(property(camelContext, java.lang.String.class, value)); return true; + case "keyAlias": target.getConfiguration().setKeyAlias(property(camelContext, String.class, value)); return true; case "keypassword": - case "keyPassword": target.getConfiguration().setKeyPassword(property(camelContext, java.lang.String.class, value)); return true; + case "keyPassword": target.getConfiguration().setKeyPassword(property(camelContext, String.class, value)); return true; case "keystorepassword": - case "keyStorePassword": target.getConfiguration().setKeyStorePassword(property(camelContext, java.lang.String.class, value)); return true; + case "keyStorePassword": target.getConfiguration().setKeyStorePassword(property(camelContext, String.class, value)); return true; case "keystoretype": - case "keyStoreType": target.getConfiguration().setKeyStoreType(property(camelContext, java.lang.String.class, value)); return true; + case "keyStoreType": target.getConfiguration().setKeyStoreType(property(camelContext, String.class, value)); return true; case "keystoreurl": - case "keyStoreUrl": target.getConfiguration().setKeyStoreUrl(property(camelContext, java.lang.String.class, value)); return true; + case "keyStoreUrl": target.getConfiguration().setKeyStoreUrl(property(camelContext, String.class, value)); return true; case "lazystartproducer": case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true; case "maxpendingpublishrequests": - case "maxPendingPublishRequests": target.getConfiguration().setMaxPendingPublishRequests(property(camelContext, java.lang.Long.class, value)); return true; + case "maxPendingPublishRequests": target.getConfiguration().setMaxPendingPublishRequests(property(camelContext, Long.class, value)); return true; case "maxresponsemessagesize": - case "maxResponseMessageSize": target.getConfiguration().setMaxResponseMessageSize(property(camelContext, java.lang.Long.class, value)); return true; - case "method": target.setMethod(property(camelContext, java.lang.String.class, value)); return true; + case "maxResponseMessageSize": target.getConfiguration().setMaxResponseMessageSize(property(camelContext, Long.class, value)); return true; + case "method": target.setMethod(property(camelContext, String.class, value)); return true; case "monitorfiltertype": - case "monitorFilterType": target.getMonitorFilterConfiguration().setMonitorFilterType(property(camelContext, org.apache.camel.component.milo.client.MonitorFilterType.class, value)); return true; - case "node": target.setNode(property(camelContext, java.lang.String.class, value)); return true; + case "monitorFilterType": target.getMonitorFilterConfiguration().setMonitorFilterType(property(camelContext, MonitorFilterType.class, value)); return true; + case "node": target.setNode(property(camelContext, String.class, value)); return true; case "omitnullvalues": case "omitNullValues": target.setOmitNullValues(property(camelContext, boolean.class, value)); return true; case "overridehost": case "overrideHost": target.getConfiguration().setOverrideHost(property(camelContext, boolean.class, value)); return true; case "producturi": - case "productUri": target.getConfiguration().setProductUri(property(camelContext, java.lang.String.class, value)); return true; + case "productUri": target.getConfiguration().setProductUri(property(camelContext, String.class, value)); return true; case "requesttimeout": - case "requestTimeout": target.getConfiguration().setRequestTimeout(property(camelContext, java.lang.Long.class, value)); return true; + case "requestTimeout": target.getConfiguration().setRequestTimeout(property(camelContext, Long.class, value)); return true; case "requestedpublishinginterval": - case "requestedPublishingInterval": target.getConfiguration().setRequestedPublishingInterval(property(camelContext, java.lang.Double.class, value)); return true; + case "requestedPublishingInterval": target.getConfiguration().setRequestedPublishingInterval(property(camelContext, Double.class, value)); return true; case "samplinginterval": - case "samplingInterval": target.setSamplingInterval(property(camelContext, java.lang.Double.class, value)); return true; + case "samplingInterval": target.setSamplingInterval(property(camelContext, Double.class, value)); return true; case "sessionname": - case "sessionName": target.getConfiguration().setSessionName(property(camelContext, java.lang.String.class, value)); return true; + case "sessionName": target.getConfiguration().setSessionName(property(camelContext, String.class, value)); return true; case "sessiontimeout": - case "sessionTimeout": target.getConfiguration().setSessionTimeout(property(camelContext, java.lang.Long.class, value)); return true; + case "sessionTimeout": target.getConfiguration().setSessionTimeout(property(camelContext, Long.class, value)); return true; default: return false; } } @@ -93,69 +93,69 @@ public class MiloClientEndpointConfigurer extends PropertyConfigurerSupport impl public Class<?> getOptionType(String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { case "allowedsecuritypolicies": - case "allowedSecurityPolicies": return java.lang.String.class; + case "allowedSecurityPolicies": return String.class; case "applicationname": - case "applicationName": return java.lang.String.class; + case "applicationName": return String.class; case "applicationuri": - case "applicationUri": return java.lang.String.class; + case "applicationUri": return String.class; case "bridgeerrorhandler": case "bridgeErrorHandler": return boolean.class; case "channellifetime": - case "channelLifetime": return java.lang.Long.class; + case "channelLifetime": return Long.class; case "clientid": - case "clientId": return java.lang.String.class; + case "clientId": return String.class; case "datachangefilterdeadbandtype": case "dataChangeFilterDeadbandType": return org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UInteger.class; case "datachangefilterdeadbandvalue": - case "dataChangeFilterDeadbandValue": return java.lang.Double.class; + case "dataChangeFilterDeadbandValue": return Double.class; case "datachangefiltertrigger": case "dataChangeFilterTrigger": return org.eclipse.milo.opcua.stack.core.types.enumerated.DataChangeTrigger.class; case "defaultawaitwrites": case "defaultAwaitWrites": return boolean.class; case "discoveryendpointsuffix": - case "discoveryEndpointSuffix": return java.lang.String.class; + case "discoveryEndpointSuffix": return String.class; case "discoveryendpointuri": - case "discoveryEndpointUri": return java.lang.String.class; + case "discoveryEndpointUri": return String.class; case "exceptionhandler": case "exceptionHandler": return org.apache.camel.spi.ExceptionHandler.class; case "exchangepattern": case "exchangePattern": return org.apache.camel.ExchangePattern.class; case "keyalias": - case "keyAlias": return java.lang.String.class; + case "keyAlias": return String.class; case "keypassword": - case "keyPassword": return java.lang.String.class; + case "keyPassword": return String.class; case "keystorepassword": - case "keyStorePassword": return java.lang.String.class; + case "keyStorePassword": return String.class; case "keystoretype": - case "keyStoreType": return java.lang.String.class; + case "keyStoreType": return String.class; case "keystoreurl": - case "keyStoreUrl": return java.lang.String.class; + case "keyStoreUrl": return String.class; case "lazystartproducer": case "lazyStartProducer": return boolean.class; case "maxpendingpublishrequests": - case "maxPendingPublishRequests": return java.lang.Long.class; + case "maxPendingPublishRequests": return Long.class; case "maxresponsemessagesize": - case "maxResponseMessageSize": return java.lang.Long.class; - case "method": return java.lang.String.class; + case "maxResponseMessageSize": return Long.class; + case "method": return String.class; case "monitorfiltertype": - case "monitorFilterType": return org.apache.camel.component.milo.client.MonitorFilterType.class; - case "node": return java.lang.String.class; + case "monitorFilterType": return MonitorFilterType.class; + case "node": return String.class; case "omitnullvalues": case "omitNullValues": return boolean.class; case "overridehost": case "overrideHost": return boolean.class; case "producturi": - case "productUri": return java.lang.String.class; + case "productUri": return String.class; case "requesttimeout": - case "requestTimeout": return java.lang.Long.class; + case "requestTimeout": return Long.class; case "requestedpublishinginterval": - case "requestedPublishingInterval": return java.lang.Double.class; + case "requestedPublishingInterval": return Double.class; case "samplinginterval": - case "samplingInterval": return java.lang.Double.class; + case "samplingInterval": return Double.class; case "sessionname": - case "sessionName": return java.lang.String.class; + case "sessionName": return String.class; case "sessiontimeout": - case "sessionTimeout": return java.lang.Long.class; + case "sessionTimeout": return Long.class; default: return null; } } diff --git a/components/camel-milo/src/generated/java/org/apache/camel/component/milo/converter/ValueConverterLoader.java b/components/camel-milo/src/generated/java/org/apache/camel/component/milo/converter/ValueConverterLoader.java index 2baa109f2ed2..7a81c0462136 100644 --- a/components/camel-milo/src/generated/java/org/apache/camel/component/milo/converter/ValueConverterLoader.java +++ b/components/camel-milo/src/generated/java/org/apache/camel/component/milo/converter/ValueConverterLoader.java @@ -42,9 +42,9 @@ public final class ValueConverterLoader implements TypeConverterLoader, CamelCon private void registerConverters(TypeConverterRegistry registry) { addTypeConverter(registry, org.eclipse.milo.opcua.stack.core.types.builtin.DataValue.class, org.eclipse.milo.opcua.stack.core.types.builtin.Variant.class, false, - (type, exchange, value) -> org.apache.camel.component.milo.converter.ValueConverter.toDataValue((org.eclipse.milo.opcua.stack.core.types.builtin.Variant) value)); + (type, exchange, value) -> ValueConverter.toDataValue((org.eclipse.milo.opcua.stack.core.types.builtin.Variant) value)); addTypeConverter(registry, org.eclipse.milo.opcua.stack.core.types.builtin.Variant.class, org.eclipse.milo.opcua.stack.core.types.builtin.DataValue.class, false, - (type, exchange, value) -> org.apache.camel.component.milo.converter.ValueConverter.toVariant((org.eclipse.milo.opcua.stack.core.types.builtin.DataValue) value)); + (type, exchange, value) -> ValueConverter.toVariant((org.eclipse.milo.opcua.stack.core.types.builtin.DataValue) value)); } private static void addTypeConverter(TypeConverterRegistry registry, Class<?> toType, Class<?> fromType, boolean allowNull, SimpleTypeConverter.ConversionMethod method) { diff --git a/components/camel-milo/src/generated/java/org/apache/camel/component/milo/server/MiloServerComponentConfigurer.java b/components/camel-milo/src/generated/java/org/apache/camel/component/milo/server/MiloServerComponentConfigurer.java index 5b4f44f60179..1c7e422e6e0b 100644 --- a/components/camel-milo/src/generated/java/org/apache/camel/component/milo/server/MiloServerComponentConfigurer.java +++ b/components/camel-milo/src/generated/java/org/apache/camel/component/milo/server/MiloServerComponentConfigurer.java @@ -22,13 +22,13 @@ public class MiloServerComponentConfigurer extends PropertyConfigurerSupport imp MiloServerComponent target = (MiloServerComponent) obj; switch (ignoreCase ? name.toLowerCase() : name) { case "applicationname": - case "applicationName": target.setApplicationName(property(camelContext, java.lang.String.class, value)); return true; + case "applicationName": target.setApplicationName(property(camelContext, String.class, value)); return true; case "applicationuri": - case "applicationUri": target.setApplicationUri(property(camelContext, java.lang.String.class, value)); return true; + case "applicationUri": target.setApplicationUri(property(camelContext, String.class, value)); return true; case "autowiredenabled": case "autowiredEnabled": target.setAutowiredEnabled(property(camelContext, boolean.class, value)); return true; case "bindaddresses": - case "bindAddresses": target.setBindAddresses(property(camelContext, java.lang.String.class, value)); return true; + case "bindAddresses": target.setBindAddresses(property(camelContext, String.class, value)); return true; case "bridgeerrorhandler": case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true; case "buildinfo": @@ -39,23 +39,23 @@ public class MiloServerComponentConfigurer extends PropertyConfigurerSupport imp case "certificatevalidator": case "certificateValidator": target.setCertificateValidator(property(camelContext, org.eclipse.milo.opcua.stack.server.security.ServerCertificateValidator.class, value)); return true; case "defaultcertificatevalidator": - case "defaultCertificateValidator": target.setDefaultCertificateValidator(property(camelContext, java.lang.String.class, value)); return true; + case "defaultCertificateValidator": target.setDefaultCertificateValidator(property(camelContext, String.class, value)); return true; case "enableanonymousauthentication": case "enableAnonymousAuthentication": target.setEnableAnonymousAuthentication(property(camelContext, boolean.class, value)); return true; case "lazystartproducer": case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true; case "namespaceuri": - case "namespaceUri": target.setNamespaceUri(property(camelContext, java.lang.String.class, value)); return true; - case "path": target.setPath(property(camelContext, java.lang.String.class, value)); return true; + case "namespaceUri": target.setNamespaceUri(property(camelContext, String.class, value)); return true; + case "path": target.setPath(property(camelContext, String.class, value)); return true; case "port": target.setPort(property(camelContext, int.class, value)); return true; case "producturi": - case "productUri": target.setProductUri(property(camelContext, java.lang.String.class, value)); return true; + case "productUri": target.setProductUri(property(camelContext, String.class, value)); return true; case "securitypolicies": case "securityPolicies": target.setSecurityPolicies(property(camelContext, java.util.Set.class, value)); return true; case "securitypoliciesbyid": - case "securityPoliciesById": target.setSecurityPoliciesById(property(camelContext, java.lang.String.class, value)); return true; + case "securityPoliciesById": target.setSecurityPoliciesById(property(camelContext, String.class, value)); return true; case "userauthenticationcredentials": - case "userAuthenticationCredentials": target.setUserAuthenticationCredentials(property(camelContext, java.lang.String.class, value)); return true; + case "userAuthenticationCredentials": target.setUserAuthenticationCredentials(property(camelContext, String.class, value)); return true; case "usernamesecuritypolicyuri": case "usernameSecurityPolicyUri": target.setUsernameSecurityPolicyUri(property(camelContext, org.eclipse.milo.opcua.stack.core.security.SecurityPolicy.class, value)); return true; default: return false; @@ -66,13 +66,13 @@ public class MiloServerComponentConfigurer extends PropertyConfigurerSupport imp public Class<?> getOptionType(String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { case "applicationname": - case "applicationName": return java.lang.String.class; + case "applicationName": return String.class; case "applicationuri": - case "applicationUri": return java.lang.String.class; + case "applicationUri": return String.class; case "autowiredenabled": case "autowiredEnabled": return boolean.class; case "bindaddresses": - case "bindAddresses": return java.lang.String.class; + case "bindAddresses": return String.class; case "bridgeerrorhandler": case "bridgeErrorHandler": return boolean.class; case "buildinfo": @@ -83,23 +83,23 @@ public class MiloServerComponentConfigurer extends PropertyConfigurerSupport imp case "certificatevalidator": case "certificateValidator": return org.eclipse.milo.opcua.stack.server.security.ServerCertificateValidator.class; case "defaultcertificatevalidator": - case "defaultCertificateValidator": return java.lang.String.class; + case "defaultCertificateValidator": return String.class; case "enableanonymousauthentication": case "enableAnonymousAuthentication": return boolean.class; case "lazystartproducer": case "lazyStartProducer": return boolean.class; case "namespaceuri": - case "namespaceUri": return java.lang.String.class; - case "path": return java.lang.String.class; + case "namespaceUri": return String.class; + case "path": return String.class; case "port": return int.class; case "producturi": - case "productUri": return java.lang.String.class; + case "productUri": return String.class; case "securitypolicies": case "securityPolicies": return java.util.Set.class; case "securitypoliciesbyid": - case "securityPoliciesById": return java.lang.String.class; + case "securityPoliciesById": return String.class; case "userauthenticationcredentials": - case "userAuthenticationCredentials": return java.lang.String.class; + case "userAuthenticationCredentials": return String.class; case "usernamesecuritypolicyuri": case "usernameSecurityPolicyUri": return org.eclipse.milo.opcua.stack.core.security.SecurityPolicy.class; default: return null; diff --git a/components/camel-milo/src/generated/resources/META-INF/services/org/apache/camel/component.properties b/components/camel-milo/src/generated/resources/META-INF/services/org/apache/camel/component.properties index aadfe339beeb..dacf84b93547 100644 --- a/components/camel-milo/src/generated/resources/META-INF/services/org/apache/camel/component.properties +++ b/components/camel-milo/src/generated/resources/META-INF/services/org/apache/camel/component.properties @@ -2,6 +2,6 @@ components=milo-browse milo-client milo-server groupId=org.apache.camel artifactId=camel-milo -version=4.0.0-SNAPSHOT +version=3.22.4-SNAPSHOT projectName=Camel :: Milo projectDescription=Camel OPC UA support diff --git a/components/camel-milo/src/generated/resources/org/apache/camel/component/milo/browse/milo-browse.json b/components/camel-milo/src/generated/resources/org/apache/camel/component/milo/browse/milo-browse.json index 6a3d643ee389..a59b6db8bec5 100644 --- a/components/camel-milo/src/generated/resources/org/apache/camel/component/milo/browse/milo-browse.json +++ b/components/camel-milo/src/generated/resources/org/apache/camel/component/milo/browse/milo-browse.json @@ -11,7 +11,7 @@ "supportLevel": "Stable", "groupId": "org.apache.camel", "artifactId": "camel-milo", - "version": "4.0.0-SNAPSHOT", + "version": "3.22.4-SNAPSHOT", "scheme": "milo-browse", "extendsScheme": "", "syntax": "milo-browse:endpointUri", diff --git a/components/camel-milo/src/generated/resources/org/apache/camel/component/milo/client/milo-client.json b/components/camel-milo/src/generated/resources/org/apache/camel/component/milo/client/milo-client.json index bc226e5d244d..c6273f60ffb5 100644 --- a/components/camel-milo/src/generated/resources/org/apache/camel/component/milo/client/milo-client.json +++ b/components/camel-milo/src/generated/resources/org/apache/camel/component/milo/client/milo-client.json @@ -11,7 +11,7 @@ "supportLevel": "Stable", "groupId": "org.apache.camel", "artifactId": "camel-milo", - "version": "4.0.0-SNAPSHOT", + "version": "3.22.4-SNAPSHOT", "scheme": "milo-client", "extendsScheme": "", "syntax": "milo-client:endpointUri", @@ -57,7 +57,7 @@ "clientId": { "kind": "parameter", "displayName": "Client Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.milo.client.MiloClientConfiguration", "configurationField": "configuration", "description": "A virtual client id to force the creation of a new connection instance" }, "dataChangeFilterDeadbandType": { "kind": "parameter", "displayName": "Data Change Filter Deadband Type", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UInteger", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "0", "configurationClass": "org.apache.camel.component.milo.client.MonitorFilterConfiguration", "configurationField": "monitorFilterConfiguration", "descripti [...] "dataChangeFilterDeadbandValue": { "kind": "parameter", "displayName": "Data Change Filter Deadband Value", "group": "common", "label": "", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "0.0", "configurationClass": "org.apache.camel.component.milo.client.MonitorFilterConfiguration", "configurationField": "monitorFilterConfiguration", "description": "Deadband value for MonitorFilterType Da [...] - "dataChangeFilterTrigger": { "kind": "parameter", "displayName": "Data Change Filter Trigger", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.eclipse.milo.opcua.stack.core.types.enumerated.DataChangeTrigger", "enum": [ "Status", "StatusValue", "StatusValueTimestamp" ], "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.milo.client.MonitorFilterConfiguration", "configurationField": "monitor [...] + "dataChangeFilterTrigger": { "kind": "parameter", "displayName": "Data Change Filter Trigger", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.eclipse.milo.opcua.stack.core.types.enumerated.DataChangeTrigger", "enum": [ "Status", "StatusValue", "StatusValueTimestamp" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "StatusValueTimestamp", "configurationClass": "org.apache.camel.component.milo.client.MonitorFilterConfig [...] "defaultAwaitWrites": { "kind": "parameter", "displayName": "Default Await Writes", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Default await setting for writes" }, "discoveryEndpointSuffix": { "kind": "parameter", "displayName": "Discovery Endpoint Suffix", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.milo.client.MiloClientConfiguration", "configurationField": "configuration", "description": "A suffix for endpoint URI when discovering" }, "discoveryEndpointUri": { "kind": "parameter", "displayName": "Discovery Endpoint Uri", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.milo.client.MiloClientConfiguration", "configurationField": "configuration", "description": "An alternative discovery URI" }, diff --git a/components/camel-milo/src/generated/resources/org/apache/camel/component/milo/server/milo-server.json b/components/camel-milo/src/generated/resources/org/apache/camel/component/milo/server/milo-server.json index 524e6499462c..e68f5611f6ca 100644 --- a/components/camel-milo/src/generated/resources/org/apache/camel/component/milo/server/milo-server.json +++ b/components/camel-milo/src/generated/resources/org/apache/camel/component/milo/server/milo-server.json @@ -11,7 +11,7 @@ "supportLevel": "Stable", "groupId": "org.apache.camel", "artifactId": "camel-milo", - "version": "4.0.0-SNAPSHOT", + "version": "3.22.4-SNAPSHOT", "scheme": "milo-server", "extendsScheme": "", "syntax": "milo-server:itemId", diff --git a/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MiloClientConfiguration.java b/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MiloClientConfiguration.java index a9d0a713e9d5..41acde36a5af 100644 --- a/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MiloClientConfiguration.java +++ b/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MiloClientConfiguration.java @@ -23,18 +23,17 @@ import java.util.Set; import java.util.function.Consumer; import jakarta.xml.bind.annotation.XmlTransient; - -import com.google.common.base.Supplier; import org.apache.camel.RuntimeCamelException; import org.apache.camel.component.milo.KeyStoreLoader; import org.apache.camel.component.milo.KeyStoreLoader.Result; import org.apache.camel.spi.UriParam; import org.apache.camel.spi.UriParams; -import org.eclipse.milo.opcua.sdk.client.api.config.OpcUaClientConfigBuilder; +import org.eclipse.milo.opcua.sdk.client.OpcUaClientConfigBuilder; import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy; import org.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText; import org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UInteger; import org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned; +import org.eclipse.milo.shaded.com.google.common.base.Supplier; @UriParams public class MiloClientConfiguration implements Cloneable { @@ -431,9 +430,10 @@ public class MiloClientConfiguration implements Cloneable { if (configuration.getRequestTimeout() != null) { builder.setRequestTimeout(Unsigned.uint(configuration.getRequestTimeout())); } - if (configuration.getChannelLifetime() != null) { - builder.setChannelLifetime(Unsigned.uint(configuration.getChannelLifetime())); - } + // FIXME - validate moving of ChannelLifetime to SubscriptionManager +// if (configuration.getChannelLifetime() != null) { +// builder.setChannelLifetime(Unsigned.uint(configuration.getChannelLifetime())); +// } whenHasText(configuration::getSessionName, value -> builder.setSessionName(() -> value)); if (configuration.getSessionTimeout() != null) { diff --git a/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MonitorFilterConfiguration.java b/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MonitorFilterConfiguration.java index 694b49328aae..66feb1d33dbe 100644 --- a/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MonitorFilterConfiguration.java +++ b/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MonitorFilterConfiguration.java @@ -37,8 +37,8 @@ public class MonitorFilterConfiguration implements Cloneable { @UriParam(defaultValue = "0.0", description = "Deadband value for MonitorFilterType DataChangeFilter.") private Double dataChangeFilterDeadbandValue = 0.0; - @UriParam(description = "Daata change trigger for data change monitor filter type.") - private DataChangeTrigger dataChangeFilterTrigger = DataChangeTrigger.StatusValue; + @UriParam(defaultValue = "StatusValueTimestamp", description = "Data change trigger for data change monitor filter type.") + private DataChangeTrigger dataChangeFilterTrigger = DataChangeTrigger.StatusValueTimestamp; public MonitorFilterType getMonitorFilterType() { return monitorFilterType; @@ -80,7 +80,8 @@ public class MonitorFilterConfiguration implements Cloneable { switch (monitorFilterType) { default: return new DataChangeFilter( - DataChangeTrigger.StatusValueTimestamp, this.getDataChangeFilterDeadbandType(), + this.getDataChangeFilterTrigger(), + this.getDataChangeFilterDeadbandType(), this.getDataChangeFilterDeadbandValue()); } } diff --git a/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/internal/SubscriptionManager.java b/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/internal/SubscriptionManager.java index 98be64231209..23f8a072a956 100644 --- a/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/internal/SubscriptionManager.java +++ b/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/internal/SubscriptionManager.java @@ -39,28 +39,25 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; -import com.google.common.base.Strings; -import com.google.common.collect.Lists; import org.apache.camel.RuntimeCamelException; import org.apache.camel.component.milo.client.MiloClientConfiguration; import org.apache.camel.component.milo.client.MonitorFilterConfiguration; +import org.eclipse.milo.opcua.sdk.client.DiscoveryClient; import org.eclipse.milo.opcua.sdk.client.OpcUaClient; -import org.eclipse.milo.opcua.sdk.client.api.config.OpcUaClientConfigBuilder; -import org.eclipse.milo.opcua.sdk.client.api.identity.AnonymousProvider; -import org.eclipse.milo.opcua.sdk.client.api.identity.CompositeProvider; -import org.eclipse.milo.opcua.sdk.client.api.identity.IdentityProvider; -import org.eclipse.milo.opcua.sdk.client.api.identity.UsernameProvider; -import org.eclipse.milo.opcua.sdk.client.api.subscriptions.UaMonitoredItem; -import org.eclipse.milo.opcua.sdk.client.api.subscriptions.UaSubscription; -import org.eclipse.milo.opcua.sdk.client.api.subscriptions.UaSubscriptionManager.SubscriptionListener; -import org.eclipse.milo.opcua.stack.client.DiscoveryClient; +import org.eclipse.milo.opcua.sdk.client.OpcUaClientConfigBuilder; +import org.eclipse.milo.opcua.sdk.client.identity.AnonymousProvider; +import org.eclipse.milo.opcua.sdk.client.identity.CompositeProvider; +import org.eclipse.milo.opcua.sdk.client.identity.IdentityProvider; +import org.eclipse.milo.opcua.sdk.client.identity.UsernameProvider; +import org.eclipse.milo.opcua.sdk.client.subscriptions.MonitoredItemServiceOperationResult; +import org.eclipse.milo.opcua.sdk.client.subscriptions.OpcUaMonitoredItem; +import org.eclipse.milo.opcua.sdk.client.subscriptions.OpcUaSubscription; import org.eclipse.milo.opcua.stack.core.AttributeId; import org.eclipse.milo.opcua.stack.core.Identifiers; import org.eclipse.milo.opcua.stack.core.StatusCodes; import org.eclipse.milo.opcua.stack.core.UaException; import org.eclipse.milo.opcua.stack.core.types.builtin.ByteString; import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue; -import org.eclipse.milo.opcua.stack.core.types.builtin.DateTime; import org.eclipse.milo.opcua.stack.core.types.builtin.ExpandedNodeId; import org.eclipse.milo.opcua.stack.core.types.builtin.ExtensionObject; import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId; @@ -84,6 +81,8 @@ import org.eclipse.milo.opcua.stack.core.types.structured.MonitoringFilter; import org.eclipse.milo.opcua.stack.core.types.structured.MonitoringParameters; import org.eclipse.milo.opcua.stack.core.types.structured.ReadValueId; import org.eclipse.milo.opcua.stack.core.types.structured.ReferenceDescription; +import org.eclipse.milo.shaded.com.google.common.base.Strings; +import org.eclipse.milo.shaded.com.google.common.collect.Lists; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -98,31 +97,21 @@ public class SubscriptionManager { private final AtomicLong clientHandleCounter = new AtomicLong(); - private final class SubscriptionListenerImpl implements SubscriptionListener { - @Override - public void onSubscriptionTransferFailed(final UaSubscription subscription, final StatusCode statusCode) { - LOG.info("Transfer failed {} : {}", subscription.getSubscriptionId(), statusCode); - - // we simply tear it down and build it up again - handleConnectionFailure(new RuntimeCamelException("Subscription failed to reconnect")); - } + private final class SubscriptionListenerImpl implements OpcUaSubscription.SubscriptionListener { @Override - public void onStatusChanged(final UaSubscription subscription, final StatusCode status) { + public void onStatusChanged(final OpcUaSubscription subscription, final StatusCode status) { LOG.info("Subscription status changed {} : {}", subscription.getSubscriptionId(), status); } @Override - public void onPublishFailure(final UaException exception) { - } + public void onTransferFailed(final OpcUaSubscription subscription, final StatusCode statusCode) { + LOG.info("Transfer failed {} : {}", subscription.getSubscriptionId(), statusCode); - @Override - public void onNotificationDataLost(final UaSubscription subscription) { + // we simply tear it down and build it up again + handleConnectionFailure(new RuntimeCamelException("Subscription failed to reconnect")); } - @Override - public void onKeepAlive(final UaSubscription subscription, final DateTime publishTime) { - } } public interface Worker<T> { @@ -162,21 +151,21 @@ public class SubscriptionManager { return null; } final MonitoringFilter monitorFilter = this.monitorFilterConfiguration.createMonitoringFilter(); - return ExtensionObject.encode(client.getStaticSerializationContext(), monitorFilter); + return ExtensionObject.encode(client.getStaticEncodingContext(), monitorFilter); } } private class Connected { private OpcUaClient client; - private final UaSubscription manager; + private final OpcUaSubscription manager; private final Map<UInteger, Subscription> badSubscriptions = new HashMap<>(); - private final Map<UInteger, UaMonitoredItem> goodSubscriptions = new HashMap<>(); + private final Map<UInteger, OpcUaMonitoredItem> goodSubscriptions = new HashMap<>(); private final Map<String, UShort> namespaceCache = new ConcurrentHashMap<>(); - Connected(final OpcUaClient client, final UaSubscription manager) { + Connected(final OpcUaClient client, final OpcUaSubscription manager) { this.client = client; this.manager = manager; } @@ -189,7 +178,8 @@ public class SubscriptionManager { // convert to requests - final List<MonitoredItemCreateRequest> items = new ArrayList<>(subscriptions.size()); +// final List<MonitoredItemCreateRequest> items = new ArrayList<>(subscriptions.size()); + final List<OpcUaMonitoredItem> items = new ArrayList<>(subscriptions.size()); for (final Map.Entry<UInteger, Subscription> entry : subscriptions.entrySet()) { final Subscription s = entry.getValue(); @@ -204,14 +194,33 @@ public class SubscriptionManager { final MonitoringParameters parameters = new MonitoringParameters( entry.getKey(), samplingInterval, s.createMonitoringFilter(client), null, true); - items.add(new MonitoredItemCreateRequest(itemId, MonitoringMode.Reporting, parameters)); +// items.add(new MonitoredItemCreateRequest(itemId, MonitoringMode.Reporting, parameters)); + items.add(new OpcUaMonitoredItem(itemId, MonitoringMode.Reporting)); } } if (!items.isEmpty()) { // create monitors + for(OpcUaMonitoredItem item : items) { + this.manager.addMonitoredItem(item); + } + List<MonitoredItemServiceOperationResult> resultList = this.manager.createMonitoredItems(); + for(MonitoredItemServiceOperationResult result: resultList) { + StatusCode statusCode = result.operationResult().get(); + UInteger clientHandle = result.monitoredItem().getClientHandle().get(); + final Subscription s = subscriptions.get(clientHandle); + if(statusCode.isBad()) { + handleSubscriptionError(statusCode, clientHandle, s); + } else { + this.goodSubscriptions.put(clientHandle, result.monitoredItem()); +// item.setValueConsumer(s.getValueConsumer()); + } + } + + + /* this.manager.createMonitoredItems(TimestampsToReturn.Both, items, (item, idx) -> { // set value listener @@ -226,6 +235,7 @@ public class SubscriptionManager { } }).get(); + */ } if (!this.badSubscriptions.isEmpty()) { @@ -254,9 +264,13 @@ public class SubscriptionManager { } public void deactivate(final UInteger clientHandle) throws Exception { - final UaMonitoredItem item = this.goodSubscriptions.remove(clientHandle); + final OpcUaMonitoredItem item = this.goodSubscriptions.remove(clientHandle); if (item != null) { - this.manager.deleteMonitoredItems(Collections.singletonList(item)).get(); + // TODO is this migrated correctly? + this.manager.removeMonitoredItem(item); +// this.manager.synchronizeMonitoredItems(); + this.manager.deleteMonitoredItems(); +// this.manager.deleteMonitoredItems(Collections.singletonList(item)).get(); } else { this.badSubscriptions.remove(clientHandle); } @@ -282,9 +296,11 @@ public class SubscriptionManager { */ LOG.debug("Looking up namespace on server: {}", namespaceUri); - - final CompletableFuture<DataValue> future - = this.client.readValue(0, TimestampsToReturn.Neither, Identifiers.Server_NamespaceArray); +// +// final CompletableFuture<DataValue> future +// = this.client.readValue(0, TimestampsToReturn.Neither, Identifiers.Server_NamespaceArray); + CompletableFuture<DataValue> future = this.client.readValuesAsync(0, TimestampsToReturn.Neither, Collections.singletonList(Identifiers.Server_NamespaceArray)) + .thenApply(r -> r.get(0)); return future.thenApply(value -> { final Object rawValue = value.getValue().getValue(); @@ -305,8 +321,13 @@ public class SubscriptionManager { public void dispose() { if (this.client != null) { - this.client.disconnect(); - this.client = null; + try { + this.client.disconnect(); + this.client = null; + } catch (final UaException e) { + LOG.warn("Failed to disconnect client", e); + } + } } @@ -327,11 +348,9 @@ public class SubscriptionManager { } public CompletableFuture<StatusCode> write(final ExpandedNodeId nodeId, final DataValue value) { - + /* return lookupNamespace(nodeId).thenCompose(node -> { - LOG.debug("Node - expanded: {}, full: {}", nodeId, node); - return this.client.writeValue(node, value).whenComplete((status, error) -> { if (status != null) { LOG.debug("Write to node={} = {} -> {}", node, value, status); @@ -339,7 +358,22 @@ public class SubscriptionManager { LOG.debug("Failed to write", error); } }); + }); + */ + return lookupNamespace(nodeId).thenCompose(node -> { + + LOG.debug("Node - expanded: {}, full: {}", nodeId, node); + + return this.client.writeValuesAsync(List.of(node), List.of(value)) + .thenApply(r -> r.get(0)) + .whenComplete((status, error) -> { + if (status != null) { + LOG.debug("Write to node={} = {} -> {}", node, value, status); + } else { + LOG.debug("Failed to write", error); + } + }); }); } @@ -356,6 +390,7 @@ public class SubscriptionManager { final CallMethodRequest cmr = new CallMethodRequest(node, method, inputArguments); + /* return this.client.call(cmr).whenComplete((status, error) -> { if (status != null) { LOG.debug("Call to node={}, method={} = {}-> {}", nodeId, methodId, inputArguments, status); @@ -363,6 +398,16 @@ public class SubscriptionManager { LOG.debug("Failed to call", error); } }); + */ + return this.client.callAsync(List.of(cmr)) + .thenApply(r -> r.getResults()[0]) + .whenComplete((status, error) -> { + if (status != null) { + LOG.debug("Call to node={}, method={} = {}-> {}", nodeId, methodId, inputArguments, status); + } else { + LOG.debug("Failed to call", error); + } + }); }); @@ -376,7 +421,7 @@ public class SubscriptionManager { return CompletableFuture.allOf(nodeIdFutures).thenCompose(param -> { List<NodeId> nodeIds = Stream.of(nodeIdFutures).map(CompletableFuture::join).collect(Collectors.toList()); - return this.client.readValues(0, TimestampsToReturn.Server, nodeIds); + return this.client.readValuesAsync(0, TimestampsToReturn.Server, nodeIds); }); } @@ -421,7 +466,9 @@ public class SubscriptionManager { if (previousBrowseResult.getStatusCode().isGood() && continuationPoint.isNotNull()) { - return this.client.browseNext(false, continuationPoint) +// return this.client.browseNext(false, continuationPoint) + return this.client.browseNextAsync(false, List.of(continuationPoint)) + .thenApply(r -> r.getResults()[0]) .thenCompose(browseResult -> { @@ -499,7 +546,7 @@ public class SubscriptionManager { List<BrowseDescription> browseDescriptions, int depth, int maxDepth, Pattern pattern, int maxNodesPerRequest) { - return this.client.browse(browseDescriptions) + return this.client.browseAsync(browseDescriptions) .thenCompose(partials -> { @@ -694,16 +741,30 @@ public class SubscriptionManager { cfg.setEndpoint(endpoint); // create client + final OpcUaClient client = OpcUaClient.create( + cfg.build(), + // have been in MiloclientConfiguration before + transportBuilder -> { + if (configuration.getChannelLifetime() != null) { + transportBuilder.setChannelLifetime(Unsigned.uint(configuration.getChannelLifetime())); + } + }); - final OpcUaClient client = OpcUaClient.create(cfg.build()); - client.connect().get(); + client.connect(); try { - final UaSubscription manager = client.getSubscriptionManager() - .createSubscription(this.configuration.getRequestedPublishingInterval()).get(); - client.getSubscriptionManager().addSubscriptionListener(new SubscriptionListenerImpl()); - - return new Connected(client, manager); + // FIXME validate Subscription creation + OpcUaSubscription subscription = new OpcUaSubscription(client); + subscription.setSubscriptionListener(new SubscriptionListenerImpl()); + subscription.create(); + + return new Connected(client, subscription); + +// final OpcUaSubscription manager = client.getSubscriptionManager() +// .createSubscription(this.configuration.getRequestedPublishingInterval()).get(); +// client.getSubscriptionManager().addSubscriptionListener(new SubscriptionListenerImpl()); +// +// return new Connected(client, manager); } catch (final Exception e) { // clean up client.disconnect(); diff --git a/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/MiloServerComponent.java b/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/MiloServerComponent.java index f4013d5d2a73..864ff1773569 100644 --- a/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/MiloServerComponent.java +++ b/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/MiloServerComponent.java @@ -21,6 +21,9 @@ import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.security.KeyPair; import java.security.cert.X509Certificate; import java.util.Arrays; @@ -42,36 +45,30 @@ import org.apache.camel.component.milo.server.internal.CamelNamespace; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.annotations.Component; import org.apache.camel.support.DefaultComponent; +import org.eclipse.milo.opcua.sdk.server.EndpointConfig; import org.eclipse.milo.opcua.sdk.server.OpcUaServer; -import org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfig; -import org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfigBuilder; +import org.eclipse.milo.opcua.sdk.server.OpcUaServerConfig; +import org.eclipse.milo.opcua.sdk.server.OpcUaServerConfigBuilder; import org.eclipse.milo.opcua.sdk.server.identity.AnonymousIdentityValidator; import org.eclipse.milo.opcua.sdk.server.identity.IdentityValidator; import org.eclipse.milo.opcua.sdk.server.identity.UsernameIdentityValidator; import org.eclipse.milo.opcua.sdk.server.util.HostnameUtil; +import org.eclipse.milo.opcua.stack.core.NodeIds; import org.eclipse.milo.opcua.stack.core.StatusCodes; import org.eclipse.milo.opcua.stack.core.UaException; -import org.eclipse.milo.opcua.stack.core.security.CertificateManager; -import org.eclipse.milo.opcua.stack.core.security.CertificateValidator; -import org.eclipse.milo.opcua.stack.core.security.DefaultCertificateManager; -import org.eclipse.milo.opcua.stack.core.security.DefaultTrustListManager; -import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy; +import org.eclipse.milo.opcua.stack.core.security.*; import org.eclipse.milo.opcua.stack.core.transport.TransportProfile; import org.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText; import org.eclipse.milo.opcua.stack.core.types.enumerated.MessageSecurityMode; import org.eclipse.milo.opcua.stack.core.types.enumerated.UserTokenType; import org.eclipse.milo.opcua.stack.core.types.structured.BuildInfo; import org.eclipse.milo.opcua.stack.core.types.structured.UserTokenPolicy; -import org.eclipse.milo.opcua.stack.server.EndpointConfiguration; -import org.eclipse.milo.opcua.stack.server.security.DefaultServerCertificateValidator; -import org.eclipse.milo.opcua.stack.server.security.ServerCertificateValidator; +import org.eclipse.milo.opcua.stack.transport.server.tcp.OpcTcpServerTransport; +import org.eclipse.milo.opcua.stack.transport.server.tcp.OpcTcpServerTransportConfig; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfig.USER_TOKEN_POLICY_ANONYMOUS; -import static org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfig.USER_TOKEN_POLICY_USERNAME; -import static org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfig.USER_TOKEN_POLICY_X509; - /** * OPC UA Server based component */ @@ -120,10 +117,17 @@ public class MiloServerComponent extends DefaultComponent { @Metadata(label = "security") private String defaultCertificateValidator; @Metadata(label = "security") - private ServerCertificateValidator certificateValidator; + private CertificateValidator certificateValidator; @Metadata(label = "security") private X509Certificate certificate; + // FIXME - extract CertificateQuarantine + @Metadata(label = "security") + private CertificateQuarantine certificateQuarantine; + // FIXME - migration to CertificateGroup + @Metadata(label = "security") + private CertificateGroup certificateGroup; + public MiloServerComponent() { this.opcServerConfig = null; } @@ -138,7 +142,18 @@ public class MiloServerComponent extends DefaultComponent { @Override protected void doStart() throws Exception { - this.server = new OpcUaServer(buildServerConfig()); + // https://github.com/eclipse-milo/milo/blob/1.0/milo-examples/server-examples/src/main/java/org/eclipse/milo/examples/server/ExampleServer.java + OpcUaServerConfig serverConfig = buildServerConfig(); + this.server = new OpcUaServer( + serverConfig, + transportProfile -> { + assert transportProfile == TransportProfile.TCP_UASC_UABINARY; + + OpcTcpServerTransportConfig transportConfig = + OpcTcpServerTransportConfig.newBuilder().build(); + + return new OpcTcpServerTransport(transportConfig); + }); this.namespace = new CamelNamespace(this.namespaceUri, this.server); this.namespace.startup(); @@ -153,6 +168,9 @@ public class MiloServerComponent extends DefaultComponent { * @return the new server configuration, never returns {@code null} */ private OpcUaServerConfig buildServerConfig() { + +// this.certificateGroup = createCertificateGroup(); + OpcUaServerConfigBuilder serverConfig = this.opcServerConfig != null ? this.opcServerConfig : createDefaultConfiguration(); @@ -162,7 +180,7 @@ public class MiloServerComponent extends DefaultComponent { if (!userMap.isEmpty() || enableAnonymousAuthentication != null) { // set identity validator final boolean allowAnonymous = Boolean.TRUE.equals(this.enableAnonymousAuthentication); - final IdentityValidator identityValidator = new UsernameIdentityValidator(allowAnonymous, challenge -> { + final IdentityValidator identityValidator = new UsernameIdentityValidator(challenge -> { final String pwd = userMap.get(challenge.getUsername()); if (pwd == null) { return false; @@ -179,9 +197,9 @@ public class MiloServerComponent extends DefaultComponent { if (!userMap.isEmpty()) { tokenPolicies.add(getUsernamePolicy()); } - serverConfig.setEndpoints(createEndpointConfigurations(tokenPolicies)); + serverConfig.setEndpoints(createEndpointConfigs(tokenPolicies)); } else { - serverConfig.setEndpoints(createEndpointConfigurations(null, securityPolicies)); + serverConfig.setEndpoints(createEndpointConfigs(null, securityPolicies)); } if (certificateValidator != null) { @@ -196,7 +214,10 @@ public class MiloServerComponent extends DefaultComponent { } }); } - serverConfig.setCertificateValidator(certificateValidator); +// serverConfig.setCertificateValidator(certificateValidator); +// // FIXME - moved to certificateManager + serverConfig.setCertificateManager( + new DefaultCertificateManager(this.certificateQuarantine, this.certificateGroup)); } // build final configuration @@ -206,13 +227,15 @@ public class MiloServerComponent extends DefaultComponent { private OpcUaServerConfigBuilder createDefaultConfiguration() { final OpcUaServerConfigBuilder cfg = OpcUaServerConfig.builder(); - cfg.setCertificateManager(new DefaultCertificateManager()); - cfg.setCertificateValidator(DenyAllCertificateValidator.INSTANCE); - cfg.setEndpoints(createEndpointConfigurations(null)); +// cfg.setCertificateManager(new DefaultCertificateManager()); // TODO there is already der CertificateManager intialization below +// cfg.setCertificateValidator(DenyAllCertificateValidator.INSTANCE); // TODO moved to createCertificateGroup + cfg.setEndpoints(createEndpointConfigs(null)); cfg.setApplicationName(LocalizedText.english(applicationName == null ? "Apache Camel Milo Server" : applicationName)); cfg.setApplicationUri("urn:org:apache:camel:milo:server"); cfg.setProductUri("urn:org:apache:camel:milo"); cfg.setCertificateManager(certificateManager); + + if (productUri != null) { cfg.setProductUri(productUri); } @@ -230,13 +253,13 @@ public class MiloServerComponent extends DefaultComponent { return cfg; } - private Set<EndpointConfiguration> createEndpointConfigurations(List<UserTokenPolicy> userTokenPolicies) { - return createEndpointConfigurations(userTokenPolicies, securityPolicies); + private Set<EndpointConfig> createEndpointConfigs(List<UserTokenPolicy> userTokenPolicies) { + return createEndpointConfigs(userTokenPolicies, securityPolicies); } - private Set<EndpointConfiguration> createEndpointConfigurations( + private Set<EndpointConfig> createEndpointConfigs( List<UserTokenPolicy> userTokenPolicies, Set<SecurityPolicy> securityPolicies) { - Set<EndpointConfiguration> endpointConfigurations = new LinkedHashSet<>(); + Set<EndpointConfig> endpointConfigs = new LinkedHashSet<>(); //if address is not defined, return empty set if (bindAddresses == null) { @@ -255,11 +278,14 @@ public class MiloServerComponent extends DefaultComponent { = userTokenPolicies != null ? userTokenPolicies.toArray(new UserTokenPolicy[userTokenPolicies.size()]) : anonymous ? new UserTokenPolicy[] { - USER_TOKEN_POLICY_ANONYMOUS, USER_TOKEN_POLICY_USERNAME, USER_TOKEN_POLICY_X509 } - : new UserTokenPolicy[] { USER_TOKEN_POLICY_USERNAME, USER_TOKEN_POLICY_X509 }; + OpcUaServerConfig.USER_TOKEN_POLICY_ANONYMOUS, + OpcUaServerConfig.USER_TOKEN_POLICY_USERNAME, + OpcUaServerConfig.USER_TOKEN_POLICY_X509 + } + : new UserTokenPolicy[] { OpcUaServerConfig.USER_TOKEN_POLICY_USERNAME, OpcUaServerConfig.USER_TOKEN_POLICY_X509 }; for (String hostname : hostnames) { - EndpointConfiguration.Builder builder = EndpointConfiguration.newBuilder() + EndpointConfig.Builder builder = EndpointConfig.newBuilder() .setBindAddress(bindAddress) .setHostname(hostname) .setCertificate(certificate) @@ -267,22 +293,22 @@ public class MiloServerComponent extends DefaultComponent { .addTokenPolicies(tokenPolicies); if (securityPolicies == null || securityPolicies.contains(SecurityPolicy.None)) { - EndpointConfiguration.Builder noSecurityBuilder = builder.copy() + EndpointConfig.Builder noSecurityBuilder = builder.copy() .setSecurityPolicy(SecurityPolicy.None) .setSecurityMode(MessageSecurityMode.None); - endpointConfigurations.add(buildTcpEndpoint(noSecurityBuilder)); - endpointConfigurations.add(buildHttpsEndpoint(noSecurityBuilder)); + endpointConfigs.add(buildTcpEndpoint(noSecurityBuilder)); + endpointConfigs.add(buildHttpsEndpoint(noSecurityBuilder)); } else if (securityPolicies.contains(SecurityPolicy.Basic256Sha256)) { // TCP Basic256Sha256 / SignAndEncrypt - endpointConfigurations.add(buildTcpEndpoint( + endpointConfigs.add(buildTcpEndpoint( builder.copy() .setSecurityPolicy(SecurityPolicy.Basic256Sha256) .setSecurityMode(MessageSecurityMode.SignAndEncrypt))); } else if (securityPolicies.contains(SecurityPolicy.Basic256Sha256)) { // HTTPS Basic256Sha256 / Sign (SignAndEncrypt not allowed for HTTPS) - endpointConfigurations.add(buildHttpsEndpoint( + endpointConfigs.add(buildHttpsEndpoint( builder.copy() .setSecurityPolicy(SecurityPolicy.Basic256Sha256) .setSecurityMode(MessageSecurityMode.Sign))); @@ -298,46 +324,41 @@ public class MiloServerComponent extends DefaultComponent { * different address for this Endpoint it shall create the address by appending the path "/discovery" to * its base address. */ - EndpointConfiguration.Builder discoveryBuilder = builder.copy() + EndpointConfig.Builder discoveryBuilder = builder.copy() .setPath("/discovery") .setSecurityPolicy(SecurityPolicy.None) .setSecurityMode(MessageSecurityMode.None); - endpointConfigurations.add(buildTcpEndpoint(discoveryBuilder)); - endpointConfigurations.add(buildHttpsEndpoint(discoveryBuilder)); + endpointConfigs.add(buildTcpEndpoint(discoveryBuilder)); + endpointConfigs.add(buildHttpsEndpoint(discoveryBuilder)); } } - return endpointConfigurations; + return endpointConfigs; } - private EndpointConfiguration buildTcpEndpoint(EndpointConfiguration.Builder base) { + private EndpointConfig buildTcpEndpoint(EndpointConfig.Builder base) { return base.copy() .setTransportProfile(TransportProfile.TCP_UASC_UABINARY) .setBindPort(this.port) .build(); } - private EndpointConfiguration buildHttpsEndpoint(EndpointConfiguration.Builder base) { + private EndpointConfig buildHttpsEndpoint(EndpointConfig.Builder base) { return base.copy() .setTransportProfile(TransportProfile.HTTPS_UABINARY) .setBindPort(this.port) .build(); } - private static final class DenyAllCertificateValidator implements ServerCertificateValidator { - public static final ServerCertificateValidator INSTANCE = new DenyAllCertificateValidator(); + private static final class DenyAllCertificateValidator implements CertificateValidator { + public static final CertificateValidator INSTANCE = new DenyAllCertificateValidator(); private DenyAllCertificateValidator() { } @Override - public void validateCertificateChain(List<X509Certificate> list, String s) throws UaException { - throw new UaException(StatusCodes.Bad_CertificateUseNotAllowed); - } - - @Override - public void validateCertificateChain(List<X509Certificate> list) throws UaException { + public void validateCertificateChain(List<X509Certificate> certificateChain, @Nullable String applicationUri, @Nullable String[] validHostnames) throws UaException { throw new UaException(StatusCodes.Bad_CertificateUseNotAllowed); } } @@ -423,7 +444,17 @@ public class MiloServerComponent extends DefaultComponent { */ public void loadServerCertificate(final KeyPair keyPair, final X509Certificate certificate) { this.certificate = certificate; - setCertificateManager(new DefaultCertificateManager(keyPair, certificate)); + // TODO evaluate migration to CertificateGroup +// setCertificateManager(new DefaultCertificateManager(keyPair, certificate)); + try { + this.certificateGroup.updateCertificate( + NodeIds.ServerConfiguration_CertificateGroups_DefaultApplicationGroup, + keyPair, + new X509Certificate[]{certificate}); + } catch (Exception e) { + throw new RuntimeCamelException(e); + } + } /** @@ -576,13 +607,13 @@ public class MiloServerComponent extends DefaultComponent { * Server certificate manager */ public void setCertificateManager(final CertificateManager certificateManager) { - this.certificateManager = certificateManager != null ? certificateManager : new DefaultCertificateManager(); + this.certificateManager = certificateManager != null ? certificateManager : new DefaultCertificateManager(this.certificateQuarantine); } /** * Validator for client certificates */ - public void setCertificateValidator(final ServerCertificateValidator certificateValidator) { + public void setCertificateValidator(final CertificateValidator certificateValidator) { this.certificateValidator = certificateValidator; } @@ -592,13 +623,41 @@ public class MiloServerComponent extends DefaultComponent { public void setDefaultCertificateValidator(final String defaultCertificateValidator) { this.defaultCertificateValidator = defaultCertificateValidator; try { - DefaultTrustListManager trustListManager = new DefaultTrustListManager(new File(defaultCertificateValidator)); - this.certificateValidator = new DefaultServerCertificateValidator(trustListManager); - } catch (IOException e) { + final Path certificateConfigurationPath = new File(defaultCertificateValidator).toPath(); + TrustListManager trustListManager = FileBasedTrustListManager.createAndInitialize(certificateConfigurationPath); + + this.certificateQuarantine = this.createCertificateQuarantine(certificateConfigurationPath); + + this.certificateValidator = new DefaultServerCertificateValidator(trustListManager, certificateQuarantine); + + this.certificateGroup = DefaultApplicationGroup.createAndInitialize( + trustListManager, + new MemoryCertificateStore(), // alternative is KeyStoreCertificateStore + new RsaSha256CertificateFactory() { + @Override + protected X509Certificate[] createRsaSha256CertificateChain(KeyPair keyPair) { + return new X509Certificate[] {certificate}; + } + }, + certificateValidator); + + } catch (Exception e) { throw new RuntimeCamelException(e); } } + private CertificateQuarantine createCertificateQuarantine(Path certificateConfigurationPath) + throws IOException { + var certificateQuarantineDir = certificateConfigurationPath.resolve("rejected").resolve("certs"); + var certificateQuarantine = FileBasedCertificateQuarantine.create(certificateQuarantineDir); + if (!Files.exists(certificateConfigurationPath)) { + Files.createDirectories(certificateConfigurationPath); + } + + return certificateQuarantine; + } + + public String getDefaultCertificateValidator() { return defaultCertificateValidator; } diff --git a/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CallMethod.java b/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CallMethod.java index 1780439c199b..9eb812874c18 100644 --- a/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CallMethod.java +++ b/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CallMethod.java @@ -18,7 +18,7 @@ package org.apache.camel.component.milo.server.internal; import org.eclipse.milo.opcua.sdk.core.ValueRanks; -import org.eclipse.milo.opcua.sdk.server.api.methods.AbstractMethodInvocationHandler; +import org.eclipse.milo.opcua.sdk.server.methods.AbstractMethodInvocationHandler; import org.eclipse.milo.opcua.sdk.server.nodes.UaMethodNode; import org.eclipse.milo.opcua.stack.core.Identifiers; import org.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText; diff --git a/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CamelNamespace.java b/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CamelNamespace.java index a398a856a5a3..775b8ad24d60 100644 --- a/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CamelNamespace.java +++ b/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CamelNamespace.java @@ -22,10 +22,10 @@ import java.util.Map; import org.eclipse.milo.opcua.sdk.core.Reference; import org.eclipse.milo.opcua.sdk.server.OpcUaServer; -import org.eclipse.milo.opcua.sdk.server.api.DataItem; -import org.eclipse.milo.opcua.sdk.server.api.ManagedNamespaceWithLifecycle; -import org.eclipse.milo.opcua.sdk.server.api.MonitoredItem; -import org.eclipse.milo.opcua.sdk.server.dtd.DataTypeDictionaryManager; +import org.eclipse.milo.opcua.sdk.server.ManagedNamespaceWithLifecycle; +import org.eclipse.milo.opcua.sdk.server.dtd.BinaryDataTypeDictionaryManager; +import org.eclipse.milo.opcua.sdk.server.items.DataItem; +import org.eclipse.milo.opcua.sdk.server.items.MonitoredItem; import org.eclipse.milo.opcua.sdk.server.nodes.UaFolderNode; import org.eclipse.milo.opcua.sdk.server.nodes.UaObjectNode; import org.eclipse.milo.opcua.sdk.server.util.SubscriptionModel; @@ -45,7 +45,7 @@ public class CamelNamespace extends ManagedNamespaceWithLifecycle { private final Map<String, CamelServerItem> itemMap = new HashMap<>(); - private final DataTypeDictionaryManager dictionaryManager; + private final BinaryDataTypeDictionaryManager dictionaryManager; private final Logger log = LoggerFactory.getLogger(CamelNamespace.class); @@ -53,7 +53,7 @@ public class CamelNamespace extends ManagedNamespaceWithLifecycle { super(server, namespaceUri); this.subscriptionModel = new SubscriptionModel(server, this); - this.dictionaryManager = new DataTypeDictionaryManager(getNodeContext(), namespaceUri); + this.dictionaryManager = new BinaryDataTypeDictionaryManager(getNodeContext(), namespaceUri); getLifecycleManager().addLifecycle(dictionaryManager); getLifecycleManager().addLifecycle(subscriptionModel); diff --git a/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CamelServerItem.java b/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CamelServerItem.java index 1b9799d7875f..61375e32ef96 100644 --- a/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CamelServerItem.java +++ b/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CamelServerItem.java @@ -39,6 +39,7 @@ import org.eclipse.milo.opcua.stack.core.types.builtin.QualifiedName; import org.eclipse.milo.opcua.stack.core.types.builtin.StatusCode; import org.eclipse.milo.opcua.stack.core.types.builtin.Variant; import org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UShort; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -74,7 +75,7 @@ public class CamelServerItem { .addAttributeFilter(new AttributeFilter() { @Override - public Object getAttribute(AttributeFilterContext.GetAttributeContext ctx, AttributeId attributeId) { + public @Nullable Object getAttribute(AttributeFilterContext ctx, AttributeId attributeId) { if (filter.test(attributeId) && ctx.getSession().isPresent()) { return getDataValue(); } @@ -82,8 +83,7 @@ public class CamelServerItem { } @Override - public void setAttribute( - AttributeFilterContext.SetAttributeContext ctx, AttributeId attributeId, Object value) { + public void setAttribute(AttributeFilterContext ctx, AttributeId attributeId, @Nullable Object value) { if (filter.test(attributeId) && ctx.getSession().isPresent()) { setDataValue((DataValue) value); } diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/CallClientTest.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/CallClientTest.java index 208cf732e150..8948fff2327f 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/CallClientTest.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/CallClientTest.java @@ -16,6 +16,7 @@ */ package org.apache.camel.component.milo.call; +import java.security.KeyPair; import java.security.cert.X509Certificate; import java.util.Arrays; import java.util.EnumSet; @@ -29,19 +30,18 @@ import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.milo.AbstractMiloServerTest; import org.apache.camel.component.milo.NodeIds; +import org.eclipse.milo.opcua.sdk.server.EndpointConfig; import org.eclipse.milo.opcua.sdk.server.OpcUaServer; -import org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfig; -import org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfigBuilder; +import org.eclipse.milo.opcua.sdk.server.OpcUaServerConfig; +import org.eclipse.milo.opcua.sdk.server.OpcUaServerConfigBuilder; import org.eclipse.milo.opcua.sdk.server.util.HostnameUtil; -import org.eclipse.milo.opcua.stack.core.UaException; -import org.eclipse.milo.opcua.stack.core.security.DefaultCertificateManager; -import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy; +import org.eclipse.milo.opcua.stack.core.security.*; import org.eclipse.milo.opcua.stack.core.transport.TransportProfile; import org.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText; import org.eclipse.milo.opcua.stack.core.types.enumerated.MessageSecurityMode; import org.eclipse.milo.opcua.stack.core.types.structured.UserTokenPolicy; -import org.eclipse.milo.opcua.stack.server.EndpointConfiguration; -import org.eclipse.milo.opcua.stack.server.security.ServerCertificateValidator; +import org.eclipse.milo.opcua.stack.transport.server.tcp.OpcTcpServerTransport; +import org.eclipse.milo.opcua.stack.transport.server.tcp.OpcTcpServerTransportConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; @@ -49,7 +49,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static org.apache.camel.component.milo.NodeIds.nodeValue; -import static org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfig.USER_TOKEN_POLICY_ANONYMOUS; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -102,46 +101,73 @@ public class CallClientTest extends AbstractMiloServerTest { public void start() throws Exception { final OpcUaServerConfigBuilder cfg = OpcUaServerConfig.builder(); - cfg.setCertificateManager(new DefaultCertificateManager()); - cfg.setEndpoints(createEndpointConfigurations(Arrays.asList(OpcUaServerConfig.USER_TOKEN_POLICY_ANONYMOUS), +// cfg.setCertificateManager(new DefaultCertificateManager()); // TODO setCertificateManager is called afterwards + cfg.setEndpoints(createEndpointConfigs(Arrays.asList(OpcUaServerConfig.USER_TOKEN_POLICY_ANONYMOUS), EnumSet.of(SecurityPolicy.None))); cfg.setApplicationName(LocalizedText.english("Apache Camel Milo Server")); cfg.setApplicationUri("urn:mock:namespace"); cfg.setProductUri("urn:org:apache:camel:milo"); - cfg.setCertificateManager(new DefaultCertificateManager()); - cfg.setCertificateValidator(new InsecureCertificateValidator()); - - this.server = new OpcUaServer(cfg.build()); + // FIXME migrate to new certifcate +// cfg.setCertificateManager(new DefaultCertificateManager()); +//// cfg.setCertificateValidator(new InsecureCertificateValidator()); +// cfg.setCertificateValidator(new CertificateValidator.InsecureCertificateValidator()); + + var certificateQuarantine = new MemoryCertificateQuarantine(); + var trustListManager = new MemoryTrustListManager(); + var certificateStore = new MemoryCertificateStore(); + var certificateFactory = new TestCertificateFactory(); + var certificateGroup = new DefaultApplicationGroup( + trustListManager, + certificateStore, + certificateFactory, + new CertificateValidator.InsecureCertificateValidator() + ); + cfg.setCertificateManager( + new DefaultCertificateManager(certificateQuarantine, certificateGroup)); + + // https://github.com/eclipse-milo/milo/blob/1.0/milo-examples/server-examples/src/main/java/org/eclipse/milo/examples/server/ExampleServer.java +// this.server = new OpcUaServer(cfg.build()); + OpcUaServerConfig serverConfig = cfg.build(); + this.server = new OpcUaServer( + serverConfig, + transportProfile -> { + assert transportProfile == TransportProfile.TCP_UASC_UABINARY; + + OpcTcpServerTransportConfig transportConfig = + OpcTcpServerTransportConfig.newBuilder().build(); + + return new OpcTcpServerTransport(transportConfig); + }); this.namespace = new MockCamelNamespace(this.server, node -> callMethod = new MockCallMethod(node)); this.namespace.startup(); this.server.startup().get(); } - private Set<EndpointConfiguration> createEndpointConfigurations( + private Set<EndpointConfig> createEndpointConfigs( List<UserTokenPolicy> userTokenPolicies, Set<SecurityPolicy> securityPolicies) { - Set<EndpointConfiguration> endpointConfigurations = new LinkedHashSet<>(); + Set<EndpointConfig> endpointConfigs = new LinkedHashSet<>(); String bindAddress = "0.0.0.0"; Set<String> hostnames = new LinkedHashSet<>(); hostnames.add(HostnameUtil.getHostname()); hostnames.addAll(HostnameUtil.getHostnames(bindAddress)); - UserTokenPolicy[] tokenPolicies = new UserTokenPolicy[] { USER_TOKEN_POLICY_ANONYMOUS }; + UserTokenPolicy[] tokenPolicies = new UserTokenPolicy[] { OpcUaServerConfig.USER_TOKEN_POLICY_ANONYMOUS }; for (String hostname : hostnames) { - EndpointConfiguration.Builder builder = EndpointConfiguration.newBuilder() + EndpointConfig.Builder builder = EndpointConfig.newBuilder() .setBindAddress(bindAddress) .setHostname(hostname) .setCertificate(() -> null) .addTokenPolicies(tokenPolicies); if (securityPolicies == null || securityPolicies.contains(SecurityPolicy.None)) { - EndpointConfiguration.Builder noSecurityBuilder = builder.copy() + EndpointConfig.Builder noSecurityBuilder = builder.copy() .setSecurityPolicy(SecurityPolicy.None) .setSecurityMode(MessageSecurityMode.None); - endpointConfigurations.add(buildTcpEndpoint(noSecurityBuilder)); + endpointConfigs.add(buildTcpEndpoint(noSecurityBuilder)); } /* * It's good practice to provide a discovery-specific endpoint with no security. @@ -154,18 +180,18 @@ public class CallClientTest extends AbstractMiloServerTest { * its base address. */ - EndpointConfiguration.Builder discoveryBuilder = builder.copy() + EndpointConfig.Builder discoveryBuilder = builder.copy() .setPath("/discovery") .setSecurityPolicy(SecurityPolicy.None) .setSecurityMode(MessageSecurityMode.None); - endpointConfigurations.add(buildTcpEndpoint(discoveryBuilder)); + endpointConfigs.add(buildTcpEndpoint(discoveryBuilder)); } - return endpointConfigurations; + return endpointConfigs; } - private EndpointConfiguration buildTcpEndpoint(EndpointConfiguration.Builder base) { + private EndpointConfig buildTcpEndpoint(EndpointConfig.Builder base) { return base.copy() .setTransportProfile(TransportProfile.TCP_UASC_UABINARY) .setBindPort(getServerPort()) @@ -188,20 +214,4 @@ public class CallClientTest extends AbstractMiloServerTest { // we always write synchronously since we do need the message order producerTemplate.sendBodyAndHeader(input, "await", true); } - - private static final class InsecureCertificateValidator implements ServerCertificateValidator { - - public static final ServerCertificateValidator INSTANCE = new CallClientTest.InsecureCertificateValidator(); - - private InsecureCertificateValidator() { - } - - @Override - public void validateCertificateChain(List<X509Certificate> list, String s) throws UaException { - } - - @Override - public void validateCertificateChain(List<X509Certificate> list) throws UaException { - } - } } diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/MockCallMethod.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/MockCallMethod.java index 9806e6780685..3a2092aaef20 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/MockCallMethod.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/MockCallMethod.java @@ -21,7 +21,7 @@ import java.util.LinkedList; import java.util.List; import org.eclipse.milo.opcua.sdk.core.ValueRanks; -import org.eclipse.milo.opcua.sdk.server.api.methods.AbstractMethodInvocationHandler; +import org.eclipse.milo.opcua.sdk.server.methods.AbstractMethodInvocationHandler; import org.eclipse.milo.opcua.sdk.server.nodes.UaMethodNode; import org.eclipse.milo.opcua.stack.core.Identifiers; import org.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText; diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/MockCamelNamespace.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/MockCamelNamespace.java index 2893153ba2e8..1aec6ceb4439 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/MockCamelNamespace.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/MockCamelNamespace.java @@ -25,11 +25,11 @@ import org.apache.camel.component.milo.client.MiloClientConsumer; import org.apache.camel.component.milo.server.internal.CamelServerItem; import org.eclipse.milo.opcua.sdk.core.Reference; import org.eclipse.milo.opcua.sdk.server.Lifecycle; +import org.eclipse.milo.opcua.sdk.server.ManagedNamespaceWithLifecycle; import org.eclipse.milo.opcua.sdk.server.OpcUaServer; -import org.eclipse.milo.opcua.sdk.server.api.DataItem; -import org.eclipse.milo.opcua.sdk.server.api.ManagedNamespaceWithLifecycle; -import org.eclipse.milo.opcua.sdk.server.api.MonitoredItem; -import org.eclipse.milo.opcua.sdk.server.api.methods.AbstractMethodInvocationHandler; +import org.eclipse.milo.opcua.sdk.server.items.DataItem; +import org.eclipse.milo.opcua.sdk.server.items.MonitoredItem; +import org.eclipse.milo.opcua.sdk.server.methods.AbstractMethodInvocationHandler; import org.eclipse.milo.opcua.sdk.server.nodes.UaFolderNode; import org.eclipse.milo.opcua.sdk.server.nodes.UaMethodNode; import org.eclipse.milo.opcua.sdk.server.util.SubscriptionModel; diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/TestCertificateFactory.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/TestCertificateFactory.java new file mode 100644 index 000000000000..459ae4101a24 --- /dev/null +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/TestCertificateFactory.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.camel.component.milo.call; + +import org.eclipse.milo.opcua.stack.core.NodeIds; +import org.eclipse.milo.opcua.stack.core.security.RsaSha256CertificateFactory; +import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId; +import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateBuilder; +import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateGenerator; + +import java.security.KeyPair; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; + +/** + * copied from milo::TestCertificateFactory + */ +public class TestCertificateFactory extends RsaSha256CertificateFactory { + + @Override + public KeyPair createKeyPair(NodeId nodeId) { + assert nodeId.equals(NodeIds.RsaSha256ApplicationCertificateType); + + return createRsaSha256KeyPair(); + } + + @Override + public X509Certificate[] createCertificateChain(NodeId nodeId, KeyPair keyPair) { + assert nodeId.equals(NodeIds.RsaSha256ApplicationCertificateType); + + return createRsaSha256CertificateChain(keyPair); + } + + @Override + public KeyPair createRsaSha256KeyPair() { + try { + return SelfSignedCertificateGenerator.generateRsaKeyPair(2048); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + } + + @Override + public X509Certificate[] createRsaSha256CertificateChain(KeyPair keyPair) { + String applicationUri = "urn:eclipse:milo:test"; + + SelfSignedCertificateBuilder builder = + new SelfSignedCertificateBuilder(keyPair) + .setCommonName("Eclipse Milo OPC UA Test Server") + .setOrganization("digitalpetri") + .setOrganizationalUnit("dev") + .setLocalityName("Folsom") + .setStateName("CA") + .setCountryCode("US") + .setApplicationUri(applicationUri) + .addIpAddress("127.0.0.1") + .addDnsName("localhost"); + + try { + return new X509Certificate[] {builder.build()}; + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/client/NodeIdTest.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/client/NodeIdTest.java index 1869d6394292..d0bb36778292 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/client/NodeIdTest.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/client/NodeIdTest.java @@ -18,8 +18,10 @@ package org.apache.camel.component.milo.client; import java.io.Serializable; +import com.google.common.net.UrlEscapers; import org.apache.camel.ResolveEndpointFailedException; import org.apache.camel.component.milo.AbstractMiloServerTest; +import org.apache.camel.component.milo.server.MiloServerComponent; import org.eclipse.milo.opcua.stack.core.types.builtin.ExpandedNodeId; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -27,8 +29,6 @@ import org.junit.jupiter.api.TestInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static com.google.common.net.UrlEscapers.urlFormParameterEscaper; -import static org.apache.camel.component.milo.server.MiloServerComponent.DEFAULT_NAMESPACE_URI; import static org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned.uint; import static org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned.ushort; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -52,8 +52,8 @@ public class NodeIdTest extends AbstractMiloServerTest { @Test public void testFull1() { - final String s = String.format("nsu=%s;s=%s", DEFAULT_NAMESPACE_URI, "item-1"); - testUri("milo-client:tcp://foo:bar@localhost:@@port@@?samplingInterval=1000&node=RAW(" + s + ")", DEFAULT_NAMESPACE_URI, + final String s = String.format("nsu=%s;s=%s", MiloServerComponent.DEFAULT_NAMESPACE_URI, "item-1"); + testUri("milo-client:tcp://foo:bar@localhost:@@port@@?samplingInterval=1000&node=RAW(" + s + ")", MiloServerComponent.DEFAULT_NAMESPACE_URI, "item-1"); } @@ -73,7 +73,7 @@ public class NodeIdTest extends AbstractMiloServerTest { public void testFull1NonRaw() { final String s = String.format("ns=%s;i=%s", 1, 2); testUri("milo-client:tcp://foo:bar@localhost:@@port@@?samplingInterval=1000&node=" - + urlFormParameterEscaper().escape(s), ushort(1), uint(2)); + + UrlEscapers.urlFormParameterEscaper().escape(s), ushort(1), uint(2)); } @Test @@ -86,7 +86,7 @@ public class NodeIdTest extends AbstractMiloServerTest { public void testMixed() { // This must fail since "node" is incomplete assertThrows(ResolveEndpointFailedException.class, - () -> testUri("milo-client:tcp://foo:bar@localhost:@@port@@?node=foo&namespaceUri=" + DEFAULT_NAMESPACE_URI, + () -> testUri("milo-client:tcp://foo:bar@localhost:@@port@@?node=foo&namespaceUri=" + MiloServerComponent.DEFAULT_NAMESPACE_URI, null, null)); }
