1 /** 2 * Copyright (c) 2004-2011 QOS.ch 3 * All rights reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining 6 * a copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sublicense, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be 14 * included in all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 * 24 */ 25 package org.slf4j.helpers; 26 27 import java.util.concurrent.ConcurrentHashMap; 28 import java.util.concurrent.ConcurrentMap; 29 30 import org.slf4j.IMarkerFactory; 31 import org.slf4j.Marker; 32 33 /** 34 * An almost trivial implementation of the {@link IMarkerFactory} 35 * interface which creates {@link BasicMarker} instances. 36 * 37 * <p>Simple logging systems can conform to the SLF4J API by binding 38 * {@link org.slf4j.MarkerFactory} with an instance of this class. 39 * 40 * @author Ceki Gülcü 41 */ 42 public class BasicMarkerFactory implements IMarkerFactory { 43 44 private final ConcurrentMap<String, Marker> markerMap = new ConcurrentHashMap<String, Marker>(); 45 46 /** 47 * Regular users should <em>not</em> create 48 * <code>BasicMarkerFactory</code> instances. <code>Marker</code> 49 * instances can be obtained using the static {@link 50 * org.slf4j.MarkerFactory#getMarker} method. 51 */ BasicMarkerFactory()52 public BasicMarkerFactory() { 53 } 54 55 /** 56 * Manufacture a {@link BasicMarker} instance by name. If the instance has been 57 * created earlier, return the previously created instance. 58 * 59 * @param name the name of the marker to be created 60 * @return a Marker instance 61 */ getMarker(String name)62 public Marker getMarker(String name) { 63 if (name == null) { 64 throw new IllegalArgumentException("Marker name cannot be null"); 65 } 66 67 Marker marker = markerMap.get(name); 68 if (marker == null) { 69 marker = new BasicMarker(name); 70 Marker oldMarker = markerMap.putIfAbsent(name, marker); 71 if (oldMarker != null) { 72 marker = oldMarker; 73 } 74 } 75 return marker; 76 } 77 78 /** 79 * Does the name marked already exist? 80 */ exists(String name)81 public boolean exists(String name) { 82 if (name == null) { 83 return false; 84 } 85 return markerMap.containsKey(name); 86 } 87 detachMarker(String name)88 public boolean detachMarker(String name) { 89 if (name == null) { 90 return false; 91 } 92 return (markerMap.remove(name) != null); 93 } 94 getDetachedMarker(String name)95 public Marker getDetachedMarker(String name) { 96 return new BasicMarker(name); 97 } 98 99 } 100