There are specific problems with xsd:duration, see
http://www.w3.org/TR/2004/REC-rdf-mt-20040210/#dtype_interp
"xsd:duration does not have a well-defined value space"
This is fixed and you should use either
http://www.w3.org/TR/xmlschema11-2/#yearMonthDuration
or
http://www.w3.org/TR/xmlschema11-2/#dayTimeDuration
I am unclear as to how this interacts with Jena support for duration, or
your question - sorry.
As regards to your question, the error message that "P" is not a valid
duration is correct, "P0D" for example, seems to be valid representation of
the zero length duration, which is the canonical one for dayTimeDuration. I
can't quite follow where the "P" is produced in your code, but still,
wherever it is, patching it to be "P0D" will fix things.
Jeremy
On Mar 18, 2013, at 1:54 PM, Léonard PETNGA <[email protected]> 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){
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? How do I
construct that using the *XSDDuration* constructor?
Any other solution will be welcomed...
Many thanks in advance for your prompt reaction.
Leo