OK I was probably too quick - now I realized the syntax of xsd:gMonth and xsd:gDay is not so simple...
On Thu, Nov 14, 2013 at 4:05 PM, Martynas Jusevičius <marty...@graphity.org> wrote: > I came up with an approach that concatenates lexical values and > doesn't need Calendar or DateTimeStruct. > > Not sure however how this aligns with the range of time:inXSDDateTime > which is xsd:dateTime - can xsd:gYear/xsd:gMonthDay/xsd:date be > treated as xsd:dateTime values? I guess I'll have to typecast them in > SPARQL. > > if > (resource.hasProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#inDateTime"))) > { > Literal dateTime; > Resource dateTimeDesc = > resource.getPropertyResourceValue(ResourceFactory.createProperty("http://www.w3.org/2006/time#inDateTime")); > > if > (!dateTimeDesc.hasProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#year"))) > throw new DateTimeParseException("time:year value is > missing"); > RDFNode yearObject = > dateTimeDesc.getProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#year")).getObject(); > if (!yearObject.isLiteral()) > throw new DateTimeParseException("time:year value is > not a Literal"); > > if > (dateTimeDesc.hasProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#month"))) > { > RDFNode monthObject = > dateTimeDesc.getProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#month")).getObject(); > if (!monthObject.isLiteral()) > throw new DateTimeParseException("time:month value > is not a Literal"); > > if > (dateTimeDesc.hasProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#day"))) > { > RDFNode dayObject = > dateTimeDesc.getProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#day")).getObject(); > if (!dayObject.isLiteral()) > throw new DateTimeParseException("time:day > value is not a Literal"); > > dateTime = > resource.getModel().createTypedLiteral(yearObject.asLiteral().getLexicalForm() > + "-" + > monthObject.asLiteral().getLexicalForm() + > "-" + > dayObject.asLiteral().getLexicalForm(), > XSDDatatype.XSDdate); > } > else > { > dateTime = > resource.getModel().createTypedLiteral(yearObject.asLiteral().getLexicalForm() > + "-" + > monthObject.asLiteral().getLexicalForm(), > XSDDatatype.XSDgMonthDay); > } > } > else > dateTime = yearObject.asLiteral(); > > > resource.addLiteral(ResourceFactory.createProperty("http://www.w3.org/2006/time#inXSDDateTime"), > dateTime); > } > > On Thu, Nov 14, 2013 at 3:08 PM, Martynas Jusevičius > <marty...@graphity.org> wrote: >> I'll try DateTimeStruct again, but that basically means I need my own >> copy of the class, since I currently cannot extend it to override the >> private constructor? >> >> On Thu, Nov 14, 2013 at 2:15 PM, Andy Seaborne <a...@apache.org> wrote: >>> Hi there, >>> >>> DateTimeStruct is, well, a struct. The fields are public. You could write a >>> builder to target that. The default constructor could be made public. The >>> statics are specific patterns for the XSD date/time datatypes with >>> validation. >>> >>> DateTimeStruct represents the Date/time Seven-property model of XSD. It can >>> produce the string for xsd:date or xsd:dateTime but not the gregorial g* >>> datatypes. >>> >>> java.util.calendar is OK as a value but, in the details, unusable for XSD >>> types. Why not set DateTimeStruct fields? >>> >>> javax.xml.datatype.XMLGregorianCalendar could be of use - it has getters and >>> setters. >>> >>> For DateTimeStruct or XMLGregorianCalendar, you can then use >>> >>> createTypedLiteral(String lex, RDFDatatype dtype) >>> >>> >>>> Not all mandatory - the >>>> format can be YYYY, YYYY-MM, YYYY-MM-DD. >>> >>> You could build the lexical form. >>> >>> Andy >>> >>> >>> On 14/11/13 02:02, Martynas Jusevičius wrote: >>>> >>>> Hey, >>>> >>>> I have datetime components as 3 separate literals, with xsd:gYear, >>>> xsd:gMonth, xsd:gDay respective datatypes. Not all mandatory - the >>>> format can be YYYY, YYYY-MM, YYYY-MM-DD. >>>> >>>> Now how do I combine those into a single xsd:dateTime Literal? A >>>> concrete use case would be converting time:inDateTime values into >>>> time:inXSDDateTime values: >>>> http://www.w3.org/TR/owl-time/#calclock >>>> >>>> I came up with the code below which seems to work but is not pretty >>>> (and doesn't deal with time). I also looked at DateTimeStruct but >>>> either way there seemed to be some datatype mismatch. I think it would >>>> make more sense for DateTimeStruct to use the builder pattern instead >>>> of static methods. >>>> >>>> Is there a better way? >>>> >>>> if >>>> (resource.hasProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#inDateTime"))) >>>> { >>>> Calendar calendar = Calendar.getInstance(); >>>> Resource dateTimeDesc = >>>> >>>> resource.getPropertyResourceValue(ResourceFactory.createProperty("http://www.w3.org/2006/time#inDateTime")); >>>> >>>> if >>>> (dateTimeDesc.hasProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#year"))) >>>> { >>>> RDFNode object = >>>> >>>> dateTimeDesc.getProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#year")).getObject(); >>>> if (object.isLiteral()) >>>> { >>>> Literal literal = object.asLiteral(); >>>> calendar.set(Calendar.YEAR, >>>> Integer.parseInt(literal.getLexicalForm())); >>>> } >>>> } >>>> else throw new DateTimeParseException("time:year value is >>>> missing"); >>>> >>>> if >>>> (dateTimeDesc.hasProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#month"))) >>>> { >>>> RDFNode object = >>>> >>>> dateTimeDesc.getProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#month")).getObject(); >>>> if (object.isLiteral()) >>>> { >>>> Literal literal = object.asLiteral(); >>>> calendar.set(Calendar.MONTH, >>>> Integer.parseInt(literal.getLexicalForm())); >>>> } >>>> } >>>> >>>> if >>>> (dateTimeDesc.hasProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#day"))) >>>> { >>>> RDFNode object = >>>> >>>> dateTimeDesc.getProperty(ResourceFactory.createProperty("http://www.w3.org/2006/time#day")).getObject(); >>>> if (object.isLiteral()) >>>> { >>>> Literal literal = object.asLiteral(); >>>> calendar.set(Calendar.DAY_OF_MONTH, >>>> Integer.parseInt(literal.getLexicalForm())); >>>> } >>>> } >>>> >>>> calendar.set(Calendar.HOUR, 0); >>>> calendar.set(Calendar.MINUTE, 0); >>>> calendar.set(Calendar.SECOND, 0); >>>> Literal dateTime = >>>> resource.getModel().createTypedLiteral(calendar); >>>> >>>> resource.addLiteral(ResourceFactory.createProperty("http://www.w3.org/2006/time#inXSDDateTime"), >>>> dateTime); >>>> } >>>> >>>> Martynas >>>> graphityhq.com >>>> >>>