/*******************************************************************************
 * 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.gtasm.patternmatcher.impl.patternmatcher.internal.searchgraph.SearchGraphNode;
import org.eclipse.viatra2.gtasm.patternmatcher.impl.patternmatcher.internal.searchgraph.VariableSearchGraphNode;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.core.AnnotatedElement;


/**
 * @author Akos Horvath
 *
 */
public class CreateRelationBound2Bound extends CreateBound2Bound {

	
	/**
	 * @param manager
	 * @param variableI
	 */
	
	public CreateRelationBound2Bound(int s, int t,
			int variableI ,IModelManager manager){
		super(manager,variableI);
		target = t;
		source = s;
	}
	
	@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 = {frame.getPattern().getSearchGraph().getSearchNode(source).getName(), getClass().getSimpleName()};
    			throw new GTOperationException(GTErrorStrings.NOT_A_MODELELEMENT
    					,context
    					,frame.getPattern().getSearchGraph().getSearchNode(source).getTraceabilityElement().getRepresentativeEMFElement());
        }
        try {
            targetElement = (IModelElement) frame.getValue(target);
        } catch (ClassCastException e) {
        	String[] context = {frame.getPattern().getSearchGraph().getSearchNode(target).getName(), getClass().getSimpleName()};
			throw new GTOperationException(GTErrorStrings.NOT_A_MODELELEMENT
					,context
					,frame.getPattern().getSearchGraph().getSearchNode(target).getTraceabilityElement().getRepresentativeEMFElement());
        }
        if (sourceElement == null) {
        	String[] context = {frame.getPattern().getSearchGraph().getSearchNode(source).getName(),getClass().getSimpleName()};
			throw new GTOperationException(GTErrorStrings.INTERNAL_EMPTY_VALUE
					,context
					,frame.getPattern().getSearchGraph().getSearchNode(source).getTraceabilityElement().getRepresentativeEMFElement());
			
        }
        if (targetElement == null) {
        	String[] context = {frame.getPattern().getSearchGraph().getSearchNode(target).getName(),getClass().getSimpleName()};
			throw new GTOperationException(GTErrorStrings.INTERNAL_EMPTY_VALUE
					,context
					,frame.getPattern().getSearchGraph().getSearchNode(target).getTraceabilityElement().getRepresentativeEMFElement());
        }
        
		try {
			frame.setValue(variableIndex, manager.newRelation(sourceElement,targetElement));
		}catch (VPMCoreException e) {
			String[] context = {frame.getPattern().getSearchGraph().getSearchNode(variableIndex).getName(),e.getMessage()};
			throw new GTOperationException(GTErrorStrings.INTERNAL_CREATE_RELATION
					,context
					,frame.getPattern().getSearchGraph().getSearchNode(variableIndex).getTraceabilityElement().getRepresentativeEMFElement());
		}
		
		return true;
	}
	
	public String toString() {
			return getClass().getSimpleName() + " : " + 
	            source + " -- Relation:"+ variableIndex+" -> " + target;
	}
	   
	@Override
	public AnnotatedElement getErrorfulElement(MatchingFrame frame){
	    	return frame.getPattern().getSearchGraph().getSearchNode(variableIndex).getTraceabilityElement().getRepresentativeEMFElement();
	    }
}



	
