blob: 34e52d79203fac53a211fd081fe5c59725115f81 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004-2008 Andras Balogh 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:
* Andras Balogh - initial API and implementation
*******************************************************************************/
package org.eclipse.viatra2.imports.vtml;
import org.eclipse.viatra2.core.IEntity;
import org.eclipse.viatra2.core.IModelElement;
import org.eclipse.viatra2.core.IModelManager;
import org.eclipse.viatra2.core.IModelSpace;
import org.eclipse.viatra2.core.IRelation;
import org.eclipse.viatra2.errors.VPMCoreException;
/**
* @author babo
*
*/
public class RelationDefinition extends ElementDefinition {
IRelation element = null;
public IModelElement getElement()
{
if (element==null)
{
//System.out.println("GETELEMENT: "+this.toString());
elemGen(VTMLMetaModelHelper.getInstance().getMSpace());
}
return element;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
// TODO Auto-generated method stub
return "relation name : "+name+" type : "+type+" src : "+source+" trg: "+target+" namespace: "+namespace;
}
String name;
String namespace;
String defns;
String type;
String source;
String target;
IModelElement tar;
IModelElement src;
IModelElement typ;
IEntity ns;
public boolean isNativ = false;
public RelationDefinition(IRelation r)
{
defns="";
name = r.getName();
namespace = r.getNamespace().getFullyQualifiedName();
source = r.getFrom().getFullyQualifiedName();
target = r.getTo().getFullyQualifiedName();
element = r;
type = null;
isNativ = true;
}
public RelationDefinition(int l, String ns, String n, String t, String s, String tar)
{
name = n;
if (name.indexOf(".")>0) name = name.substring(name.lastIndexOf(".")+1);
namespace = ns;
defns = ns;
type = t;
source = s;
target = tar;
setLine(l);
isNativ=false;
}
RelationDefinition _type = null;
ElementDefinition _source = null;
ElementDefinition _target = null;
/* (non-Javadoc)
* @see org.eclipse.viatra2.imports.vtcl.ASTNode#checkDefintion(org.eclipse.viatra2.imports.vtcl.ASTBuilder, org.eclipse.viatra2.core.IModelSpace)
*/
public boolean checkDefintion(ASTBuilder ab, IModelSpace m) {
String tmp = null;
if (!isNativ)
{
_type = ab.getRelationWithLookup(defns,type);
if ((_type==null) && (!type.equals("relation")))
{
ab.log.error("type "+type+" for relation "+name+" not found. Error in line "+getLine());
return false;
}
_source = ab.getElementWithLookup(defns,source);
if (_source==null)
{
ab.log.error("Source "+source+" for relation "+name+" not found. Error in line "+getLine());
return false;
} else source = tmp;
_target = ab.getElementWithLookup(defns,target);
if (_target==null)
{
ab.log.error("Target "+target+" for relation "+name+" not found. Error in line "+getLine());
return false;
} else target = tmp;
if (_target==this || _source==this)
{
ab.log.error("Relation cannot start or end in itself. Error in line "+getLine());
return false;
}
}
for (RelationDefinition r : relations)
{
boolean btm = r.checkDefintion(ab,m);
if (!btm) return false;
}
return true;
}
/* (non-Javadoc)
* @see org.eclipse.viatra2.imports.vtcl.ASTNode#resolveReferences(org.eclipse.viatra2.imports.vtcl.ASTBuilder)
*/
public void resolveReferences(ASTBuilder ab) throws VPMCoreException{
}
public String getFQN()
{
return namespace+"."+name;
//if (namespace.length()==0) return name; else return namespace+"."+name;
}
/* (non-Javadoc)
* @see org.eclipse.viatra2.imports.vtcl.ASTNode#updateModelspace(org.eclipse.viatra2.imports.vtcl.ASTBuilder, org.eclipse.viatra2.core.IModelSpace)
*/
public void updateModelspace(ASTBuilder ab, IModelSpace m) throws VPMCoreException{
elemGen(m);
for (RelationDefinition r : relations)
{
r.updateModelspace(ab,m);
}
}
String tmpName;
IRelation me;
IEntity tmp;
boolean amIFun=false;
IModelManager mm;
public void generateElements(ASTBuilder ab, IModelSpace m,IEntity temp) throws VPMCoreException
{
}
public void elemGen(IModelSpace m)
{
if (element==null)
{
try
{
mm = m.getModelManager();
// System.out.println("<DEBUG>"+name+" "+isNativ+" "+_source+" "+_target);
element = mm.newRelation(name,_source.getElement(),_target.getElement());
if (_type!=null) mm.newInstanceOf(_type.getElement(),element);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
/**
* @return Returns the name.
*/
public String getName() {
if (isNativ)
return element.getName();
else
return name;
}
/**
* @param name The name to set.
*/
public void setName(String name) {
this.name = name;
}
/**
* @return Returns the namespace.
*/
public String getNamespace() {
if (isNativ)
if (element.getFrom().getNamespace()!=null)
return element.getFrom().getNamespace().getFullyQualifiedName();
else return "";
else
return namespace;
}
/**
* @param namespace The namespace to set.
*/
public void setNamespace(String namespace) {
this.namespace = namespace;
}
/**
* @return Returns the source.
*/
public String getSource() {
if (isNativ)
return element.getFrom().getName();
else
return source;
}
/**
* @param source The source to set.
*/
public void setSource(String source) {
this.source = source;
}
/**
* @return Returns the target.
*/
public String getTarget() {
return target;
}
/**
* @param target The target to set.
*/
public void setTarget(String target) {
this.target = target;
}
/**
* @return Returns the type.
*/
public String getType() {
return type;
}
/**
* @param type The type to set.
*/
public void setType(String type) {
this.type = type;
}
}