--- /dev/null
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.log4j.helpers;
+
+import org.apache.log4j.spi.AppenderAttachable;
+import org.apache.log4j.spi.LoggingEvent;
+
+import org.apache.log4j.Appender;
+import java.util.Vector;
+import java.util.Enumeration;
+
+/**
+ A straightforward implementation of the {@link AppenderAttachable}
+ interface.
+
+ @author Ceki Gülcü
+ @since version 0.9.1 */
+public class AppenderAttachableImpl implements AppenderAttachable {
+
+ /** Array of appenders. */
+ protected Vector appenderList;
+
+ /**
+ Attach an appender. If the appender is already in the list in
+ won't be added again.
+ */
+ public
+ void addAppender(Appender newAppender) {
+ // Null values for newAppender parameter are strictly forbidden.
+ if(newAppender == null) {
+ return;
+ }
+
+ if(appenderList == null) {
+ appenderList = new Vector(1);
+ }
+ if(!appenderList.contains(newAppender)) {
+ appenderList.addElement(newAppender);
+ }
+ }
+
+ /**
+ Call the <code>doAppend</code> method on all attached appenders. */
+ public
+ int appendLoopOnAppenders(LoggingEvent event) {
+ int size = 0;
+ Appender appender;
+
+ if(appenderList != null) {
+ size = appenderList.size();
+ for(int i = 0; i < size; i++) {
+ appender = (Appender) appenderList.elementAt(i);
+ appender.doAppend(event);
+ }
+ }
+ return size;
+ }
+
+
+ /**
+ Get all attached appenders as an Enumeration. If there are no
+ attached appenders <code>null</code> is returned.
+
+ @return Enumeration An enumeration of attached appenders.
+ */
+ public
+ Enumeration getAllAppenders() {
+ if(appenderList == null) {
+ return null;
+ } else {
+ return appenderList.elements();
+ }
+ }
+
+ /**
+ Look for an attached appender named as <code>name</code>.
+
+ <p>Return the appender with that name if in the list. Return null
+ otherwise.
+
+ */
+ public
+ Appender getAppender(String name) {
+ if(appenderList == null || name == null) {
+ return null;
+ }
+
+ int size = appenderList.size();
+ Appender appender;
+ for(int i = 0; i < size; i++) {
+ appender = (Appender) appenderList.elementAt(i);
+ if(name.equals(appender.getName())) {
+ return appender;
+ }
+ }
+ return null;
+ }
+
+
+ /**
+ Returns <code>true</code> if the specified appender is in the
+ list of attached appenders, <code>false</code> otherwise.
+
+ @since 1.2 */
+ public
+ boolean isAttached(Appender appender) {
+ if(appenderList == null || appender == null) {
+ return false;
+ }
+
+ int size = appenderList.size();
+ Appender a;
+ for(int i = 0; i < size; i++) {
+ a = (Appender) appenderList.elementAt(i);
+ if(a == appender) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+
+ /**
+ * Remove and close all previously attached appenders.
+ * */
+ public
+ void removeAllAppenders() {
+ if(appenderList != null) {
+ int len = appenderList.size();
+ for(int i = 0; i < len; i++) {
+ Appender a = (Appender) appenderList.elementAt(i);
+ a.close();
+ }
+ appenderList.removeAllElements();
+ appenderList = null;
+ }
+ }
+
+
+ /**
+ Remove the appender passed as parameter form the list of attached
+ appenders. */
+ public
+ void removeAppender(Appender appender) {
+ if(appender == null || appenderList == null) {
+ return;
+ }
+ appenderList.removeElement(appender);
+ }
+
+
+ /**
+ Remove the appender with the name passed as parameter form the
+ list of appenders.
+ */
+ public
+ void removeAppender(String name) {
+ if(name == null || appenderList == null) {
+ return;
+ }
+ int size = appenderList.size();
+ for(int i = 0; i < size; i++) {
+ if(name.equals(((Appender)appenderList.elementAt(i)).getName())) {
+ appenderList.removeElementAt(i);
+ break;
+ }
+ }
+ }
+
+}