/*******************************************************************************
 * Copyright (c) 2001, 2005 IBM 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:
 * IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.j2ee.internal.model.translator.common;

import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jem.java.JavaClass;
import org.eclipse.jem.java.JavaRefFactory;
import org.eclipse.wst.common.internal.emf.resource.Translator;
import org.eclipse.wst.common.internal.emf.resource.TranslatorPath;

public class JavaClassTranslator extends Translator {

	/**
	 * Constructor for JavaClassTranslator.
	 * @param domNameAndPath
	 * @param aFeature
	 */
	public JavaClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
		super(domNameAndPath, aFeature);
	}

	/**
	 * Constructor for JavaClassTranslator.
	 * @param domNameAndPath
	 * @param aFeature
	 * @param path
	 */
	public JavaClassTranslator(String domNameAndPath, EStructuralFeature aFeature, TranslatorPath path) {
		super(domNameAndPath, aFeature, path);
	}

	/**
	 * Constructor for JavaClassTranslator.
	 * @param domNameAndPath
	 * @param aFeature
	 * @param paths
	 */
	public JavaClassTranslator(String domNameAndPath, EStructuralFeature aFeature, TranslatorPath[] paths) {
		super(domNameAndPath, aFeature, paths);
	}

	/**
	 * Constructor for JavaClassTranslator.
	 * @param domNameAndPath
	 * @param aFeature
	 * @param style
	 */
	public JavaClassTranslator(String domNameAndPath, EStructuralFeature aFeature, int style) {
		super(domNameAndPath, aFeature, style);
	}

	@Override
	public Object convertStringToValue(String nodeName, String readAheadName, String value, Notifier owner) {
		Object result = null;
		if (value != null) {
			result = convertStringToValue(value, (EObject) owner);
		}
		
		return result;
	}

	/**
	 * @see com.ibm.etools.emf2xml.impl.Translator#convertStringToValue(String)
	 */
	@Override
	public Object convertStringToValue(String strValue, EObject owner) {
		if (strValue != null) {
			String qualifiedName = removePreceedingAndTrailingPeriods(strValue.trim());		
			if (owner != null) {
				Resource ownerRes = owner.eResource();
				if (ownerRes != null) {
					ResourceSet rs = ownerRes.getResourceSet();
					if (rs != null) {
						//Try to reflect the type directly.  If nothing is returned
						//or an error occurs, return a proxy.
						Object javaClass = null;
						try {
							javaClass = JavaRefFactory.eINSTANCE.reflectType(qualifiedName, rs);
						} catch (Exception e) {
							//Ignore
							return null;
						}
						if (javaClass != null)
							return javaClass;
					}
				}
			}
			try{
				return JavaRefFactory.eINSTANCE.createClassRef(qualifiedName);
			} catch (Exception e){
				//Ignore
			}
		}
		return null;
	}
	private String removePreceedingAndTrailingPeriods(String qualifiedName) {
		char[] characters = qualifiedName.toCharArray();
		int startIndex = 0;
		for (; startIndex < characters.length && characters[startIndex] == '.'; startIndex++){
			//do nothing simply incrementing startIndex
		}
		// Handle case where all chars in the qualifiedName are periods
		if(startIndex >= characters.length)
			return qualifiedName;
		int qualifiedNameEnd = qualifiedName.length() - 1;
		int endIndex = qualifiedNameEnd;
		for (; endIndex > -1 && characters[endIndex] == '.'; endIndex--) {
			if (startIndex == 0 && endIndex == qualifiedNameEnd)
				return qualifiedName;
		}	
		return qualifiedName.substring(startIndex, endIndex + 1);
		
	}	

	/**
	 * @see com.ibm.etools.emf2xml.impl.Translator#convertValueToString(Object)
	 */
	@Override
	public String convertValueToString(Object value, EObject owner) {
		if (value != null)
			return ((JavaClass) value).getQualifiedName();
		return null;
	}

}
