On 18/03/13 22:12, Dave Reynolds wrote:
On 18/03/13 20:54, Léonard PETNGA wrote:
Hi Jena Community,
I'm new to Jena and I would need your help fixing some issues with my
code.
I'm trying to parse a String in duration format ie  "*PnYn MnDTnH
nMn**S*" into
an *XSDDuration* datatype that I'll bind to a Node of my inferred
graph (in
a custom built-in function). To that aim, my parser extracts and stores
integer values for Year, Month, etc... in an array int[9] of *value,
*that
is latter passed to the XML duration constructor. This works fine
...except
for when the duration is 0 (see the error below).

public static int[]  parseStringToISODurationInt(String duration)
throwsIllegalArgumentException {

      int[] value = new int[9];

      StringTokenizer st = new StringTokenizer(duration);

      String nullDur = "PT0H0M0S";     // from a previous converter
function

      if (duration == nullDur){

You shouldn't use == to compare strings.


      value[0] = 0;

      value[1] = 0;

      value[2] = 0;

      value[3] = 0;

      value[4] = 0;

      value[5] = 0;

      value[6] = 0;     // [7] is the Z character(zulu timezone, not
needed
here),

      value[8] = 3;     // 'mscale' value

    } else {

      // ....rest of the code

      }

  return value;

}

In my built-in I pass the array obtained to the *XSDDuration(Object
value)*constructor and make the new node that is binded to the graph
as follows :

Node duration = null;

  duration = Node.createLiteral(
LiteralLabelFactory.create(newXSDDuration(value)) );
The following excerpt shows the error when running my built-in for a zero
duration (value[i]=0 forall i =0,..6 and value[8]=3 ).

Exception in thread "main"
com.hp.hpl.jena.datatypes.DatatypeFormatException: Lexical form 'P' is
not
a legal instance of Datatype[http://www.w3.org/2001/XMLSchema#duration ->
class com.hp.hpl.jena.datatypes.xsd.XSDDuration] null
      [java] at
com.hp.hpl.jena.graph.impl.LiteralLabelImpl.getValue(LiteralLabelImpl.java:300)


So what what is the legal lexical form for a "zero" duration?

xsd:duration allows you to omit any zero field except you must have at
least one field. So presumably any P with at least one explicit 0 field
would do, e.g. "PT0S" or your "PT0H0M0S".

xmlschema 1.1

PT0S is the canonical form of a zero duration

http://www.w3.org/TR/xmlschema11-2/#duration
->
http://www.w3.org/TR/xmlschema11-2/#f-durationCanMap
->
http://www.w3.org/TR/xmlschema11-2/#f-duDTCan



How do I
construct that using the *XSDDuration* constructor?

As Joshua says the constructor is not intended for normal use, use
lexical forms.

However, it does look like your attempt to use the constructor directly
has uncovered an lurking bug in that the XSDDuration serialization
doesn't handle the case where all fields are zero. I've logged that as
an issue in Jira.

Many thanks in advance for your prompt reaction.

hmmm - bear in mind you are talking to volunteers here.

Dave


Reply via email to