/*
* Copyright 2018- Cisco
*
* Licensed 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 filter;

import java.util.Arrays;

import org.slf4j.Marker;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.AbstractMatcherFilter;
import ch.qos.logback.core.spi.FilterReply;

import org.slf4j.Marker;
import org.slf4j.MarkerFactory;

public class MarkerFilter extends AbstractMatcherFilter<ILoggingEvent> {

	Marker markerToMatch;

	/*
	* (non-Javadoc)
	*
	* @see ch.qos.logback.core.filter.Filter#decide(java.lang.Object)
	*/
	@Override
	public FilterReply decide(ILoggingEvent event) {
		if (!isStarted()) {
			return FilterReply.NEUTRAL;
		}
		Marker marker = event.getMarker();
		if (marker == null) {
			return onMismatch;
		}

		if (markerToMatch.contains(marker)) {
			return onMatch;
		} else {
			return onMismatch;
		}
	}

	/**
	* The marker to match in the event.
	*
	* @param markerToMatch
	*/
	public void setMarker(String markerStr) {
		if (markerStr != null) {
			Marker marker = MarkerFactory.getMarker(markerStr);
			this.markerToMatch = marker;
		}
	}

	/*
	* (non-Javadoc)
	*
	* @see ch.qos.logback.core.filter.Filter#start()
	*/
	@Override
	public void start() {
		if (this.markerToMatch != null) {
			super.start();
		}
	}
}
