001: /*
002: * Copyright (c) 2004-2007 QOS.ch
003: * All rights reserved.
004: *
005: * Permission is hereby granted, free of charge, to any person obtaining
006: * a copy of this software and associated documentation files (the
007: * "Software"), to deal in the Software without restriction, including
008: * without limitation the rights to use, copy, modify, merge, publish,
009: * distribute, sublicense, and/or sell copies of the Software, and to
010: * permit persons to whom the Software is furnished to do so, subject to
011: * the following conditions:
012: *
013: * The above copyright notice and this permission notice shall be
014: * included in all copies or substantial portions of the Software.
015: *
016: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
017: * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
018: * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
019: * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
020: * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
021: * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
022: * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
023: */
024:
025: package org.slf4j.helpers;
026:
027: import java.util.Collections;
028: import java.util.Iterator;
029: import java.util.List;
030: import java.util.Vector;
031:
032: import org.slf4j.Marker;
033:
034: /**
035: * An almost trivial implementation of the {@link Marker} interface.
036: *
037: * <p>
038: * <code>BasicMarker</code> lets users specify marker information. However, it
039: * does not offer any useful operations on that information.
040: *
041: * <p>
042: * Simple logging systems which ignore marker data, just return instances of
043: * this class in order to conform to the SLF4J API.
044: *
045: * @author Ceki Gülcü
046: * @author Joern Huxhorn
047: */
048: public class BasicMarker implements Marker {
049:
050: private static final long serialVersionUID = 1803952589649545191L;
051:
052: final String name;
053: List children;
054:
055: BasicMarker(String name) {
056: this .name = name;
057: }
058:
059: public String getName() {
060: return name;
061: }
062:
063: public synchronized void add(Marker child) {
064: if (child == null) {
065: throw new NullPointerException(
066: "Null children cannot be added to a Marker.");
067: }
068: if (children == null) {
069: children = new Vector();
070: }
071:
072: // no point in adding the child multiple times
073: if (children.contains(child)) {
074: return;
075: } else {
076: // add the child
077: children.add(child);
078: }
079:
080: }
081:
082: public synchronized boolean hasChildren() {
083: return ((children != null) && (children.size() > 0));
084: }
085:
086: public synchronized Iterator iterator() {
087: if (children != null) {
088: return children.iterator();
089: } else {
090: return Collections.EMPTY_LIST.iterator();
091: }
092: }
093:
094: public synchronized boolean remove(Marker markerToRemove) {
095: if (children == null) {
096: return false;
097: }
098:
099: int size = children.size();
100: for (int i = 0; i < size; i++) {
101: Marker m = (Marker) children.get(i);
102: if (m == markerToRemove) {
103: children.remove(i);
104: return true;
105: }
106: }
107: // could not find markerToRemove
108: return false;
109: }
110:
111: public boolean contains(Marker other) {
112: if (other == null) {
113: throw new IllegalArgumentException("Other cannot be null");
114: }
115:
116: if (this == other) {
117: return true;
118: }
119:
120: if (hasChildren()) {
121: for (int i = 0; i < children.size(); i++) {
122: Marker child = (Marker) children.get(i);
123: if (child.contains(other)) {
124: return true;
125: }
126: }
127: }
128: return false;
129: }
130:
131: /**
132: * This method is mainly used with Expression Evaluators.
133: */
134: public boolean contains(String name) {
135: if (name == null) {
136: throw new IllegalArgumentException("Other cannot be null");
137: }
138:
139: if (this .name.equals(name)) {
140: return true;
141: }
142:
143: if (hasChildren()) {
144: for (int i = 0; i < children.size(); i++) {
145: Marker child = (Marker) children.get(i);
146: if (child.contains(name)) {
147: return true;
148: }
149: }
150: }
151: return false;
152: }
153:
154: private static String OPEN = "[ ";
155: private static String CLOSE = " ]";
156: private static String SEP = ", ";
157:
158: public String toString() {
159:
160: if (!this .hasChildren()) {
161: return this .getName();
162: }
163:
164: Iterator it = this .iterator();
165: Marker child;
166: StringBuffer sb = new StringBuffer(this .getName());
167: sb.append(' ').append(OPEN);
168: while (it.hasNext()) {
169: child = (Marker) it.next();
170: sb.append(child.getName());
171: if (it.hasNext()) {
172: sb.append(SEP);
173: }
174: }
175: sb.append(CLOSE);
176:
177: return sb.toString();
178: }
179: }
|