| /* |
| * 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 |
| * |
| * https://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.commons.configuration2.tree; |
| |
| import org.apache.commons.lang3.builder.EqualsBuilder; |
| import org.apache.commons.lang3.builder.HashCodeBuilder; |
| import org.apache.commons.lang3.builder.ToStringBuilder; |
| |
| /** |
| * <p> |
| * A class representing the various symbols that are supported in keys recognized by {@link DefaultExpressionEngine}. |
| * </p> |
| * <p> |
| * An instance of this class is associated with each instance of {@code DefaultExpressionEngine}. It determines which |
| * concrete symbols are used to define elements like separators, attributes, etc. within a configuration key. |
| * </p> |
| * <p> |
| * Instances are created using the nested {@code Builder} class. They are immutable and can be shared between arbitrary |
| * components. |
| * </p> |
| * |
| * @since 2.0 |
| */ |
| public final class DefaultExpressionEngineSymbols { |
| |
| /** |
| * A builder class for creating instances of {@code DefaultExpressionEngineSymbols}. |
| */ |
| public static class Builder { |
| |
| /** Stores the property delimiter. */ |
| private String propertyDelimiter; |
| |
| /** Stores the escaped property delimiter. */ |
| private String escapedDelimiter; |
| |
| /** Stores the attribute start marker. */ |
| private String attributeStart; |
| |
| /** Stores the attribute end marker. */ |
| private String attributeEnd; |
| |
| /** Stores the index start marker. */ |
| private String indexStart; |
| |
| /** Stores the index end marker. */ |
| private String indexEnd; |
| |
| /** |
| * Creates a new, uninitialized instance of {@code Builder}. All symbols are undefined. |
| */ |
| public Builder() { |
| } |
| |
| /** |
| * Creates a new instance of {@code Builder} whose properties are initialized from the passed in |
| * {@code DefaultExpressionEngineSymbols} object. This is useful if symbols are to be created which are similar to the |
| * passed in instance. |
| * |
| * @param c the {@code DefaultExpressionEngineSymbols} object serving as starting point for this builder |
| */ |
| public Builder(final DefaultExpressionEngineSymbols c) { |
| propertyDelimiter = c.getPropertyDelimiter(); |
| escapedDelimiter = c.getEscapedDelimiter(); |
| indexStart = c.getIndexStart(); |
| indexEnd = c.getIndexEnd(); |
| attributeStart = c.getAttributeStart(); |
| attributeEnd = c.getAttributeEnd(); |
| } |
| |
| /** |
| * Creates the {@code DefaultExpressionEngineSymbols} instance based on the properties set for this builder object. This |
| * method does not change the state of this builder. So it is possible to change properties and create another |
| * {@code DefaultExpressionEngineSymbols} instance. |
| * |
| * @return the newly created {@code DefaultExpressionEngineSymbols} instance |
| */ |
| public DefaultExpressionEngineSymbols create() { |
| return new DefaultExpressionEngineSymbols(this); |
| } |
| |
| /** |
| * Sets the string representing the end marker of an attribute in a property key. |
| * |
| * @param attributeEnd the attribute end marker |
| * @return a reference to this object for method chaining |
| */ |
| public Builder setAttributeEnd(final String attributeEnd) { |
| this.attributeEnd = attributeEnd; |
| return this; |
| } |
| |
| /** |
| * Sets the string representing the start marker of an attribute in a property key. Attribute start and end marker are |
| * used together to detect attributes in a property key. |
| * |
| * @param attributeStart the attribute start marker |
| * @return a reference to this object for method chaining |
| */ |
| public Builder setAttributeStart(final String attributeStart) { |
| this.attributeStart = attributeStart; |
| return this; |
| } |
| |
| /** |
| * Sets the string representing an escaped property delimiter. With this string a delimiter that belongs to the key of a |
| * property can be escaped. If for instance "." is used as property delimiter, you can set the escaped |
| * delimiter to "\." and can then escape the delimiter with a back slash. |
| * |
| * @param escapedDelimiter the escaped property delimiter |
| * @return a reference to this object for method chaining |
| */ |
| public Builder setEscapedDelimiter(final String escapedDelimiter) { |
| this.escapedDelimiter = escapedDelimiter; |
| return this; |
| } |
| |
| /** |
| * Sets the string representing the end of an index in a property key. |
| * |
| * @param indexEnd the index end |
| * @return a reference to this object for method chaining |
| */ |
| public Builder setIndexEnd(final String indexEnd) { |
| this.indexEnd = indexEnd; |
| return this; |
| } |
| |
| /** |
| * Sets the string representing the start of an index in a property key. Index start and end marker are used together to |
| * detect indices in a property key. |
| * |
| * @param is the index start |
| * @return a reference to this object for method chaining |
| */ |
| public Builder setIndexStart(final String is) { |
| this.indexStart = is; |
| return this; |
| } |
| |
| /** |
| * Sets the string representing a delimiter for properties. |
| * |
| * @param propertyDelimiter the property delimiter |
| * @return a reference to this object for method chaining |
| */ |
| public Builder setPropertyDelimiter(final String propertyDelimiter) { |
| this.propertyDelimiter = propertyDelimiter; |
| return this; |
| } |
| } |
| |
| /** Constant for the default property delimiter. */ |
| public static final String DEFAULT_PROPERTY_DELIMITER = "."; |
| |
| /** Constant for the default escaped property delimiter. */ |
| public static final String DEFAULT_ESCAPED_DELIMITER = DEFAULT_PROPERTY_DELIMITER + DEFAULT_PROPERTY_DELIMITER; |
| |
| /** Constant for the default attribute start marker. */ |
| public static final String DEFAULT_ATTRIBUTE_START = "[@"; |
| |
| /** Constant for the default attribute end marker. */ |
| public static final String DEFAULT_ATTRIBUTE_END = "]"; |
| |
| /** Constant for the default index start marker. */ |
| public static final String DEFAULT_INDEX_START = "("; |
| |
| /** Constant for the default index end marker. */ |
| public static final String DEFAULT_INDEX_END = ")"; |
| |
| /** |
| * An instance with default symbols. This instance is used by the default instance of {@code DefaultExpressionEngine}. |
| */ |
| public static final DefaultExpressionEngineSymbols DEFAULT_SYMBOLS = createDefaultSmybols(); |
| |
| /** |
| * Creates the {@code DefaultExpressionEngineSymbols} object with default symbols. |
| * |
| * @return the default symbols instance |
| */ |
| private static DefaultExpressionEngineSymbols createDefaultSmybols() { |
| return new Builder().setPropertyDelimiter(DEFAULT_PROPERTY_DELIMITER).setEscapedDelimiter(DEFAULT_ESCAPED_DELIMITER).setIndexStart(DEFAULT_INDEX_START) |
| .setIndexEnd(DEFAULT_INDEX_END).setAttributeStart(DEFAULT_ATTRIBUTE_START).setAttributeEnd(DEFAULT_ATTRIBUTE_END).create(); |
| } |
| |
| /** Stores the property delimiter. */ |
| private final String propertyDelimiter; |
| |
| /** Stores the escaped property delimiter. */ |
| private final String escapedDelimiter; |
| |
| /** Stores the attribute start marker. */ |
| private final String attributeStart; |
| |
| /** Stores the attribute end marker. */ |
| private final String attributeEnd; |
| |
| /** Stores the index start marker. */ |
| private final String indexStart; |
| |
| /** Stores the index end marker. */ |
| private final String indexEnd; |
| |
| /** |
| * Creates a new instance of {@code DefaultExpressionEngineSymbols}. |
| * |
| * @param b the builder for defining the properties of this instance |
| */ |
| private DefaultExpressionEngineSymbols(final Builder b) { |
| propertyDelimiter = b.propertyDelimiter; |
| escapedDelimiter = b.escapedDelimiter; |
| indexStart = b.indexStart; |
| indexEnd = b.indexEnd; |
| attributeStart = b.attributeStart; |
| attributeEnd = b.attributeEnd; |
| } |
| |
| /** |
| * Compares this object with another one. Two instances of {@code DefaultExpressionEngineSymbols} are considered equal |
| * if all of their properties are equal. |
| * |
| * @param obj the object to compare to |
| * @return a flag whether these objects are equal |
| */ |
| @Override |
| public boolean equals(final Object obj) { |
| if (this == obj) { |
| return true; |
| } |
| if (!(obj instanceof DefaultExpressionEngineSymbols)) { |
| return false; |
| } |
| |
| final DefaultExpressionEngineSymbols c = (DefaultExpressionEngineSymbols) obj; |
| return new EqualsBuilder().append(getPropertyDelimiter(), c.getPropertyDelimiter()).append(getEscapedDelimiter(), c.getEscapedDelimiter()) |
| .append(getIndexStart(), c.getIndexStart()).append(getIndexEnd(), c.getIndexEnd()).append(getAttributeStart(), c.getAttributeStart()) |
| .append(getAttributeEnd(), c.getAttributeEnd()).isEquals(); |
| } |
| |
| /** |
| * Gets the string representing an attribute end marker. |
| * |
| * @return the attribute end marker |
| */ |
| public String getAttributeEnd() { |
| return attributeEnd; |
| } |
| |
| /** |
| * Gets the string representing an attribute start marker. |
| * |
| * @return the attribute start marker |
| */ |
| public String getAttributeStart() { |
| return attributeStart; |
| } |
| |
| /** |
| * Gets the string representing an escaped property delimiter. |
| * |
| * @return the escaped property delimiter |
| */ |
| public String getEscapedDelimiter() { |
| return escapedDelimiter; |
| } |
| |
| /** |
| * Gets the string representing the end of an index in a property key. |
| * |
| * @return the index end marker |
| */ |
| public String getIndexEnd() { |
| return indexEnd; |
| } |
| |
| /** |
| * Gets the string representing the start of an index in a property key. |
| * |
| * @return the index start marker |
| */ |
| public String getIndexStart() { |
| return indexStart; |
| } |
| |
| /** |
| * Gets the string used as delimiter in property keys. |
| * |
| * @return the property delimiter |
| */ |
| public String getPropertyDelimiter() { |
| return propertyDelimiter; |
| } |
| |
| /** |
| * Returns a hash code for this object. |
| * |
| * @return a hash code |
| */ |
| @Override |
| public int hashCode() { |
| return new HashCodeBuilder().append(getPropertyDelimiter()).append(getEscapedDelimiter()).append(getIndexStart()).append(getIndexEnd()) |
| .append(getAttributeStart()).append(getAttributeEnd()).toHashCode(); |
| } |
| |
| /** |
| * Returns a string representation for this object. This string contains the values of all properties. |
| * |
| * @return a string for this object |
| */ |
| @Override |
| public String toString() { |
| return new ToStringBuilder(this).append("propertyDelimiter", getPropertyDelimiter()).append("escapedDelimiter", getEscapedDelimiter()) |
| .append("indexStart", getIndexStart()).append("indexEnd", getIndexEnd()).append("attributeStart", getAttributeStart()) |
| .append("attributeEnd", getAttributeEnd()).toString(); |
| } |
| } |