/**
* <copyright>
*
* Copyright (c) 2012 Springsite BV (The Netherlands) 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
*
* Contributors:
* Martin Taal - Initial API and implementation
*
* </copyright>
*
* $Id: ModelEMFConverter.java,v 1.27 2011/09/14 15:35:53 mtaal Exp $
*/
package org.eclipse.emf.texo.json;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.FeatureMapUtil;
import org.eclipse.emf.texo.model.ModelFeatureMapEntry;
import org.eclipse.emf.texo.model.ModelObject;
import org.eclipse.emf.texo.model.ModelResolver;
import org.eclipse.emf.texo.utils.ModelUtils;
/**
* Converts a Texo object to a JSON object.
*
* @author <a href="mtaal@elver.org">Martin Taal</a>
* @see ModelObject
*/
public class ModelJSONConverter extends BaseModelJSONConverter<Object> {
private Object lastObject = null;
private ModelObject<?> lastModelObject = null;
private ModelObject<?> getModelObject(Object target) {
if (target == lastObject) {
return lastModelObject;
}
lastObject = target;
lastModelObject = ModelResolver.getInstance().getModelObject(target);
return lastModelObject;
}
@Override
protected EClass eClass(Object target) {
return getModelObject(target).eClass();
}
@Override
protected Object eGet(Object target, EStructuralFeature eFeature) {
return getModelObject(target).eGet(eFeature);
}
@Override
protected boolean isModelEnabled(Object target) {
return ModelResolver.getInstance().isModelEnabled(target);
}
@Override
protected EStructuralFeature getFeatureMapFeature(EStructuralFeature eFeature, Object fmEntry) {
final ModelFeatureMapEntry<?> mEntry = ModelResolver.getInstance().getModelFeatureMapEntry(eFeature, fmEntry);
EStructuralFeature entryFeature = mEntry.getEStructuralFeature();
Object entryValue = mEntry.getValue();
// flatten the tree of feature map entries, feature maps maybe nested
// EMF uses a flattened api, while Texo builds this actual tree of
// featuremaps, the findFeature and findValue find the deepest featureMap entry
if (FeatureMapUtil.isFeatureMap(entryFeature)) {
final ModelFeatureMapEntry<?> modelFeatureMapEntry = ModelResolver.getInstance().getModelFeatureMapEntry(
entryFeature, entryValue);
entryFeature = ModelUtils.findFeature(modelFeatureMapEntry);
entryValue = ModelUtils.findValue(modelFeatureMapEntry);
}
return entryFeature;
}
@Override
protected Object getFeatureMapValue(EStructuralFeature eFeature, Object fmEntry) {
final ModelFeatureMapEntry<?> mEntry = ModelResolver.getInstance().getModelFeatureMapEntry(eFeature, fmEntry);
EStructuralFeature entryFeature = mEntry.getEStructuralFeature();
Object entryValue = mEntry.getValue();
// flatten the tree of feature map entries, feature maps maybe nested
// EMF uses a flattened api, while Texo builds this actual tree of
// featuremaps, the findFeature and findValue find the deepest featureMap entry
if (FeatureMapUtil.isFeatureMap(entryFeature)) {
final ModelFeatureMapEntry<?> modelFeatureMapEntry = ModelResolver.getInstance().getModelFeatureMapEntry(
entryFeature, entryValue);
entryFeature = ModelUtils.findFeature(modelFeatureMapEntry);
entryValue = ModelUtils.findValue(modelFeatureMapEntry);
}
return entryValue;
}
}