/******************************************************************************* * Copyright (c) 2013 INRIA. * 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: * Cau� Clasen - initial API and implementation *******************************************************************************/ package fr.inria.atlanmod.emfviews.elements; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import fr.inria.atlanmod.emfviews.core.View; import fr.inria.atlanmod.emfviews.rules.ReproduceRule; import fr.inria.atlanmod.emfviews.rules.TranslationRule; public class ReproduceElementImpl extends VirtualElement { private EObject concreteElement; private Map<EStructuralFeature, VirtualAssociation> virtualAssociations; public ReproduceElementImpl(View vModel, EObject concreteElement) { super(); EClass tempEClass = vModel.getMetamodelManager() .translateToVirtualEClass(concreteElement.eClass()); this.init(vModel, concreteElement, tempEClass); } public ReproduceElementImpl(View vModel, EObject concreteElement, EClass eClass) { this.init(vModel, concreteElement, eClass); } public Object setVirtualAssociation(EStructuralFeature feature, int index, List<EObject> targets) { for (EObject target : targets) { setVirtualAssociation(feature, index, target); } return null; } public Object setVirtualAssociation(EStructuralFeature feature, int index, EObject target) { if (virtualAssociations == null) { virtualAssociations = new HashMap<EStructuralFeature, VirtualAssociation>(); } VirtualAssociation vAss = virtualAssociations.get(feature); if (vAss == null) { vAss = new VirtualAssociation(this, feature, target); virtualAssociations.put(feature, vAss); } else { vAss.set(target, TranslationRule.NO_INDEX); } return null; } public Object getVirtualAssociation(EStructuralFeature feature, int index) { if (virtualAssociations == null) { if (feature.isMany()) { return new BasicEList<EObject>(); } else { return null; } } else { VirtualAssociation vAss = this.virtualAssociations.get(feature); if (vAss == null) { if (feature.isMany()) { return new BasicEList<EObject>(); } else { return null; } } else { return vAss.get(index); } } } private void init(View vModel, EObject concreteElement, EClass eClass) { this.eProperties().setEResource(vModel); this.concreteElement = concreteElement; this.eSetClass(eClass); this.eClass(); setTranslationRule(ReproduceRule.INSTANCE); eSetStore(this.getTranslationRule()); } public EObject getConcreteElement() { return concreteElement; } @Override public int hashCode() { return this.getConcreteElement().hashCode(); } public EStructuralFeature getConcreteFeature( EStructuralFeature virtualFeature) { return ((View) eResource()).getMetamodelManager() .translateFromVirtualFeature(this, virtualFeature); } }