blob: c675e1a0891b70bb963a323b722687a2ddaa86fb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 The University of York.
* 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:
* Dimitrios Kolovos - initial API and implementation
******************************************************************************/
package org.eclipse.epsilon.emc.emf.m0;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.ListIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.epsilon.common.util.StringProperties;
import org.eclipse.epsilon.emc.emf.EmfModel;
import org.eclipse.epsilon.eol.EolModule;
import org.eclipse.epsilon.eol.IEolModule;
import org.eclipse.epsilon.eol.dom.Operation;
import org.eclipse.epsilon.eol.exceptions.EolIllegalPropertyException;
import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
import org.eclipse.epsilon.eol.exceptions.models.EolModelElementTypeNotFoundException;
import org.eclipse.epsilon.eol.exceptions.models.EolModelLoadingException;
import org.eclipse.epsilon.eol.execute.introspection.AbstractPropertyGetter;
import org.eclipse.epsilon.eol.execute.introspection.AbstractPropertySetter;
import org.eclipse.epsilon.eol.execute.introspection.IPropertyGetter;
import org.eclipse.epsilon.eol.execute.introspection.IReflectivePropertySetter;
import org.eclipse.epsilon.eol.models.IRelativePathResolver;
public class EmfM0Model extends EmfModel {
protected File m0SpecificationFile;
protected IEolModule eolModule;
public EmfM0Model() {
super();
}
@Override
public void load(StringProperties properties, IRelativePathResolver resolver) throws EolModelLoadingException {
this.m0SpecificationFile = new File(resolver.resolve(properties.getProperty("m0SpecificationFile")));
super.load(properties, resolver);
// this.name = properties.getProperty("name");
// String[] aliases = properties.getProperty("aliases").split(",");
// for (int i=0;i<aliases.length;i++){
// this.aliases.add(aliases[i].trim());
// }
// setMetamodelFile(properties.getProperty(EmfModel.PROPERTY_METAMODEL_FILE));
// setMetamodelUri(properties.getProperty("metamodelUri"));
// this.isMetamodelFileBased = Boolean.parseBoolean(properties.getProperty("isMetamodelFileBased"));
// this.m0SpecificationFile = new File(resolver.resolve(properties.getProperty("m0SpecificationFile")));
// this.readOnLoad = Boolean.parseBoolean(properties.getProperty("readOnLoad"));
// this.storeOnDisposal = Boolean.parseBoolean(properties.getProperty("storeOnDisposal"));
// load();
}
@Override
protected void loadModel() throws EolModelLoadingException {
super.loadModel();
eolModule = new EolModule();
try {
eolModule.parse(m0SpecificationFile);
eolModule.execute();
}
catch (Exception ex){
ex.printStackTrace();
}
EmfModel copy = new EmfModel();
//copy.setMetamodel(this.isMetamodel());
copy.getAliases().addAll(this.getAliases());
copy.setMetamodelFiles(this.getMetamodelFiles());
copy.setMetamodelUris(this.getMetamodelUris());
copy.setModelFile(this.getModelFile());
copy.setMetamodelFileBased(this.isMetamodelFileBased());
//copy.setMetamodelImpl(this.getMetamodelImpl());
copy.setModelImpl(this.getModelImpl());
copy.setReadOnLoad(this.isReadOnLoad());
copy.setStoredOnDisposal(this.isStoredOnDisposal());
copy.setName("Model");
eolModule.getContext().getModelRepository().addModel(copy);
}
public Operation getHelper(String name){
ListIterator<Operation> li = eolModule.getDeclaredOperations().listIterator();
while (li.hasNext()){
Operation helper = (Operation) li.next();
if (helper.getName().equals(name)){
return helper;
}
}
return null;
}
class EmfM0PropertyGetter extends AbstractPropertyGetter {
public Object invoke(Object object, String property) throws EolRuntimeException {
ArrayList<Object> parameterValues = new ArrayList<Object>();
parameterValues.add(property);
Operation propertyGetter = eolModule.getDeclaredOperations().getOperation(object,"getProperty",parameterValues,eolModule.getContext());
if (propertyGetter != null){
return propertyGetter.execute(object,parameterValues,eolModule.getContext());
}
else {
return null;
}
}
}
class EmfM0PropertySetter extends AbstractPropertySetter implements IReflectivePropertySetter {
public void invoke(Object value) throws EolRuntimeException {
ArrayList<Object> parameterValues = new ArrayList<Object>();
parameterValues.add(property);
parameterValues.add(value);
Operation propertySetter = eolModule.getDeclaredOperations().getOperation(object,"setProperty",parameterValues,eolModule.getContext());
if (propertySetter != null) {
propertySetter.execute(object,parameterValues,eolModule.getContext());
}
}
public Object coerce(Object value) throws EolIllegalPropertyException {
return value;
}
public boolean conforms(Object value) throws EolIllegalPropertyException {
return true;
}
}
@Override
public IPropertyGetter getPropertyGetter() {
return new EmfM0PropertyGetter();
}
@Override
public IReflectivePropertySetter getPropertySetter() {
return new EmfM0PropertySetter();
}
@Override
protected Collection<EObject> getAllOfTypeFromModel(String metaClass) throws EolModelElementTypeNotFoundException {
Operation allOfTypeHelper = getHelper("allOfType");
Collection<EObject> allOfType = null;
try {
allOfType = (Collection<EObject>) allOfTypeHelper.execute(metaClass, new ArrayList<EObject>(), eolModule.getContext());
}
catch (EolRuntimeException rex){
eolModule.getContext().getErrorStream().print(rex);
}
return allOfType;
}
@Override
public Object getCacheKeyForType(String type)
throws EolModelElementTypeNotFoundException {
return null;
}
@Override
protected Collection<EObject> getAllOfKindFromModel(String metaClass) throws EolModelElementTypeNotFoundException {
Operation allOfKindHelper = getHelper("allOfKind");
Collection<EObject> allOfKind = null;
try {
allOfKind = (Collection<EObject>) allOfKindHelper.execute(metaClass, new ArrayList<Object>(), eolModule.getContext());
}
catch (EolRuntimeException rex){
eolModule.getContext().getErrorStream().print(rex);
}
return allOfKind;
}
//FIXME : Actually check is such a type is present
@Override
public boolean hasType(String type){
Operation hasTypeHelper = getHelper("hasType");
boolean hasType = false;
try {
hasType = (Boolean) hasTypeHelper.execute(type, new ArrayList<Object>(), eolModule.getContext());
}
catch (EolRuntimeException rex){
eolModule.getContext().getErrorStream().print(rex);
}
return hasType;
}
public File getM0SpecificationFile() {
return m0SpecificationFile;
}
public void setM0SpecificationFile(File specification) {
m0SpecificationFile = specification;
}
public IEolModule getEolModule() {
return eolModule;
}
public void setEolModule(IEolModule eolModule) {
this.eolModule = eolModule;
}
}