Как я могу изменить XML-файл ecore для создания методов, отличных от геттеров и сеттеров Java/EMF

Я использую EMF для создания классов Java из XML-файла ecore. Я пытаюсь в этом сгенерированном коде переопределить методы equals() и hashCode(), но я не нашел в Интернете хороших руководств о том, как генерировать что-либо помимо базовых методов get и set. Мой файл sample.ecore выглядит примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="sample" nsURI="jewel:/sample" nsPrefix="sample">
    <eSubpackages name="models" nsURI="jewel:/sample.models" nsPrefix="models">
        <eClassifiers xsi:type="ecore:EClass" name="Foo" abstract="true" eSuperTypes="models.ecore#//Foo">
            <eStructuralFeatures xsi:type="ecore:EAttribute" name="code" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
            <eStructuralFeatures xsi:type="ecore:EAttribute" name="anotherAttribute" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
            <eStructuralFeatures xsi:type="ecore:EAttribute" name="aDateAttribute" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDate"/>
            <eStructuralFeatures xsi:type="ecore:EAttribute" name="aBooleanAttribute" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
        </eClassifiers>
    </eSubpackages>
</ecore:EPackage>

Я пытаюсь сгенерировать код, который выглядит примерно так:

@Override
public boolean equals(Object o) {
    if(o == this) return true;
    if(!(o instanceof Foo))
        return false;
    Foo foo = (Foo) o;
    return foo.code=code;
}

@Override
public int hashCode() {
    int result = 17;
    result = 31 * result + code.hashCode();
    return result;
}

Есть ли какой-то дополнительный тег, который я могу написать внутри eClassifiers, чтобы сгенерировать это, или какое-то свойство, которое мне нужно изменить при генерации кода?


person Alex Thompson    schedule 11.04.2018    source источник


Ответы (1)


Это должно быть возможно, если аннотировать EOperation ключевым словом body и исходным кодом. "http://www.eclipse.org/emf/2002/GenModel" аннотации подхватываются моделью генератора.

<eOperations name="hash" eType="#//EInt"> 
      <eAnnotations source=" http://www.eclipse.org/emf/2002/GenModel "> 
        <details key=" body " value="int result = 17;&#xA;    result = 31 * result + code.hashCode();&#xA;    return result;"/> 
      </eAnnotations> 
 </eOperations> 
person Mad Matts    schedule 13.04.2018