    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    }