17ba0605dc97fb81bde8311510d27b3ccba170008Ceki Gulcu/**
27ba0605dc97fb81bde8311510d27b3ccba170008Ceki Gulcu * Copyright (c) 2004-2011 QOS.ch
388c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * All rights reserved.
47ba0605dc97fb81bde8311510d27b3ccba170008Ceki Gulcu *
588c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * Permission is hereby granted, free  of charge, to any person obtaining
688c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * a  copy  of this  software  and  associated  documentation files  (the
788c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * "Software"), to  deal in  the Software without  restriction, including
888c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * without limitation  the rights to  use, copy, modify,  merge, publish,
988c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * distribute,  sublicense, and/or sell  copies of  the Software,  and to
1088c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * permit persons to whom the Software  is furnished to do so, subject to
1188c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * the following conditions:
127ba0605dc97fb81bde8311510d27b3ccba170008Ceki Gulcu *
1388c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * The  above  copyright  notice  and  this permission  notice  shall  be
1488c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * included in all copies or substantial portions of the Software.
157ba0605dc97fb81bde8311510d27b3ccba170008Ceki Gulcu *
1688c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
1788c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
1888c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
1988c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
2088c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
2188c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
2288c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
237ba0605dc97fb81bde8311510d27b3ccba170008Ceki Gulcu *
2488c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu */
2588c4c456766193e012eb890e2208473d99b91f83Ceki Gulcupackage org.slf4j.helpers;
2688c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu
273b0b4c8003115ec7bea359aff081bee98bcb870eMikhail Mazurskyimport java.util.concurrent.ConcurrentHashMap;
283b0b4c8003115ec7bea359aff081bee98bcb870eMikhail Mazurskyimport java.util.concurrent.ConcurrentMap;
2988c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu
3088c4c456766193e012eb890e2208473d99b91f83Ceki Gulcuimport org.slf4j.IMarkerFactory;
3188c4c456766193e012eb890e2208473d99b91f83Ceki Gulcuimport org.slf4j.Marker;
3288c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu
3388c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu/**
3488c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * An almost trivial implementation of the {@link IMarkerFactory}
3588c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * interface which creates {@link BasicMarker} instances.
3688c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu *
379f10490a05f7344f4b3ef657e8991f5d51934e2fCeki Gulcu * <p>Simple logging systems can conform to the SLF4J API by binding
3888c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * {@link org.slf4j.MarkerFactory} with an instance of this class.
3988c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu *
4088c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu * @author Ceki G&uuml;lc&uuml;
4188c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu */
4288c4c456766193e012eb890e2208473d99b91f83Ceki Gulcupublic class BasicMarkerFactory implements IMarkerFactory {
4388c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu
4431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu    private final ConcurrentMap<String, Marker> markerMap = new ConcurrentHashMap<String, Marker>();
4588c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu
4631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu    /**
4731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu     * Regular users should <em>not</em> create
4831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu     * <code>BasicMarkerFactory</code> instances. <code>Marker</code>
4931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu     * instances can be obtained using the static {@link
5031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu     * org.slf4j.MarkerFactory#getMarker} method.
5131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu     */
5231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu    public BasicMarkerFactory() {
5388c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu    }
5488c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu
5531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu    /**
5631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu     * Manufacture a {@link BasicMarker} instance by name. If the instance has been
5731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu     * created earlier, return the previously created instance.
5831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu     *
5931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu     * @param name the name of the marker to be created
6031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu     * @return a Marker instance
6131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu     */
6231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu    public Marker getMarker(String name) {
6331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu        if (name == null) {
6431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu            throw new IllegalArgumentException("Marker name cannot be null");
6531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu        }
6631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu
6731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu        Marker marker = markerMap.get(name);
6831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu        if (marker == null) {
6931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu            marker = new BasicMarker(name);
7031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu            Marker oldMarker = markerMap.putIfAbsent(name, marker);
7131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu            if (oldMarker != null) {
7231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu                marker = oldMarker;
7331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu            }
7431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu        }
7531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu        return marker;
7631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu    }
7731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu
7831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu    /**
7931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu     * Does the name marked already exist?
8031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu     */
8131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu    public boolean exists(String name) {
8231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu        if (name == null) {
8331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu            return false;
8431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu        }
8531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu        return markerMap.containsKey(name);
8688c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu    }
8731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu
8831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu    public boolean detachMarker(String name) {
8931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu        if (name == null) {
9031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu            return false;
9131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu        }
9231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu        return (markerMap.remove(name) != null);
9388c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu    }
9488c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu
9531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu    public Marker getDetachedMarker(String name) {
9631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu        return new BasicMarker(name);
9788c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu    }
9888c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu
9988c4c456766193e012eb890e2208473d99b91f83Ceki Gulcu}
100