blob: ba3e2c912e063d07819b083f91f8eaaaccb5ac8d [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2014 itemis and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
*
* Contributors:
* itemis - Initial API and implementation
*
* </copyright>
*/
package org.eclipse.sphinx.tests.emf.serialization.generators.model;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.util.ExtendedMetaData;
import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingExtendedMetaData;
import org.eclipse.sphinx.emf.serialization.XMLPersistenceMappingExtendedMetaDataImpl;
@SuppressWarnings("nls")
public abstract class AbstractNodeModelBuilder implements ModelBuilder {
protected XMLPersistenceMappingExtendedMetaData metadata = new XMLPersistenceMappingExtendedMetaDataImpl();
final protected List<EPackage> singlePackages;
final protected List<EPackage> manyPackages;
public AbstractNodeModelBuilder(String name, int persistenceMappingStrategy) {
singlePackages = createMetaModel(name, false, persistenceMappingStrategy);
manyPackages = createMetaModel(name, true, persistenceMappingStrategy);
}
@Override
public List<EPackage> getSingleMetaModel() {
return singlePackages;
}
@Override
public List<EPackage> getManyMetaModel() {
return manyPackages;
}
@Override
public EObject getManyModel(int numberOfChildren) {
return createModel(manyPackages.get(0), manyPackages.get(0), numberOfChildren);
}
@Override
public EObject getSingleModel(int numberOfChildren) {
return createModel(singlePackages.get(0), singlePackages.get(0), numberOfChildren);
}
abstract protected List<EPackage> createMetaModel(String name, boolean isMany, int persistenceMappingStrategy);
abstract protected EObject createModel(EPackage rootEPackage, EPackage childEPackage, int numberOfChildren);
public void setXMLExternalSchemaLocations(Map<String, String> externalSchemaLocations) {
metadata.setXMLExternalSchemaLocations(singlePackages.get(0), externalSchemaLocations);
metadata.setXMLExternalSchemaLocations(manyPackages.get(0), externalSchemaLocations);
}
protected EPackage createEPackage(String name, String nsUri, String nsPrefix) {
EPackage ePackage = EcoreFactory.eINSTANCE.createEPackage();
ePackage.setName(name);
ePackage.setNsURI(nsUri);
ePackage.setNsPrefix(nsPrefix);
metadata.setXMLSchemaLocation(ePackage, name + ".xsd");
metadata.setXMLDefaultEReferenceReferencedTypeAttributeName(ePackage, "TYPE");
metadata.setXMLDefaultEReferenceReferencedTypeDeclarationStrategy(ePackage, XMLPersistenceMappingExtendedMetaData.TYPE_DECLARATION_ALWAYS);
metadata.setXMLDefaultEReferenceContainedTypeAttributeName(ePackage, "type");
metadata.setXMLDefaultEReferenceContainedTypeDeclarationStrategy(ePackage, XMLPersistenceMappingExtendedMetaData.TYPE_DECLARATION_IF_NEEDED);
// metadata.setQualified(ePackage, true); // not necessary since default is true
return ePackage;
}
protected EClass createEClass(EPackage ePackage, String name, String xmlName, String xmlWrapperName, boolean isGlobal) {
EClass nodeEClass = EcoreFactory.eINSTANCE.createEClass();
nodeEClass.setName(name);
ePackage.getEClassifiers().add(nodeEClass);
metadata.setXMLName(nodeEClass, xmlName);
metadata.setXMLWrapperName(nodeEClass, xmlWrapperName);
metadata.setXMLGlobalElement(nodeEClass, isGlobal);
return nodeEClass;
}
protected EDataType createEDataType(EPackage ePackage, String name, String xmlName, String xmlWrapperName, boolean isGlobal) {
EDataType eDataType = EcoreFactory.eINSTANCE.createEDataType();
eDataType.setName(name);
eDataType.setInstanceClassName("java.lang.String");
ePackage.getEClassifiers().add(eDataType);
metadata.setXMLName(eDataType, xmlName);
metadata.setXMLWrapperName(eDataType, xmlWrapperName);
metadata.setXMLGlobalElement(eDataType, isGlobal);
return eDataType;
}
protected EObject createNodeEObject(EPackage ePackage, String className) {
EObject nodeEClass = ePackage.getEFactoryInstance().create((EClass) ePackage.getEClassifier(className));
return nodeEClass;
}
protected EReference createEReference(EClass eClass, String name, boolean isContainment, boolean isMany, EClass type, String xmlName,
String xmlWrapperName, int xmlPersistenceMapping) {
return createEReference(eClass, name, isContainment, isMany, type, xmlName, xmlWrapperName, null, xmlPersistenceMapping);
}
protected EReference createEReference(EClass eClass, String name, boolean isContainment, boolean isMany, EClass type, String xmlName,
String xmlWrapperName, String classifierSuffix, int xmlPersistenceMapping) {
EReference eReference = EcoreFactory.eINSTANCE.createEReference();
eReference.setName(name);
eReference.setContainment(isContainment);
eReference.setLowerBound(0);
eReference.setUpperBound(isMany ? -1 : 1);
eReference.setEType(type);
eClass.getEStructuralFeatures().add(eReference);
metadata.setXMLName(eReference, xmlName);
metadata.setXMLWrapperName(eReference, xmlWrapperName);
metadata.setXMLPersistenceMappingStrategy(eReference, xmlPersistenceMapping);
metadata.setNamespace(eReference, eReference.getEContainingClass().getEPackage().getNsURI());
metadata.setFeatureKind(eReference, ExtendedMetaData.ELEMENT_FEATURE);
if (null != classifierSuffix) {
metadata.setXMLClassifierNameSuffix(eReference, classifierSuffix);
}
return eReference;
}
protected EAttribute createEAttribute(EClass eClass, String name, boolean isMany, EDataType type, String xmlName, String xmlWrapperName,
int xmlPersistenceMapping) {
EAttribute eAttribute = EcoreFactory.eINSTANCE.createEAttribute();
eAttribute.setName(name);
eAttribute.setLowerBound(0);
eAttribute.setUpperBound(isMany ? -1 : 1);
eAttribute.setEType(type);
eClass.getEStructuralFeatures().add(eAttribute);
metadata.setXMLName(eAttribute, xmlName);
metadata.setXMLWrapperName(eAttribute, xmlWrapperName);
metadata.setXMLPersistenceMappingStrategy(eAttribute, xmlPersistenceMapping);
metadata.setNamespace(eAttribute, eAttribute.getEContainingClass().getEPackage().getNsURI());
metadata.setFeatureKind(eAttribute, ExtendedMetaData.ELEMENT_FEATURE);
return eAttribute;
}
}