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".

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