alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code



package com.ice.syslogd;

import java.util.*;

import com.ice.syslog.SyslogDefs;


public class
ConfigEntry
	{
	public static final String		RCS_ID = "$Id: ConfigEntry.java,v 1.1.1.1 1998/02/22 05:47:54 time Exp $";
	public static final String		RCS_REV = "$Revision: 1.1.1.1 $";
	public static final String		RCS_NAME = "$Name:  $";

	private static final int[] repeatBackoff =
		{ 15, 30, 60, 180, 600, 3600 };

	private boolean			hasMatch;
	private boolean			notMatch;
	private SyslogMatch		matcher;
	private SyslogAction	action;

	private int[]			facilities;

	private String[]		parameters;

	private int				backOffIdx;
	private int				repeatCount;
	private Date			repeatTimeout;

	private Date			prevTime;
	private SyslogMessage	prevMsg;


	public
	ConfigEntry()
		{
		this.matcher = null;
		this.hasMatch = false;
		this.notMatch = false;
		
		this.facilities =
			new int[ SyslogDefs.LOG_NFACILITIES ];

		this.action = null;
		this.parameters = null;

		this.backOffIdx = 0;
		this.repeatCount = 0;
		this.prevTime = null;
		this.prevMsg = null;
		}

	public void
	setAction( SyslogAction action )
		{
		this.action = action;
		}

	public boolean
	afterRepeatTimeout( Date now )
		{
		return now.after( this.repeatTimeout );
		}

	public Date
	getRepeatTimeout( Date now )
		{
		return this.repeatTimeout;
		}

	public void
	setFacilityLevel( int facility, int level )
		{
		this.facilities[ facility ] = level;
		}

	public void
	setMatchExpr( String expr )
		{
		this.hasMatch = true;
		this.notMatch = false;
		if ( expr.startsWith( "!" ) )
			{
			this.notMatch = true;
			expr = expr.substring(1);
			}

		this.matcher = new SyslogMatch();

		try { this.matcher.compile( expr ); }
		catch ( MatchCompileException ex )
			{
			this.matcher = null;
			this.hasMatch = false;
			this.notMatch = false;
			}
		}

	private boolean
	matchMessage( String message )
		{
		boolean result = false;

		if ( this.hasMatch && this.matcher != null )
			{
			result = this.matcher.matchMessage( message );
			if ( this.notMatch )
				{
				result = ! result;
				}
			}

		return result;
		}

	public void
	openAction()
		{
		if ( this.action != null )
			{
			this.action.openAction();
			}
		}

	public void
	closeAction()
		{
		if ( this.action != null )
			{
			this.action.closeAction();
			}
		}

	public void
	registerActionDisplay( String name, SyslogDisplayInterface display )
		{
		if ( this.action != null )
			{
			this.action.registerActionDisplay( name, display );
			}
		}

	private SyslogMessage
	createRepeatMsg( SyslogMessage logMsg, Date now )
		{
		SyslogMessage repeatMsg =
			(SyslogMessage)logMsg.clone();

		long repSecs =
			( now.getTime()
				- this.prevTime.getTime() )
					/ 1000;

		repeatMsg.isRepeat = true;
		repeatMsg.matchVars = null;
		repeatMsg.message =
			"msg repeated " + this.repeatCount
			+ " times in " + repSecs + " seconds.";

		return repeatMsg;
		}
	
	public void
	incrementBackOff()
		{
		if ( ConfigEntry.repeatBackoff.length
				> ( this.backOffIdx + 1 ) )
			{
			this.backOffIdx++;
			}
		}

	public void
	computeRepeatTimer( Date now )
		{
		Calendar cal = Calendar.getInstance();

		cal.setTime( now );
		cal.add
			( Calendar.SECOND,
				this.repeatBackoff[ this.backOffIdx ] );
		
		this.repeatTimeout = cal.getTime();
		}
 
	public synchronized void
	checkRepeatTimeout( Date now )
		{
		if ( this.prevMsg != null
				&& this.repeatCount > 0 )
			{
			if ( now.after( this.repeatTimeout ) )
				{
				SyslogMessage repeatMsg;

				if ( this.repeatCount == 1 )
					repeatMsg = this.prevMsg;
				else
					repeatMsg =
						this.createRepeatMsg( this.prevMsg, now );

				this.invokeMessageAction( repeatMsg );

				this.prevMsg = null;
				this.repeatCount = 0;
				this.backOffIdx = 0;
				}
			}
		}

	/*
	 *
	 * @return True, if the message should be processed.
	 *         otherwise, False, indicating a repeat.
	 */

	public synchronized boolean
	checkForRepeats( SyslogMessage logMsg )
		{
		boolean result = true;
		boolean newMsg = true;
		Date	now = new Date();
		SyslogMessage repeatMsg = null;

		if ( this.prevMsg != null
				&& this.prevMsg.message.length()
					== logMsg.message.length()
				&& this.prevMsg.hostName.equals( logMsg.hostName )
				&& this.prevMsg.message.equals( logMsg.message ) )
			{
			result = false;
			newMsg = false;

			if ( this.repeatCount > 0 )
				{
				this.repeatCount++;
				if ( now.after( this.repeatTimeout ) )
					{
					result = true;
					
					repeatMsg = this.createRepeatMsg( logMsg, now );

					this.invokeMessageAction( repeatMsg );

					this.computeRepeatTimer( now );

					this.incrementBackOff();
					
					this.prevTime = now;
					this.repeatCount = 0;
					}
				}
			else
				{
				this.repeatCount++;
				this.computeRepeatTimer( now );
				}
			}

		if ( newMsg )
			{
			if ( this.repeatCount > 0 )
				{
				repeatMsg = this.createRepeatMsg( logMsg, now );
				this.invokeMessageAction( repeatMsg );
				}

			this.backOffIdx = 0;
			this.prevTime = now;
			this.repeatCount = 0;
			}

		this.prevMsg = logMsg;

		return result;
		}

	public void
	invokeMessageAction( SyslogMessage logMsg )
		{
		if ( this.action.isThreaded() )
			{
			ActionThread thread =
				new ActionThread( this.action, logMsg );

			thread.start();
			}
		else
			{
			this.action.processMessage( logMsg );
			}
		}

	public void
	processMessage( SyslogMessage logMsg )
		{
		boolean		processIt = true;

		if ( facilities[ logMsg.facility ] >= logMsg.priority
				&& this.action != null && this.action.isOpen() )
			{
			if ( this.hasMatch )
				{
				processIt = this.matchMessage( logMsg.message );
				}

			if ( processIt )
				{
				if ( this.checkForRepeats( logMsg ) )
					{
					logMsg.matchVars = null;
					if ( this.hasMatch && ! this.notMatch )
						{
						logMsg.matchVars =
							this.matcher.getMatchVariables();
						}

					this.invokeMessageAction( logMsg );
					}
				}
			}
		}

	}


... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.