1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 package org.openrdf.elmo.sesame.converters.impl;
30
31 import java.math.BigDecimal;
32 import java.sql.Timestamp;
33 import java.util.GregorianCalendar;
34
35 import javax.xml.datatype.DatatypeConfigurationException;
36 import javax.xml.datatype.DatatypeFactory;
37 import javax.xml.datatype.XMLGregorianCalendar;
38
39 import org.openrdf.elmo.sesame.converters.Marshall;
40 import org.openrdf.model.Literal;
41 import org.openrdf.model.URI;
42 import org.openrdf.model.ValueFactory;
43 import org.openrdf.model.impl.URIImpl;
44
45 public class SqlTimestampMarshall implements Marshall<Timestamp> {
46 private static final URI DATATYPE = new URIImpl("java:"
47 + Timestamp.class.getName());
48
49 private ValueFactory vf;
50
51 private DatatypeFactory factory;
52
53 private URI datatype = DATATYPE;
54
55 public SqlTimestampMarshall(ValueFactory vf)
56 throws DatatypeConfigurationException {
57 this.vf = vf;
58 factory = DatatypeFactory.newInstance();
59 }
60
61 public Class<Timestamp> getJavaClass() {
62 return Timestamp.class;
63 }
64
65 public URI getDatatype() {
66 return datatype;
67 }
68
69 public void setDatatype(URI datatype) {
70 this.datatype = datatype;
71 }
72
73 public Timestamp deserialize(Literal literal) {
74 String label = literal.getLabel();
75 XMLGregorianCalendar gc = factory.newXMLGregorianCalendar(label);
76 return new Timestamp(gc.toGregorianCalendar().getTimeInMillis());
77 }
78
79 public Literal serialize(Timestamp object) {
80 GregorianCalendar gc = new GregorianCalendar(0, 0, 0);
81 gc.setTime(object);
82 XMLGregorianCalendar xgc = factory.newXMLGregorianCalendar(gc);
83 BigDecimal fraction = BigDecimal.valueOf(object.getNanos(), 9);
84 xgc.setFractionalSecond(fraction);
85 String label = xgc.toXMLFormat();
86 return vf.createLiteral(label, datatype);
87 }
88
89 }