public static FileTime literalAsFileTime()

in taverna-robundle/src/main/java/org/apache/taverna/robundle/utils/RDFUtils.java [44:117]


	public static FileTime literalAsFileTime(RDFNode rdfNode) {
		if (rdfNode == null) {
			return null;
		}
		Literal literal = null;
		if (rdfNode.isLiteral()) {
			/* Example:
			   <dcterms:created
			     rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2014-06-26T10:29:00Z</dcterms:created>
			 */
			literal = rdfNode.asLiteral();
		} else {
			// TAVERNA-1044: not a literal, so assume a resource
			// with the literal nested somehow
			Resource resource = rdfNode.asResource();

			// Potential type of bnode
			Resource dctW3CDTF = rdfNode.getModel().getResource("http://purl.org/dc/terms/W3CDTF");
			// TAVERNA-1044 - COMBIE sometimes mis-use DCT:W3CDTF as if it was a property
			Property dctW3CDTFProp = rdfNode.getModel().getProperty("http://purl.org/dc/terms/W3CDTF");

			if (resource.hasProperty(RDF.type, dctW3CDTF)) {
				// Semantically correct pattern, pick up rdf:value directly.
				/* Example:
			     <dcterms:created>
			      <dcterms:W3CDTF>
			        <rdf:value>2018-05-10T02:38:51Z</rdf:value>
			      </dcterms:W3CDTF>
			    </dcterms:created>
				 */
				Statement valueStmt = rdfNode.asResource().getProperty(RDF.value);
				if (valueStmt != null && valueStmt.getObject().isLiteral()) {
					literal = valueStmt.getLiteral();
				}
			} else if (resource.hasProperty(dctW3CDTFProp)) {
				// TAVERNA-1044: Weird, dct:W3CDTF is a type, not a property,
				// but we'll pretend it is to be compatible with example in
				// http://identifiers.org/combine.specifications/omex.version-1

				/* Example:
				<dcterms:created rdf:parseType="Resource">
				  <dcterms:W3CDTF>2014-06-26T10:29:00Z</dcterms:W3CDTF>
				</dcterms:created>
				*/
				Statement w3cDtfStmt = resource.getProperty(dctW3CDTFProp);
				if (w3cDtfStmt != null && w3cDtfStmt.getObject().isLiteral()) {
					literal = w3cDtfStmt.getLiteral();
				}
			}
		}
		if (literal == null) {
			Exception ex = new Exception("Invalid timestamp literal");
			logger.log(Level.WARNING,
			           "Expected literal value or dcterms:W3CDTF instance, not: " + rdfNode,
			           ex);
			return null;
		}

		Object value = literal.getValue();
		XSDDateTime dateTime;
		if (value instanceof XSDDateTime) {
			dateTime = (XSDDateTime) value;
		} else {
			logger.info("Literal not an XSDDateTime, but: " + value.getClass() + " " + value);
			// Try to parse it anyway
			try {
				dateTime = (XSDDateTime) XSDdateTime.parse(literal.getLexicalForm());
			} catch (DatatypeFormatException e) {
				logger.warning("Invalid datetime: " + literal);
				return null;
			}
		}
		return fromMillis(dateTime.asCalendar().getTimeInMillis());
	}