
com.hazelcast.config.ConfigXmlGenerator 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.config;
import com.hazelcast.internal.util.MapUtil;
import java.util.ArrayDeque;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
/**
* The ConfigXmlGenerator is responsible for transforming a {@link com.hazelcast.client.config.ClientConfig}
* to a Hazelcast XML string.
*/
@SuppressWarnings({"checkstyle:methodcount"})
public class ConfigXmlGenerator {
/**
* Mask to hide the sensitive values in configuration.
*/
public static final String MASK_FOR_SENSITIVE_DATA = "****";
private ConfigXmlGenerator() {
}
/**
* Utility class to build xml using a {@link StringBuilder}.
*/
public static final class XmlGenerator {
private static final int CAPACITY = 64;
private final StringBuilder xml;
private final ArrayDeque openNodes = new ArrayDeque<>();
public XmlGenerator(StringBuilder xml) {
this.xml = xml;
}
public XmlGenerator open(String name, Object... attributes) {
appendOpenNode(xml, name, attributes);
openNodes.addLast(name);
return this;
}
public XmlGenerator node(String name, Object contents, Object... attributes) {
appendNode(xml, name, contents, attributes);
return this;
}
public XmlGenerator nodeIfContents(String name, Object contents, Object... attributes) {
if (contents != null) {
appendNode(xml, name, contents, attributes);
}
return this;
}
public XmlGenerator close() {
appendCloseNode(xml, openNodes.pollLast());
return this;
}
public XmlGenerator appendLabels(Set labels) {
if (!labels.isEmpty()) {
open("client-labels");
for (String label : labels) {
node("label", label);
}
close();
}
return this;
}
public XmlGenerator appendProperties(Properties props) {
if (!props.isEmpty()) {
open("properties");
Set keys = props.keySet();
for (Object key : keys) {
node("property", props.getProperty(key.toString()), "name", key.toString());
}
close();
}
return this;
}
public XmlGenerator appendProperties(Map props) {
if (!MapUtil.isNullOrEmpty(props)) {
open("properties");
for (Map.Entry entry : props.entrySet()) {
node("property", entry.getValue(), "name", entry.getKey());
}
close();
}
return this;
}
private static void appendOpenNode(StringBuilder xml, String name, Object... attributes) {
xml.append('<').append(name);
appendAttributes(xml, attributes);
xml.append('>');
}
private static void appendCloseNode(StringBuilder xml, String name) {
xml.append("").append(name).append('>');
}
private static void appendNode(StringBuilder xml, String name, Object contents, Object... attributes) {
if (contents != null || attributes.length > 0) {
xml.append('<').append(name);
appendAttributes(xml, attributes);
if (contents != null) {
xml.append('>');
escapeXml(contents, xml);
xml.append("").append(name).append('>');
} else {
xml.append("/>");
}
}
}
private static void appendAttributes(StringBuilder xml, Object... attributes) {
for (int i = 0; i < attributes.length; ) {
Object attributeName = attributes[i++];
Object attributeValue = attributes[i++];
if (attributeValue == null) {
continue;
}
xml.append(" ").append(attributeName).append("=\"");
escapeXmlAttr(attributeValue, xml);
xml.append("\"");
}
}
/**
* Escapes special characters in XML element contents and appends the result to appendTo
.
*/
private static void escapeXml(Object o, StringBuilder appendTo) {
if (o == null) {
appendTo.append("null");
return;
}
String s = o.toString();
int length = s.length();
appendTo.ensureCapacity(appendTo.length() + length + CAPACITY);
for (int i = 0; i < length; i++) {
char ch = s.charAt(i);
if (ch == '<') {
appendTo.append("<");
} else if (ch == '&') {
appendTo.append("&");
} else {
appendTo.append(ch);
}
}
}
/**
* Escapes special characters in XML attribute value and appends the result to appendTo
.
*/
private static void escapeXmlAttr(Object o, StringBuilder appendTo) {
if (o == null) {
appendTo.append("null");
return;
}
String s = o.toString();
int length = s.length();
appendTo.ensureCapacity(appendTo.length() + length + CAPACITY);
for (int i = 0; i < length; i++) {
char ch = s.charAt(i);
switch (ch) {
case '\n':
appendTo.append("
");
break;
case '\r':
appendTo.append("
");
break;
case '"':
appendTo.append(""");
break;
case '\'':
appendTo.append("'");
break;
case '&':
appendTo.append("&");
break;
case '<':
appendTo.append("<");
break;
default:
appendTo.append(ch);
}
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy