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.Collections; 28 import java.util.Iterator; 29 import java.util.List; 30 import java.util.Vector; 31 32 import org.slf4j.Marker; 33 34 /** 35 * A simple implementation of the {@link Marker} interface. 36 * 37 * @author Ceki Gülcü 38 * @author Joern Huxhorn 39 */ 40 public class BasicMarker implements Marker { 41 42 private static final long serialVersionUID = 1803952589649545191L; 43 44 private final String name; 45 private List<Marker> referenceList; 46 BasicMarker(String name)47 BasicMarker(String name) { 48 if (name == null) { 49 throw new IllegalArgumentException("A marker name cannot be null"); 50 } 51 this.name = name; 52 } 53 getName()54 public String getName() { 55 return name; 56 } 57 add(Marker reference)58 public synchronized void add(Marker reference) { 59 if (reference == null) { 60 throw new IllegalArgumentException("A null value cannot be added to a Marker as reference."); 61 } 62 63 // no point in adding the reference multiple times 64 if (this.contains(reference)) { 65 return; 66 67 } else if (reference.contains(this)) { // avoid recursion 68 // a potential reference should not its future "parent" as a reference 69 return; 70 } else { 71 // let's add the reference 72 if (referenceList == null) { 73 referenceList = new Vector<Marker>(); 74 } 75 referenceList.add(reference); 76 } 77 78 } 79 hasReferences()80 public synchronized boolean hasReferences() { 81 return ((referenceList != null) && (referenceList.size() > 0)); 82 } 83 hasChildren()84 public boolean hasChildren() { 85 return hasReferences(); 86 } 87 iterator()88 public synchronized Iterator<Marker> iterator() { 89 if (referenceList != null) { 90 return referenceList.iterator(); 91 } else { 92 List<Marker> emptyList = Collections.emptyList(); 93 return emptyList.iterator(); 94 } 95 } 96 remove(Marker referenceToRemove)97 public synchronized boolean remove(Marker referenceToRemove) { 98 if (referenceList == null) { 99 return false; 100 } 101 102 int size = referenceList.size(); 103 for (int i = 0; i < size; i++) { 104 Marker m = (Marker) referenceList.get(i); 105 if (referenceToRemove.equals(m)) { 106 referenceList.remove(i); 107 return true; 108 } 109 } 110 return false; 111 } 112 contains(Marker other)113 public boolean contains(Marker other) { 114 if (other == null) { 115 throw new IllegalArgumentException("Other cannot be null"); 116 } 117 118 if (this.equals(other)) { 119 return true; 120 } 121 122 if (hasReferences()) { 123 for (int i = 0; i < referenceList.size(); i++) { 124 Marker ref = (Marker) referenceList.get(i); 125 if (ref.contains(other)) { 126 return true; 127 } 128 } 129 } 130 return false; 131 } 132 133 /** 134 * This method is mainly used with Expression Evaluators. 135 */ contains(String name)136 public boolean contains(String name) { 137 if (name == null) { 138 throw new IllegalArgumentException("Other cannot be null"); 139 } 140 141 if (this.name.equals(name)) { 142 return true; 143 } 144 145 if (hasReferences()) { 146 for (int i = 0; i < referenceList.size(); i++) { 147 Marker ref = (Marker) referenceList.get(i); 148 if (ref.contains(name)) { 149 return true; 150 } 151 } 152 } 153 return false; 154 } 155 156 private static String OPEN = "[ "; 157 private static String CLOSE = " ]"; 158 private static String SEP = ", "; 159 equals(Object obj)160 public boolean equals(Object obj) { 161 if (this == obj) 162 return true; 163 if (obj == null) 164 return false; 165 if (!(obj instanceof Marker)) 166 return false; 167 168 final Marker other = (Marker) obj; 169 return name.equals(other.getName()); 170 } 171 hashCode()172 public int hashCode() { 173 return name.hashCode(); 174 } 175 toString()176 public String toString() { 177 if (!this.hasReferences()) { 178 return this.getName(); 179 } 180 Iterator<Marker> it = this.iterator(); 181 Marker reference; 182 StringBuilder sb = new StringBuilder(this.getName()); 183 sb.append(' ').append(OPEN); 184 while (it.hasNext()) { 185 reference = (Marker) it.next(); 186 sb.append(reference.getName()); 187 if (it.hasNext()) { 188 sb.append(SEP); 189 } 190 } 191 sb.append(CLOSE); 192 193 return sb.toString(); 194 } 195 } 196