001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied.  See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019package org.apache.shiro.web.servlet;
020
021import org.apache.shiro.util.Nameable;
022
023import javax.servlet.FilterConfig;
024
025/**
026 * Allows a filter to be named via JavaBeans-compatible
027 * {@link #getName()}/{@link #setName(String)} methods.  If no name is specified, the name of the filter will
028 * default to the name given to it in {@code web.xml} (the {@code FilterConfig}'s
029 * {@link javax.servlet.FilterConfig#getFilterName() filterName}).
030 *
031 * @since 1.0
032 */
033public abstract class NameableFilter extends AbstractFilter implements Nameable {
034
035    /**
036     * The name of this filter, unique within an application.
037     */
038    private String name;
039
040    /**
041     * Returns the filter's name.
042     * <p/>
043     * Unless overridden by calling the {@link #setName(String) setName(String)} method, this value defaults to the
044     * filter name as specified by the servlet container at start-up:
045     * <pre>
046     * this.name = {@link #getFilterConfig() getFilterConfig()}.{@link javax.servlet.FilterConfig#getFilterName() getName()};</pre>
047     *
048     * @return the filter name, or {@code null} if none available
049     * @see javax.servlet.GenericServlet#getServletName()
050     * @see javax.servlet.FilterConfig#getFilterName()
051     */
052    protected String getName() {
053        if (this.name == null) {
054            FilterConfig config = getFilterConfig();
055            if (config != null) {
056                this.name = config.getFilterName();
057            }
058        }
059
060        return this.name;
061    }
062
063    /**
064     * Sets the filter's name.
065     * <p/>
066     * Unless overridden by calling this method, this value defaults to the filter name as specified by the
067     * servlet container at start-up:
068     * <pre>
069     * this.name = {@link #getFilterConfig() getFilterConfig()}.{@link javax.servlet.FilterConfig#getFilterName() getName()};</pre>
070     *
071     * @param name the name of the filter.
072     */
073    public void setName(String name) {
074        this.name = name;
075    }
076
077    /**
078     * Returns a StringBuilder instance with the {@link #getName() name}, or if the name is {@code null}, just the
079     * {@code super.toStringBuilder()} instance.
080     *
081     * @return a StringBuilder instance to use for appending String data that will eventually be returned from a
082     *         {@code toString()} invocation.
083     */
084    protected StringBuilder toStringBuilder() {
085        String name = getName();
086        if (name == null) {
087            return super.toStringBuilder();
088        } else {
089            StringBuilder sb = new StringBuilder();
090            sb.append(name);
091            return sb;
092        }
093    }
094
095}