/*******************************************************************************
 * Copyright (c) 2008 xored software, Inc.  
 *
 * 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:
 *     xored software, Inc. - initial API and Implementation (Andrei Sobolev)
 *******************************************************************************/
package org.eclipse.dltk.internal.core;

import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.IModelElementMemento;
import org.eclipse.dltk.core.IParent;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.core.WorkingCopyOwner;
import org.eclipse.dltk.internal.core.util.MementoTokenizer;

public class MementoModelElementUtil {
	public static IModelElement getHandleFromMemento(MementoTokenizer memento,
			IParent parent, WorkingCopyOwner owner) {
		String token = null;
		String name = "";
		while (memento.hasMoreTokens()) {
			token = memento.nextToken();
			char firstChar = token.charAt(0);
			if (ModelElement.JEM_USER_ELEMENT_ENDING.indexOf(firstChar) == -1
					&& firstChar != ModelElement.JEM_COUNT) {
				name += token;
			} else {
				break;
			}
		}
		if (!memento.hasMoreTokens()) {
			token = null;
		}
		try {
			IModelElement[] children = parent.getChildren();
			for (int i = 0; i < children.length; i++) {
				if (name.equals(children[i].getElementName())
						&& children[i] instanceof IModelElementMemento) {
					IModelElementMemento childMemento = (IModelElementMemento) children[i];
					if (token == null) {
						return childMemento
								.getHandleFromMemento(memento, owner);
					} else {
						return childMemento.getHandleFromMemento(token,
								memento, owner);
					}
				}
			}
		} catch (ModelException e) {
			DLTKCore.error("Incorrect handle resolving", e);
		}
		return null;
	}
}
