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

Reply via email to