package org.eclipse.epf.xml.uma.util;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.xmi.XMLHelper;
import org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl;
import org.eclipse.epf.common.serviceability.VersionUtil;

/**
 * This class customize the XMLSaveImpl to save the string tags as CDATA
 * 
 * @author Jinhua Xi
 * @since 1.0
 *
 */
public class UmaXMLSaveImpl extends XMLSaveImpl {

	public static List cdataFeatureNames = new ArrayList();
	static {
		
		cdataFeatureNames.add("alternatives");
		cdataFeatureNames.add("mainDescription");
		cdataFeatureNames.add("howToStaff");
		cdataFeatureNames.add("keyConsiderations");
		cdataFeatureNames.add("purpose");	
		cdataFeatureNames.add("scope");					// ProcessDescription
		cdataFeatureNames.add("usageNotes");			// ProcessDescription
	}
	
	private boolean isCDATAFeature(EStructuralFeature f, boolean isAttribute) {
		
		if ( isAttribute ) {
			return false;
		}
		
//		if ( f == UmaPackage.eINSTANCE.getContentDescription_KeyConsiderations() 
//			|| f == UmaPackage.eINSTANCE.getContentDescription_MainDescription()
//			|| f == UmaPackage.eINSTANCE.getSection_Description()
//		) {
//			System.out.println("test");
//		}
		
		return cdataFeatureNames.contains(f.getName());
	}
	
	/**
	 * 
	 * @param helper
	 */
	public UmaXMLSaveImpl(XMLHelper helper) {
		super(helper);
	}

	/**
	 * 
	 * @param options Map
	 * @param helper XMLHelper
	 * @param encoding String
	 */
	public UmaXMLSaveImpl(Map options, XMLHelper helper, String encoding) {
		super(options, helper, encoding);
	}

	protected String getDatatypeValue(Object value, EStructuralFeature f,
			boolean isAttribute) {	
		
		if ( value == null || value.toString().equals("") ) {
			return "";
		}				
		
		if ( isCDATAFeature(f, isAttribute) ) {
			String str = value.toString();
			String replaced = "]]>";								//$NON-NLS-1$
			if (str != null && str.indexOf(replaced) >= 0) {
				str = str.replaceAll(replaced, "]]]]><![CDATA[>" );	//$NON-NLS-1$	//175395
			}
			return "<![CDATA[" + str + "]]>";
		}
		
		return super.getDatatypeValue(value, f, isAttribute);
	}
	
}
