/***************************************************************************************************
 * 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 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.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();
	}

}