/* * Copyright Aduna (http://www.aduna-software.com/) (c) 2008. * * Licensed under the Aduna BSD-style license. */ package org.openrdf.sail.rdbms.managers; import java.sql.SQLException; import java.util.Locale; import java.util.TimeZone; import javax.xml.datatype.XMLGregorianCalendar; import org.openrdf.model.Literal; import org.openrdf.model.URI; import org.openrdf.model.datatypes.XMLDatatypeUtil; import org.openrdf.sail.rdbms.managers.base.ValueManagerBase; import org.openrdf.sail.rdbms.model.RdbmsLiteral; import org.openrdf.sail.rdbms.model.RdbmsURI; import org.openrdf.sail.rdbms.schema.LiteralTable; /** * Manages RDBMS Literals. Including creation, id lookup, and inserting them * into the database. * * @author James Leigh * */ public class LiteralManager extends ValueManagerBase<RdbmsLiteral> { private static TimeZone Z = TimeZone.getTimeZone("GMT"); public static long getCalendarValue(XMLGregorianCalendar xcal) { return xcal.toGregorianCalendar(Z, Locale.US, null).getTimeInMillis(); } public static LiteralManager instance; private LiteralTable table; public LiteralManager() { instance = this; } public void setTable(LiteralTable table) { this.table = table; } @Override public void close() throws SQLException { super.close(); table.close(); } @Override protected boolean expunge(String condition) throws SQLException { return table.expunge(condition); } @Override protected void optimize() throws SQLException { super.optimize(); table.optimize(); } @Override protected Literal key(RdbmsLiteral value) { return value; } @Override protected void insert(Number id, RdbmsLiteral literal) throws SQLException, InterruptedException { String label = literal.getLabel(); String language = literal.getLanguage(); URI datatype = literal.getDatatype(); if (literal.getPredicate() != null && literal.getPredicate().stringValue().equals("http://www.georss.org/georss/point")) { /* * Insert point using reverse parameter order: * GeoRss uses latitude<space>longitude format, whereas POINT datatype * expects x<space>y format, which equals to longitude<space>latitude */ String[] point = literal.stringValue().split(" "); table.insertPoint(id, label, point[1] + " " + point[0]); } else if (datatype == null && language == null) { table.insertSimple(id, label); } else if (datatype == null) { table.insertLanguage(id, label, language); } else { String dt = datatype.stringValue(); try { if (XMLDatatypeUtil.isNumericDatatype(datatype)) { table.insertNumeric(id, label, dt, literal.doubleValue()); } else if (XMLDatatypeUtil.isCalendarDatatype(datatype)) { long value = getCalendarValue(literal.calendarValue()); table.insertDateTime(id, label, dt, value); } else { table.insertDatatype(id, label, dt); } } catch (NumberFormatException e) { table.insertDatatype(id, label, dt); } catch (IllegalArgumentException e) { table.insertDatatype(id, label, dt); } } } @Override protected int getBatchSize() { return table.getBatchSize(); } }