/*******************************************************************************
 * Copyright (c) 2005, 2011 Intel Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Intel Corporation - Initial API and implementation
 *    James Blackburn (Broadcom Corp.)
 *    IBM Corporation
 *******************************************************************************/
package org.eclipse.cdt.utils.envvar;

import org.eclipse.cdt.core.envvar.EnvironmentVariable;
import org.eclipse.cdt.core.settings.model.ICStorageElement;
import org.eclipse.cdt.internal.core.SafeStringInterner;
import org.osgi.service.prefs.Preferences;

/**
 * This class represents the Environment variable that could be loaded
 * and stored in XML
 * 
 * @since 3.0
 */
public class StorableEnvVar extends EnvironmentVariable {
	public static final String VARIABLE_ELEMENT_NAME = "variable"; //$NON-NLS-1$
	public static final String NAME = "name"; //$NON-NLS-1$
	public static final String VALUE = "value"; //$NON-NLS-1$
	public static final String OPERATION = "operation"; //$NON-NLS-1$
	public static final String DELIMITER = "delimiter"; //$NON-NLS-1$
	
	public static final String REPLACE = "replace"; //$NON-NLS-1$
	public static final String REMOVE = "remove"; //$NON-NLS-1$
	public static final String APPEND = "append"; //$NON-NLS-1$
	public static final String PREPEND = "prepend"; //$NON-NLS-1$
	
	public StorableEnvVar(String name, String value, int op, String delimiter){
		super(name,value,op,delimiter);
	}
	
	public StorableEnvVar(String name){
		this(name,null,ENVVAR_REPLACE,null);
	}
	
	public StorableEnvVar(String name, String value){
		this(name,value,ENVVAR_REPLACE,null);	
	}
	
	public StorableEnvVar(String name, String value, String delimiter){
		this(name,value,ENVVAR_REPLACE,delimiter);	
	}

	/**
	 * Load the environment variable from the ICStorageElement
	 * @param element
	 */
	public StorableEnvVar(ICStorageElement element){
		fName = SafeStringInterner.safeIntern(element.getAttribute(NAME));

		fValue = SafeStringInterner.safeIntern(element.getAttribute(VALUE));

		fOperation = opStringToInt(element.getAttribute(OPERATION));
			
		fDelimiter = element.getAttribute(DELIMITER);
		if("".equals(fDelimiter)) //$NON-NLS-1$
			fDelimiter = null;
	}

	/**
	 * Load the Environment Variable directly from a Preference element 
	 * @param name
	 * @param element
	 * @since 5.2
	 */
	public StorableEnvVar(String name, Preferences element){
		fName = SafeStringInterner.safeIntern(name);
		fValue = SafeStringInterner.safeIntern(element.get(VALUE, null));
		fOperation = opStringToInt(element.get(OPERATION, null));
		fDelimiter = element.get(DELIMITER, null);
	}

	
	private int opStringToInt(String op){
		int operation;
		
		if(REMOVE.equals(op))
			operation = ENVVAR_REMOVE;
		else if(APPEND.equals(op))
			operation = ENVVAR_APPEND;
		else if(PREPEND.equals(op))
			operation = ENVVAR_PREPEND;
		else
			operation = ENVVAR_REPLACE;
		
		return operation;
	}
	
	private String opIntToString(int op){
		String operation;
		
		if(ENVVAR_REMOVE == op)
			operation = REMOVE;
		else if(ENVVAR_APPEND == op)
			operation = APPEND;
		else if(ENVVAR_PREPEND == op)
			operation = PREPEND;
		else
			operation = REPLACE;
		
		return operation;
	}

	public void serialize(ICStorageElement element){
		if(fName != null)
			element.setAttribute(NAME,fName);
		
		if(fValue != null)
			element.setAttribute(VALUE,fValue);
		
		element.setAttribute(OPERATION,opIntToString(fOperation));
		
		if(fDelimiter != null)
			element.setAttribute(DELIMITER,fDelimiter);
	}

	/**
	 * Serialize this Preference straight into the Preferences element.
	 * It's assumed that the Preference node represents this StorableEnvVar's name
	 * @param element
	 * @since 5.2
	 */
	public void serialize(Preferences element) {
		if(fValue != null)
			element.put(VALUE, fValue);

		element.put(OPERATION, opIntToString(fOperation));

		if(fDelimiter != null)
			element.put(DELIMITER, fDelimiter);
	}
}
