/***************************************************************************************************
 * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
 * accompanying materials are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/

 * 
 * Contributors: IBM Corporation - initial API and implementation
 **************************************************************************************************/
package org.eclipse.wst.common.internal.emf.resource;


import java.util.Iterator;
import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;


public class TranslatorPath {
	protected Translator[] mapInfoPath;

	/**
	 * Construct with an array of Translator that specifies the path to follow from an object to
	 * another object
	 */
	public TranslatorPath(Translator[] path) {
		mapInfoPath = path;
	}

	public List findObjects(EObject startObject) {
		Object cur = startObject;
		for (int i = 0; i < mapInfoPath.length; i++) {
			Translator curMap = mapInfoPath[i];
			if (cur instanceof EObject) {
				EStructuralFeature curAttr = curMap.getFeature();
				if (curAttr == Translator.CONTAINER_FEATURE) {
					curAttr = ((EObject) cur).eContainmentFeature();
					cur = ((EObject) cur).eContainer();
				} else if (curAttr == Translator.ROOT_FEATURE) {
					cur = ((TranslatorResource) startObject.eResource()).getRootObject();
				} else {
					cur = ((EObject) cur).eGet(curAttr);
				}
				if (curMap.isMultiValued()) {
					return (List) cur;
				}
			}
		}
		return null;
	}

	public Object findObject(EObject startObject, Object matchValue) {
		List objects = findObjects(startObject);
		if (objects == null)
			return null;
		return findObject(objects, getLastMap(), matchValue);
	}

	private Object findObject(List objectList, Translator map, Object matchValue) {
		for (Iterator iter = objectList.iterator(); iter.hasNext();) {
			EObject mofObject = (EObject) iter.next();
			Object curMatchValue = mofObject.eGet(map.getFeature());
			if (matchValue.equals(curMatchValue))
				return mofObject;
		}
		return null;
	}

	public Translator getLastMap() {
		return mapInfoPath[mapInfoPath.length - 1];
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		StringBuffer sb = new StringBuffer();
		String cn = getClass().getName();
		int i = cn.lastIndexOf('.');
		cn = cn.substring(++i, cn.length());
		sb.append(cn);
		sb.append('(');
		sb.append(mapInfoPath[0]);
		for (int j = 1; j < mapInfoPath.length; j++) {
			sb.append('\n');
			sb.append(mapInfoPath[j]);
		}
		sb.append(')');
		return sb.toString();
	}

}