/* * Copyright 2014-2015 JKOOL, LLC. * * 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 com.jkoolcloud.tnt4j.sink; import java.util.Map; import java.util.concurrent.TimeUnit; import com.jkoolcloud.tnt4j.core.TTL; import com.jkoolcloud.tnt4j.config.ConfigException; import com.jkoolcloud.tnt4j.config.Configurable; import com.jkoolcloud.tnt4j.limiter.DefaultLimiterFactory; import com.jkoolcloud.tnt4j.limiter.Limiter; import com.jkoolcloud.tnt4j.utils.Utils; /** * <p>Abstract event sink factory class that all sink factories should subclass from. * Derived classes should call {@code configure()} before returning {@link EventSink} * instances back using {@code getEventSink()} method calls. See example below: * </p> *<pre> *<code> * public EventSink getEventSink(String name, Properties props, EventFormatter frmt) { * return configureSink(new MyEventSinkImpl(name, props, frmt)); * } *</code> *</pre> * * @see TTL * @see EventSink * @see Configurable * * @version $Revision: 1 $ * */ public abstract class AbstractEventSinkFactory implements EventSinkFactory, Configurable { private SinkEventFilter eventFilter = null; private SinkErrorListener errorListener = null; private SinkLogEventListener eventListener = null; private EventLimiter limiter = null; private long ttl = TTL.TTL_CONTEXT; protected Map<String, Object> config = null; /** * Obtain the default instance of {@link SinkEventFilter} configured for this factory. * * @return default sink event filter instance */ public SinkEventFilter getDefaultEventFilter() { return eventFilter; } /** * Obtain the default instance of {@link SinkErrorListener} configured for this factory. * * @return default sink error listener instance */ public SinkErrorListener getDefaultErrorListener() { return errorListener; } /** * Obtain the default instance of {@link SinkLogEventListener} configured for this factory. * * @return default sink event listener instance */ public SinkLogEventListener getDefaultEventListener() { return eventListener; } /** * Obtain the default instance of {@link EventLimiter} configured for this factory. * * @return default sink event limiter instance */ public EventLimiter getDefaultEventLimiter() { return limiter; } /** * Configure a given event sink based on default settings * * @param sink event sink * @return configured event sink */ protected EventSink configureSink(EventSink sink) { if (eventFilter != null) { sink.addSinkEventFilter(eventFilter); } if (errorListener != null) { sink.addSinkErrorListener(errorListener); } if (eventListener != null) { sink.addSinkLogEventListener(eventListener); } sink.setTTL(ttl); sink.setLimiter(limiter); return sink; } @Override public long getTTL() { return ttl; } @Override public void setTTL(long ttl) { this.ttl = ttl; } @Override public Map<String, Object> getConfiguration() { return config; } @Override public void setConfiguration(Map<String, Object> props) throws ConfigException { config = props; setTTL(Utils.getLong("TTL", props, getTTL())); double maxmps = Utils.getDouble("RateMaxMPS", props, Limiter.MAX_RATE); double maxbps = Utils.getDouble("RateMaxBPS", props, Limiter.MAX_RATE); boolean enabled = Utils.getBoolean("RateLimit", props, false); long timeout = Utils.getLong("RateTimeout", props, EventLimiter.BLOCK_UNTIL_GRANTED); if (enabled) { limiter = new EventLimiter(DefaultLimiterFactory.getInstance().newLimiter(maxmps, maxbps, enabled), timeout, TimeUnit.MILLISECONDS); } eventFilter = (SinkEventFilter) Utils.createConfigurableObject("Filter", "Filter.", config); errorListener = (SinkErrorListener) Utils.createConfigurableObject("ErrorListener", "ErrorListener.", config); eventListener = (SinkLogEventListener) Utils.createConfigurableObject("EventListener", "EventListener.", config); } }