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    package org.apache.logging.log4j.core.appender.routing;
018    
019    import org.apache.logging.log4j.Logger;
020    import org.apache.logging.log4j.core.config.Node;
021    import org.apache.logging.log4j.core.config.plugins.Plugin;
022    import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
023    import org.apache.logging.log4j.core.config.plugins.PluginFactory;
024    import org.apache.logging.log4j.core.config.plugins.PluginNode;
025    import org.apache.logging.log4j.status.StatusLogger;
026    
027    /**
028     * A Route to an appender.
029     */
030    @Plugin(name = "Route", category = "Core", printObject = true, deferChildren = true)
031    public final class Route {
032        private static final Logger LOGGER = StatusLogger.getLogger();
033    
034        private final Node node;
035        private final String appenderRef;
036        private final String key;
037    
038        private Route(final Node node, final String appenderRef, final String key) {
039            this.node = node;
040            this.appenderRef = appenderRef;
041            this.key = key;
042        }
043    
044        /**
045         * Returns the Dynamic Appender Node.
046         * @return The Node.
047         */
048        public Node getNode() {
049            return node;
050        }
051    
052        /**
053         * Returns the appender reference.
054         * @return The Appender reference.
055         */
056        public String getAppenderRef() {
057            return appenderRef;
058        }
059    
060        /**
061         * Returns the key for this Route.
062         * @return the key for this Route.
063         */
064        public String getKey() {
065            return key;
066        }
067    
068        @Override
069        public String toString() {
070            final StringBuilder sb = new StringBuilder("Route(");
071            sb.append("type=");
072            if (appenderRef != null) {
073                sb.append("static Reference=").append(appenderRef);
074            } else if (node != null) {
075                sb.append("dynamic - type=").append(node.getName());
076            } else {
077                sb.append("invalid Route");
078            }
079            if (key != null) {
080                sb.append(" key='").append(key).append('\'');
081            } else {
082                sb.append(" default");
083            }
084            sb.append(')');
085            return sb.toString();
086        }
087    
088        /**
089         * Create the Route.
090         * @param appenderRef The Appender reference.
091         * @param key The key.
092         * @param node The Node.
093         * @return A Route.
094         */
095        @PluginFactory
096        public static Route createRoute(
097                @PluginAttribute("ref") final String appenderRef,
098                @PluginAttribute("key") final String key,
099                @PluginNode final Node node) {
100            if (node != null && node.hasChildren()) {
101                if (appenderRef != null) {
102                    LOGGER.error("A route cannot be configured with an appender reference and an appender definition");
103                    return null;
104                }
105            } else {
106                if (appenderRef == null) {
107                    LOGGER.error("A route must specify an appender reference or an appender definition");
108                    return null;
109                }
110            }
111            return new Route(node, appenderRef, key);
112        }
113    }