/******************************************************************************* * Copyright (c) 2010-2015 Henshin developers. 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: * TU Berlin, University of Luxembourg, SES S.A. *******************************************************************************/ package de.tub.tfs.henshin.tggeditor; import java.util.Iterator; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.henshin.model.Mapping; import org.eclipse.emf.henshin.model.Module; import org.eclipse.emf.henshin.model.Node; import org.eclipse.emf.henshin.model.Rule; import agg.attribute.AttrType; import agg.attribute.AttrTypeMember; import agg.attribute.handler.AttrHandler; import agg.attribute.handler.impl.javaExpr.JexHandler; import agg.xt_basis.Arc; import agg.xt_basis.Type; import de.tub.tfs.henshin.analysis.AggInfo; import de.tub.tfs.henshin.tgg.NodeLayout; import de.tub.tfs.henshin.tgg.TGG; import de.tub.tfs.henshin.tgg.TNode; import de.tub.tfs.henshin.tgg.interpreter.util.NodeUtil; import de.tub.tfs.henshin.tgg.interpreter.util.RuleUtil; import de.tub.tfs.henshin.tggeditor.util.ModelUtil; import de.tub.tfs.henshin.tggeditor.util.GraphicalNodeUtil; public class TggAggInfo extends AggInfo { public TggAggInfo(Module ts) { super(ts); } public void extendDueToTGG(TGG layoutSystem) { extendSrsNodeType(layoutSystem); extendEdgeTypeMultiplicity(layoutSystem); //olga extendFTRules(layoutSystem); } private void extendSrsNodeType(TGG layoutSystem) { AttrHandler handler = new JexHandler(); for (EClass emfType : nodeTypeMap.keySet()) { if (NodeUtil.isSourceClass(layoutSystem, emfType)) { Type aggNodeType = nodeTypeMap.get(emfType); AttrType attr = aggNodeType.getAttrType(); AttrTypeMember member = attr.addMember(handler,"boolean" , "translated"); if (member.getType() == null) System.out.println("DEBUG: " + member.getType()); aggNodeType.getTypeGraphNodeObject().getAttribute().setExprValueAt("false", "translated"); ((agg.attribute.impl.ValueTuple)aggNodeType.getTypeGraphNodeObject().getAttribute()).showValue(); } } } //olga private EClass getEClassForType(Type t) { Iterator<EClass> iter = this.nodeTypeMap.keySet().iterator(); while (iter.hasNext()) { EClass c = iter.next(); if (this.nodeTypeMap.get(c) == t) return c; } return null; } //olga - set 1 at source max for multiplicity of edges from Corr to Source private void extendEdgeTypeMultiplicity(TGG layoutSystem) { Iterator<Arc> arcs = this.aggTypeGraph.getArcsCollection().iterator(); while (arcs.hasNext()) { agg.xt_basis.Arc aggEdge = arcs.next(); EClass srcC = getEClassForType(aggEdge.getSourceType()); EClass tarC = getEClassForType(aggEdge.getTargetType()); // TODO: determine triple component from tgg rule, because a type may occur in several components if (NodeUtil.isCorrespondenceClass(layoutSystem, srcC) && NodeUtil.isSourceClass(layoutSystem, tarC)) { aggEdge.getType().setSourceMax(aggEdge.getSourceType(), aggEdge.getTargetType(), 1); } } } private void extendFTRules(TGG layoutSystem) { EList<Rule> rules = ModelUtil.getRules( this.emfGrammar); for (Rule r : rules) { if (r.getName().startsWith("FT") || r.getName().startsWith("CR")) { // System.out.println("DEBUG: " + r.getName()); EList<TNode> rhsNodes = (EList)r.getRhs().getNodes(); for (TNode n : rhsNodes) { if (NodeUtil.isSourceNode(n)) { agg.xt_basis.Node aggNode = (agg.xt_basis.Node) this.henshinToAggConversionMap.get(n); if (RuleUtil.Translated.equals(n.getMarkerType()) && aggNode.getAttribute() != null && aggNode.getAttribute().getMemberAt("translated") != null) { aggNode.getAttribute().setExprValueAt(String.valueOf(Boolean.TRUE), "translated"); ((agg.attribute.impl.ValueTuple)aggNode.getAttribute()).showValue(); for (Mapping m : r.getMappings()) { if (m.getImage() == n) { Node nLhs = m.getOrigin(); agg.xt_basis.Node aggNodeLhs = (agg.xt_basis.Node) this.henshinToAggConversionMap.get(nLhs); if (aggNodeLhs.getAttribute().getMemberAt("translated") != null) { //TODO check if this is correct aggNodeLhs.getAttribute().setExprValueAt(String.valueOf(!RuleUtil.Translated.equals(n.getMarkerType()) ), "translated"); ((agg.attribute.impl.ValueTuple)aggNodeLhs.getAttribute()).showValue(); } } } } } } } } } }