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.PluginAttr;
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", type = "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(Node node, String appenderRef, 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            StringBuilder sb = new StringBuilder("Route(");
071            sb.append("type=");
072            if (appenderRef != null) {
073                sb.append("static Reference=").append(appenderRef);
074            } else {
075                sb.append("dynamic");
076            }
077            if (key != null) {
078                sb.append(" key='").append(key).append("'");
079            } else {
080                sb.append(" default");
081            }
082            sb.append(")");
083            return sb.toString();
084        }
085    
086        /**
087         * Create the Route.
088         * @param appenderRef The Appender reference.
089         * @param key The key.
090         * @param node The Node.
091         * @return A Route.
092         */
093        @PluginFactory
094        public static Route createRoute(@PluginAttr("ref") String appenderRef,
095                                        @PluginAttr("key") String key,
096                                        @PluginNode Node node) {
097            if (node != null && node.hasChildren()) {
098                for (Node child : node.getChildren()) {
099    
100                }
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    }