--- /dev/null
+## *********************************************************************
+## *
+## * Copyright (c) 2002 CERN and INFN on behalf of the EU DataGrid.
+## * For license conditions see LICENSE file or
+## * http://www.edg.org/license.html
+## *
+## *********************************************************************
+
+## Process this file with automake to produce Makefile.in
+
+## Subdirectories list
+SUBDIRS = src
+
+## Default flags to run aclocal
+ACLOCAL_AMFLAGS = -I project
+
+stage:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ target="install"; \
+ prefix_arg="@prefix@"; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target $$prefix_arg in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target $$prefix_arg) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" $$prefix_arg || exit 1; \
+ fi; test -z "$$fail"
+
+distsrc: dist
+ mv $(distdir).tar.gz $(DISTTAR)/$(distdir)_src.tar.gz
+
+distbin:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ target="install"; \
+ tmpdistbin="$(WORKDIR)/dist_bin"; \
+ prefix_arg="prefix=$$tmpdistbin"; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target $$prefix_arg in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target $$prefix_arg) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" $$prefix_arg || exit 1; \
+ fi; test -z "$$fail"; \
+ pushd $$tmpdistbin; \
+ $(AMTAR) -zcf $(DISTTAR)/$(distdir)_bin.tar.gz .; \
+ popd; \
+ rm -rf $$tmpdistbin
+
--- /dev/null
+#! /bin/sh
+
+mkdir -p src/autogen
+set -x
+aclocal -I project
+libtoolize --force
+autoheader
+automake --foreign --add-missing --copy
+autoconf
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ Copyright (c) 2004 on behalf of the EU EGEE Project:
+ The European Organization for Nuclear Research (CERN),
+ Istituto Nazionale di Fisica Nucleare (INFN), Italy
+ Datamat Spa, Italy
+ Centre National de la Recherche Scientifique (CNRS), France
+ CS Systeme d'Information (CSSI), France
+ Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
+ Universiteit van Amsterdam (UvA), Netherlands
+ University of Helsinki (UH.HIP), Finland
+ University of Bergen (UiB), Norway
+ Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
+
+ Build file for the GLite WMS jobid module
+
+ Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
+ Joachim Flammer <Joachim.Flammer@cern.ch>
+ Version info: $Id$
+ Release: $Name$
+
+ Revision history:
+ $Log$
+
+-->
+
+<project name="exception" default="dist">
+
+ <!-- =========================================
+ Builds the GLite WMS Utils Exception Module
+ ========================================= -->
+
+ <!-- =========================================
+ Import properties (order is important)
+ ========================================= -->
+
+ <!-- import baseline & user properties -->
+ <import file="../org.glite/project/baseline.properties.xml" />
+
+ <!-- import component build properties,
+ component properties &
+ component common properties -->
+ <import file="./project/properties.xml"/>
+
+ <!-- import subsystem build properties,
+ subsystem properties &
+ subsystem common properties -->
+ <import file="${subsystem.properties.file}"/>
+
+ <!-- import global build properties &
+ global properties -->
+ <import file="${global.properties.file}" />
+
+ <!-- =========================================
+ Load dependency property files (order is important)
+ ========================================= -->
+ <property file="${user.dependencies.file}"/>
+ <property file="${component.dependencies.file}" />
+ <property file="${subsystem.dependencies.file}" />
+ <property file="${global.dependencies.file}"/>
+
+ <!-- =========================================
+ Load configure options (order is important)
+ ========================================= -->
+ <import file="${global.configure.options.file}"/>
+ <import file="${component.configure.options.file}"/>
+
+ <!-- =========================================
+ Import task definitions (order is important)
+ ========================================= -->
+ <import file="${subsystem.taskdefs.file}" />
+ <import file="${global.taskdefs.file}" />
+
+ <!-- =========================================
+ Load common targets
+ ========================================= -->
+ <import file="${global.targets-make.file}" />
+
+ <!-- =========================================
+ Load version file
+ ========================================= -->
+ <property file="${module.version.file}"/>
+
+ <!-- ==============================================
+ Local private targets
+ ============================================== -->
+
+ <target name="localinit"
+ description="Module specific initialization tasks">
+ </target>
+
+ <target name="localcompile"
+ description="Module specific compile tasks">
+ </target>
+
+ <target name="localclean"
+ description="Module specific cleaning tasks">
+ </target>
+
+</project>
--- /dev/null
+#
+# Copyright (c) 2004 on behalf of the EU EGEE Project:
+# The European Organization for Nuclear Research (CERN),
+# Istituto Nazionale di Fisica Nucleare (INFN), Italy
+# Datamat Spa, Italy
+# Centre National de la Recherche Scientifique (CNRS), France
+# CS Systeme d'Information (CSSI), France
+# Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
+# Universiteit van Amsterdam (UvA), Netherlands
+# University of Helsinki (UH.HIP), Finland
+# University of Bergen (UiB), Norway
+# Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
+#
+# Common configure.ac file for the GLite WMS Common module
+#
+# Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
+# Version info: $Id$
+# Release: $Name$
+#
+# Revision history:
+# $Log$
+#
+#
+
+# Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.57)
+AC_INIT([GLite WMS Utils Exception], [0.0.0])
+AC_CONFIG_AUX_DIR([./project])
+AM_INIT_AUTOMAKE([1.6.3 subdir-objects])
+AC_CONFIG_SRCDIR([src/cjobid.h])
+
+# Notices.
+AC_COPYRIGHT([Copyright (c) 2004 The EU EGEE Project
+See LICENCE file for details
+])
+AC_REVISION([$Revision$])
+
+#Environment.
+WORKDIR=`pwd`
+AC_SUBST(WORKDIR)
+
+# Checks for programs.
+AC_PROG_CC
+AC_PROG_CPP
+AC_PROG_CXX
+AC_PROG_CXXCPP
+AM_PROG_CC_C_O
+AC_PROG_LIBTOOL
+
+# Checks for libraries.
+
+# Checks for header files.
+AC_CHECK_HEADERS([fcntl.h mntent.h sys/vfs.h syslog.h unistd.h])
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_HEADER_STDBOOL
+AC_C_CONST
+AC_C_INLINE
+AC_TYPE_OFF_T
+AC_TYPE_SIZE_T
+AC_CHECK_MEMBERS([struct stat.st_rdev])
+AC_TYPE_UID_T
+AC_CHECK_TYPES([ptrdiff_t])
+
+# Checks for library functions.
+AC_HEADER_STDC
+AC_FUNC_ERROR_AT_LINE
+AC_FUNC_GETMNTENT
+AC_FUNC_MEMCMP
+AC_FUNC_STAT
+AC_FUNC_STRFTIME
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS([bzero endpwent ftruncate getmntent memset mkdir pow strerror strtol])
+
+have_globus=no
+
+AC_GLOBUS([], have_globus=yes, have_globus=no)
+AC_MSG_RESULT(["GLOBUS found $have_globus"])
+
+#have_glite_wmsutils_exception=no
+
+AC_GLITE
+
+#AC_GLITE_WMSUTILS_EXCEPTION([], have_glite_wmsutils_exception=yes, have_glite_wmsutils_exception=no)
+#AC_MSG_RESULT(["GLITE_WMSUTILS_EXCEPTION found $have_glite_wmsutils_exception"])
+
+# Configuration items
+AC_PREFIX_DEFAULT([/opt/glite])
+AM_CONFIG_HEADER([src/autogen/config.h])
+AC_CONFIG_FILES([Makefile])
+AC_CONFIG_FILES([src/Makefile])
+AC_CONFIG_FILES([interface/Makefile])
+
+AC_OUTPUT
--- /dev/null
+## *********************************************************************
+## *
+## * Copyright (c) 2002 CERN and INFN on behalf of the EU DataGrid.
+## * For license conditions see LICENSE file or
+## * http://www.edg.org/license.html
+## *
+## *********************************************************************
+
+exceptiondir = $(includedir)
+nobase_exception_HEADERS = \
+ glite/wmsutils/exception/exception_codes.h \
+ glite/wmsutils/exception/Exceptions.h \
+ glite/wmsutils/exception/result_codes.h
+
+MAINTAINERCLEANFILES = Makefile.in
--- /dev/null
+#ifndef GLITE_WMSUTILS_EXCEPTION_EXCEPTIONS_H
+#define GLITE_WMSUTILS_EXCEPTION_EXCEPTIONS_H
+
+/*
+ * Exceptions.h
+ * Copyright (c) 2001 The European Datagrid Project - IST programme, all rights reserved.
+ * Contributors are mentioned in the code where appropriate.
+ */
+
+#include <fstream>
+#include <cstdlib>
+//#include <list>
+#include <syslog.h> // For logging exceptions to log file
+#include <errno.h> // list the exception codes
+#include <string>
+#include <exception> // base ancestor
+
+#include "glite/wmsutils/exception/result_codes.h" //base result codes
+
+namespace glite {
+namespace wmsutils {
+namespace exception {
+
+extern pthread_mutex_t METHOD_MUTEX; // used in order to store info into a file (rather then syslog)
+#define EDG_STACK_TRY(method_name) std::string METHOD = method_name ; try {
+#define EDG_STACK_CATCH() } catch (glite::wms::common::utilities::Exception &exc){ throw glite::wms::common::utilities::Exception ( __FILE__ , METHOD , &exc) ; }
+
+/**
+ * The Exception classes contains attributes into which are placed exception information and provides
+ * constructors that beyond the error code take parameters specifying the source file and line number
+ * (e.g. through __FILE__ and __LINE__) where the error has been generated and string messages,
+ * allowing an easy way of storing the origin of the exception.
+ * Moreover it provides methods for getting all the exception information and for logging them either
+ * in a log file or to the syslog daemon.
+ * Each of the derived types may contain its private attributes describing the actual error instance in detail.
+ * For example a JdlSyntaxException thrown when parsing the job description could contain additional
+ * details indicating exactly on which attributes the error occurred.
+ * Moreover each exception has an attribute representing the exception identifier that is set by the
+ * class constructor and allows the identification of the original exception.
+ *
+ * @ingroup Common
+ * @version 0.1
+ * @date 15 April 2002
+ * @author Alessandro Maraschini <alessandro.maraschini@datamat.it>
+*/
+
+class Exception : public std::exception{
+ public:
+ Exception ( const std::string& source,
+ const std::string& method,
+ Exception *e);
+ /**
+ * Constructor Update all mandatory fields
+ * @param code the code representing the thrown exception
+ * @param exception the name of the thrown exception
+ * @param method the name of the method that raised the exception
+ * @param source The source that raised the exception (could be the file path, the class Name, etc etc)
+ * @param line_number the number of the line in the file that raised the exception(if the source has been given as a file) */
+
+ Exception ( const std::string& source,
+ const std::string& method,
+ int code,
+ const std::string& exception);
+
+ /**
+ * Constructor Update all mandatory fields
+ * @param source the path of the file that raised the exception
+ * @param line_number the number of the line in the file that raised the exception
+ * @param method the name of the method that raised the exception
+ * @param code the code representing the thrown exception
+ * @param exception the name of the thrown exception */
+ Exception (const std::string& source,
+ int line_number,
+ const std::string& method,
+ int code,
+ const std::string& exception);
+
+ /**
+ * Destructor
+ */
+ virtual ~Exception() throw ();
+ /**
+ * Return a string debug message containing information about Exception thrown
+ */
+ virtual std::string dbgMessage();
+ /**
+ * Return the Code number
+ */
+ virtual int getCode();
+
+ /**
+ * return the Error Message associated to the Exception
+ */
+ virtual const char* what() const throw ();
+
+ /**
+ * Print Exception error information into a log file
+ */
+ virtual void log(const std::string& logfile = "");
+ /**
+ * Return the name of the Exception raised
+ */
+ virtual std::string getExceptionName();
+
+ /**
+ * Return the list of methods that caused the Exception
+ */
+ virtual std::string printStackTrace() ;
+
+ protected:
+ /**
+ * Empty Default Constructor
+ */
+ Exception();
+ //Mandatory Information:
+ int error_code;
+ std::string error_message ;
+ int line;
+ std::string source_file;
+ std::string exception_name;
+ std::string method_name ;
+ std::string stack;
+ std::string ancestor ;
+ // Exception* exc ;
+}; //End Exception Class
+
+/**
+ * This Exception is thrown when a unespected fatal error is found
+ */
+class FatalErrorException : public Exception {
+public:
+ FatalErrorException(const std::string& file,
+ int line,
+ const std::string& method);
+};//End CLass FatalErrorException
+
+/**
+ * StdException remap the Exception thrown by std::exception class into the JSUI WL standard format
+ */
+class StdException : public Exception {
+public:
+ StdException(const std::string& file,
+ int line,
+ const std::string& method,
+ int code,
+ const std::string& exception_name);
+};//End CLass StdException
+
+/**
+ * StdException remap the Exception thrown by std::exception class into the JSUI WL standard format
+ */
+class ThreadException : public Exception {
+public:
+ ThreadException(const std::string& file,
+ int line,
+ const std::string& method,
+ int code,
+ int jobNumber);
+};//End CLass StdException
+
+} // exception namespace
+} // wmsutils namespace
+} // glite namespace
+
+#endif
--- /dev/null
+#ifndef GLITE_WMSUTILS_EXCEPTION_CODES_H
+#define GLITE_WMSUTILS_EXCEPTION_CODES_H
+
+// pure C-style code:
+#define GLITE_WMS_COMMON_ERROR_BASE 900
+#define GLITE_WMS_USERINTERFACE_ERROR_BASE 1000
+#define GLITE_WMS_NETWORKSERVER_ERROR_BASE 1200
+#define GLITE_WMS_SOCKET_ERROR_BASE 1300
+#define GLITE_WMS_LDAP_ERROR_BASE 1350
+#define GLITE_WMS_LOGGING_ERROR_BASE 1400
+#define GLITE_WMS_REQUESTAD_ERROR_BASE 1500
+#define GLITE_WMS_CHECKPOINT_ERROR_BASE 1600
+#define GLITE_WMS_CONFIGURATION_ERROR_BASE 1800
+
+#ifdef __cplusplus
+
+namespace glite {
+namespace wmsutils {
+namespace exception {
+
+/**
+ * The Error Code
+*/
+enum {
+ WMS_COMMON_BASE = GLITE_WMS_COMMON_ERROR_BASE,
+ THREAD_INIT , // pthread_attr_init method failed
+ THREAD_DETACH , // pthread_attr_setdetachstate method failed
+ THREAD_CREATE , // pthread_create method failed
+ THREAD_JOIN,
+ THREAD_SSL,
+ WMS_FATAL_ERROR,
+ WMS_UI_ERROR_BASE = GLITE_WMS_USERINTERFACE_ERROR_BASE,
+ WMS_NS_ERROR_BASE = GLITE_WMS_NETWORKSERVER_ERROR_BASE,
+ WMS_SOCKET_ERROR_BASE = GLITE_WMS_SOCKET_ERROR_BASE,
+ WMS_LDAP_ERROR_BASE = GLITE_WMS_LDAP_ERROR_BASE,
+ WMS_LB_ERROR_BASE = GLITE_WMS_LOGGING_ERROR_BASE ,
+ WMS_REQUESTAD_ERROR_BASE = GLITE_WMS_REQUESTAD_ERROR_BASE,
+ WMS_CHKPT_ERROR_BASE = GLITE_WMS_CHECKPOINT_ERROR_BASE,
+ WMS_CONFIGURATION_ERROR_BASE = GLITE_WMS_CONFIGURATION_ERROR_BASE
+};
+
+} // exception namespace
+} // wmsutils namespace
+} // glite namespace
+
+#endif //ifdef c++
+#endif
--- /dev/null
+#ifndef GLITE_WMSUTILS_EXCEPTION_RESULT_CODES_H
+#define GLITE_WMSUTILS_EXCEPTION_RESULT_CODES_H
+
+namespace glite {
+namespace wmsutils {
+namespace exception {
+/*
+ * exception_codes.h
+ * Copyright (c) 2001 The European Datagrid Project - IST programme, all rights reserved.
+ * Contributors are mentioned in the code where appropriate.
+ */
+
+
+/**
+ * Result Code
+*/
+enum ResultCode {
+ SUCCESS, // The requested operation has been completed successfully
+ ACCEPTED, // The requested operation has been accepted
+
+ SUBMISSION_FAILURE, // API failed, general RB Exc remapping
+ CANCEL_FAILURE, // API failed, general RB Exc remapping
+ GETOUTPUT_FAILURE, // API failed, general RB Exc remapping
+ STATUS_FAILURE, // API failed, general RB Exc remapping
+
+ GETOUTPUT_FORBIDDEN, //When trying to retrieve output from a not submitted job
+ CANCEL_FORBIDDEN, //When trying to cancel a not submitted job
+ STATUS_FORBIDDEN, //When trying to retrieve status from a not submitted job
+ ALREADY_SUBMITTED, //submit skipped because Job has been already submitted
+
+ JOIN_FAILED, //When a pthread_join is waiting for a cored thread
+
+ OUTPUT_NOT_READY, //JobNotDoneException
+ FILE_TRANSFER_ERROR, //SandboxIOException
+ JOB_NOT_FOUND, //JobNotFoundException
+
+ MARKED_FOR_REMOVAL, //Cancel Method Result
+ GENERIC_FAILURE, //Cancel Method Result
+ CONDOR_FAILURE, //Cancel Method Result
+
+ GLOBUS_JOBMANAGER_FAILURE,
+
+ JOB_ALREADY_DONE,
+ JOB_ABORTED,
+ JOB_CANCELLING,
+ JOB_NOT_OWNER
+
+};
+
+} // exception namespace
+} // wmsutils namespace
+} // glite namespace
+
+#endif
--- /dev/null
+ <!-- ======================================================
+ Define extra properties here ...
+ ====================================================== -->
+
+ <project name="configure options">
+ <property name="configure.args"
+ value="--prefix=${workspace.abs.dir}/stage --with-globus-prefix=${with.globus.prefix} --with-globus-thr-flavor=${with.globus.thr.flavor} --with-globus-nothr-flavor=${with.globus.nothr.flavor} --with-glite-location=${with.glite.location} --with-dist-location=${with.dist.location}"/>
+
+ </project>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2004 on behalf of the EU EGEE Project:
+ The European Organization for Nuclear Research (CERN),
+ Istituto Nazionale di Fisica Nucleare (INFN), Italy
+ Datamat Spa, Italy
+ Centre National de la Recherche Scientifique (CNRS), France
+ CS Systeme d'Information (CSSI), France
+ Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
+ Universiteit van Amsterdam (UvA), Netherlands
+ University of Helsinki (UH.HIP), Finland
+ University of Bergen (UiB), Norway
+ Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
+
+ Common build properties file for the Glite WMS Common component
+
+ Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
+ Joachim Flammer <Joachim.Flammer@cern.ch>
+ Version info: $Id$
+ Release: $Name$
+
+ Revision history:
+ $Log$
+ Revision 1.2 2004/07/16 14:56:56 flammer
+ Corrected input path of build.properties.
+
+ Revision 1.1.1.1 2004/05/26 18:45:05 eronchie
+ Import of wms jobid
+
+
+-->
+
+<project name="WMS Utils Exception component common properties">
+
+ <!-- Include build properties to allow overwriting
+ of properties for subsystem -->
+ <property file="project/build.properties" />
+
+ <!-- ======================================================
+ Define corresponding subsystem properties
+ ====================================================== -->
+
+ <!-- Subsystem name -->
+ <property name="subsystem.name" value="${wms-utils.subsystem.name}"/>
+
+ <!-- Subsystem prefix -->
+ <property name="subsystem.prefix" value="${wms-utils.subsystem.prefix}"/>
+
+ <!-- ======================================================
+ Define component properties
+ ====================================================== -->
+
+ <!-- Component name prefix -->
+ <property name="component.prefix" value="jobid" />
+
+ <!-- ======================================================
+ Define general component properties
+ ====================================================== -->
+
+ <import file="${component.general.properties.file}" />
+
+ <!-- ======================================================
+ Define extra properties here ...
+ ====================================================== -->
+
+
+</project>
--- /dev/null
+module.version=0.0.0
+module.build=0
+module.age=0
\ No newline at end of file
--- /dev/null
+/* **************************************************************************
+* filename : Exceptions.cpp
+* author : Alessandro Maraschini <alessandro.maraschini@datamat.it>
+* copyright : (C) 2002 by DATAMAT
+***************************************************************************/
+
+#include "glite/wmsutils/exception/Exceptions.h"
+#include "glite/wmsutils/exception/exception_codes.h"
+#include "utils.h"
+
+namespace glite {
+namespace wmsutils {
+namespace exception {
+
+using namespace std ;
+using namespace glite::wmsutils::exception ;
+
+pthread_mutex_t METHOD_MUTEX ; // This mutex is used in order to lock the file for writing log infornation
+/* *********************************
+* Exception Class Implementation
+************************************/
+//Constructor/Destructor
+
+Exception::Exception () {
+ //exc = NULL ;
+ stack= "";
+ line = 0;
+} ;
+
+Exception::~Exception() throw(){ }
+/**
+* Exception chainig
+*/
+Exception::Exception ( const string& source,
+ const string& method,
+ Exception *e){
+ source_file = source ;
+ method_name = method;
+ error_message = "";
+ stack= e->printStackTrace();
+ ancestor = e->what() ;
+ line = 0;
+ error_code= 0;
+};
+Exception::Exception( const std::string& file,
+ int line_number,
+ const std::string& method,
+ int code,
+ const std::string& name)
+ : error_code(code), exception_name(name){
+ source_file = file;
+ line = line_number;
+ method_name = method;
+ stack= "";
+};
+Exception::Exception (const string& source,
+ const string& method,
+ int code,
+ const string& exception)
+ : error_code(code), exception_name(exception){
+ source_file = source;
+ method_name = method;
+ stack= "";
+ line = 0;
+};
+int Exception::getCode(){
+ if (error_code != 0)
+ return error_code ;
+ else
+ return WMS_COMMON_BASE;
+};
+const char* Exception::what() const throw(){
+ if (!ancestor.empty() )
+ return ancestor.c_str() ;
+ if ( error_message != "")
+ return error_message.c_str() ;
+ else
+ return "" ;
+
+};
+string Exception::getExceptionName(){
+ if (exception_name!= "")
+ return exception_name;
+ else
+ return "" ;
+};
+void Exception::log(const std::string& logfile)
+{
+ if ( logfile == "")
+ syslog ( LOG_PERROR, (char *) (dbgMessage()).c_str() );
+ else{
+ pthread_mutex_lock( &METHOD_MUTEX); // LOCK
+ //TBD : test if file exist-->>Create HEADER ??
+ ofstream fout ((char *) logfile.c_str() , ios::app ); //Open the file for writing (if it doesn't exist then it will be created)
+ fout << "\n" << dbgMessage() ; //write (append) the message
+ fout.close(); //close the file
+ pthread_mutex_unlock( &METHOD_MUTEX); // UNLOCK
+ }
+};
+string Exception::printStackTrace(){
+return stack + "\n" + dbgMessage();
+};
+string Exception::dbgMessage(){
+ // cout << "\nDBM callded for :" << this;
+ string result ;
+ //Adding exception Name
+ if ( exception_name!="")
+ result = exception_name ;
+ //Adding error msg
+ if (error_message!="")
+ result +=": " + string(what());
+ if (result != "")
+ result+="\n";
+ //Adding Source
+ result +=" at " + source_file ;
+ //Adding line number
+ if (line!=0)
+ result += " Line: " + inTo(line);
+ result +=" " ;
+ //Adding Method Name
+ if (method_name != "")
+ result += "Method: " +method_name ;
+ return result;
+}
+FatalErrorException::FatalErrorException(const std::string& file,
+ int line,
+ const std::string& method)
+ : Exception(file, line, method, WMS_FATAL_ERROR, "FatalErrorException")
+{
+ error_message = "Fatal Error found: system is unable to continue";
+}
+StdException::StdException(const std::string& file,
+ int line,
+ const std::string& method,
+ int code,
+ const std::string& exception_name)
+ : Exception(file, line, method, code, "StdException")
+{
+ error_message = "std::exception Fatal Error thrown: " + exception_name;
+}
+ThreadException::ThreadException(const std::string& file,
+ int line,
+ const std::string& method,
+ int code,
+ int jobNumber)
+ : Exception(file, line, method, code, "ThreadException")
+{
+
+ switch (code){
+ case THREAD_INIT:
+ error_message = "pthread_attr_init";
+ break;
+ case THREAD_DETACH :
+ error_message = "pthread_attr_setdetachstate";
+ break;
+ case THREAD_SSL :
+ error_message = "SSL multi thread procedure";
+ break;
+ case THREAD_CREATE :
+ error_message = "pthread_create";
+ break;
+ default: //THREAD_JOIN
+ error_message = "pthread_join";
+ break;
+ }
+ error_message += "pthread Fatal Error thrown for: " + error_message ;
+}
+
+} // exception namespace
+} // wmsutils namespace
+} // glite namespace
--- /dev/null
+## *********************************************************************
+## *
+## * Copyright (c) 2002 CERN and INFN on behalf of the EU DataGrid.
+## * For license conditions see LICENSE file or
+## * http://www.edg.org/license.html
+## *
+## *********************************************************************
+
+lib_LTLIBRARIES = libglite_wms_exceptions.la
+
+libglite_wms_exceptions_la_SOURCES = \
+ Exceptions.cpp \
+ utils.cpp
+
+utilitiesincludedir = $(includedir)/glite/wmsutils/exception
+utilitiesinclude_HEADERS = \
+ utils.h
+
+AM_CPPFLAGS = -I$(top_srcdir)/interface \
+ -I$(top_srcdir)/src \
+ $(GLOBUS_THR_CFLAGS) \
+ $(BOOST_CFLAGS) \
+ $(CLASSAD_CFLAGS) \
+ -DB_THREAD_SAFE
+
+MAINTAINERCLEANFILES = Makefile.in *.*~
--- /dev/null
+/* **************************************************************************
+* filename : utils.cpp
+* author : Alessandro Maraschini <alessandro.maraschini@datamat.it>
+* copyright : (C) 2002 by DATAMAT
+***************************************************************************/
+#include "utils.h"
+#include <string>
+#include <stdio.h>
+
+using namespace std;
+
+namespace glite {
+namespace wmsutils {
+namespace exception {
+
+/******************************************************************
+ method : isInt
+ field: integer & string class
+ check if str is an integer
+*******************************************************************/
+int isInt (const string& str)
+{
+ int len, bCode,eCode;
+ char code ;
+ const char * strCh ;
+ len = str.size() ;
+ strCh = str.c_str();
+ bCode= '0';
+ eCode= '9';
+ for (int i=0; i<len; i++){
+ code=strCh[i];
+ if ( (code < bCode) || (code >eCode) ) //It's not a digit number
+ return 1;
+ }
+ return 0;
+}
+
+
+/******************************************************************
+ methods : toInt , toHex
+ field: integer & string class
+ Converts a string str to an Integer value sum
+ returns 0/1 ---> success/failure
+ STRING--->INTEGER
+*******************************************************************/
+int toHex (const string& str,int &sum)
+{
+ int len, bCode,eCode,dec=1;
+ char code ;
+ const char * strCh ;
+
+ len = str.size() ;
+ strCh = str.c_str();
+ bCode= '0';
+ eCode= '9';
+ sum=0;
+ for (int i=0; i<len; i++)
+ {
+ dec=1;
+ for (int j=0; j<len-i-1 ; j++)
+ dec = 0x10 * dec;
+
+ code= strCh[i];
+ //cout << code << " checked: \n";
+ if ( (code >= bCode) && (code <=eCode) ){ //It's a digit number
+ sum = sum + dec * (code-bCode) ;
+ //cout << dec <<" Int added\n" ;
+ }
+ else if ( (code >= 'A') && (code <= 'F') ){ //It's a hex allowed char
+ sum = sum + dec * (code- 'A' +10) ;
+ //cout << dec << " Hex Added\n" ;
+ }
+ else {
+ return 1;
+ //cout << sum << " Azz Added\n" ;
+ }
+ }
+ return 0;
+
+};
+
+int toInt (const string& str,int &sum)
+{
+ int len, bCode,eCode,dec=1;
+ char code ;
+ const char * strCh ;
+
+ len = str.size() ;
+ strCh = str.c_str();
+ bCode= '0';
+ eCode= '9';
+ sum=0;
+ for (int i=0; i<len; i++)
+ {
+ dec=1;
+ for (int j=0; j<len-i-1 ; j++)
+ dec=10*dec;
+ code= strCh[i];
+ if ( (code < bCode) || (code >eCode) ) //It's not a digit number
+ return 1;
+ else
+ sum = sum + dec * (code-bCode) ;
+ }
+ return 0;
+}
+/******************************************************************
+ method : inTo
+ field: integer & string class
+ Converts an integer to a string
+ INTEGER --->STRING
+*******************************************************************/
+string inTo(const int number){
+ char buffer [CHAR_BUFFER_SIZE] ;
+ sprintf (buffer, "%i" , number) ;
+ return std::string(buffer);
+};
+
+/******************************************************************
+ method : count
+ field: string class
+ Counts number of sub-string occurrences in str
+*******************************************************************/
+int count(const string& strMain,const string& sep){
+ int n=0,found ;
+ int l;
+ //string str=strMain ;
+ l = sep.length();
+ found = strMain.find(sep) ;
+ while (found!= -1){
+ found = strMain.find(sep , found + l) ;
+ ++n ;
+ }
+ return n ;
+};
+
+/******************************************************************
+ method : split
+ field: string class
+ Splits a string into a vector of substring
+ maxLenght: max dimension of vector (the last item of the vector will be the lasting part)
+ trough: if trough == 1 the separator will be copied at the end of the left-substring
+*******************************************************************/
+vector<string> split(const string& str, const string& sep, int maxLength, int trough)
+{
+ vector<string> strList ;
+ int n,l,end, begin;
+ string tmpStr=str ;
+ l= sep.length();
+ // Optional trough variable indicates that the separator
+ // string remain in the array string
+ if (trough) trough = l ;
+ n = count(tmpStr,sep);
+ if (n>maxLength) n = maxLength ;
+ //n (or maxLength) is the number of separator to be found
+ begin = 0;
+ //cout << "->"<< str << " <--------> " << sep << ":\n";
+ end = tmpStr.find(sep);
+ for (int i=0; i<n; i++)
+ {
+ //cout << end << "<---END\n";
+ strList.push_back( tmpStr.substr(begin,end +trough - begin) ) ;
+ //cout << "##"<< tmpStr.substr(begin,end + trough - begin)<<"##\n" ;
+ begin = end + l ;
+ end= tmpStr.find(sep, begin) ;
+ //tmpStr=tmpStr.substr(end+l, str.size() );
+ }
+ //cout << end << ">beg>end>" << tmpStr.length() ;
+ strList.push_back(tmpStr.substr(begin, tmpStr.length() - begin ) ) ;
+ //cout << "||"<< tmpStr.substr( begin,tmpStr.length() - begin )<<"||\n" ;
+ return strList ;
+
+};
+
+/******************************************************************
+ method : sp
+ field: string class
+ used to create a checkString
+*******************************************************************/
+string sp(const string& separator)
+ {
+ const string sep = "_SEP_" ;
+ return sep + separator + sep ;
+ }
+
+/******************************************************************
+ method : checkFormat
+ field: string class
+ Chek the format of a string
+ The format should be given as:
+ TYPE+sep+SEPARATOR+sep+TYPE+sep+SEPARATOR+sep+ TYPE +...
+ Returns: 0 No Error
+ 1 Error Found
+*******************************************************************/
+int checkFormat (const string& format, const string& str)
+{
+ string type , separator, tmpStr=str ;
+ vector<string> form ;
+ int len, pos, i;
+ const string sep = "_SEP_" ;
+ const string sepStr = "$STR$" ;
+ const string sepInt = "$INT$" ;
+ form =split (format,sep);
+ len=form.size();
+ for (i =1;i<len;i=i+2) {
+ separator = form[i];
+ pos = tmpStr.find(separator);
+ if (pos ==-1)
+ //No required separator found
+ return 1 ;
+ else
+ //Required Separator successfully found
+ type = tmpStr.substr (0, pos);
+ tmpStr = tmpStr.substr( pos+separator.size() , tmpStr.size() );
+ if (form[i-1] == sepInt)
+ {
+ pos = isInt(type);
+ if (pos)
+ return 1;
+ }
+ }
+ type = tmpStr ;
+ if (form[i-1] == sepInt)
+ {
+ pos = isInt(type);
+ if (pos)
+ return 1;
+ }
+ return 0 ;
+}
+
+/******************************************************************
+ * method : replace
+ * field: string class
+ * Replace "what" value with "with" value
+ *******************************************************************/
+void
+replace(string& where, const string& what, const string& with)
+{
+ size_t fpos = where.find(what);
+
+ while (fpos != string::npos) {
+ where.replace(fpos, what.length(), with);
+ fpos = where.find(what, fpos + what.length() + 1);
+ }
+}
+
+} // exception namespace
+} // wmsutils namespace
+} // glite namespace
--- /dev/null
+#ifndef GLITE_WMSGLITE_EXCEPTION_UTILS_H
+#define GLITE_WMSGLITE_EXCEPTION_UTILS_H
+/*
+ * utils.h
+ * Copyright (c) 2001 The European Datagrid Project - IST programme, all rights reserved.
+ * Contributors are mentioned in the code where appropriate.
+ *
+ */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_STRINGSTREAM
+#include <sstream>
+#else
+#include <strstream>
+#endif
+
+#include <iostream>
+#include <vector>
+#include <string>
+#include <cstdlib>
+#include <cstdio>
+#include <ctime>
+#include <unistd.h>
+
+#define CHAR_BUFFER_SIZE 1024
+
+namespace glite {
+namespace wmsutils {
+namespace exception {
+
+/**
+ * std:string useful JSUI common utilized methods
+ *
+ * @ingroup Common
+ * @version 0.1
+ * @date 15 April 2002
+ * @author Alessandro Maraschini <alessandro.maraschini@datamat.it>
+*/
+
+/**
+* Check if a string can be converted into an integer
+* @ingroup Common
+*/
+int isInt (const std::string& str);
+/**
+* Converts a string into an Integer value
+* @ingroup Common
+*/
+int toInt (const std::string& str, int &sum);
+/**
+* Converts a string into an Hexasdecimal value
+* @ingroup Common
+*/
+int toHex (const std::string& str, int &sum);
+/**
+* Converts an integer into a string
+* @ingroup Common
+*/
+std::string inTo(int i);
+/**
+* Counts number of sub-string occurrences in a string
+* @ingroup Common
+*/
+int count(const std::string& strMain, const std::string& sep);
+/**
+* Splits a string into a vector of substring
+* @param str - The string to be parsed
+* @param sep - The separator to be found
+* @param maxLength - max dimension of vector (the last item of the vector will be the lasting part)
+* @param trough - if trough == 1 the separator will be copied at the end of the left-substring
+* @ingroup Common
+*/
+std::vector<std::string> split(const std::string& str, const std::string& sep, int maxLength =1000, int trough = 0);
+std::string sp(const std::string& separator);
+int checkFormat (const std::string& format, const std::string& str);
+
+void
+replace(std::string& where, const std::string& what, const std::string& with);
+
+} // exception namespace
+} // wmsglite namespace
+} // glite namespace
+
+#endif