Here's code that works that serializes in 1.1 format.

The key idea is to set the OutputProperty OutputKeys.VERSION to "1.1".

XmiCasSerializer xmiCasSerializer = new XmiCasSerializer(jCas.getTypeSystem());
OutputStream out = new FileOutputStream(new File ("odd-doc-txt-v11.xmi"));
try {
  XMLSerializer xml11Serializer = new XMLSerializer(out);
  xml11Serializer.setOutputProperty(OutputKeys.VERSION,"1.1");
  xmiCasSerializer.serialize(jCas.getCas(), 
xml11Serializer.getContentHandler());
    }
finally {
  out.close();
}

This is from a test case. -Marshall

On 9/25/2019 2:16 PM, Mario Juric wrote:
> Thanks Marshall,
>
> If you prefer then I can also have a look at it, although I probably need to 
> finish something first within the next 3-4 weeks. It would probably get me 
> faster started if you could share some of your experimental sample code.
>
> Cheers,
> Mario
>
>
>
>
>
>
>
>
>
>
>
>
>
>> On 24 Sep 2019, at 21:32 , Marshall Schor <[email protected]> wrote:
>>
>> yes, makes sense, thanks for posting the Jira.
>>
>> If no one else steps up to work on this, I'll probably take a look in a few
>> days. -Marshall
>>
>> On 9/24/2019 6:47 AM, Mario Juric wrote:
>>> Hi Marshall,
>>>
>>> I added the following feature request to Apache Jira:
>>>
>>> https://issues.apache.org/jira/browse/UIMA-6128
>>>
>>> Hope it makes sense :)
>>>
>>> Thanks a lot for the help, it’s appreciated.
>>>
>>> Cheers,
>>> Mario
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>> On 23 Sep 2019, at 16:33 , Marshall Schor <[email protected]> wrote:
>>>>
>>>> Re: serializing using XML 1.1
>>>>
>>>> This was not thought of, when setting up the CasIOUtils.
>>>>
>>>> The way it was done (above) was using some more "primitive/lower level" 
>>>> APIs,
>>>> rather than the CasIOUtils.
>>>>
>>>> Please open a Jira ticket for this, with perhaps some suggestions on how it
>>>> might be specified in the CasIOUtils APIs.
>>>>
>>>> Thanks! -Marshall
>>>>
>>>> On 9/23/2019 3:45 AM, Mario Juric wrote:
>>>>> Hi Marshall,
>>>>>
>>>>> Thanks for the thorough and excellent investigation.
>>>>>
>>>>> We are looking into possible normalisation/cleanup of 
>>>>> whitespace/invisible characters, but I don’t think we can necessarily do 
>>>>> the same for some of the other characters. It sounds to me though that 
>>>>> serialising to XML 1.1 could also be a simple fix right now, but can this 
>>>>> be configured? CasIOUtils doesn’t seem to have an option for this, so I 
>>>>> assume it’s something you have working in your branch.
>>>>>
>>>>> Regarding the other problem. It seems that the JDK bug is fixed from Java 
>>>>> 9 and after. Do you think switching to a more recent Java version would 
>>>>> make a difference? I think we can also try this out ourselves when we 
>>>>> look into migrating to UIMA 3 once our current deliveries are complete. 
>>>>> We also like to switch to Java 11, and like UIMA 3 migration it will 
>>>>> require some thorough testing.
>>>>>
>>>>> Cheers,
>>>>> Mario
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>> On 20 Sep 2019, at 20:52 , Marshall Schor <[email protected]> wrote:
>>>>>>
>>>>>> In the test "OddDocumentText", this produces a "throw" due to an invalid 
>>>>>> xml
>>>>>> char, which is the \u0002.
>>>>>>
>>>>>> This is in part because the xml version being used is xml 1.0.
>>>>>>
>>>>>> XML 1.1 expanded the set of valid characters to include \u0002.
>>>>>>
>>>>>> Here's a snip from the XmiCasSerializerTest class which serializes with 
>>>>>> xml 1.1:
>>>>>>
>>>>>>       XmiCasSerializer xmiCasSerializer = new
>>>>>> XmiCasSerializer(jCas.getTypeSystem());
>>>>>>       OutputStream out = new FileOutputStream(new File 
>>>>>> ("odd-doc-txt-v11.xmi"));
>>>>>>       try {
>>>>>>         XMLSerializer xml11Serializer = new XMLSerializer(out);
>>>>>>         xml11Serializer.setOutputProperty(OutputKeys.VERSION,"1.1");
>>>>>>         xmiCasSerializer.serialize(jCas.getCas(),
>>>>>> xml11Serializer.getContentHandler());
>>>>>>       }
>>>>>>       finally {
>>>>>>         out.close();
>>>>>>       }
>>>>>>
>>>>>> This succeeds and serializes this using xml 1.1.
>>>>>>
>>>>>> I also tried serializing some doc text which includes \u77987.  That did 
>>>>>> not
>>>>>> serialize correctly.
>>>>>> I could see it in the code while tracing up to some point down in the 
>>>>>> innards of
>>>>>> some internal
>>>>>> sax java code
>>>>>> com.sun.org.apache.xml.internal.serializer.AttributesImplSerialize  
>>>>>> where it was
>>>>>> "Correct" in the Java string.
>>>>>>
>>>>>> When serialized (as UTF-8) it came out as a 4 byte string E79E 9837.
>>>>>>
>>>>>> This is 1110 0111 1001 1110 1001 1000 0011 0111, which in utf8 is a 3 
>>>>>> byte encoding:
>>>>>>       1110 xxxx 10xx xxxx 10xx xxxx
>>>>>>
>>>>>> of 0111 0111 1001 1000 which in hex is "7 7 9 8" so it looks fishy to me.
>>>>>>
>>>>>> But I think it's out of our hands - it's somewhere deep in the sax 
>>>>>> transform
>>>>>> java code.
>>>>>>
>>>>>> I looked for a bug report and found some
>>>>>> https://bugs.openjdk.java.net/browse/JDK-8058175
>>>>>>
>>>>>> Bottom line, is, I think to clean out these characters early :-) .
>>>>>>
>>>>>> -Marshall
>>>>>>
>>>>>>
>>>>>> On 9/20/2019 1:28 PM, Marshall Schor wrote:
>>>>>>> here's an idea.
>>>>>>>
>>>>>>> If you have a string, with the surrogate pair &#77987 at position 10, 
>>>>>>> and you
>>>>>>> have some Java code, which is iterating through the string and getting 
>>>>>>> the
>>>>>>> code-point at each character offset, then that code will produce:
>>>>>>>
>>>>>>> at position 10:  the code-point 77987
>>>>>>> at position 11:  the code-point 56483
>>>>>>>
>>>>>>> Of course, it's a "bug" to iterate through a string of characters, 
>>>>>>> assuming you
>>>>>>> have characters at each point, if you don't handle surrogate pairs.
>>>>>>>
>>>>>>> The 56483 is just the lower bits of the surrogate pair, added to xDC00 
>>>>>>> (see
>>>>>>> https://tools.ietf.org/html/rfc2781 )
>>>>>>>
>>>>>>> I worry that even tools like the CVD or similar may not work properly, 
>>>>>>> since
>>>>>>> they're not designed to handle surrogate pairs, I think, so I have no 
>>>>>>> idea if
>>>>>>> they would work well enough for you.
>>>>>>>
>>>>>>> I'll poke around some more to see if I can enable the conversion for 
>>>>>>> document
>>>>>>> strings.
>>>>>>>
>>>>>>> -Marshall
>>>>>>>
>>>>>>> On 9/20/2019 11:09 AM, Mario Juric wrote:
>>>>>>>> Thanks Marshall,
>>>>>>>>
>>>>>>>> Encoding the characters like you suggest should work just fine for us 
>>>>>>>> as long as we can serialize and deserialise the XMI, so that we can 
>>>>>>>> open the content in a tool like the CVD or similar. These characters 
>>>>>>>> are just noise from the original content that happen to remain in the 
>>>>>>>> CAS, but they are not visible in our final output because they are 
>>>>>>>> basically filtered out one way or the other by downstream components. 
>>>>>>>> They become a problem though when they make it more difficult for us 
>>>>>>>> to inspect the content.
>>>>>>>>
>>>>>>>> Regarding the feature name issue: Might you have an idea why we are 
>>>>>>>> getting a different XMI output for the same character in our actual 
>>>>>>>> pipeline, where it results in "&#77987;&#56483;”? I investigated the 
>>>>>>>> value in the debugger again, and like you are illustrating it is also 
>>>>>>>> just a single codepoint with the value 77987. We are simply not able 
>>>>>>>> to load this XMI because of this, but unfortunately I couldn’t 
>>>>>>>> reproduce it in my small example.
>>>>>>>>
>>>>>>>> Cheers,
>>>>>>>> Mario
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>> On 19 Sep 2019, at 22:41 , Marshall Schor <[email protected]> wrote:
>>>>>>>>>
>>>>>>>>> The odd-feature-text seems to work OK, but has some unusual 
>>>>>>>>> properties, due to
>>>>>>>>> that unicode character.
>>>>>>>>>
>>>>>>>>> Here's what I see:  The FeatureRecord "name" field is set to a
>>>>>>>>> 1-unicode-character, that must be encoded as 2 java characters.
>>>>>>>>>
>>>>>>>>> When output, it shows up in the xmi as <noNamespace:FeatureRecord 
>>>>>>>>> xmi:id="18"
>>>>>>>>> name="&#77987;" value="1.0"/>
>>>>>>>>> which seems correct.  The name field only has 1 (extended)unicode 
>>>>>>>>> character
>>>>>>>>> (taking 2 Java characters to represent),
>>>>>>>>> due to setting it with this code:   String oddName = "\uD80C\uDCA3";
>>>>>>>>>
>>>>>>>>> When read in, the name field is assigned to a String, that string 
>>>>>>>>> says it has a
>>>>>>>>> length of 2 (but that's because it takes 2 java chars to represent 
>>>>>>>>> this char).
>>>>>>>>> If you have the name string in a variable "n", and do
>>>>>>>>> System.out.println(n.codePointAt(0)), it shows (correctly) 77987.
>>>>>>>>> n.codePointCount(0, n.length()) is, as expected, 1.
>>>>>>>>>
>>>>>>>>> So, the string value serialization and deserialization seems to be 
>>>>>>>>> "working".
>>>>>>>>>
>>>>>>>>> The other code - for the sofa (document) serialization, is throwing 
>>>>>>>>> that error,
>>>>>>>>> because as currently designed, the
>>>>>>>>> serialization code checks for these kinds of characters, and if found 
>>>>>>>>> throws
>>>>>>>>> that exception.  The code checking is
>>>>>>>>> in XMLUtils.checkForNonXmlCharacters
>>>>>>>>>
>>>>>>>>> This is because it's highly likely that "fixing this" in the same way 
>>>>>>>>> as the
>>>>>>>>> other, would result in hard-to-diagnose
>>>>>>>>> future errors, because the subject of analysis string is processed 
>>>>>>>>> with begin /
>>>>>>>>> end offset all over the place, and makes
>>>>>>>>> the assumption that the characters are all not coded as surrogate 
>>>>>>>>> pairs.
>>>>>>>>>
>>>>>>>>> We could change the code to output these like the name, as, e.g.,  
>>>>>>>>> &#77987; 
>>>>>>>>>
>>>>>>>>> Would that help in your case, or do you imagine other kinds of things 
>>>>>>>>> might
>>>>>>>>> break (due to begin/end offsets no longer
>>>>>>>>> being on character boundaries, for example).
>>>>>>>>>
>>>>>>>>> -Marshall
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 9/18/2019 11:41 AM, Mario Juric wrote:
>>>>>>>>>> Hi,
>>>>>>>>>>
>>>>>>>>>> I investigated the XMI issue as promised and these are my findings.
>>>>>>>>>>
>>>>>>>>>> It is related to special unicode characters that are not handled by 
>>>>>>>>>> XMI
>>>>>>>>>> serialisation, and there seems to be two distinct categories of 
>>>>>>>>>> issues we have
>>>>>>>>>> identified so far.
>>>>>>>>>>
>>>>>>>>>> 1) The document text of the CAS contains special unicode characters
>>>>>>>>>> 2) Annotations with String features have values containing special 
>>>>>>>>>> unicode
>>>>>>>>>> characters
>>>>>>>>>>
>>>>>>>>>> In both cases we could for sure solve the problem if we did a better 
>>>>>>>>>> clean up
>>>>>>>>>> job upstream, but with the amount and variety of data we receive 
>>>>>>>>>> there is
>>>>>>>>>> always a chance something passes through, and some of it may in the 
>>>>>>>>>> general
>>>>>>>>>> case even be valid content.
>>>>>>>>>>
>>>>>>>>>> The first case is easy to reproduce with the OddDocumentText example 
>>>>>>>>>> I
>>>>>>>>>> attached. In this example the text is a snippet taken from the 
>>>>>>>>>> content of a
>>>>>>>>>> parsed XML document.
>>>>>>>>>>
>>>>>>>>>> The other case was not possible to reproduce with the OddFeatureText 
>>>>>>>>>> example,
>>>>>>>>>> because I am getting slightly different output to what I have in our 
>>>>>>>>>> real
>>>>>>>>>> setup. The OddFeatureText example is based on the simple type system 
>>>>>>>>>> I shared
>>>>>>>>>> previously. The name value of a FeatureRecord contains special 
>>>>>>>>>> unicode
>>>>>>>>>> characters that I found in a similar data structure in our actual 
>>>>>>>>>> CAS. The
>>>>>>>>>> value comes from an external knowledge base holding some noisy 
>>>>>>>>>> strings, which
>>>>>>>>>> in this case is a hieroglyph entity. However, when I write the CAS 
>>>>>>>>>> to XMI
>>>>>>>>>> using the small example it only outputs the first of the two 
>>>>>>>>>> characters in
>>>>>>>>>> "\uD80C\uDCA3”, which yields the value "&#77987;” in the XMI, but in 
>>>>>>>>>> our
>>>>>>>>>> actual setup both character values are written as 
>>>>>>>>>> "&#77987;&#56483;”. This
>>>>>>>>>> means that the attached example will for some reason parse the XMI 
>>>>>>>>>> again, but
>>>>>>>>>> it will not work in the case where both characters are written the 
>>>>>>>>>> way we
>>>>>>>>>> experience it. The XMI can be manually changed, so that both 
>>>>>>>>>> character values
>>>>>>>>>> are included the way it happens in our output, and in this case a
>>>>>>>>>> SAXParserException happens.
>>>>>>>>>>
>>>>>>>>>> I don’t know whether it is outside the scope of the XMI serialiser 
>>>>>>>>>> to handle
>>>>>>>>>> any of this, but it will be good to know in any case :)
>>>>>>>>>>
>>>>>>>>>> Cheers,
>>>>>>>>>> Mario
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>> On 17 Sep 2019, at 09:36 , Mario Juric <[email protected] 
>>>>>>>>>>> <mailto:[email protected]> <mailto:[email protected] 
>>>>>>>>>>> <mailto:[email protected]>>>
>>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>> Thank you very much for looking into this. It is really appreciated 
>>>>>>>>>>> and I
>>>>>>>>>>> think it touches upon something important, which is about data 
>>>>>>>>>>> migration in
>>>>>>>>>>> general.
>>>>>>>>>>>
>>>>>>>>>>> I agree that some of these solutions can appear specific, awkward 
>>>>>>>>>>> or complex
>>>>>>>>>>> and the way forward is not to address our use case alone. I think 
>>>>>>>>>>> there is a
>>>>>>>>>>> need for a compact and efficient binary serialization format for 
>>>>>>>>>>> the CAS when
>>>>>>>>>>> dealing with large amounts of data because this is directly visible 
>>>>>>>>>>> in costs
>>>>>>>>>>> of processing and storing, and I found the compressed binary format 
>>>>>>>>>>> to be
>>>>>>>>>>> much better than XMI in this regard, although I have to admit it’s 
>>>>>>>>>>> been a
>>>>>>>>>>> while since I benchmarked this. Given that UIMA already has a well 
>>>>>>>>>>> described
>>>>>>>>>>> type system then maybe it just lacks a way to describe schema 
>>>>>>>>>>> evolution
>>>>>>>>>>> similar to Apache Avro or similar serialisation frameworks. I think 
>>>>>>>>>>> a more
>>>>>>>>>>> formal approach to data migration would be critical to any larger 
>>>>>>>>>>> operational
>>>>>>>>>>> setup.
>>>>>>>>>>>
>>>>>>>>>>> Regarding XMI I like to provide some input to the problem we are 
>>>>>>>>>>> observing,
>>>>>>>>>>> so that it can be solved. We are primarily using XMI for 
>>>>>>>>>>> inspection/debugging
>>>>>>>>>>> purposes, and we are sometimes not able to do this because of this 
>>>>>>>>>>> error. I
>>>>>>>>>>> will try to extract a minimum example to avoid involving parts that 
>>>>>>>>>>> has to do
>>>>>>>>>>> with our pipeline and type system, and I think this would also be 
>>>>>>>>>>> the best
>>>>>>>>>>> way to illustrate that the problem exists outside of this context. 
>>>>>>>>>>> However,
>>>>>>>>>>> converting all our data to XMI first in order to do the conversion 
>>>>>>>>>>> in our
>>>>>>>>>>> example would not be very practical for us, because it involves a 
>>>>>>>>>>> large
>>>>>>>>>>> amount of data.
>>>>>>>>>>>
>>>>>>>>>>> Cheers,
>>>>>>>>>>> Mario
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>> On 16 Sep 2019, at 23:02 , Marshall Schor <[email protected] 
>>>>>>>>>>>> <mailto:[email protected]>
>>>>>>>>>>>> <mailto:[email protected] <mailto:[email protected]>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>> In this case, the original looks kind-of like this:
>>>>>>>>>>>>
>>>>>>>>>>>> Container
>>>>>>>>>>>> features -> FSArray of FeatureAnnotation each of which
>>>>>>>>>>>>                           has 5 slots: sofaRef, begin, end, name, 
>>>>>>>>>>>> value
>>>>>>>>>>>>
>>>>>>>>>>>> the new TypeSystem has
>>>>>>>>>>>>
>>>>>>>>>>>> Container
>>>>>>>>>>>> features -> FSArray of FeatureRecord each of which
>>>>>>>>>>>>                            has 2 slots: name, value
>>>>>>>>>>>>
>>>>>>>>>>>> The deserializer code would need some way to decide how to
>>>>>>>>>>>> 1) create an FSArray of FeatureRecord,
>>>>>>>>>>>> 2) for each element,
>>>>>>>>>>>>    map the FeatureAnnotation to a new instance of FeatureRecord
>>>>>>>>>>>>
>>>>>>>>>>>> I guess I could imagine a default mapping (for item 2 above) of
>>>>>>>>>>>> 1) change the type from A to B
>>>>>>>>>>>> 2) set equal-named features from A to B, drop other features
>>>>>>>>>>>>
>>>>>>>>>>>> This mapping would need to apply to a subset of the A's and B's, 
>>>>>>>>>>>> namely, only
>>>>>>>>>>>> those referenced by the FSArray where the element type changed.  
>>>>>>>>>>>> Seems complex
>>>>>>>>>>>> and specific to this use case though.
>>>>>>>>>>>>
>>>>>>>>>>>> -Marshall
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On 9/16/2019 2:42 PM, Richard Eckart de Castilho wrote:
>>>>>>>>>>>>> On 16. Sep 2019, at 19:05, Marshall Schor <[email protected] 
>>>>>>>>>>>>> <mailto:[email protected]>
>>>>>>>>>>>>> <mailto:[email protected] <mailto:[email protected]>>> wrote:
>>>>>>>>>>>>>> I can reproduce the problem, and see what is happening.  The 
>>>>>>>>>>>>>> deserialization
>>>>>>>>>>>>>> code compares the two type systems, and allows for some 
>>>>>>>>>>>>>> mismatches (things
>>>>>>>>>>>>>> present in one and not in the other), but it doesn't allow for 
>>>>>>>>>>>>>> having a
>>>>>>>>>>>>>> feature
>>>>>>>>>>>>>> whose range (value) is type XXXX in one type system and type 
>>>>>>>>>>>>>> YYYY in the
>>>>>>>>>>>>>> other.
>>>>>>>>>>>>>> See CasTypeSystemMapper lines 299 - 315.
>>>>>>>>>>>>> Without reading the code in detail - could we not relax this 
>>>>>>>>>>>>> check such
>>>>>>>>>>>>> that the element type of FSArrays is not checked and the code 
>>>>>>>>>>>>> simply
>>>>>>>>>>>>> assumes that the source element type has the same features as the 
>>>>>>>>>>>>> target
>>>>>>>>>>>>> element type (with the usual lenient handling of missing features 
>>>>>>>>>>>>> in the
>>>>>>>>>>>>> target type)? - Kind of a "duck typing" approach?
>>>>>>>>>>>>>
>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>>
>>>>>>>>>>>>> -- Richard
>

Reply via email to