public short initialize(boolean setup_from_config)
	{
		if (is_init)
		{
			MsgDumperCmnDef.WriteErrorSyslog(__FILE__(), __LINE__(), "Library has been initialized");
			return MsgDumperCmnDef.MSG_DUMPER_FAILURE_INCORRECT_OPERATION;
		}
// Setup the parameters from the config file, overwrite the former parameter settings
		if (setup_from_config)
		{
			MsgDumperCmnDef.WriteWarnSyslog(__FILE__(), __LINE__(), "Warning: Setup from the config file, the original setting could be altered !!!");
			short ret = setup_from_config();
			if (MsgDumperCmnDef.CheckMsgDumperFailure(ret))
			{
				MsgDumperCmnDef.WriteWarnSyslog(__FILE__(), __LINE__(), "Fail to setup parameters from the config file");
				return ret;
			}
		}

		current_working_directory = MsgDumperCmnDef.get_cur_path();
		MsgDumperCmnDef.WriteDebugFormatSyslog(__FILE__(), __LINE__(), "Current working folder: %s", current_working_directory);

		Class c = this.getClass();
		String package_name = c.getPackage().getName();

		short ret = MsgDumperCmnDef.MSG_DUMPER_SUCCESS;
		String dev_class_name;
// Initialize the device
		EXIT:
		for (int i = 0 ; i < facility_size ; i++)
		{
			dev_class_name = String.format("MsgDumper%s", dev_name[i]);
// Allocate and initialize the object derived from the MsgDumplerBaseInf class
			if ((dumper_facility & dev_flag[i]) != 0)
			{
				MsgDumperCmnDef.WriteDebugFormatSyslog(__FILE__(), __LINE__(), "Allocate the %s object", dev_class_name);
				try
				{
					MsgDumperBase msg_dumper_object = (MsgDumperBase)Class.forName(package_name + "." + dev_class_name).newInstance();
					msg_dumper_object.enable_silent_mode(setup_from_config);
					msg_dumper_thread[i] = new MsgDumperTimerThread(msg_dumper_object);
				}
				catch (ClassNotFoundException ex)
				{
					MsgDumperCmnDef.WriteErrorFormatSyslog(__FILE__(), __LINE__(), "The class[%s] is NOT defined", dev_class_name);
					return MsgDumperCmnDef.MSG_DUMPER_FAILURE_UNKNOWN;
				} 
				catch (InstantiationException e) 
				{
					MsgDumperCmnDef.WriteErrorFormatSyslog(__FILE__(), __LINE__(), "The class[%s] is NOT instantialized", dev_class_name);
					return MsgDumperCmnDef.MSG_DUMPER_FAILURE_UNKNOWN;
				} 
				catch (IllegalAccessException e) 
				{
					MsgDumperCmnDef.WriteErrorFormatSyslog(__FILE__(), __LINE__(), "The class[%s] is accessed illegally", dev_class_name);
					return MsgDumperCmnDef.MSG_DUMPER_FAILURE_UNKNOWN;
				}

				MsgDumperCmnDef.WriteDebugFormatSyslog(__FILE__(), __LINE__(), "Initialize the %s object", dev_class_name);
				ret = msg_dumper_thread[i].initialize(current_working_directory, null);
				if (MsgDumperCmnDef.CheckMsgDumperFailure(ret))
				{
					MsgDumperCmnDef.WriteErrorFormatSyslog(__FILE__(), __LINE__(), "Fail to initialize the %s object", dev_class_name);
					break EXIT;
				}
			}
		}

		is_init = true;

		return ret;
	}