/*******************************************************************************
 * Copyright (c) 2004-2008 Akos Horvath, Gergely Varro and Daniel Varro
 * 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:
 *    Akos Horvath, Gergely Varro - initial API and implementation
 *******************************************************************************/

 package org.eclipse.viatra2.gtasm.patternmatcher.impl.gtmatcher.internal.operation;

import org.eclipse.viatra2.core.IModelElement;
import org.eclipse.viatra2.core.IModelManager;
import org.eclipse.viatra2.errors.VPMCoreException;
import org.eclipse.viatra2.gtasm.patternmatcher.impl.gtmatcher.exceptions.GTErrorStrings;
import org.eclipse.viatra2.gtasm.patternmatcher.impl.gtmatcher.exceptions.GTOperationException;
import org.eclipse.viatra2.gtasm.patternmatcher.impl.patternmatcher.internal.MatchingFrame;
import org.eclipse.viatra2.gtasm.patternmatcher.impl.patternmatcher.internal.searchgraph.SearchGraphEdge;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.core.AnnotatedElement;


/**
 * @author Akos Horvath
 *
 */
public class CreateInstanceofBound2Bound extends CreateBound2Bound {

	
	/**
	 * @param manager
	 * @param variableI
	 */
	private SearchGraphEdge relatedSearchGraphEdge;
	
	public CreateInstanceofBound2Bound(int s, int t,IModelManager manager, SearchGraphEdge edge){
		super(manager);
		target = t;
		source = s;
		relatedSearchGraphEdge = edge;
	}
	
	@Override
	protected boolean create(MatchingFrame frame) throws GTOperationException {
		
		IModelElement sourceElement = null;
        IModelElement targetElement = null;
        try {
            sourceElement = (IModelElement) frame.getValue(source);
        } catch (ClassCastException e) {
    			String[] context = {relatedSearchGraphEdge.getSourceNode().getName(), getClass().getSimpleName()};
    			throw new GTOperationException(GTErrorStrings.NOT_A_MODELELEMENT
    					,context
    					,relatedSearchGraphEdge.getSourceNode().getTraceabilityElement().getRepresentativeEMFElement());
        }
        try {
            targetElement = (IModelElement) frame.getValue(target);
        } catch (ClassCastException e) {
        	String[] context = {relatedSearchGraphEdge.getTargetNode().getName(), getClass().getSimpleName()};
			throw new GTOperationException(GTErrorStrings.NOT_A_MODELELEMENT
					,context
					,relatedSearchGraphEdge.getTargetNode().getTraceabilityElement().getRepresentativeEMFElement());
        }
        if (sourceElement == null) {
        	String[] context = {relatedSearchGraphEdge.getSourceNode().getName(),getClass().getSimpleName()};
			throw new GTOperationException(GTErrorStrings.INTERNAL_EMPTY_VALUE
					,context
					,relatedSearchGraphEdge.getSourceNode().getTraceabilityElement().getRepresentativeEMFElement());
			
        }
        if (targetElement == null) {
        	String[] context = {relatedSearchGraphEdge.getTargetNode().getName(),getClass().getSimpleName()};
			throw new GTOperationException(GTErrorStrings.INTERNAL_EMPTY_VALUE
					,context
					,relatedSearchGraphEdge.getTargetNode().getTraceabilityElement().getRepresentativeEMFElement());
        }
		
		
		try {
			manager.newInstanceOf(sourceElement,targetElement);
		}catch (VPMCoreException e) {
			String[] context = {frame.getPattern().getSearchGraph().getSearchNode(source).getName(),frame.getPattern().getSearchGraph().getSearchNode(target).getName(), e.getMessage()};
			throw new GTOperationException(GTErrorStrings.INTERNAL_CREATE_INSTANCEOF
					,context
					,relatedSearchGraphEdge.getTraceabilityElement().getRepresentativeEMFElement());
		}
		
		return true;
	}
	
	public String toString() {
			return getClass().getSimpleName() + " : " + 
	            source + "(type) -- instanceof -> " + target;
	}
	
	@Override
	public AnnotatedElement getErrorfulElement(MatchingFrame frame){
    	return relatedSearchGraphEdge.getTraceabilityElement().getRepresentativeEMFElement();
    }
}
