    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.config.plugins.visitors;
    019
    020    import java.util.Map;
    021
    022    import org.apache.logging.log4j.core.LogEvent;
    023    import org.apache.logging.log4j.core.config.Configuration;
    024    import org.apache.logging.log4j.core.config.Node;
    025    import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
    026    import org.apache.logging.log4j.core.util.NameUtil;
    027    import org.apache.logging.log4j.util.StringBuilders;
    028
    029    /**
    030     * PluginVisitor implementation for {@link PluginAttribute}.
    031     */
    032    public class PluginAttributeVisitor extends AbstractPluginVisitor<PluginAttribute> {
    033        public PluginAttributeVisitor() {
    034            super(PluginAttribute.class);
    035        }
    036
    037        @Override
    038        public Object visit(final Configuration configuration, final Node node, final LogEvent event,
    039                            final StringBuilder log) {
    040            final String name = this.annotation.value();
    041            final Map<String, String> attributes = node.getAttributes();
    042            final String rawValue = removeAttributeValue(attributes, name, this.aliases);
    043            final String replacedValue = this.substitutor.replace(event, rawValue);
    044            final Object defaultValue = findDefaultValue(event);
    045            final Object value = convert(replacedValue, defaultValue);
    046            final Object debugValue = this.annotation.sensitive() ? NameUtil.md5(value + this.getClass().getName()) : value;
    047            StringBuilders.appendKeyDqValue(log, "name", debugValue);
    048            return value;
    049        }
    050
    051        private Object findDefaultValue(final LogEvent event) {
    052            if (this.conversionType == int.class || this.conversionType == Integer.class) {
    053                return this.annotation.defaultInt();
    054            }
    055            if (this.conversionType == long.class || this.conversionType == Long.class) {
    056                return this.annotation.defaultLong();
    057            }
    058            if (this.conversionType == boolean.class || this.conversionType == Boolean.class) {
    059                return this.annotation.defaultBoolean();
    060            }
    061            if (this.conversionType == float.class || this.conversionType == Float.class) {
    062                return this.annotation.defaultFloat();
    063            }
    064            if (this.conversionType == double.class || this.conversionType == Double.class) {
    065                return this.annotation.defaultDouble();
    066            }
    067            if (this.conversionType == byte.class || this.conversionType == Byte.class) {
    068                return this.annotation.defaultByte();
    069            }
    070            if (this.conversionType == char.class || this.conversionType == Character.class) {
    071                return this.annotation.defaultChar();
    072            }
    073            if (this.conversionType == short.class || this.conversionType == Short.class) {
    074                return this.annotation.defaultShort();
    075            }
    076            if (this.conversionType == Class.class) {
    077                return this.annotation.defaultClass();
    078            }
    079            return this.substitutor.replace(event, this.annotation.defaultString());
    080        }
    081    }