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    }