blob: 8a8e5d11e9f140682973bb6d773f9a8490b0a143 [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.eol.models;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.ListIterator;
import org.eclipse.epsilon.common.util.StringProperties;
import org.eclipse.epsilon.eol.exceptions.EolIllegalPropertyException;
import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
import org.eclipse.epsilon.eol.exceptions.models.EolEnumerationValueNotFoundException;
import org.eclipse.epsilon.eol.exceptions.models.EolModelElementTypeNotFoundException;
import org.eclipse.epsilon.eol.exceptions.models.EolModelLoadingException;
import org.eclipse.epsilon.eol.exceptions.models.EolModelNotFoundException;
import org.eclipse.epsilon.eol.exceptions.models.EolNotInstantiableModelElementTypeException;
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.IPropertySetter;
public class ModelGroup extends Model {
protected ArrayList<IModel> models = new ArrayList<IModel>();
public ModelGroup(ModelRepository repository, String metaModel) throws EolModelNotFoundException {
this.name = metaModel;
for (IModel model : repository.getModels()){
if (model.getAliases().contains(metaModel)){
models.add(model);
}
}
if (models.size() == 0) throw new EolModelNotFoundException(metaModel);
}
public ArrayList<IModel> getModels() {
return models;
}
public void load() throws EolModelLoadingException {
for (IModel model : models) {
model.load();
}
}
public String getMetaModel() {
return null;
}
public Object getEnumerationValue(String enumeration, String label) throws EolEnumerationValueNotFoundException {
for (IModel model : models) {
try {
return model.getEnumerationValue(enumeration,label);
}
catch (Exception ex) {}
}
throw new EolEnumerationValueNotFoundException(enumeration, label, this.getName());
}
public Collection<?> getAllOfType(String metaClass) throws EolModelElementTypeNotFoundException {
ArrayList<Object> allOfClass = new ArrayList<Object>();
for (IModel model : models) {
if (model.hasType(metaClass)) allOfClass.addAll(model.getAllOfType(metaClass));
}
return allOfClass;
}
public Collection<?> getAllOfKind(String metaClass) throws EolModelElementTypeNotFoundException {
ArrayList<Object> allOfType = new ArrayList<Object>();
for (IModel model : models) {
if (model.hasType(metaClass)) allOfType.addAll(model.getAllOfKind(metaClass));
}
return allOfType;
}
public Collection<Object> allContents() {
final List<Object> allContents = new ArrayList<Object>();
for (IModel model : models) {
allContents.addAll(model.allContents());
}
return allContents;
}
public Object getTypeOf(Object instance) {
for (IModel model : models) {
if (model.owns(instance)) return model.getTypeOf(instance);
}
return null;
}
public String getTypeNameOf(Object instance) {
for (IModel model : models) {
if (model.isModelElement(instance))
return model.getTypeNameOf(instance);
}
throw new IllegalArgumentException("No grouped model can contain: " + instance + " (" + instance.getClass().getCanonicalName() + ")");
}
@SuppressWarnings("serial")
public Object createInstance(String metaClass) throws EolModelElementTypeNotFoundException, EolNotInstantiableModelElementTypeException {
if (models.size() == 1) {
return models.get(0).createInstance(metaClass);
}
else {
throw new EolNotInstantiableModelElementTypeException(this.name, metaClass) {
@Override
public String getReason(){
return "Cannot create an instance of " + typeName + " because model group " + name + " has more than one models";
}
};
}
}
public Object getElementById(String id) {
ListIterator<IModel> li = models.listIterator();
while (li.hasNext()){
IModel model = li.next();
Object instance = model.getElementById(id);
if (instance!=null) return instance;
}
return null;
}
public String getElementId(Object instance) {
ListIterator<IModel> li = models.listIterator();
while (li.hasNext()){
IModel model = li.next();
if (model.owns(instance)) return model.getElementId(instance);
}
return null;
}
public void setElementId(Object instance, String newId) {
ListIterator<IModel> li = models.listIterator();
while (li.hasNext()){
IModel model = li.next();
if (model.owns(instance)) model.setElementId(instance, newId);
}
}
public void deleteElement(Object instance) throws EolRuntimeException{
ListIterator<IModel> li = models.listIterator();
while (li.hasNext()){
IModel model = li.next();
if (model.owns(instance)) model.deleteElement(instance);
}
}
/*
public String getClassOf(Object instance) {
ListIterator li = models.listIterator();
while (li.hasNext()){
EolModel model =(EolModel) li.next();
if (model.owns(instance)) return model.getClassOf(instance);
}
return null;
}
*/
public boolean owns(Object instance) {
for (IModel model : models) {
if (model.owns(instance)) return true;
}
return false;
}
@Override
public boolean knowsAboutProperty(Object instance, String property) {
for (IModel model : models) {
if (model.knowsAboutProperty(instance, property)) return true;
}
return false;
}
public boolean store(String fileName) {
return false;
}
public boolean store() {
for (IModel model : models) {
model.store();
}
return true;
}
@Override
public void dispose() {
for (IModel model : models) {
model.dispose();
}
}
public boolean isInstantiable(String metaClass) {
for (IModel model : models) {
if (model.hasType(metaClass) && model.isInstantiable(metaClass)) return true;
}
return false;
}
public boolean hasType(String metaClass) {
for (IModel model : models) {
if (model.hasType(metaClass)) return true;
}
return false;
}
@Override
public void load(StringProperties properties, IRelativePathResolver resolver) throws EolModelLoadingException {
load();
}
public boolean isModelElement(Object instance) {
for (IModel model : models) {
if (model.isModelElement(instance)) return true;
}
return false;
}
@Override
public IPropertyGetter getPropertyGetter() {
return new DelegatingModelElementPropertyGetter();
}
@Override
public IPropertySetter getPropertySetter() {
return new DelegatingModelElementPropertySetter();
}
public class DelegatingModelElementPropertyGetter extends AbstractPropertyGetter {
public Object invoke(Object object, String property)
throws EolRuntimeException {
for (IModel model : models) {
if (model.knowsAboutProperty(object, property)) {
return model.getPropertyGetter().invoke(object, property);
}
}
throw new EolIllegalPropertyException(object, property, ast, context);
}
}
public class DelegatingModelElementPropertySetter extends AbstractPropertySetter {
public void invoke(Object value) throws EolRuntimeException {
for (IModel model : models) {
if (model.knowsAboutProperty(object, property)) {
IPropertySetter delegate = null;
delegate = model.getPropertySetter();
delegate.setObject(object);
delegate.setProperty(property);
delegate.setContext(context);
delegate.setAst(ast);
delegate.invoke(value);
return;
}
}
throw new EolIllegalPropertyException(object, property, ast, context);
}
}
}