All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hazelcast.spring.HazelcastClientBeanDefinitionParser Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2008-2024, Hazelcast, Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.hazelcast.spring;

import com.hazelcast.client.HazelcastClient;
import com.hazelcast.client.config.ClientCloudConfig;
import com.hazelcast.client.config.ClientConnectionStrategyConfig;
import com.hazelcast.client.config.ClientFlakeIdGeneratorConfig;
import com.hazelcast.client.config.ClientIcmpPingConfig;
import com.hazelcast.client.config.ClientMetricsConfig;
import com.hazelcast.client.config.ClientNetworkConfig;
import com.hazelcast.client.config.ClientReliableTopicConfig;
import com.hazelcast.client.config.ClientSecurityConfig;
import com.hazelcast.client.config.ClientSqlConfig;
import com.hazelcast.client.config.ClientTpcConfig;
import com.hazelcast.client.config.ClientUserCodeDeploymentConfig;
import com.hazelcast.client.config.ClusterRoutingConfig;
import com.hazelcast.client.config.ConnectionRetryConfig;
import com.hazelcast.client.config.ProxyFactoryConfig;
import com.hazelcast.client.config.RoutingStrategy;
import com.hazelcast.client.config.SocketOptions;
import com.hazelcast.client.util.RandomLB;
import com.hazelcast.client.util.RoundRobinLB;
import com.hazelcast.config.CredentialsFactoryConfig;
import com.hazelcast.config.EntryListenerConfig;
import com.hazelcast.config.InMemoryFormat;
import com.hazelcast.config.InstanceTrackingConfig;
import com.hazelcast.config.ListenerConfig;
import com.hazelcast.config.LoginModuleConfig;
import com.hazelcast.config.MetricsJmxConfig;
import com.hazelcast.config.NearCacheConfig;
import com.hazelcast.config.PredicateConfig;
import com.hazelcast.config.QueryCacheConfig;
import com.hazelcast.config.SSLConfig;
import com.hazelcast.config.security.JaasAuthenticationConfig;
import com.hazelcast.config.security.KerberosIdentityConfig;
import com.hazelcast.config.security.RealmConfig;
import com.hazelcast.config.security.TokenEncoding;
import com.hazelcast.config.security.TokenIdentityConfig;
import com.hazelcast.config.security.UsernamePasswordIdentityConfig;
import com.hazelcast.cp.CPSubsystem;
import com.hazelcast.internal.config.AliasedDiscoveryConfigUtils;
import com.hazelcast.spring.config.ConfigFactory;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.support.ManagedMap;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

import java.util.ArrayList;
import java.util.List;

import static com.hazelcast.internal.config.DomConfigHelper.childElements;
import static com.hazelcast.internal.config.DomConfigHelper.cleanNodeName;
import static com.hazelcast.internal.util.StringUtil.upperCaseInternal;
import static com.hazelcast.spring.HazelcastInstanceDefinitionParser.CP_SUBSYSTEM_SUFFIX;
import static org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition;
import static org.springframework.util.Assert.isTrue;

