package com.atlassian.uwc.converters;

import java.util.Properties;

import org.apache.log4j.Logger;

import com.atlassian.uwc.ui.ConverterErrors;
import com.atlassian.uwc.ui.listeners.FeedbackHandler;

/**
 * An abstract base class to hold the key and value fields.
 * This gets rid of some duplicated code.
 * The key and value fields are usually not used by the converters.
 *
 * To create a new converter type extend this class. If the class
 * is a new type of regular expression engine then add the appropriate
 * code to instantiate it in ConverterEngine.getConverterFromString()
 *
 * @author Rex (Rolf Staflin)
 * @version $Id$
 */
public abstract class BaseConverter implements Converter, FeedbackHandler {

    /**
     * converter string key as defined in converter properties file
     */
    String key;
    /**
     * converter string value as defined in converter properties file
     */
    String value;
    /**
     * attachment directory as provided by user in Attachments textfield of gui.
     */
    String attachmentDirectory;
    /**
     * object containing errors encountered by converter that will be
     * communicated back to the user via the Feedback Framework
     */
    ConverterErrors errors = new ConverterErrors();
    /**
     * logging object - sends logs to console and uwc.log
     */
    Logger log = Logger.getLogger("BaseConverter");
    /**
     * contains miscellaneous properties passed in by the ConverterEngine when
     * the converter is created
     */
    Properties properties = new Properties();
    
    
    /**
     * @return gets the attachment directory setting the user provides via the 
     * Attachments textfield in the GUI
     */
    protected String getAttachmentDirectory() {
    	return this.attachmentDirectory;
    }
	public void setAttachmentDirectory(String attachmentDirectory) {
		this.attachmentDirectory = attachmentDirectory;
	}

	public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String toString() {
        return "[" + this.getClass().getSimpleName() + ": " + key + "=" + value + "]";
    }
    
    /** 
     * Get the errors generated by the conversion
     * @see com.atlassian.uwc.converters.Converter#getErrors()
     */
    public ConverterErrors getErrors() {
    	return this.errors;
    }
    
    /**
     * adds an error to the error list.
     * @param type type of feedback. Usually an error. 
     * If OK, will not count as an error, but will be considered a status message.
     * @param note description of feedback. This is where you explain what actually happened. 
     * @param isFeedbackWindowMessage if true, will be displayed in the feedback window.
     * This should usually be true.
     */
    public void addError(Feedback type, String note, boolean isFeedbackWindowMessage) {
    	this.errors.addError(type, note, isFeedbackWindowMessage);
    }

    public Properties getProperties() {
    	return this.properties;
    }
    
    public void setProperties(Properties properties) {
    	this.properties = properties;
    }
}
