這個東西比較有趣,代碼還要區分是否在Eclipse環境下運行。
先看看現象,以EMF例子Library.ecore為例, 測試代碼如下:
public?class?Test?{
????
public?static?void?main(String[]?args)?throws?IOException?{
????????ResourceSet?rs?
=?new?ResourceSetImpl();
????????rs.getResourceFactoryRegistry().getExtensionToFactoryMap().put(
????????????????Resource.Factory.Registry.DEFAULT_EXTENSION,
????????????????
new?XMIResourceFactoryImpl()); //outside eclipse
????????Resource?resource?
=?rs.createResource(URI
????????????????.createURI(EXTLibraryPackage.eNS_URI));
????????
//step?a
????????Library?library?=?EXTLibraryFactory.eINSTANCE.createLibrary();
????????library.setName(
"some?lib");
????????resource.getContents().add(library);
????????
//step?b
//????????Book?book?=?EXTLibraryFactory.eINSTANCE.createBook();
//????????book.setTitle("some?book");
//????????Employee?employee?=?EXTLibraryFactory.eINSTANCE.createEmployee();
//????????employee.setFirstName("some?one");
????????
//step?c
//????????library.getBooks().add(book);
//????????library.getEmployees().add(employee);
????????
//step?d
//????????resource.getContents().add(book);
????
//????????System.out.println(EcoreUtil.getURI(employee));
//????????System.out.println(EcoreUtil.getURI(book));
????????resource.save(System.out,?null);
????}

}


步驟 輸出
a ----------------
<?xml version="1.0" encoding="ASCII"?>
<extlib:Library xmi:version="2.0" xmlns:xmi="http:///org/eclipse/emf/examples/library/extlibrary.ecore/1.0.0" name="some lib"/>
b?#//
#//
<?xml version="1.0" encoding="ASCII"?>
<extlib:Library xmi:version="2.0" xmlns:xmi="http:///org/eclipse/emf/examples/library/extlibrary.ecore/1.0.0" name="some lib"/>
c http:///org/eclipse/emf/examples/library/extlibrary.ecore/1.0.0#//@employees.0
#//
<?xml version="1.0" encoding="ASCII"?>
<extlib:Library xmi:version="2.0" xmlns:xmi="http:///org/eclipse/emf/examples/library/extlibrary.ecore/1.0.0" name="some lib">
? <employees firstName="some one"/>
</extlib:Library>
d http:///org/eclipse/emf/examples/library/extlibrary.ecore/1.0.0#/0/@employees.0
http:///org/eclipse/emf/examples/library/extlibrary.ecore/1.0.0#/1
<?xml version="1.0" encoding="ASCII"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http:///org/eclipse/emf/examples/library/extlibrary.ecore/1.0.0">
? <extlib:Library name="some lib">
??? <employees firstName="some one"/>
? </extlib:Library>
? <extlib:Book title="some book"/>
</xmi:XMI>

可以看到,沒有加入lib的時候,employee/book實例的URI都是#//, employee加入以后有了#//@employees.0, book依舊。
在book加入resource以后有了#/1的URI, employee/book在containment定義分別是true,false,所以employee加入lib以后就隨lib加入resource(實例容器)。book則要單獨加入。

另外一個有趣的現象是Resource可以容納多個實例,在step d可以看到輸出的根節點由lib變成匿名容器。

如果lib不加入resource又如何呢?
步驟 輸出
a ----------------
b?#//
#//
c #///@employees.0
#//
d ----------------
沒加入resource之前,URI是未知的,知道的只是相對父節點的相對segment.