2017-10-11 2 views
0

Ich arbeite an der Entwicklung einer Testsuite für EMF-Modelle. Ich habe ein Metamodell (.ecore Datei (Klassendiagramm)) erstellt mit dem grafischen Editor.So erstellen Sie programmgesteuert eine untergeordnete Instanz einer Modellinstanz in EMF

Jetzt bin ich in der Lage, die dynamischen Instanzen programmgesteuert zu erstellen, aber in meinem Metamodell habe ich eine Zusammensetzung (Containment Referenz), in der ich untergeordnete Instanz der enthaltenen Klasse (programmgesteuert) erstellen möchte.

Bitte finden Sie die folgenden Informationen als Referenz

Klassendiagramm:

metamodel

JUnit Testfall:

public class DynamicTest extends TestCase 
{ 
    public void testCreateModel() throws IOException { 
    ResourceSet rs = new ResourceSetImpl(); 
    rs.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore", 
    new XMIResourceFactoryImpl()); 
    Resource res = rs.createResource(URI.createFileURI( 
    "C:/Users/Manoj/Documents/FreshStart/Company/model/company.ecore")); 
    res.load(null); 
    EPackage metapackage = (EPackage)res.getContents().get(0); 
    System.out.println("meta Package "+metapackage.getName()); 
    EFactory employeeFactoryInstance = metapackage.getEFactoryInstance(); 
    EClass employeeClass = (EClass)metapackage.getEClassifier("Employee"); 
    EObject employeeObject = employeeFactoryInstance.create(employeeClass); 
    EAttribute employeeName = employeeClass.getEAllAttributes().get(0); 
    EAttribute employeeManager = employeeClass.getEAllAttributes().get(1); 
    employeeObject.eSet(employeeName, "Manoj"); 
    employeeObject.eSet(employeeManager, "Albert"); 
    String empName = (String)employeeObject.eGet(employeeName); 
    String empManager = (String)employeeObject.eGet(employeeManager); 
    ResourceSet resourseSet = new ResourceSetImpl(); 
    resourseSet.getPackageRegistry().put(metapackage.getNsURI(), 
    metapackage); 

    ResourseSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put 
    ("*", new XMIResourceFactoryImpl()); 
    Resource resource = 
    ResourseSet.createResource(URI.createURI("./model/Employee.xmi")); 
    resource.getContents().add(employeeObject); 
    Map options = new HashMap(); 
    options.put(XMIResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE); 
    try 
    { 
     resource.save(options); 
    } catch (IOException e) { 
     // TODO: handle exception 
     e.printStackTrace(); 
    } 
    EPackage metapackage1 = (EPackage)res.getContents().get(0); 
    EFactory departmentFactoryInstance = metapackage1.getEFactoryInstance(); 
    EClass departmentClass = 
    (EClass)metapackage1.getEClassifier("Department"); 
    EObject departmentObject = 
    departmentFactoryInstance.create(departmentClass); 
    EAttribute departmentName = departmentClass.getEAllAttributes().get(0); 
    EAttribute departmentNumber = 
    departmentClass.getEAllAttributes().get(1); 
    EObject depRef = employeeClass.eContainmentFeature().eContents().get(0); 
    departmentObject.eSet(departmentName, "SMS"); 
    departmentObject.eSet(departmentNumber, 101); 
    String depName = (String)departmentObject.eGet(departmentName); 
    Integer depNumber = (Integer)departmentObject.eGet(departmentNumber); 
    ResourceSet resSet = new ResourceSetImpl(); 
    resSet.getPackageRegistry().put(metapackage1.getNsURI(), metapackage1); 
    resSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("*", 
    new XMIResourceFactoryImpl()); 
    Resource res1 = 
    resSet.createResource(URI.createURI("./model/Department.xmi")); 
    res1.getContents().add(departmentObject); 
    Map options1 = new HashMap(); 
    options1.put(XMIResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE); 
    try 
    { 
     res1.save(options1); 
    } catch (IOException e) { 
     // TODO: handle exception 
     e.printStackTrace(); 
    }   
    } 
} 

mir freundlicherweise helfen, neue untergeordnete Instanz von Abteilung Instanz zu erstellen programmatisch .

+0

Ihr Code ist seltsam formatiert. Das macht es schwer zu lesen. Mehr Leute sind bereit, Ihr Problem zu betrachten, wenn der Code richtig formatiert ist. – Lii

Antwort

2

Sie fügen ein Objekt zu einem mehrwertigen Feature hinzu, indem Sie zuerst die Liste abrufen, bei der es sich um den Feature-Wert handelt. Dann fügen Sie der Liste ein Element hinzu.

Beispiel:

EStructuralFeature employeeFeature = departmentClass.getEStructuralFeature("employee"); 
@SuppressWarnings("unchecked") // Safe cast as long as only Employees are added 
List<EObject> employees = (List<EObject>) departmentObject.eGet(employeeFeature); 
employees.add(employeeObject); 

Ein paar Anmerkungen über Ihren Code:

  • Es ist besser, EClass.getEStructuralFeature zu verwenden, um die richtige Funktion zu erhalten. Auf diese Weise bricht Ihr Code nicht, wenn die Reihenfolge der Features geändert wird.
  • employeeObject sollte nicht zu einer Ressource hinzugefügt werden, wenn sie in departmentObject enthalten ist. Nur die Objekte der obersten Ebene, die nicht von anderen Objekten enthalten sind, sollten einer Ressource hinzugefügt werden.
Verwandte Themen