[
https://issues.apache.org/jira/browse/JENA-1841?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17051149#comment-17051149
]
Jan Martin Keil commented on JENA-1841:
---------------------------------------
{quote}putting in a registration step will work for you? This seems like the
correct way. The rest of this discussion is about how to deal with the
"incorrect setup" case of no prior registration.
{quote}
Sure, that is a convenient way to do this, similar to the Converters in JPA or
the De-/Serializers in Jackson. And I used a similar approach to work around
this bug, but unfortunately without using {{TypeMapper}}, as I did not know it.
Would be helpful to mention the {{TypeMapper}} in the new exception to give a
hint to developers.
Just to mention it: Compared to e.g. Jackson I see the drawback that it is not
possible to have different TypeMappers and therefore different conversions for
the same DataType. But that is another issue (and does not affect me).
> Side Effect of Datatype <java:java.util.UUID> Use in Query
> ----------------------------------------------------------
>
> Key: JENA-1841
> URL: https://issues.apache.org/jira/browse/JENA-1841
> Project: Apache Jena
> Issue Type: Bug
> Affects Versions: Jena 3.14.0
> Reporter: Jan Martin Keil
> Priority: Major
>
> I faced a bug caused by a side effect of using the datatype
> <java:java.util.UUID> in a query.
> Short story is that you can not use this datatype in model parsing or queries
> after you once used it in a query.
> I did not completely break it down to a specific piece of code, but I wrote
> some testcases that narrow down the issue. Please note that the order of
> execution of the test methods effect the result. So please first try to
> execute single test methods before executing the whole test class.
> {code:java}
> import java.io.ByteArrayInputStream;
> import java.util.UUID;
> import org.apache.jena.arq.querybuilder.SelectBuilder;
> import org.apache.jena.query.QueryExecution;
> import org.apache.jena.query.QueryExecutionFactory;
> import org.apache.jena.rdf.model.Model;
> import org.apache.jena.rdf.model.ModelFactory;
> import org.junit.jupiter.api.Test;
> public class UuidParsingintoModelOrQuery {
> @Test
> public void uuidParsingIntoSingleModel() throws Exception {
> UUID uuid1 =
> UUID.fromString("00000000-0000-0000-0000-000000000000");
> UUID uuid2 =
> UUID.fromString("00000000-0000-0000-0000-000000000001");
> String modelStr = "_:a <http://example.org/p1> \"" + uuid1 +
> "\"^^<java:java.util.UUID> .\n"
> + "_:a <http://example.org/p2> \"" + uuid1 +
> "\"^^<java:java.util.UUID> .";
> ModelFactory.createDefaultModel().read(new
> ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE");
> // repeat
> modelStr = "_:a <http://example.org/p1> \"" + uuid2 +
> "\"^^<java:java.util.UUID> .\n"
> + "_:a <http://example.org/p2> \"" + uuid2 +
> "\"^^<java:java.util.UUID> .";
> ModelFactory.createDefaultModel().read(new
> ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE");
> }
> @Test
> public void sameUuidParsingIntoSingleModel() throws Exception {
> UUID uuid1 =
> UUID.fromString("00000000-0000-0000-0000-000000000002");
> UUID uuid2 =
> UUID.fromString("00000000-0000-0000-0000-000000000003");
> String modelStr = "_:a <http://example.org/p1> \"" + uuid1 +
> "\"^^<java:java.util.UUID> .\n"
> + "_:a <http://example.org/p2> \"" + uuid2 +
> "\"^^<java:java.util.UUID> .";
> ModelFactory.createDefaultModel().read(new
> ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE");
> // repeat
> ModelFactory.createDefaultModel().read(new
> ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE");
> }
> @Test
> public void sameUuidParsingIntoMultipleModel() throws Exception {
> UUID uuid =
> UUID.fromString("00000000-0000-0000-0000-000000000004");
> String modelStr = "_:a <http://example.org/p1> \"" + uuid +
> "\"^^<java:java.util.UUID> .";
> ModelFactory.createDefaultModel().read(new
> ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE");
> ModelFactory.createDefaultModel().read(new
> ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE");
> }
> @Test
> public void uuidUseInQuery() throws Exception {
> UUID uuid =
> UUID.fromString("00000000-0000-0000-0000-000000000005");
> SelectBuilder select = new SelectBuilder();
> select.addWhere("?a", "<http://example.org/p>", "?uuid");
> select.addFilter(select.getExprFactory().eq("?uuid", uuid));
> QueryExecution q = QueryExecutionFactory.create(select.build());
> }
> @Test
> public void uuidParsingIntoQuery() throws Exception {
> UUID uuid =
> UUID.fromString("00000000-0000-0000-0000-000000000006");
> SelectBuilder select = new SelectBuilder();
> select.addWhere("?a", "<http://example.org/p>", "?uuid");
> select.addFilter(select.getExprFactory().eq("?uuid", uuid));
> QueryExecution q =
> QueryExecutionFactory.create(select.toString());
> }
> @Test
> public void uuidUseInQueryAndParsingIntoModel() throws Exception {
> UUID uuid =
> UUID.fromString("00000000-0000-0000-0000-000000000007");
> SelectBuilder select = new SelectBuilder();
> select.addWhere("?a", "<http://example.org/p>", "?uuid");
> select.addFilter(select.getExprFactory().eq("?uuid", uuid));
> QueryExecution q = QueryExecutionFactory.create(select.build());
> String modelStr = "_:a <http://example.org/p1> \"" + uuid +
> "\"^^<java:java.util.UUID> .\n"
> + "_:a <http://example.org/p2> \"" + uuid +
> "\"^^<java:java.util.UUID> .";
> Model model = ModelFactory.createDefaultModel().read(new
> ByteArrayInputStream(modelStr.getBytes()), "",
> "N-TRIPLE");
> }
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)