/**
 * @file Exception.h
 * Exception class declaration
 *
 * 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.
 */
#ifndef __EXCEPTION_H__
#define __EXCEPTION_H__

#include <sstream>
#include <exception>
#include <stdexcept>
#include <errno.h>
#include <string.h>

//! ExceptionType 
enum ExceptionType 
{
	FILE_OPERATION_EXCEPTION = 0,
	FLOW_EXCEPTION,
	PROCESSOR_EXCEPTION,
	PROCESS_SESSION_EXCEPTION,
	PROCESS_SCHEDULE_EXCEPTION,
	SITE2SITE_EXCEPTION,
	GENERAL_EXCEPTION,
	MAX_EXCEPTION
};

//! Exception String 
static const char *ExceptionStr[MAX_EXCEPTION] =
{
		"File Operation",
		"Flow File Operation",
		"Processor Operation",
		"Process Session Operation",
		"Process Schedule Operation",
		"Site2Site Protocol",
		"General Operation"
};

//! Exception Type to String 
inline const char *ExceptionTypeToString(ExceptionType type)
{
	if (type < MAX_EXCEPTION)
		return ExceptionStr[type];
	else
		return NULL;
}

//! Exception Class
class Exception : public std::exception
{
public:
	//! Constructor
	/*!
	 * Create a new flow record
	 */
	Exception(ExceptionType type, const char *errorMsg) : _type(type), _errorMsg(errorMsg) {
	}
	//! Destructor
	virtual ~Exception() throw () {}
	virtual const char * what() const throw () {

		_whatStr = ExceptionTypeToString(_type);

		_whatStr += ":" + _errorMsg;
		return _whatStr.c_str();
	}

protected:

private:
	//! Exception type
	ExceptionType _type;
	//! Exception detailed information
	std::string _errorMsg;
	//! Hold the what result
	mutable std::string _whatStr;

};

#endif
