/**
* Copyright (c) 2011-2012 Eclipse contributors and others.
* 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
*/
package org.eclipse.emf.ecore.xcore.interpreter;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.util.CancelIndicator;
import org.eclipse.xtext.xbase.XBlockExpression;
import org.eclipse.xtext.xbase.interpreter.IEvaluationResult;
import org.eclipse.xtext.xbase.interpreter.impl.DefaultEvaluationContext;
public class XcoreSettingDelegate implements EStructuralFeature.Internal.SettingDelegate
{
private XcoreInterpreter interpreter;
private XBlockExpression getBody;
private XBlockExpression setBody;
private XBlockExpression isSetBody;
private XBlockExpression unsetBody;
private EStructuralFeature eStructuralFeature;
public void initialize
(XBlockExpression getBody,
XBlockExpression setBody,
XBlockExpression isSetBody,
XBlockExpression unsetBody,
EStructuralFeature eStructuralFeature,
XcoreInterpreter interpreter)
{
this.getBody = getBody;
this.setBody = setBody;
this.isSetBody = isSetBody;
this.unsetBody = unsetBody;
this.eStructuralFeature = eStructuralFeature;
this.interpreter = interpreter;
}
public EStructuralFeature.Setting dynamicSetting
(final InternalEObject owner,
final EStructuralFeature.Internal.DynamicValueHolder settings,
final int dynamicFeatureID)
{
return
new EStructuralFeature.Setting()
{
public void unset()
{
dynamicUnset(owner, settings, dynamicFeatureID);
}
public void set(Object newValue)
{
dynamicSet(owner, settings, dynamicFeatureID, newValue);
}
public boolean isSet()
{
return dynamicIsSet(owner, settings, dynamicFeatureID);
}
public EStructuralFeature getEStructuralFeature()
{
return eStructuralFeature;
}
public EObject getEObject()
{
return owner;
}
public Object get(boolean resolve)
{
return dynamicGet(owner, settings, dynamicFeatureID, resolve, false);
}
};
}
public Object dynamicGet
(InternalEObject owner,
EStructuralFeature.Internal.DynamicValueHolder settings,
int dynamicFeatureID,
boolean resolve,
boolean coreType)
{
if (getBody == null)
{
throw new IllegalStateException("coudn't find exeutable Xbase get body");
}
DefaultEvaluationContext context = new DefaultEvaluationContext();
context.newValue(QualifiedName.create("this"), owner);
IEvaluationResult result = interpreter.evaluate(getBody, context, CancelIndicator.NullImpl);
if (result.getException() != null)
{
throw new RuntimeException(result.getException());
}
else
{
return result.getResult();
}
}
public void dynamicSet
(InternalEObject owner,
EStructuralFeature.Internal.DynamicValueHolder settings,
int dynamicFeatureID,
Object newValue)
{
if (setBody == null)
{
throw new IllegalStateException("coudn't find exeutable Xbase set body");
}
DefaultEvaluationContext context = new DefaultEvaluationContext();
context.newValue(QualifiedName.create("this"), owner);
context.newValue(QualifiedName.create("newValue"), newValue);
IEvaluationResult result = interpreter.evaluate(setBody, context, CancelIndicator.NullImpl);
if (result.getException() != null)
{
throw new RuntimeException(result.getException());
}
else
{
settings.dynamicSet(dynamicFeatureID, result.getResult());
}
}
public boolean dynamicIsSet(InternalEObject owner, EStructuralFeature.Internal.DynamicValueHolder settings, int dynamicFeatureID)
{
if (isSetBody == null)
{
return settings.dynamicGet(dynamicFeatureID) != null;
}
else
{
DefaultEvaluationContext context = new DefaultEvaluationContext();
context.newValue(QualifiedName.create("this"), owner);
IEvaluationResult result = interpreter.evaluate(isSetBody, context, CancelIndicator.NullImpl);
if (result.getException() != null)
{
throw new RuntimeException(result.getException());
}
return (Boolean)result.getResult();
}
}
public void dynamicUnset(InternalEObject owner, EStructuralFeature.Internal.DynamicValueHolder settings, int dynamicFeatureID)
{
if (unsetBody == null)
{
settings.dynamicUnset(dynamicFeatureID);
}
else
{
DefaultEvaluationContext context = new DefaultEvaluationContext();
context.newValue(QualifiedName.create("this"), owner);
IEvaluationResult result = interpreter.evaluate(unsetBody, context, CancelIndicator.NullImpl);
if (result.getException() != null)
{
throw new RuntimeException(result.getException());
}
}
}
public NotificationChain dynamicInverseAdd
(InternalEObject owner,
EStructuralFeature.Internal.DynamicValueHolder settings,
int dynamicFeatureID,
InternalEObject otherEnd,
NotificationChain notifications)
{
throw new UnsupportedOperationException("updates aren't supported");
}
public NotificationChain dynamicInverseRemove
(InternalEObject owner,
EStructuralFeature.Internal.DynamicValueHolder settings,
int dynamicFeatureID,
InternalEObject otherEnd,
NotificationChain notifications)
{
throw new UnsupportedOperationException("updates aren't supported");
}
}