/**
 * BeanDefinitionParser for Hazelcast Client Configuration.
 * 

* Sample Spring XML for Hazelcast Client: *

{@code
 *   
 *      ${cluster.name}
 *      
 *              
 *              10.10.1.2:5701
 *              10.10.1.3:5701
 *      
 *   
 * }
*/ @SuppressWarnings("checkstyle:methodcount") public class HazelcastClientBeanDefinitionParser extends AbstractHazelcastBeanDefinitionParser { @Override protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { SpringXmlBuilder springXmlBuilder = new SpringXmlBuilder(parserContext); AbstractBeanDefinition bean = springXmlBuilder.handleClient(element); registerCPSubsystemBean(element, parserContext); return bean; } private void registerCPSubsystemBean(Element element, ParserContext parserContext) { String instanceBeanRef = element.getAttribute("id"); BeanDefinitionBuilder cpBeanDefBuilder = BeanDefinitionBuilder.rootBeanDefinition(CPSubsystem.class); cpBeanDefBuilder.setFactoryMethodOnBean("getCPSubsystem", instanceBeanRef); cpBeanDefBuilder.setLazyInit(true); BeanDefinitionHolder holder = new BeanDefinitionHolder(cpBeanDefBuilder.getBeanDefinition(), instanceBeanRef + CP_SUBSYSTEM_SUFFIX); registerBeanDefinition(holder, parserContext.getRegistry()); } /** * Client bean definition builder */ public static class SpringXmlBuilder extends SpringXmlBuilderHelper { private static final int INITIAL_CAPACITY = 10; private final ParserContext parserContext; private final BeanDefinitionBuilder builder; private final ManagedMap nearCacheConfigMap = new ManagedMap<>(); private final ManagedMap flakeIdGeneratorConfigMap = new ManagedMap<>(); private final ManagedMap reliableTopicConfigMap = new ManagedMap<>(); SpringXmlBuilder(ParserContext parserContext) { this(parserContext, rootBeanDefinition(HazelcastClient.class) .setFactoryMethod("newHazelcastClient") .setDestroyMethodName("shutdown")); } public SpringXmlBuilder(ParserContext parserContext, BeanDefinitionBuilder builder) { this.parserContext = parserContext; this.builder = builder; this.configBuilder = rootBeanDefinition(ConfigFactory.class, "newClientConfig"); configBuilder.addPropertyValue("nearCacheConfigMap", nearCacheConfigMap); configBuilder.addPropertyValue("flakeIdGeneratorConfigMap", flakeIdGeneratorConfigMap); configBuilder.addPropertyValue("reliableTopicConfigMap", reliableTopicConfigMap); } public AbstractBeanDefinition handleClient(Node rootNode) { AbstractBeanDefinition configBean = createConfigBean(rootNode); builder.addConstructorArgValue(configBean); return builder.getBeanDefinition(); } @SuppressWarnings("checkstyle:cyclomaticcomplexity") AbstractBeanDefinition createConfigBean(Node rootNode) { handleCommonBeanAttributes(rootNode, builder, parserContext); for (Node node : childElements(rootNode)) { String nodeName = cleanNodeName(node); if ("cluster-name".equals(nodeName)) { configBuilder.addPropertyValue("clusterName", getTextContent(node)); } else if ("properties".equals(nodeName)) { handleProperties(node, configBuilder); } else if ("network".equals(nodeName)) { handleNetwork(node); } else if ("listeners".equals(nodeName)) { List listeners = parseListeners(node, ListenerConfig.class); configBuilder.addPropertyValue("listenerConfigs", listeners); } else if ("serialization".equals(nodeName)) { handleSerialization(node); } else if ("proxy-factories".equals(nodeName)) { List list = parseProxyFactories(node, ProxyFactoryConfig.class); configBuilder.addPropertyValue("proxyFactoryConfigs", list); } else if ("load-balancer".equals(nodeName)) { handleLoadBalancer(node); } else if ("near-cache".equals(nodeName)) { handleNearCache(node); } else if ("spring-aware".equals(nodeName)) { handleSpringAware(); } else if ("query-caches".equals(nodeName)) { ManagedMap> queryCaches = getQueryCaches(node); configBuilder.addPropertyValue("queryCacheConfigs", queryCaches); } else if ("connection-strategy".equals(nodeName)) { handleConnectionStrategy(node); } else if ("user-code-deployment".equals(nodeName)) { handleUserCodeDeployment(node); } else if ("flake-id-generator".equals(nodeName)) { handleFlakeIdGenerator(node); } else if ("reliable-topic".equals(nodeName)) { handleReliableTopic(node); } else if ("security".equals(nodeName)) { handleSecurity(node); } else if ("instance-name".equals(nodeName)) { configBuilder.addPropertyValue("instanceName", getTextContent(node)); } else if ("labels".equals(nodeName)) { handleLabels(node); } else if ("backup-ack-to-client-enabled".equals(nodeName)) { configBuilder.addPropertyValue("backupAckToClientEnabled", getTextContent(node)); } else if ("metrics".equals(nodeName)) { handleMetrics(node); } else if ("instance-tracking".equals(nodeName)) { handleInstanceTracking(node); } else if ("native-memory".equals(nodeName)) { handleNativeMemory(node); } else if ("sql".equals(nodeName)) { handleSql(node); } else if ("tpc".equals(nodeName)) { handleTpc(node); } else if ("cp-direct-to-leader-routing".equals(nodeName)) { configBuilder.addPropertyValue("cpDirectToLeaderRoutingEnabled", getTextContent(node)); } } return configBuilder.getBeanDefinition(); } private void handleSecurity(Node node) { BeanDefinitionBuilder securityConfigBuilder = createBeanBuilder(ClientSecurityConfig.class); AbstractBeanDefinition beanDefinition = securityConfigBuilder.getBeanDefinition(); fillAttributeValues(node, securityConfigBuilder); for (Node child : childElements(node)) { String nodeName = cleanNodeName(child); if ("credentials-factory".equals(nodeName)) { handleCredentialsFactory(child, securityConfigBuilder); } else if ("username-password".equals(nodeName)) { BeanDefinitionBuilder configBuilder = createBeanBuilder(UsernamePasswordIdentityConfig.class) .addConstructorArgValue(getAttribute(child, "username")) .addConstructorArgValue(getAttribute(child, "password")); securityConfigBuilder.addPropertyValue("UsernamePasswordIdentityConfig", configBuilder.getBeanDefinition()); } else if ("token".equals(nodeName)) { BeanDefinitionBuilder configBuilder = createBeanBuilder(TokenIdentityConfig.class) .addConstructorArgValue(TokenEncoding.getTokenEncoding(getAttribute(child, "encoding"))) .addConstructorArgValue(getTextContent(child)); securityConfigBuilder.addPropertyValue("TokenIdentityConfig", configBuilder.getBeanDefinition()); } else if ("kerberos".equals(nodeName)) { createAndFillBeanBuilder(child, KerberosIdentityConfig.class, "KerberosIdentityConfig", securityConfigBuilder); } else if ("credentials-ref".equals(nodeName)) { securityConfigBuilder.addPropertyReference("credentials", getTextContent(child)); } else if ("realms".equals(nodeName)) { handleRealms(child, securityConfigBuilder); } } configBuilder.addPropertyValue("securityConfig", beanDefinition); } void handleCredentialsFactory(Node node, BeanDefinitionBuilder securityConfigBuilder) { BeanDefinitionBuilder credentialsConfigBuilder = createBeanBuilder(CredentialsFactoryConfig.class); AbstractBeanDefinition beanDefinition = credentialsConfigBuilder.getBeanDefinition(); NamedNodeMap attributes = node.getAttributes(); Node classNameNode = attributes.getNamedItem("class-name"); String className = classNameNode != null ? getTextContent(classNameNode) : null; Node implNode = attributes.getNamedItem("implementation"); String implementation = implNode != null ? getTextContent(implNode) : null; credentialsConfigBuilder.addPropertyValue("className", className); if (implementation != null) { credentialsConfigBuilder.addPropertyReference("implementation", implementation); } isTrue(className != null || implementation != null, "One of 'class-name' or 'implementation'" + " attributes is required to create CredentialsFactory!"); for (Node child : childElements(node)) { String nodeName = cleanNodeName(child); if ("properties".equals(nodeName)) { handleProperties(child, credentialsConfigBuilder); break; } } securityConfigBuilder.addPropertyValue("credentialsFactoryConfig", beanDefinition); } private void handleConnectionStrategy(Node node) { BeanDefinitionBuilder clientConnectionStrategyConfig = createBeanBuilder(ClientConnectionStrategyConfig.class); fillAttributeValues(node, clientConnectionStrategyConfig); for (Node child : childElements(node)) { String nodeName = cleanNodeName(child); if ("connection-retry".equals(nodeName)) { createAndFillBeanBuilder(child, ConnectionRetryConfig.class, "ConnectionRetryConfig", clientConnectionStrategyConfig); } } configBuilder.addPropertyValue("connectionStrategyConfig", clientConnectionStrategyConfig.getBeanDefinition()); } private void handleUserCodeDeployment(Node node) { BeanDefinitionBuilder userCodeDeploymentConfig = createBeanBuilder(ClientUserCodeDeploymentConfig.class); List jarPaths = new ArrayList<>(INITIAL_CAPACITY); List classNames = new ArrayList<>(INITIAL_CAPACITY); fillAttributeValues(node, userCodeDeploymentConfig); for (Node child : childElements(node)) { String nodeName = cleanNodeName(child); if ("jarpaths".equals(nodeName)) { for (Node child1 : childElements(child)) { String nodeName1 = cleanNodeName(child1); if ("jarpath".equals(nodeName1)) { jarPaths.add(getTextContent(child1)); } } } else if ("classnames".equals(nodeName)) { for (Node child1 : childElements(child)) { String nodeName1 = cleanNodeName(child1); if ("classname".equals(nodeName1)) { classNames.add(getTextContent(child1)); } } } } userCodeDeploymentConfig.addPropertyValue("jarPaths", jarPaths); userCodeDeploymentConfig.addPropertyValue("classNames", classNames); configBuilder.addPropertyValue("userCodeDeploymentConfig", userCodeDeploymentConfig.getBeanDefinition()); } @SuppressWarnings("checkstyle:cyclomaticcomplexity") private void handleNetwork(Node node) { BeanDefinitionBuilder clientNetworkConfig = createBeanBuilder(ClientNetworkConfig.class); List members = new ArrayList<>(INITIAL_CAPACITY); fillAttributeValues(node, clientNetworkConfig); for (Node child : childElements(node)) { String nodeName = cleanNodeName(child); if ("member".equals(nodeName)) { members.add(getTextContent(child)); } else if ("socket-options".equals(nodeName)) { createAndFillBeanBuilder(child, SocketOptions.class, "socketOptions", clientNetworkConfig); } else if ("socket-interceptor".equals(nodeName)) { handleSocketInterceptorConfig(child, clientNetworkConfig); } else if ("ssl".equals(nodeName)) { handleSSLConfig(child, clientNetworkConfig); } else if (AliasedDiscoveryConfigUtils.supports(nodeName)) { handleAliasedDiscoveryStrategy(child, clientNetworkConfig, nodeName); } else if ("discovery-strategies".equals(nodeName)) { handleDiscoveryStrategies(child, clientNetworkConfig); } else if ("auto-detection".equals(nodeName)) { handleAutoDetection(child, clientNetworkConfig); } else if ("outbound-ports".equals(nodeName)) { handleOutboundPorts(child, clientNetworkConfig); } else if ("icmp-ping".equals(nodeName)) { createAndFillBeanBuilder(child, ClientIcmpPingConfig.class, "clientIcmpPingConfig", clientNetworkConfig); } else if ("hazelcast-cloud".equals(nodeName)) { createAndFillBeanBuilder(child, ClientCloudConfig.class, "cloudConfig", clientNetworkConfig); } else if ("cluster-routing".equals(nodeName)) { handleClusterRouting(child, clientNetworkConfig); } } clientNetworkConfig.addPropertyValue("addresses", members); configBuilder.addPropertyValue("networkConfig", clientNetworkConfig.getBeanDefinition()); } private void handleSSLConfig(Node node, BeanDefinitionBuilder networkConfigBuilder) { BeanDefinitionBuilder sslConfigBuilder = createBeanBuilder(SSLConfig.class); String implAttribute = "factory-implementation"; fillAttributeValues(node, sslConfigBuilder, implAttribute); Node implNode = node.getAttributes().getNamedItem(implAttribute); String implementation = implNode != null ? getTextContent(implNode) : null; if (implementation != null) { sslConfigBuilder.addPropertyReference(xmlToJavaName(implAttribute), implementation); } for (Node child : childElements(node)) { String name = cleanNodeName(child); if ("properties".equals(name)) { handleProperties(child, sslConfigBuilder); } } networkConfigBuilder.addPropertyValue("SSLConfig", sslConfigBuilder.getBeanDefinition()); } private void handleClusterRouting(Node child, BeanDefinitionBuilder networkConfigBuilder) { BeanDefinitionBuilder clusterRoutingConfig = createBeanBuilder(ClusterRoutingConfig.class); clusterRoutingConfig.addPropertyValue("routingMode", getAttribute(child, "mode")); String attribute = getAttribute(child, "routing-strategy"); RoutingStrategy routingStrategy = attribute == null ? ClusterRoutingConfig.DEFAULT_ROUTING_STRATEGY : RoutingStrategy.valueOf(attribute); clusterRoutingConfig.addPropertyValue("routingStrategy", routingStrategy); networkConfigBuilder.addPropertyValue("clusterRoutingConfig", clusterRoutingConfig.getBeanDefinition()); } private void handleLoadBalancer(Node node) { String type = getAttribute(node, "type"); if ("random".equals(type)) { configBuilder.addPropertyValue("loadBalancer", new RandomLB()); } else if ("round-robin".equals(type)) { configBuilder.addPropertyValue("loadBalancer", new RoundRobinLB()); } else if ("custom".equals(type)) { NamedNodeMap attributes = node.getAttributes(); Node classNameNode = attributes.getNamedItem("class-name"); String className = classNameNode != null ? getTextContent(classNameNode) : null; Node implNode = attributes.getNamedItem("implementation"); String implementation = implNode != null ? getTextContent(implNode) : null; isTrue(className != null ^ implementation != null, "Exactly one of 'class-name' or 'implementation'" + " attributes is required to create LoadBalancer!"); if (className != null) { BeanDefinitionBuilder loadBalancerBeanDefinition = createBeanBuilder(className); configBuilder.addPropertyValue("loadBalancer", loadBalancerBeanDefinition.getBeanDefinition()); } else { configBuilder.addPropertyReference("loadBalancer", implementation); } } } private void handleNearCache(Node node) { BeanDefinitionBuilder nearCacheConfigBuilder = createBeanBuilder(NearCacheConfig.class); fillAttributeValues(node, nearCacheConfigBuilder); for (Node childNode : childElements(node)) { String nodeName = cleanNodeName(childNode); if ("eviction".equals(nodeName)) { handleEvictionConfig(childNode, nearCacheConfigBuilder, true); } else if ("preloader".equals(nodeName)) { handlePreloaderConfig(childNode, nearCacheConfigBuilder); } } String name = getAttribute(node, "name"); nearCacheConfigMap.put(name, nearCacheConfigBuilder.getBeanDefinition()); } private void handleFlakeIdGenerator(Node node) { BeanDefinitionBuilder configBuilder = createBeanBuilder(ClientFlakeIdGeneratorConfig.class); fillAttributeValues(node, configBuilder); String name = getAttribute(node, "name"); flakeIdGeneratorConfigMap.put(name, configBuilder.getBeanDefinition()); } private void handleReliableTopic(Node node) { BeanDefinitionBuilder configBuilder = createBeanBuilder(ClientReliableTopicConfig.class); String name = getAttribute(node, "name"); fillValues(node, configBuilder); reliableTopicConfigMap.put(name, configBuilder.getBeanDefinition()); } private void handleEvictionConfig(Node node, BeanDefinitionBuilder configBuilder, boolean isNearCache) { configBuilder.addPropertyValue("evictionConfig", getEvictionConfig(node, isNearCache, false)); } private void handlePreloaderConfig(Node node, BeanDefinitionBuilder configBuilder) { configBuilder.addPropertyValue("preloaderConfig", getPreloaderConfig(node)); } private ManagedMap> getQueryCaches(Node childNode) { ManagedMap> queryCaches = new ManagedMap<>(); for (Node queryCacheNode : childElements(childNode)) { parseQueryCache(queryCaches, queryCacheNode); } return queryCaches; } private void parseQueryCache(ManagedMap> queryCaches, Node queryCacheNode) { BeanDefinitionBuilder builder = createBeanBuilder(QueryCacheConfig.class); NamedNodeMap attributes = queryCacheNode.getAttributes(); String mapName = getTextContent(attributes.getNamedItem("map-name")); String cacheName = getTextContent(attributes.getNamedItem("name")); for (Node node : childElements(queryCacheNode)) { String nodeName = cleanNodeName(node); String textContent = getTextContent(node); parseQueryCacheInternal(builder, node, nodeName, textContent); } builder.addPropertyValue("name", cacheName); ManagedMap configMap = queryCaches.get(mapName); if (configMap == null) { configMap = new ManagedMap<>(); queryCaches.put(mapName, configMap); } configMap.put(cacheName, builder.getBeanDefinition()); } @SuppressWarnings({"checkstyle:cyclomaticcomplexity"}) private void parseQueryCacheInternal(BeanDefinitionBuilder builder, Node node, String nodeName, String textContent) { if ("predicate".equals(nodeName)) { BeanDefinitionBuilder predicateBuilder = getPredicate(node, textContent); builder.addPropertyValue("predicateConfig", predicateBuilder.getBeanDefinition()); } else if ("entry-listeners".equals(nodeName)) { ManagedList listeners = getEntryListeners(node); builder.addPropertyValue("entryListenerConfigs", listeners); } else if ("include-value".equals(nodeName)) { builder.addPropertyValue("includeValue", textContent); } else if ("batch-size".equals(nodeName)) { builder.addPropertyValue("batchSize", textContent); } else if ("buffer-size".equals(nodeName)) { builder.addPropertyValue("bufferSize", textContent); } else if ("delay-seconds".equals(nodeName)) { builder.addPropertyValue("delaySeconds", textContent); } else if ("in-memory-format".equals(nodeName)) { String value = textContent.trim(); builder.addPropertyValue("inMemoryFormat", InMemoryFormat.valueOf(upperCaseInternal(value))); } else if ("coalesce".equals(nodeName)) { builder.addPropertyValue("coalesce", textContent); } else if ("populate".equals(nodeName)) { builder.addPropertyValue("populate", textContent); } else if ("serialize-keys".equals(nodeName)) { builder.addPropertyValue("serializeKeys", textContent); } else if ("indexes".equals(nodeName)) { ManagedList indexes = getIndexes(node); builder.addPropertyValue("indexConfigs", indexes); } else if ("eviction".equals(nodeName)) { builder.addPropertyValue("evictionConfig", getEvictionConfig(node, false, false)); } } private BeanDefinitionBuilder getPredicate(Node node, String textContent) { BeanDefinitionBuilder predicateBuilder = createBeanBuilder(PredicateConfig.class); String predicateType = getTextContent(node.getAttributes().getNamedItem("type")); if ("sql".equals(predicateType)) { predicateBuilder.addPropertyValue("sql", textContent); } else if ("class-name".equals(predicateType)) { predicateBuilder.addPropertyValue("className", textContent); } return predicateBuilder; } private ManagedList getIndexes(Node node) { ManagedList indexes = new ManagedList<>(); for (Node indexNode : childElements(node)) { handleIndex(indexes, indexNode); } return indexes; } private ManagedList getEntryListeners(Node node) { ManagedList listeners = new ManagedList<>(); String implementationAttr = "implementation"; for (Node listenerNode : childElements(node)) { BeanDefinitionBuilder listenerConfBuilder = createBeanBuilder(EntryListenerConfig.class); fillAttributeValues(listenerNode, listenerConfBuilder, implementationAttr); Node implementationNode = listenerNode.getAttributes().getNamedItem(implementationAttr); if (implementationNode != null) { listenerConfBuilder.addPropertyReference(implementationAttr, getTextContent(implementationNode)); } listeners.add(listenerConfBuilder.getBeanDefinition()); } return listeners; } private void handleOutboundPorts(Node node, BeanDefinitionBuilder networkConfigBuilder) { ManagedList outboundPorts = new ManagedList<>(); for (Node child : childElements(node)) { String name = cleanNodeName(child); if ("ports".equals(name)) { String value = getTextContent(child); outboundPorts.add(value); } } networkConfigBuilder.addPropertyValue("outboundPortDefinitions", outboundPorts); } private void handleLabels(Node node) { ManagedList labels = new ManagedList<>(); for (Node n : childElements(node)) { String name = cleanNodeName(n); if (!"label".equals(name)) { continue; } String label = getTextContent(n); labels.add(label); } configBuilder.addPropertyValue("labels", labels); } private void handleInstanceTracking(Node node) { BeanDefinitionBuilder configBuilder = createBeanBuilder(InstanceTrackingConfig.class); fillAttributeValues(node, configBuilder); for (Node child : childElements(node)) { final String name = cleanNodeName(child); if ("file-name".equals(name)) { configBuilder.addPropertyValue("fileName", getTextContent(child)); } else if ("format-pattern".equals(name)) { configBuilder.addPropertyValue("formatPattern", getTextContent(child)); } } this.configBuilder.addPropertyValue("instanceTrackingConfig", configBuilder.getBeanDefinition()); } private void handleMetrics(Node node) { BeanDefinitionBuilder metricsConfigBuilder = createBeanBuilder(ClientMetricsConfig.class); fillValues(node, metricsConfigBuilder, "jmx"); Node attrEnabled = node.getAttributes().getNamedItem("enabled"); metricsConfigBuilder.addPropertyValue("enabled", getTextContent(attrEnabled)); for (Node child : childElements(node)) { String nodeName = cleanNodeName(child); if ("jmx".equals(nodeName)) { BeanDefinitionBuilder metricsJmxConfigBuilder = createBeanBuilder(MetricsJmxConfig.class); fillValues(child, metricsJmxConfigBuilder); metricsConfigBuilder.addPropertyValue("jmxConfig", metricsJmxConfigBuilder.getBeanDefinition()); } } configBuilder.addPropertyValue("metricsConfig", metricsConfigBuilder.getBeanDefinition()); } private void handleRealms(Node node, BeanDefinitionBuilder securityConfigBuilder) { ManagedMap realms = new ManagedMap<>(); for (Node child : childElements(node)) { String nodeName = cleanNodeName(child); if ("realm".equals(nodeName)) { realms.put(getAttribute(child, "name"), handleRealm(child, securityConfigBuilder)); } } securityConfigBuilder.addPropertyValue("realmConfigs", realms); } private AbstractBeanDefinition handleRealm(Node node, BeanDefinitionBuilder securityConfigBuilder) { BeanDefinitionBuilder realmConfigBuilder = createBeanBuilder(RealmConfig.class); AbstractBeanDefinition beanDefinition = realmConfigBuilder.getBeanDefinition(); for (Node child : childElements(node)) { String nodeName = cleanNodeName(child); if ("authentication".equals(nodeName)) { handleAuthentication(child, realmConfigBuilder); } } return beanDefinition; } private void handleAuthentication(Node node, BeanDefinitionBuilder realmConfigBuilder) { for (Node child : childElements(node)) { String nodeName = cleanNodeName(child); if ("jaas".equals(nodeName)) { handleLoginModules(child, realmConfigBuilder); } } } private void handleLoginModules(Node node, BeanDefinitionBuilder realmConfigBuilder) { BeanDefinitionBuilder jaasConfigBuilder = createBeanBuilder(JaasAuthenticationConfig.class); AbstractBeanDefinition beanDefinition = jaasConfigBuilder.getBeanDefinition(); List lms = new ManagedList<>(); for (Node child : childElements(node)) { String nodeName = cleanNodeName(child); if ("login-module".equals(nodeName)) { handleLoginModule(child, lms); } } jaasConfigBuilder.addPropertyValue("loginModuleConfigs", lms); realmConfigBuilder.addPropertyValue("jaasAuthenticationConfig", beanDefinition); } private void handleLoginModule(Node node, List list) { BeanDefinitionBuilder lmConfigBuilder = createBeanBuilder(LoginModuleConfig.class); AbstractBeanDefinition beanDefinition = lmConfigBuilder.getBeanDefinition(); fillAttributeValues(node, lmConfigBuilder, "class-name", "implementation"); NamedNodeMap attributes = node.getAttributes(); Node classNameNode = attributes.getNamedItem("class-name"); String className = classNameNode != null ? getTextContent(classNameNode) : null; Node implNode = attributes.getNamedItem("implementation"); String implementation = implNode != null ? getTextContent(implNode) : null; lmConfigBuilder.addPropertyValue("className", className); if (implementation != null) { lmConfigBuilder.addPropertyReference("implementation", implementation); } isTrue(className != null || implementation != null, "One of 'class-name' or 'implementation'" + " attributes is required to create LoginModule!"); for (Node child : childElements(node)) { String nodeName = cleanNodeName(child); if ("properties".equals(nodeName)) { handleProperties(child, lmConfigBuilder); break; } } list.add(beanDefinition); } private void handleSql(Node node) { BeanDefinitionBuilder sqlConfigBuilder = createBeanBuilder(ClientSqlConfig.class); fillValues(node, sqlConfigBuilder); this.configBuilder.addPropertyValue("sqlConfig", sqlConfigBuilder.getBeanDefinition()); } private void handleTpc(Node node) { BeanDefinitionBuilder tpcConfigBuilder = createBeanBuilder(ClientTpcConfig.class); fillAttributeValues(node, tpcConfigBuilder); this.configBuilder.addPropertyValue("tpcConfig", tpcConfigBuilder.getBeanDefinition()); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy