/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/

package com.nokia.carbide.cpp.internal.codescanner.config;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.preference.IPreferenceStore;

import com.nokia.carbide.cpp.internal.codescanner.CSPlugin;
import com.nokia.carbide.cpp.internal.codescanner.ui.CSPreferenceConstants;
import com.nokia.cpp.internal.api.utils.core.HostOS;

/**
 * A class for handling global and project specific Codescanner configuration settings.
 */
public class CSConfigManager implements IResourceChangeListener {

	// name of CodeScanner configuration file generated by this plugin
	public static final String CS_CONFIG_SETTINGS_FILE = "carbide_cs_config.xml";

	// name of CodeScanner commandline tool
	public static final String CS_CMDLINE_TOOL = "codescanner" + HostOS.EXE_EXT;

	// private members
	private static CSConfigSettings defaultConfig;
	private String codescannerDir = null;
	private String resultsDir = null;
	private String outputFormatArgument = null;
	private List<String> inputArguments = null;
	private boolean htmlResults = false;
	private boolean xmlResults = false;
	private Map<IProject, CSProjectSettings> settingsMap;

	/**
	 * Create an instance of CSConfigManager.
	 */
	public CSConfigManager() {
		super();
		defaultConfig = new CSConfigSettings();
		defaultConfig.loadDefaultConfig();
		settingsMap = new HashMap<IProject, CSProjectSettings>();
	}
	
	/**
	 * Get the default CodeScanner configuration settings.
	 * @return default CodeScanner configuration settings
	 */
	public CSConfigSettings getDefaultConfig() {
		if (defaultConfig == null) {
			defaultConfig = new CSConfigSettings();
			defaultConfig.loadDefaultConfig();
		}
		return defaultConfig;
	}

	/**
	 * Find out whether the CodeScanner commandline tool exists in the specified
	 * CodeScanner directory. If it does, return its full path, otherwise return null.
	 * @return full path of the CodeScanner commandline tool if it exists
	 */
	public String getCSCommandLineTool() {
        String csCmdLineTool = CS_CMDLINE_TOOL;
        if (codescannerDir != null && codescannerDir.length() > 0) {
        	csCmdLineTool = codescannerDir + csCmdLineTool;
		}
        IPath fullPath = new Path(csCmdLineTool);
        if (fullPath.toFile().exists()) {
        	return csCmdLineTool;
        }
        else {
        	return null;
        }
	}

	/**
	 * Return the directory for scanning results.
	 * @return the directory for scanning results
	 */
	public String getCSResultsDirectory() {
		return resultsDir;
	}

	/**
	 * Are we generating html reports for scanning results?
	 * @return true if generating html reports
	 */
	public boolean generateHtmlResults() {
		return htmlResults;
	}

	/**
	 * Are we generating xml reports for scanning results?
	 * @return true if generating xml reports
	 */
	public boolean generateXmlResults() {
		return xmlResults;
	}

	/**
	 * Create CodeScanner settings for a given project and store it.
	 * @param project - the project in question
	 * @return the project specific CodeScanner settings
	 */
	public CSProjectSettings createProjectSettings(IProject project) {
		synchronized (settingsMap) {
			assert(settingsMap.get(project) == null);
			CSProjectSettings settings = new CSProjectSettings(project);
			settingsMap.put(project, settings);
			return settings;
		}
	}
	
	/**
	 * Get the CodeScanner settings for a given project.
	 * @param project - the project in question
	 * @return the project specific CodeScanner settings
	 */
	public CSProjectSettings getProjectSettings(IProject project) {
		synchronized (settingsMap) {
			CSProjectSettings settings = settingsMap.get(project);
			if (settings == null) {
				settings = createProjectSettings(project);
			}
			return settings;
		}
	}

	/**
	 * Handle any resource change event
	 * @param event - the resource change event in question
	 */
	public void resourceChanged(IResourceChangeEvent event) {
		// remove projects from map when they are closed or deleted
		if (event.getType() == IResourceChangeEvent.PRE_CLOSE || event.getType() == IResourceChangeEvent.PRE_DELETE) {
			settingsMap.remove(event.getResource());
		}
	}

	/**
	 * Load either project specific or global CodeScanner configuration settings.
	 * @param project - project associated with currently selected resource
	 * @param configFilePath - path of CodeScanner configuration file
	 * @return true if settings has been successfully loaded
	 */
	public boolean loadConfigSettings(IProject project) {
		boolean success = false;
		if (project != null) {
			success = loadProjectConfigSettings(project);
		}
		if (!success) {
			success = loadGlobalConfigSettings();
		}
		clearArguments();
		return success;
	}

	/**
	 * Load project specific CodeScanner settings.
	 * @param project - project associated with currently selected resource
	 * @param configFilePath - path of CodeScanner configuration file
	 * @return true if settings has been successfully loaded
	 */
	public boolean loadProjectConfigSettings(IProject project) {
		if (project == null) {
			return false;
		}
		boolean success = false;
		CSProjectSettings projectSettings = getProjectSettings(project);
		IDialogSettings cSettings = projectSettings.getDialogSettings();
		IDialogSettings pageSettings = cSettings.getSection(CSPreferenceConstants.PROPERTY_SETTINGS_ID);
		if (pageSettings == null) {
			success = false;
		}
		else {
			success = pageSettings.getBoolean(CSPreferenceConstants.PROJ_SETTINGS);
			if (success) {
				codescannerDir = pageSettings.get(CSPreferenceConstants.CODESCANNER_FOLDER);
				htmlResults = pageSettings.getBoolean(CSPreferenceConstants.HTML_RESULTS);
				xmlResults = pageSettings.getBoolean(CSPreferenceConstants.XML_RESULTS);
				resultsDir = pageSettings.get(CSPreferenceConstants.RESULTS_FOLDER);
			}
			else {
				codescannerDir = "";
				htmlResults = false;
				xmlResults = false;
				resultsDir = "";
			}
		}
		return success;
	}
	
	/**
	 * Load global CodeScanner settings.
	 * @param project - project associated with currently selected resource
	 * @param configFilePath - path of CodeScanner configuration file
	 * @return true if settings has been successfully loaded
	 */
	public boolean loadGlobalConfigSettings() {
		IPreferenceStore store = CSPlugin.getCSPrefsStore();
		codescannerDir = store.getString(CSPreferenceConstants.CODESCANNER_FOLDER);
		htmlResults = store.getBoolean(CSPreferenceConstants.HTML_RESULTS);
		xmlResults = store.getBoolean(CSPreferenceConstants.XML_RESULTS);
		resultsDir = store.getString(CSPreferenceConstants.RESULTS_FOLDER);
		return true;
	}
	
	/**
	 * Create a CodeScanner configuration file from either project specific or 
	 * global CodeScanner configuration settings.
	 * @param project - project associated with currently selected resource
	 * @param configFilePath - path of CodeScanner configuration file
	 * @return true if configuration file has been successfully created
	 */
	public File createConfigFile(IProject project, String configFilePath) {
		File configFile = null;
		if (project != null) {
			configFile = createProjectConfigFile(project, configFilePath);
		}
		if (configFile == null) {
			configFile = createGlobalConfigFile(project, configFilePath);
		}
		return configFile;
	}
	
	/**
	 * Create a CodeScanner configuration file from project specific CodeScanner settings.
	 * @param configFilePath - path of CodeScanner configuration file
	 * @param settings - project specific CodeScanner settings
	 * @return CodeScanner configuration file
	 */
	public File createProjectConfigFile(IProject project, String configFilePath) {
		if (configFilePath.length() == 0) {
			return null;
		}

		// load project specific settings
		CSProjectSettings projectSettings = getProjectSettings(project);
		IDialogSettings cSettings = projectSettings.getDialogSettings();
		IDialogSettings pageSettings = cSettings.getSection(CSPreferenceConstants.PROPERTY_SETTINGS_ID);
		if (pageSettings == null) {
			return null;
		}
		if (!pageSettings.getBoolean(CSPreferenceConstants.PROJ_SETTINGS)) {
			return null;
		}

		// create and initialize a configuration file
		File configFile = new File(configFilePath);
		if (configFile.exists()) {
			configFile.delete();
		}
		CSConfigSettings configSettings = new CSConfigSettings();
		configSettings.loadDefaultConfig();

		// retrieve various stored values
		String fileFilterString = pageSettings.get(CSPreferenceConstants.FILE_FILTERS);
		if (fileFilterString != null) {
			StringTokenizer fileFilters = new StringTokenizer(fileFilterString, CSPreferenceConstants.DELIMETER);
			EList<String> fileFilterList = configSettings.getSourceFilters().getExclude();
			fileFilterList.clear();
			while (fileFilters.hasMoreTokens()) {
				String fileFilter = fileFilters.nextToken();
				fileFilterList.add(fileFilter);
			}
		}

		String scriptsString = pageSettings.get(CSPreferenceConstants.RULE_SCRIPTS);
		String categoriesString = pageSettings.get(CSPreferenceConstants.RULE_CATEGORIES);
		String severitiesString = pageSettings.get(CSPreferenceConstants.RULE_SEVERITIES);
		String enabledString = pageSettings.get(CSPreferenceConstants.RULES_ENABLED);
		if ((scriptsString != null) && 
			(categoriesString != null) && 
			(severitiesString != null) && 
			(enabledString != null)) {
			StringTokenizer scriptTokens = new StringTokenizer(scriptsString, CSPreferenceConstants.DELIMETER);
			StringTokenizer categoryTokens = new StringTokenizer(categoriesString, CSPreferenceConstants.DELIMETER);
			StringTokenizer severityTokens = new StringTokenizer(severitiesString, CSPreferenceConstants.DELIMETER);
			StringTokenizer enabledTokens = new StringTokenizer(enabledString, CSPreferenceConstants.DELIMETER);
			while (scriptTokens.hasMoreTokens() &&
				   categoryTokens.hasMoreTokens() &&
				   severityTokens.hasMoreTokens() &&
				   enabledTokens.hasMoreTokens()) {
				String scriptString = "script_" + scriptTokens.nextToken();
				String categoryString = categoryTokens.nextToken();
				String severityString = severityTokens.nextToken();
				int value = Integer.valueOf(enabledTokens.nextToken());
				boolean enabled = (value != 0);
				CSScript script = CSScript.toScript(scriptString);
				if (!script.equals(CSScript.script_unknown)) {
					configSettings.setScriptCategory(script, categoryString);
					configSettings.setScriptSeverity(script, severityString);
					configSettings.setScriptEnabled(script, enabled);
				}
			}
		}

		configSettings.setScriptCClassIgnore(pageSettings.get(CSPreferenceConstants.CCLASSIGNORE));
		configSettings.setScriptForbiddenWords(pageSettings.get(CSPreferenceConstants.FORBIDEENWORDS));
		String icons = pageSettings.get(CSPreferenceConstants.ICONS);
		if (icons.length() == 0) {
			icons = null;
		}
		configSettings.setScriptIcons(icons);
		configSettings.setScriptLFunctionIgnore(pageSettings.get(CSPreferenceConstants.LFUNCTIONIGNORE));
		configSettings.setScriptLongLinesLength(pageSettings.getInt(CSPreferenceConstants.LONGLINES_LENGTH));
		configSettings.setScriptOpenIgnore(pageSettings.get(CSPreferenceConstants.OPENIGNORE));
		configSettings.setScriptWorryingComments(pageSettings.get(CSPreferenceConstants.WORRYINGCOMMENTS));

		configSettings.setInputArguments(inputArguments);
        configSettings.setOutputFormatArgument(outputFormatArgument);

        if (isProjectKbScanningEnabled(pageSettings)) {
        	CSPlugin.getKbManager().clearRules();
            CSPlugin.getKbManager().addKBaseRulesToConfigSettings(project, configSettings);
        }

        // copy settings to the configuration file and return it
		configSettings.saveConfig(configFile);
		return configFile;
	}

	/**
	 * Create a CodeScanner configuration file from global CodeScanner settings.
	 * @param configFilePath - path of CodeScanner configuration file
	 * @return CodeScanner configuration file
	 */
	public File createGlobalConfigFile(IProject project, String configFilePath) {
		if (configFilePath.length() == 0) {
			return null;
		}

		// create and initialize a configuration file
		File configFile = new File(configFilePath);
		if (configFile.exists()) {
			configFile.delete();
		}
		CSConfigSettings configSettings = new CSConfigSettings();
		configSettings.loadDefaultConfig();

		// retrieve various stored values
		IPreferenceStore store = CSPlugin.getCSPrefsStore();

		String fileFilterString = store.getString(CSPreferenceConstants.FILE_FILTERS);
		if (fileFilterString != null) {
			StringTokenizer fileFilters = new StringTokenizer(fileFilterString, CSPreferenceConstants.DELIMETER);
			EList<String> fileFilterList = configSettings.getSourceFilters().getExclude();
			fileFilterList.clear();
			while (fileFilters.hasMoreTokens()) {
				String fileFilter = fileFilters.nextToken();
				fileFilterList.add(fileFilter);
			}
		}

		String scriptsString = store.getString(CSPreferenceConstants.RULE_SCRIPTS);
		String categoriesString = store.getString(CSPreferenceConstants.RULE_CATEGORIES);
		String severitiesString = store.getString(CSPreferenceConstants.RULE_SEVERITIES);
		String enabledString = store.getString(CSPreferenceConstants.RULES_ENABLED);
		if ((scriptsString != null) && 
			(categoriesString != null) && 
			(severitiesString != null) && 
			(enabledString != null)) {
			StringTokenizer scriptTokens = new StringTokenizer(scriptsString, CSPreferenceConstants.DELIMETER);
			StringTokenizer categoryTokens = new StringTokenizer(categoriesString, CSPreferenceConstants.DELIMETER);
			StringTokenizer severityTokens = new StringTokenizer(severitiesString, CSPreferenceConstants.DELIMETER);
			StringTokenizer enabledTokens = new StringTokenizer(enabledString, CSPreferenceConstants.DELIMETER);
			while (scriptTokens.hasMoreTokens() &&
				   categoryTokens.hasMoreTokens() &&
				   severityTokens.hasMoreTokens() &&
				   enabledTokens.hasMoreTokens()) {
				String scriptString = "script_" + scriptTokens.nextToken();
				String categoryString = categoryTokens.nextToken();
				String severityString = severityTokens.nextToken();
				int value = Integer.valueOf(enabledTokens.nextToken());
				boolean enabled = (value != 0);
				CSScript script = CSScript.toScript(scriptString);
				if (!script.equals(CSScript.script_unknown)) {
					configSettings.setScriptCategory(script, categoryString);
					configSettings.setScriptSeverity(script, severityString);
					configSettings.setScriptEnabled(script, enabled);
				}
			}
		}

		configSettings.setScriptCClassIgnore(store.getString(CSPreferenceConstants.CCLASSIGNORE));
		configSettings.setScriptForbiddenWords(store.getString(CSPreferenceConstants.FORBIDEENWORDS));
		String icons = store.getString(CSPreferenceConstants.ICONS);
		if (icons != null && icons.length() == 0) {
			icons = null;
		}
		configSettings.setScriptIcons(icons);
		configSettings.setScriptLFunctionIgnore(store.getString(CSPreferenceConstants.LFUNCTIONIGNORE));
		configSettings.setScriptLongLinesLength(store.getInt(CSPreferenceConstants.LONGLINES_LENGTH));
		configSettings.setScriptOpenIgnore(store.getString(CSPreferenceConstants.OPENIGNORE));
		configSettings.setScriptWorryingComments(store.getString(CSPreferenceConstants.WORRYINGCOMMENTS));		
		configSettings.setInputArguments(inputArguments);
        configSettings.setOutputFormatArgument(outputFormatArgument);

        if (isGlobalKbScanningEnabled()) {
        	CSPlugin.getKbManager().clearRules();
        	CSPlugin.getKbManager().addKBaseRulesToConfigSettings(project, configSettings);
        }

		// copy settings to the configuration file and return it
		configSettings.saveConfig(configFile);
		return configFile;
	}

	/**
	 * Load project specific CodeScanner settings from a CodeScanner configuration file.
	 * @param configFilePath - path of CodeScanner configuration file
	 * @param settings - project specific CodeScanner settings
	 */
	public void loadProjectConfigFile(String configFilePath, IDialogSettings settings) {
		if ((configFilePath.length() == 0) || (settings == null)) {
			return;
		}

		// load settings from a configuration file
		File configFile = new File(configFilePath);
    	CSConfigSettings configSettings = new CSConfigSettings();
    	configSettings.loadDefaultConfig();
    	if (configSettings.loadConfig(configFile)) {
    		// store various values
    		String fileFilters = "";
    		EList<String> fileFilterList = configSettings.getSourceFilters().getExclude();
    		for (Iterator<String> iterator = fileFilterList.iterator(); iterator.hasNext();) {
    			fileFilters += iterator.next() + CSPreferenceConstants.DELIMETER;
    		}
    		settings.put(CSPreferenceConstants.FILE_FILTERS, fileFilters);       		

    		String scriptString = "";
    		String categoryString = "";
    		String severityString = "";
    		String enabledString = "";
    		for (CSScript script : CSScript.values()) {
    			if (!script.equals(CSScript.script_unknown)) {
        			scriptString += script.toString() + CSPreferenceConstants.DELIMETER;
        			if (configSettings.getScript(script) != null) {
            			categoryString += configSettings.getScriptCategory(script) + CSPreferenceConstants.DELIMETER;
            			severityString += configSettings.getScriptSeverity(script) + CSPreferenceConstants.DELIMETER;
            			int flag = 1;
            			if (!configSettings.getScriptEnabled(script))
            				flag = 0;
            			enabledString += flag + CSPreferenceConstants.DELIMETER;
        			}
        			else {
            			categoryString += defaultConfig.getScriptCategory(script) + CSPreferenceConstants.DELIMETER;
            			severityString += defaultConfig.getScriptSeverity(script) + CSPreferenceConstants.DELIMETER;
            			int flag = 1;
            			if (!defaultConfig.getScriptEnabled(script))
            				flag = 0;
            			enabledString += flag + CSPreferenceConstants.DELIMETER;
        			}
    			}
    		}			
    		settings.put(CSPreferenceConstants.RULE_SCRIPTS, scriptString);
    		settings.put(CSPreferenceConstants.RULE_CATEGORIES, categoryString);
    		settings.put(CSPreferenceConstants.RULE_SEVERITIES, severityString);
    		settings.put(CSPreferenceConstants.RULES_ENABLED, enabledString);

    		settings.put(CSPreferenceConstants.CCLASSIGNORE, getCClassIgnoreFromConfig(configSettings));
    		settings.put(CSPreferenceConstants.FORBIDEENWORDS, getForbiddenWordsFromConfig(configSettings));
    		settings.put(CSPreferenceConstants.ICONS, getIconsFromConfig(configSettings));
    		settings.put(CSPreferenceConstants.LFUNCTIONIGNORE, getLFunctionIgnoreFromConfig(configSettings));
    		settings.put(CSPreferenceConstants.LONGLINES_LENGTH, getLongLinesLengthFromConfig(configSettings));
    		settings.put(CSPreferenceConstants.OPENIGNORE, getOpenIgnoreFromConfig(configSettings));
    		settings.put(CSPreferenceConstants.WORRYINGCOMMENTS, getWorryingCommentsFromConfig(configSettings));	
    	}
	}

	/**
	 * Load global CodeScanner settings from a CodeScanner configuration file.
	 * @param configFilePath - path of CodeScanner configuration file
	 */
	public void loadGlobalConfigFile(String configFilePath) {
		if (configFilePath.length() == 0) {
			return;
		}

		// load settings from a configuration file
		File configFile = new File(configFilePath);
    	CSConfigSettings configSettings = new CSConfigSettings();
    	configSettings.loadDefaultConfig();
    	if (configSettings.loadConfig(configFile)) {
    		IPreferenceStore store = CSPlugin.getCSPrefsStore();

    		// store various values
    		String fileFilters = "";
    		EList<String> fileFilterList = configSettings.getSourceFilters().getExclude();
    		for (Iterator<String> iterator = fileFilterList.iterator(); iterator.hasNext();) {
    			fileFilters += iterator.next() + CSPreferenceConstants.DELIMETER;
    		}
    		store.setValue(CSPreferenceConstants.FILE_FILTERS, fileFilters);

    		String scriptString = "";
    		String categoryString = "";
    		String severityString = "";
    		String enabledString = "";
    		for (CSScript script : CSScript.values()) {
    			if (!script.equals(CSScript.script_unknown)) {
        			scriptString += script.toString() + CSPreferenceConstants.DELIMETER;
        			if (configSettings.getScript(script) != null) {
            			categoryString += configSettings.getScriptCategory(script) + CSPreferenceConstants.DELIMETER;
            			severityString += configSettings.getScriptSeverity(script) + CSPreferenceConstants.DELIMETER;
            			int flag = 1;
            			if (!configSettings.getScriptEnabled(script))
            				flag = 0;
            			enabledString += flag + CSPreferenceConstants.DELIMETER;
        			}
        			else {
            			categoryString += defaultConfig.getScriptCategory(script) + CSPreferenceConstants.DELIMETER;
            			severityString += defaultConfig.getScriptSeverity(script) + CSPreferenceConstants.DELIMETER;
            			int flag = 1;
            			if (!defaultConfig.getScriptEnabled(script))
            				flag = 0;
            			enabledString += flag + CSPreferenceConstants.DELIMETER;
        			}
    			}
    		}			
    		store.setValue(CSPreferenceConstants.RULE_SCRIPTS, scriptString);
    		store.setValue(CSPreferenceConstants.RULE_CATEGORIES, categoryString);
    		store.setValue(CSPreferenceConstants.RULE_SEVERITIES, severityString);
    		store.setValue(CSPreferenceConstants.RULES_ENABLED, enabledString);

    		store.setValue(CSPreferenceConstants.CCLASSIGNORE, getCClassIgnoreFromConfig(configSettings));
    		store.setValue(CSPreferenceConstants.FORBIDEENWORDS, getForbiddenWordsFromConfig(configSettings));
    		store.setValue(CSPreferenceConstants.ICONS, getIconsFromConfig(configSettings));
    		store.setValue(CSPreferenceConstants.LFUNCTIONIGNORE, getLFunctionIgnoreFromConfig(configSettings));
    		store.setValue(CSPreferenceConstants.LONGLINES_LENGTH, getLongLinesLengthFromConfig(configSettings));
        	store.setValue(CSPreferenceConstants.OPENIGNORE, getOpenIgnoreFromConfig(configSettings));
        	store.setValue(CSPreferenceConstants.WORRYINGCOMMENTS, getWorryingCommentsFromConfig(configSettings));	
    	}
	}

	/**
	 * Set the input arguments.
	 * @param configSettings - CodeScanner configuration settings to be set
	 * @param inputPaths - input paths to be converted into input arguments
	 */
	public void setInputArguments(List<IPath> inputPaths) {
		inputArguments = new ArrayList<String>();
		for (IPath inputPath : inputPaths){
			inputArguments.add(inputPath.toOSString());
		}
	}

	/**
	 * Set the output format argument.
	 * @param configSettings - CodeScanner configuration settings to be set
	 */
	public void setOutputFormatArgument() {
		outputFormatArgument = "std";
        if (generateHtmlResults()) {
        	outputFormatArgument += "|html";
        }
        if (generateXmlResults()) {
        	outputFormatArgument += "|xml";
        }
	}

	/**
	 * Clear various argument settings.
	 */
	private void clearArguments() {
		inputArguments = null;
		outputFormatArgument = null;
	}

	/**
	 * Get the C class ignore list from from a CodeScanner configuration settings. 
	 * If the list does not exist in, get it from the default configuration settings.
	 * @param configSettings - CodeScanner configuration settings to be read
	 * @return C class ignore list as a string
	 */
	private String getCClassIgnoreFromConfig(CSConfigSettings configSettings) {
		String value = configSettings.getScriptCClassIgnore();
		if (value == null) {
			value = getDefaultConfig().getScriptCClassIgnore();
		}
		return value;
	}

	/**
	 * Get the forbidden words list from from a CodeScanner configuration settings. 
	 * If the list does not exist in, get it from the default configuration settings.
	 * @param configSettings - CodeScanner configuration settings to be read
	 * @return forbidden words list as a string
	 */
	private String getForbiddenWordsFromConfig(CSConfigSettings configSettings) {
		String value = configSettings.getScriptForbiddenWords();
		if (value == null) {
			value = getDefaultConfig().getScriptForbiddenWords();
		}
		return value;
	}

	/**
	 * Get the customizable icons list from from a CodeScanner configuration settings. 
	 * If the list does not exist in, get it from the default configuration settings.
	 * @param configSettings - CodeScanner configuration settings to be read
	 * @return customizable icons list as a string
	 */
	private String getIconsFromConfig(CSConfigSettings configSettings) {
		String value = configSettings.getScriptIcons();
		if (value == null) {
			value = getDefaultConfig().getScriptIcons();
		}
		if (value == null) {
			value = "";
		}
		return value;
	}

	/**
	 * Get the L-function ignore list from from a CodeScanner configuration settings. 
	 * If the list does not exist in, get it from the default configuration settings.
	 * @param configSettings - CodeScanner configuration settings to be read
	 * @return L-function ignore list as a string
	 */
	private String getLFunctionIgnoreFromConfig(CSConfigSettings configSettings) {
		String value = configSettings.getScriptLFunctionIgnore();
		if (value == null) {
			value = getDefaultConfig().getScriptLFunctionIgnore();
		}
		return value;
	}

	/**
	 * Get the long lines length attribute value from a CodeScanner configuration settings.
	 * @param configSettings - CodeScanner configuration settings to be read
	 * @return the long lines length attribute value
	 */
	private int getLongLinesLengthFromConfig(CSConfigSettings configSettings) {
		return configSettings.getScriptLongLinesLength();
	}

	/**
	 * Get the Open() function ignore list from from a CodeScanner configuration settings. 
	 * If the list does not exist in, get it from the default configuration settings.
	 * @param configSettings - CodeScanner configuration settings to be read
	 * @return Open() function  ignore list as a string
	 */
	private String getOpenIgnoreFromConfig(CSConfigSettings configSettings) {
		String value = configSettings.getScriptOpenIgnore();
		if (value == null) {
			value = getDefaultConfig().getScriptOpenIgnore();
		}
		return value;
	}

	/**
	 * Get the worrying comments list from from a CodeScanner configuration settings. 
	 * If the list does not exist in, get it from the default configuration settings.
	 * @param configSettings - CodeScanner configuration settings to be read
	 * @return worrying comments list as a string
	 */
	private String getWorryingCommentsFromConfig(CSConfigSettings configSettings) {
		String value = configSettings.getScriptWorryingComments();
		if (value == null) {
			value = getDefaultConfig().getScriptWorryingComments();
		}
		return value;
	}

	/**
	 * Check whether to perform project specific knowledge base scanning.
	 * @param pageSettings - project specific settings
	 * @return true if performing project specific knowledge base scanning.
	 */
	private boolean isProjectKbScanningEnabled (IDialogSettings pageSettings) {
		return pageSettings.getBoolean(CSPreferenceConstants.KBSCANNING);
	}

	/**
	 * Check whether to perform global knowledge base scanning.
	 * @return true if performing global knowledge base scanning.
	 */
	private boolean isGlobalKbScanningEnabled() {
		return CSPlugin.getCSPrefsStore().getBoolean(CSPreferenceConstants.KBSCANNING);
	}

}
