    001    /*
    002     * Licensed to the Apache Software Foundation (ASF) under one or more
    003     * contributor license agreements. See the NOTICE file distributed with
    004     * this work for additional information regarding copyright ownership.
    005     * The ASF licenses this file to You under the Apache license, Version 2.0
    006     * (the "License"); you may not use this file except in compliance with
    007     * the License. You may obtain a copy of the License at
    008     *
    009     *      http://www.apache.org/licenses/LICENSE-2.0
    010     *
    011     * Unless required by applicable law or agreed to in writing, software
    012     * distributed under the License is distributed on an "AS IS" BASIS,
    013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014     * See the license for the specific language governing permissions and
    015     * limitations under the license.
    016     */
    017
    018    package org.apache.logging.log4j.core.util;
    019
    020    import java.io.InvalidObjectException;
    021    import java.io.ObjectInputStream;
    022    import java.io.ObjectStreamException;
    023    import java.io.Serializable;
    024
    025    import org.apache.logging.log4j.core.config.Node;
    026    import org.apache.logging.log4j.core.config.plugins.Plugin;
    027    import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
    028    import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
    029
    030    /**
    031     * Key/Value pair configuration item.
    032     *
    033     * @since 2.1 implements {@link Serializable}
    034     * @since 2.1 implements {@link #hashCode()} and {@link #equals(Object)}
    035     */
    036    @Plugin(name = "KeyValuePair", category = Node.CATEGORY, printObject = true)
    037    public final class KeyValuePair implements Serializable {
    038
    039        private static final long serialVersionUID = 4331228262821046866L;
    040
    041        private final String key;
    042        private final String value;
    043
    044        /**
    045         * Constructs a key/value pair. The constructor should only be called from test classes.
    046         * @param key The key.
    047         * @param value The value.
    048         */
    049        public KeyValuePair(final String key, final String value) {
    050            this.key = key;
    051            this.value = value;
    052        }
    053
    054        /**
    055         * Returns the key.
    056         * @return the key.
    057         */
    058        public String getKey() {
    059            return key;
    060        }
    061
    062        /**
    063         * Returns the value.
    064         * @return The value.
    065         */
    066        public String getValue() {
    067            return value;
    068        }
    069
    070        @Override
    071        public String toString() {
    072            return key + '=' + value;
    073        }
    074
    075        @PluginBuilderFactory
    076        public static Builder newBuilder() {
    077            return new Builder();
    078        }
    079
    080        protected Object writeReplace() throws ObjectStreamException {
    081            return newBuilder().setKey(this.key).setValue(this.value);
    082        }
    083
    084        private void readObject(final ObjectInputStream stream) throws InvalidObjectException {
    085            throw new InvalidObjectException("Builder proxy required");
    086        }
    087
    088        public static class Builder implements org.apache.logging.log4j.core.util.Builder<KeyValuePair>, Serializable {
    089
    090            private static final long serialVersionUID = 1L;
    091
    092            @PluginBuilderAttribute
    093            private String key;
    094
    095            @PluginBuilderAttribute
    096            private String value;
    097
    098            public Builder setKey(final String key) {
    099                this.key = key;
    100                return this;
    101            }
    102
    103            public Builder setValue(final String value) {
    104                this.value = value;
    105                return this;
    106            }
    107
    108            @Override
    109            public KeyValuePair build() {
    110                return new KeyValuePair(key, value);
    111            }
    112
    113            protected Object readResolve() throws ObjectStreamException {
    114                return new KeyValuePair(key, value);
    115            }
    116        }
    117
    118        @Override
    119        public int hashCode() {
    120            final int prime = 31;
    121            int result = 1;
    122            result = prime * result + ((key == null) ? 0 : key.hashCode());
    123            result = prime * result + ((value == null) ? 0 : value.hashCode());
    124            return result;
    125        }
    126
    127        @Override
    128        public boolean equals(final Object obj) {
    129            if (this == obj) {
    130                return true;
    131            }
    132            if (obj == null) {
    133                return false;
    134            }
    135            if (getClass() != obj.getClass()) {
    136                return false;
    137            }
    138            final KeyValuePair other = (KeyValuePair) obj;
    139            if (key == null) {
    140                if (other.key != null) {
    141                    return false;
    142                }
    143            } else if (!key.equals(other.key)) {
    144                return false;
    145            }
    146            if (value == null) {
    147                if (other.value != null) {
    148                    return false;
    149                }
    150            } else if (!value.equals(other.value)) {
    151                return false;
    152            }
    153            return true;
    154        }
    155    }