Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » TMF (Xtext) » Resource.save output is invalid XMI file(Unresolved Reference Exception in the output file of save method even though the item exists and in the correct index)
Resource.save output is invalid XMI file [message #1006462] Thu, 31 January 2013 06:58 Go to next message
Houssam Abdoullah is currently offline Houssam Abdoullah
Messages: 1
Registered: January 2013
Junior Member
Hello all,
I'm using org.eclipse.emf.ecore.resource.Resource.save(OutputStream outputStream, Map<?, ?> options) to seliaze XMI resource
When opening the output file, I'm getting Unresolved Reference Exception

org.eclipse.emf.ecore.xmi.UnresolvedReferenceException: Unresolved reference '//@elements.13'. (platform:/resource/my.generator.project.TestAllWithnewModel/src/metamodel/t.xmi, 7, 138)
at org.eclipse.emf.ecore.xmi.impl.XMLHandler.handleForwardReferences(XMLHandler.java:1154)
at org.eclipse.emf.ecore.xmi.impl.XMLHandler.endDocument(XMLHandler.java:1228)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endDocument(AbstractSAXParser.java:737)
for the elements from 9 to 14 (Which are the last elements of the file). Evernthough they are present in the file.
The main difference between the output of save method and the original XMI scheme is that the original scheme uses structured elements when referring to a list while save method doesn't.

Any information about how to solve this problem? Another question please how can I add the schema location to the output file before calling save function?
I provided the original working XMI file, the output file (I highlighted the difference in red here) and the code I'm using.
Thanks for your help.
Houssam

The code to call the serializer
Resource xmiresource = resSet.createResource(URI.createURI("test.xmi"));
xmiresource.getContents().add(model);
xmiresource.save(xmi, Collections.EMPTY_MAP);

The output file
The output file in in this format and it's correct accourding to the input:
<?xml version="1.0" encoding="ASCII"?>
<domainmodel:Domainmodel xmi:version="2.0" xmlns:xmi="" xmlns:xsi="" xmlns:domainmodel="" xsi:schemaLocation="http://www.eclipse.org/xtext/example/Domainmodel metamodel.ecore">
<elements xsi:type="domainmodel:PackageDeclaration" name="java.lang" elements="//@elements.3"/>
<elements xsi:type="domainmodel:PackageDeclaration" name="my.company.blog" elements="//@elements.2 //@elements.6 //@elements.7 //@elements.4 //@elements.5"/>
<elements xsi:type="domainmodel:Import" importedNamespace="java.lang.*"/>
<elements xsi:type="domainmodel:DataType" name="String"/>
<elements xsi:type="domainmodel:Entity" name="Post" superType="//@elements.7" features="//@elements.13 //@elements.11 //@elements.12"/>
<elements xsi:type="domainmodel:Entity" name="Comment" superType="//@elements.7" features="//@elements.10"/>
<elements xsi:type="domainmodel:Entity" name="Blog" features="//@elements.9"/>
<elements xsi:type="domainmodel:Entity" name="HasAuthor" features="//@elements.8"/>
<elements xsi:type="domainmodel:Feature" many="false" name="author" type="//@elements.3"/>
<elements xsi:type="domainmodel:Feature" many="false" name="title" type="//@elements.3"/>
<elements xsi:type="domainmodel:Feature" many="false" name="content" type="//@elements.3"/>
<elements xsi:type="domainmodel:Feature" many="false" name="content" type="//@elements.3"/>
<elements xsi:type="domainmodel:Feature" many="true" name="comments" type="//@elements.5"/>
<elements xsi:type="domainmodel:Feature" many="false" name="title" type="//@elements.3"/>
<elements xsi:type="domainmodel:Feature" many="true" name="posts" type="//@elements.4"/>
</domainmodel:Domainmodel>

The original file
<?xml version="1.0" encoding="ASCII"?>
<domainmodel:Domainmodel xmi:version="2.0" xmlns:xmi="" xmlns:xsi="" xmlns:domainmodel="http://www.eclipse.org/xtext/example/Domainmodel" xsi:schemaLocation="http://www.eclipse.org/xtext/example/Domainmodel metamodel.ecore">
<elements xsi:type="domainmodel:PackageDeclaration" name="java.lang">
<elements xsi:type="domainmodel:DataType" name="String"/>
</elements>
<elements xsi:type="domainmodel:PackageDeclaration" name="my.company.blog">
<elements xsi:type="domainmodel:Import" importedNamespace="java.lang.*"/>
<elements xsi:type="domainmodel:Entity" name="Blog">
<features name="title" type="//@elements.0/@elements.0"/>
<features many="true" name="posts" type="//@elements.1/@elements.3"/>

</elements>
<elements xsi:type="domainmodel:Entity" name="HasAuthor">
<features name="author" type="//@elements.0/@elements.0"/>
</elements>
<elements xsi:type="domainmodel:Entity" name="Post" superType="//@elements.1/@elements.2">
<features name="title" type="//@elements.0/@elements.0"/>
<features name="content" type="//@elements.0/@elements.0"/>
<features many="true" name="comments" type="//@elements.1/@elements.4"/>

</elements>
<elements xsi:type="domainmodel:Entity" name="Comment" superType="//@elements.1/@elements.2">
<features name="content" type="//@elements.0/@elements.0"/>
</elements>
</elements>
</domainmodel:Domainmodel>
  • Attachment: Model.xmi
    (Size: 1.52KB, Downloaded 35 times)
  • Attachment: outpot.xmi
    (Size: 1.72KB, Downloaded 34 times)
  • Attachment: XmiSerializer.java
    (Size: 4.09KB, Downloaded 76 times)
Re: Resource.save output is invalid XMI file [message #1006605 is a reply to message #1006462] Fri, 01 February 2013 02:03 Go to previous message
Ed Merks is currently offline Ed Merks
Messages: 25999
Registered: July 2009
Senior Member
Houssam,

Comments below.

On 31/01/2013 3:23 PM, Houssam Abdoullah wrote:
> Hello all,
> I'm using org.eclipse.emf.ecore.resource.Resource.save(OutputStream outputStream, Map<?, ?> options) to seliaze XMI resource
> When opening the output file, I'm getting Unresolved Reference Exception
> org.eclipse.emf.ecore.xmi.UnresolvedReferenceException: Unresolved reference '//@elements.13'. (platform:/resource/my.generator.project.TestAllWithnewModel/src/metamodel/t.xmi, 7, 138)
> at org.eclipse.emf.ecore.xmi.impl.XMLHandler.handleForwardReferences(XMLHandler.java:1154)
> at org.eclipse.emf.ecore.xmi.impl.XMLHandler.endDocument(XMLHandler.java:1228)
> at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endDocument(AbstractSAXParser.java:737)
> for the elements from 9 to 14 (Which are the last elements of the file). Evernthough they are present in the file.
> The main difference between the output of save method and the original XMI scheme is that the original scheme uses structured elements when referring to a list while save method doesn't.
> Any information about how to solve this problem? Another question please how can I add the schema location to the output file before calling save function?

# 2.22 How can I ensure that an xsi:schemaLocation is serialized for my
packages?
<http://wiki.eclipse.org/index.php/EMF-FAQ#How_can_I_ensure_that_an_xsi:schemaLocation_is_serialized_for_my_packages.3F>

The schema location is determined by the URI of the resource containing
your Ecore model
> I provided the original working XMI file, the output file (I highlighted the difference in red here) and the code I'm using.
> Thanks for your help.
> Houssam
>
> The code to call the serializer
> Resource xmiresource = resSet.createResource(URI.createURI("test.xmi"));
> xmiresource.getContents().add(model);
> xmiresource.save(xmi, Collections.EMPTY_MAP);
>
> The output file
> The output file in in this format and it's correct accourding to the input:
> <?xml version="1.0" encoding="ASCII"?>
> <domainmodel:Domainmodel xmi:version="2.0" xmlns:xmi="" xmlns:xsi="" xmlns:domainmodel="" xsi:schemaLocation="http://www.eclipse.org/xtext/example/Domainmodel metamodel.ecore">
> <elements xsi:type="domainmodel:PackageDeclaration" name="java.lang" elements="//@elements.3"/>
> <elements xsi:type="domainmodel:PackageDeclaration" name="my.company.blog" elements="//@elements.2 //@elements.6 //@elements.7 //@elements.4 //@elements.5"/>
> <elements xsi:type="domainmodel:Import" importedNamespace="java.lang.*"/>
> <elements xsi:type="domainmodel:DataType" name="String"/>
> <elements xsi:type="domainmodel:Entity" name="Post" superType="//@elements.7" features="//@elements.13 //@elements.11 //@elements.12"/>
> <elements xsi:type="domainmodel:Entity" name="Comment" superType="//@elements.7" features="//@elements.10"/>
> <elements xsi:type="domainmodel:Entity" name="Blog" features="//@elements.9"/>
> <elements xsi:type="domainmodel:Entity" name="HasAuthor" features="//@elements.8"/>
> <elements xsi:type="domainmodel:Feature" many="false" name="author" type="//@elements.3"/>
> <elements xsi:type="domainmodel:Feature" many="false" name="title" type="//@elements.3"/>
> <elements xsi:type="domainmodel:Feature" many="false" name="content" type="//@elements.3"/>
> <elements xsi:type="domainmodel:Feature" many="false" name="content" type="//@elements.3"/>
> <elements xsi:type="domainmodel:Feature" many="true" name="comments" type="//@elements.5"/>
> <elements xsi:type="domainmodel:Feature" many="false" name="title" type="//@elements.3"/>
> <elements xsi:type="domainmodel:Feature" many="true" name="posts" type="//@elements.4"/>
> </domainmodel:Domainmodel>
This output I'd expect if every object is contained in the
DomainModel's elements feature.
>
> The original file
> <?xml version="1.0" encoding="ASCII"?>
> <domainmodel:Domainmodel xmi:version="2.0" xmlns:xmi="" xmlns:xsi="" xmlns:domainmodel="http://www.eclipse.org/xtext/example/Domainmodel" xsi:schemaLocation="http://www.eclipse.org/xtext/example/Domainmodel metamodel.ecore">
> <elements xsi:type="domainmodel:PackageDeclaration" name="java.lang">
> <elements xsi:type="domainmodel:DataType" name="String"/>
> </elements>
> <elements xsi:type="domainmodel:PackageDeclaration" name="my.company.blog">
> <elements xsi:type="domainmodel:Import" importedNamespace="java.lang.*"/>
> <elements xsi:type="domainmodel:Entity" name="Blog">
> <features name="title" type="//@elements.0/@elements.0"/>
> <features many="true" name="posts" type="//@elements.1/@elements.3"/>
> </elements>
> <elements xsi:type="domainmodel:Entity" name="HasAuthor">
> <features name="author" type="//@elements.0/@elements.0"/>
> </elements>
> <elements xsi:type="domainmodel:Entity" name="Post" superType="//@elements.1/@elements.2">
> <features name="title" type="//@elements.0/@elements.0"/>
> <features name="content" type="//@elements.0/@elements.0"/>
> <features many="true" name="comments" type="//@elements.1/@elements.4"/>
> </elements>
> <elements xsi:type="domainmodel:Entity" name="Comment" superType="//@elements.1/@elements.2">
> <features name="content" type="//@elements.0/@elements.0"/>
> </elements>
> </elements>
> </domainmodel:Domainmodel>
This output I'd expect if the objects are properly contained in the
hierarchy where you're expecting them. Somehow you're populating
everything as elements of the domain model and not as nested elements
and features as you were expecting/hoping.
Previous Topic:Change file to parse
Next Topic:SAXParseException on running Maven build for test that builds an Xtext model
Goto Forum:
  


Current Time: Thu Aug 21 18:17:14 EDT 2014

Powered by FUDForum. Page generated in 0.01671 seconds