/**
* Copyright (c) 2012-2016 Marsha Chechik, Alessio Di Sandro, Michalis Famelis,
* Rick Salay.
* 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:
* Alessio Di Sandro - Implementation.
*/
package edu.toronto.cs.se.modelepedia.kleisli.impl;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcorePackage;
import edu.toronto.cs.se.mmint.MMINT;
import edu.toronto.cs.se.mmint.MMINTException;
import edu.toronto.cs.se.mmint.mid.ExtendibleElementConstraint;
import edu.toronto.cs.se.mmint.mid.MIDFactory;
import edu.toronto.cs.se.mmint.mid.MIDLevel;
import edu.toronto.cs.se.mmint.mid.Model;
import edu.toronto.cs.se.mmint.mid.ModelOrigin;
import edu.toronto.cs.se.mmint.mid.impl.ModelImpl;
import edu.toronto.cs.se.mmint.mid.utils.FileUtils;
import edu.toronto.cs.se.mmint.mid.utils.MIDTypeFactory;
import edu.toronto.cs.se.modelepedia.kleisli.KleisliModel;
import edu.toronto.cs.se.modelepedia.kleisli.KleisliModelEndpoint;
import edu.toronto.cs.se.modelepedia.kleisli.KleisliModelRel;
import edu.toronto.cs.se.modelepedia.kleisli.KleisliPackage;
import edu.toronto.cs.se.modelepedia.kleisli.reasoning.KleisliReasoningEngine;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>Model</b></em>'.
* <!-- end-user-doc -->
*
* @generated
*/
public class KleisliModelImpl extends ModelImpl implements KleisliModel {
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected KleisliModelImpl() {
super();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected EClass eStaticClass() {
return KleisliPackage.Literals.KLEISLI_MODEL;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
switch (operationID) {
case KleisliPackage.KLEISLI_MODEL___KLEISLI_CREATE_TYPE__KLEISLIMODELENDPOINT:
try {
return kleisliCreateType((KleisliModelEndpoint)arguments.get(0));
}
catch (Throwable throwable) {
throw new InvocationTargetException(throwable);
}
case KleisliPackage.KLEISLI_MODEL___KLEISLI_CREATE_INSTANCE__KLEISLIMODELENDPOINT:
try {
return kleisliCreateInstance((KleisliModelEndpoint)arguments.get(0));
}
catch (Throwable throwable) {
throw new InvocationTargetException(throwable);
}
}
return super.eInvoke(operationID, arguments);
}
/**
* Gets the uri of a Kleisli model type extension.
*
* @param modelRelType
* The Kleisli model relationship.
* @param modelType
* The model type to be extended.
* @param modelTypeEndpointName
* The name of the Kleisli model type endpoint whose target is to
* be extended.
* @return The uri of the Kleisli model type extension.
* @generated NOT
*/
public static String getModelTypeExtendedUri(KleisliModelRel modelRelType, Model modelType, String modelTypeEndpointName) {
return
modelRelType.getExtendedUri() +
MMINT.URI_SEPARATOR +
modelTypeEndpointName +
MMINT.ENDPOINT_SEPARATOR +
modelType.getName() + "." + EcorePackage.eNAME;
}
/**
* @generated NOT
*/
public KleisliModel kleisliCreateType(KleisliModelEndpoint containerModelTypeEndpoint) throws MMINTException {
//TODO MMINT[KLEISLI] should try to emulate normal api structure
MMINTException.mustBeType(this);
Model origModelType = containerModelTypeEndpoint.getTarget();
String kModelTypeUri = getModelTypeExtendedUri((KleisliModelRel) containerModelTypeEndpoint.eContainer(), origModelType, containerModelTypeEndpoint.getName());
if (!FileUtils.isFileOrDirectoryInState(kModelTypeUri)) {
try {
EPackage origRootModelTypeObj = origModelType.getEMFTypeRoot();
String origModelTypeUri = origRootModelTypeObj.getNsURI();
origRootModelTypeObj.setNsURI(origModelTypeUri + KleisliReasoningEngine.KLEISLI_MODELTYPE_URI_SUFFIX);
FileUtils.writeModelFileInState(origRootModelTypeObj, kModelTypeUri);
origRootModelTypeObj.setNsURI(origModelTypeUri); // restore original for packages coming from the registry
}
catch (Exception e) {
throw new MMINTException("Error creating extended metamodel file");
}
}
KleisliModel kModelType = super.createThisEClass();
kModelType.setUri(kModelTypeUri);
kModelType.setName(origModelType.getName());
kModelType.setLevel(MIDLevel.TYPES);
kModelType.setSupertype(origModelType.getSupertype());
kModelType.setDynamic(true);
kModelType.setAbstract(origModelType.isAbstract());
ExtendibleElementConstraint origConstraint = origModelType.getConstraint();
if (origConstraint != null) {
ExtendibleElementConstraint kConstraint = MIDFactory.eINSTANCE.createExtendibleElementConstraint();
kConstraint.setLanguage(origConstraint.getLanguage());
kConstraint.setImplementation(origConstraint.getImplementation());
kModelType.setConstraint(kConstraint);
}
kModelType.setOrigin(ModelOrigin.CREATED);
kModelType.setFileExtension(origModelType.getFileExtension());
containerModelTypeEndpoint.setExtendedTarget(kModelType);
return kModelType;
}
/**
* @generated NOT
*/
@Override
public void deleteType() throws MMINTException {
MMINTException.mustBeType(this);
FileUtils.deleteFileInState(getUri());
}
/**
* @generated NOT
*/
@Override
public EPackage getEMFTypeRoot() throws MMINTException {
MMINTException.mustBeType(this);
try {
return (EPackage) FileUtils.readModelFileInState(getUri());
}
catch (Exception e) {
throw new MMINTException("Error accessing the extended metamodel file for model type" + getUri(), e);
}
}
/**
* Gets the uri of a Kleisli model instance extension.
*
* @param modelEndpoint
* The Kleisli model endpoint whose target is to be extended.
* @return The uri of the Kleisli model extension.
* @generated NOT
*/
private String getModelExtendedUri(KleisliModelEndpoint modelEndpoint) {
return
((KleisliModelRel) modelEndpoint.eContainer()).getExtendedUri() +
MMINT.URI_SEPARATOR +
modelEndpoint.getMetatype().getName() +
MMINT.ENDPOINT_SEPARATOR +
modelEndpoint.getTarget().getName() + MMINT.MODEL_FILEEXTENSION_SEPARATOR + MIDTypeFactory.ECORE_REFLECTIVE_FILE_EXTENSION;
}
/**
* @generated NOT
*/
public KleisliModel kleisliCreateInstance(KleisliModelEndpoint containerModelEndpoint) throws MMINTException {
MMINTException.mustBeType(this);
Model origModel = containerModelEndpoint.getTarget();
KleisliModel kModel = super.createThisEClass();
kModel.setUri(getModelExtendedUri(containerModelEndpoint));
kModel.setName(origModel.getName());
kModel.setLevel(MIDLevel.INSTANCES);
kModel.setDynamic(true);
kModel.setSupertype(null);
kModel.setMetatypeUri(origModel.getMetatypeUri());
kModel.setOrigin(ModelOrigin.CREATED);
kModel.setFileExtension(origModel.getFileExtension());
containerModelEndpoint.setExtendedTarget(kModel);
return kModel;
}
/**
* @generated NOT
*/
@Override
public void deleteInstance() throws MMINTException {
MMINTException.mustBeInstance(this);
FileUtils.deleteFile(getUri(), true);
}
/**
* @generated NOT
*/
@Override
public EObject getEMFInstanceRoot() throws MMINTException {
return super.getEMFInstanceRoot();
}
} //KleisliModelImpl