/**
* <copyright>
* </copyright>
*
* $Id$
*/
package org.eclipse.etrice.generator.etricegen.impl;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.util.EObjectContainmentEList;
import org.eclipse.emf.ecore.util.EObjectResolvingEList;
import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.etrice.core.room.ActorClass;
import org.eclipse.etrice.core.room.ProtocolClass;
import org.eclipse.etrice.generator.etricegen.ActorInstance;
import org.eclipse.etrice.generator.etricegen.BindingInstance;
import org.eclipse.etrice.generator.etricegen.ConnectionInstance;
import org.eclipse.etrice.generator.etricegen.ETriceGenPackage;
import org.eclipse.etrice.generator.etricegen.InterfaceItemInstance;
import org.eclipse.etrice.generator.etricegen.PortInstance;
import org.eclipse.etrice.generator.etricegen.PortKind;
import org.eclipse.etrice.generator.etricegen.SAPInstance;
import org.eclipse.etrice.generator.etricegen.SPPInstance;
import org.eclipse.etrice.generator.etricegen.ServiceImplInstance;
import org.eclipse.etrice.generator.etricegen.StructureInstance;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>Structure Instance</b></em>'.
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link org.eclipse.etrice.generator.etricegen.impl.StructureInstanceImpl#getInstances <em>Instances</em>}</li>
* <li>{@link org.eclipse.etrice.generator.etricegen.impl.StructureInstanceImpl#getPorts <em>Ports</em>}</li>
* <li>{@link org.eclipse.etrice.generator.etricegen.impl.StructureInstanceImpl#getSaps <em>Saps</em>}</li>
* <li>{@link org.eclipse.etrice.generator.etricegen.impl.StructureInstanceImpl#getSpps <em>Spps</em>}</li>
* <li>{@link org.eclipse.etrice.generator.etricegen.impl.StructureInstanceImpl#getServices <em>Services</em>}</li>
* <li>{@link org.eclipse.etrice.generator.etricegen.impl.StructureInstanceImpl#getBindings <em>Bindings</em>}</li>
* <li>{@link org.eclipse.etrice.generator.etricegen.impl.StructureInstanceImpl#getConnections <em>Connections</em>}</li>
* <li>{@link org.eclipse.etrice.generator.etricegen.impl.StructureInstanceImpl#getAllContainedInstances <em>All Contained Instances</em>}</li>
* <li>{@link org.eclipse.etrice.generator.etricegen.impl.StructureInstanceImpl#getOrderedIfItemInstances <em>Ordered If Item Instances</em>}</li>
* </ul>
* </p>
*
* @generated
*/
public class StructureInstanceImpl extends InstanceBaseImpl implements StructureInstance {
/**
* The cached value of the '{@link #getInstances() <em>Instances</em>}' containment reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getInstances()
* @generated
* @ordered
*/
protected EList<ActorInstance> instances;
/**
* The cached value of the '{@link #getPorts() <em>Ports</em>}' containment reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getPorts()
* @generated
* @ordered
*/
protected EList<PortInstance> ports;
/**
* The cached value of the '{@link #getSaps() <em>Saps</em>}' containment reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getSaps()
* @generated
* @ordered
*/
protected EList<SAPInstance> saps;
/**
* The cached value of the '{@link #getSpps() <em>Spps</em>}' containment reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getSpps()
* @generated
* @ordered
*/
protected EList<SPPInstance> spps;
/**
* The cached value of the '{@link #getServices() <em>Services</em>}' containment reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getServices()
* @generated
* @ordered
*/
protected EList<ServiceImplInstance> services;
/**
* The cached value of the '{@link #getBindings() <em>Bindings</em>}' containment reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getBindings()
* @generated
* @ordered
*/
protected EList<BindingInstance> bindings;
/**
* The cached value of the '{@link #getConnections() <em>Connections</em>}' containment reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getConnections()
* @generated
* @ordered
*/
protected EList<ConnectionInstance> connections;
/**
* The cached value of the '{@link #getOrderedIfItemInstances() <em>Ordered If Item Instances</em>}' reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getOrderedIfItemInstances()
* @generated
* @ordered
*/
protected EList<InterfaceItemInstance> orderedIfItemInstances;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected StructureInstanceImpl() {
super();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected EClass eStaticClass() {
return ETriceGenPackage.Literals.STRUCTURE_INSTANCE;
}
public HashMap<ProtocolClass, ServiceImplInstance> protocol2service = new HashMap<ProtocolClass, ServiceImplInstance>();
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EList<ActorInstance> getInstances() {
if (instances == null) {
instances = new EObjectContainmentEList<ActorInstance>(ActorInstance.class, this, ETriceGenPackage.STRUCTURE_INSTANCE__INSTANCES);
}
return instances;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EList<PortInstance> getPorts() {
if (ports == null) {
ports = new EObjectContainmentEList<PortInstance>(PortInstance.class, this, ETriceGenPackage.STRUCTURE_INSTANCE__PORTS);
}
return ports;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EList<SAPInstance> getSaps() {
if (saps == null) {
saps = new EObjectContainmentEList<SAPInstance>(SAPInstance.class, this, ETriceGenPackage.STRUCTURE_INSTANCE__SAPS);
}
return saps;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EList<SPPInstance> getSpps() {
if (spps == null) {
spps = new EObjectContainmentEList<SPPInstance>(SPPInstance.class, this, ETriceGenPackage.STRUCTURE_INSTANCE__SPPS);
}
return spps;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EList<ServiceImplInstance> getServices() {
if (services == null) {
services = new EObjectContainmentEList<ServiceImplInstance>(ServiceImplInstance.class, this, ETriceGenPackage.STRUCTURE_INSTANCE__SERVICES);
}
return services;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EList<BindingInstance> getBindings() {
if (bindings == null) {
bindings = new EObjectContainmentEList<BindingInstance>(BindingInstance.class, this, ETriceGenPackage.STRUCTURE_INSTANCE__BINDINGS);
}
return bindings;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EList<ConnectionInstance> getConnections() {
if (connections == null) {
connections = new EObjectContainmentEList<ConnectionInstance>(ConnectionInstance.class, this, ETriceGenPackage.STRUCTURE_INSTANCE__CONNECTIONS);
}
return connections;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public EList<ActorInstance> getAllContainedInstances() {
BasicEList<ActorInstance> result = new BasicEList<ActorInstance>();
TreeIterator<EObject> it = eAllContents();
while (it.hasNext()) {
EObject obj = it.next();
if (obj instanceof ActorInstance)
result.add((ActorInstance) obj);
}
return result;
}
/**
* <!-- begin-user-doc -->
* for each base class, super classes first, (ports, saps and services) in this order
* <!-- end-user-doc -->
* @generated NOT
*/
public EList<InterfaceItemInstance> getOrderedIfItemInstances() {
if (orderedIfItemInstances == null) {
orderedIfItemInstances = new EObjectResolvingEList<InterfaceItemInstance>(InterfaceItemInstance.class, this, ETriceGenPackage.STRUCTURE_INSTANCE__ORDERED_IF_ITEM_INSTANCES);
if (this instanceof ActorInstance) {
ActorInstance ai = (ActorInstance) this;
// create a list of base classes, super first
LinkedList<ActorClass> classes = new LinkedList<ActorClass>();
ActorClass ac = ai.getActorClass();
while (ac!=null) {
classes.addFirst(ac);
ac = ac.getBase();
}
for (ActorClass a : classes) {
for (PortInstance p : ai.getPorts()) {
if (p.getKind()!=PortKind.RELAY && isInActorClass(p.getPort(), a))
orderedIfItemInstances.add(p);
}
for (SAPInstance sap : ai.getSaps()) {
if (isInActorClass(sap.getSap(), a))
orderedIfItemInstances.add(sap);
}
for (ServiceImplInstance svc : ai.getServices()) {
if (isInActorClass(svc.getSvcImpl(), a))
orderedIfItemInstances.add(svc);
}
}
}
}
return orderedIfItemInstances;
}
private boolean isInActorClass(EObject obj, ActorClass ac) {
while (obj!=null) {
obj = obj.eContainer();
if (obj instanceof ActorClass)
if (obj==ac)
return true;
}
return false;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case ETriceGenPackage.STRUCTURE_INSTANCE__INSTANCES:
return ((InternalEList<?>)getInstances()).basicRemove(otherEnd, msgs);
case ETriceGenPackage.STRUCTURE_INSTANCE__PORTS:
return ((InternalEList<?>)getPorts()).basicRemove(otherEnd, msgs);
case ETriceGenPackage.STRUCTURE_INSTANCE__SAPS:
return ((InternalEList<?>)getSaps()).basicRemove(otherEnd, msgs);
case ETriceGenPackage.STRUCTURE_INSTANCE__SPPS:
return ((InternalEList<?>)getSpps()).basicRemove(otherEnd, msgs);
case ETriceGenPackage.STRUCTURE_INSTANCE__SERVICES:
return ((InternalEList<?>)getServices()).basicRemove(otherEnd, msgs);
case ETriceGenPackage.STRUCTURE_INSTANCE__BINDINGS:
return ((InternalEList<?>)getBindings()).basicRemove(otherEnd, msgs);
case ETriceGenPackage.STRUCTURE_INSTANCE__CONNECTIONS:
return ((InternalEList<?>)getConnections()).basicRemove(otherEnd, msgs);
}
return super.eInverseRemove(otherEnd, featureID, msgs);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case ETriceGenPackage.STRUCTURE_INSTANCE__INSTANCES:
return getInstances();
case ETriceGenPackage.STRUCTURE_INSTANCE__PORTS:
return getPorts();
case ETriceGenPackage.STRUCTURE_INSTANCE__SAPS:
return getSaps();
case ETriceGenPackage.STRUCTURE_INSTANCE__SPPS:
return getSpps();
case ETriceGenPackage.STRUCTURE_INSTANCE__SERVICES:
return getServices();
case ETriceGenPackage.STRUCTURE_INSTANCE__BINDINGS:
return getBindings();
case ETriceGenPackage.STRUCTURE_INSTANCE__CONNECTIONS:
return getConnections();
case ETriceGenPackage.STRUCTURE_INSTANCE__ALL_CONTAINED_INSTANCES:
return getAllContainedInstances();
case ETriceGenPackage.STRUCTURE_INSTANCE__ORDERED_IF_ITEM_INSTANCES:
return getOrderedIfItemInstances();
}
return super.eGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@SuppressWarnings("unchecked")
@Override
public void eSet(int featureID, Object newValue) {
switch (featureID) {
case ETriceGenPackage.STRUCTURE_INSTANCE__INSTANCES:
getInstances().clear();
getInstances().addAll((Collection<? extends ActorInstance>)newValue);
return;
case ETriceGenPackage.STRUCTURE_INSTANCE__PORTS:
getPorts().clear();
getPorts().addAll((Collection<? extends PortInstance>)newValue);
return;
case ETriceGenPackage.STRUCTURE_INSTANCE__SAPS:
getSaps().clear();
getSaps().addAll((Collection<? extends SAPInstance>)newValue);
return;
case ETriceGenPackage.STRUCTURE_INSTANCE__SPPS:
getSpps().clear();
getSpps().addAll((Collection<? extends SPPInstance>)newValue);
return;
case ETriceGenPackage.STRUCTURE_INSTANCE__SERVICES:
getServices().clear();
getServices().addAll((Collection<? extends ServiceImplInstance>)newValue);
return;
case ETriceGenPackage.STRUCTURE_INSTANCE__BINDINGS:
getBindings().clear();
getBindings().addAll((Collection<? extends BindingInstance>)newValue);
return;
case ETriceGenPackage.STRUCTURE_INSTANCE__CONNECTIONS:
getConnections().clear();
getConnections().addAll((Collection<? extends ConnectionInstance>)newValue);
return;
case ETriceGenPackage.STRUCTURE_INSTANCE__ALL_CONTAINED_INSTANCES:
getAllContainedInstances().clear();
getAllContainedInstances().addAll((Collection<? extends ActorInstance>)newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void eUnset(int featureID) {
switch (featureID) {
case ETriceGenPackage.STRUCTURE_INSTANCE__INSTANCES:
getInstances().clear();
return;
case ETriceGenPackage.STRUCTURE_INSTANCE__PORTS:
getPorts().clear();
return;
case ETriceGenPackage.STRUCTURE_INSTANCE__SAPS:
getSaps().clear();
return;
case ETriceGenPackage.STRUCTURE_INSTANCE__SPPS:
getSpps().clear();
return;
case ETriceGenPackage.STRUCTURE_INSTANCE__SERVICES:
getServices().clear();
return;
case ETriceGenPackage.STRUCTURE_INSTANCE__BINDINGS:
getBindings().clear();
return;
case ETriceGenPackage.STRUCTURE_INSTANCE__CONNECTIONS:
getConnections().clear();
return;
case ETriceGenPackage.STRUCTURE_INSTANCE__ALL_CONTAINED_INSTANCES:
getAllContainedInstances().clear();
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public boolean eIsSet(int featureID) {
switch (featureID) {
case ETriceGenPackage.STRUCTURE_INSTANCE__INSTANCES:
return instances != null && !instances.isEmpty();
case ETriceGenPackage.STRUCTURE_INSTANCE__PORTS:
return ports != null && !ports.isEmpty();
case ETriceGenPackage.STRUCTURE_INSTANCE__SAPS:
return saps != null && !saps.isEmpty();
case ETriceGenPackage.STRUCTURE_INSTANCE__SPPS:
return spps != null && !spps.isEmpty();
case ETriceGenPackage.STRUCTURE_INSTANCE__SERVICES:
return services != null && !services.isEmpty();
case ETriceGenPackage.STRUCTURE_INSTANCE__BINDINGS:
return bindings != null && !bindings.isEmpty();
case ETriceGenPackage.STRUCTURE_INSTANCE__CONNECTIONS:
return connections != null && !connections.isEmpty();
case ETriceGenPackage.STRUCTURE_INSTANCE__ALL_CONTAINED_INSTANCES:
return !getAllContainedInstances().isEmpty();
case ETriceGenPackage.STRUCTURE_INSTANCE__ORDERED_IF_ITEM_INSTANCES:
return orderedIfItemInstances != null && !orderedIfItemInstances.isEmpty();
}
return super.eIsSet(featureID);
}
} //StructureInstanceImpl