Package virtuoso.jena.driver

Source Code of virtuoso.jena.driver.VirtGraph

/*
*  $Id$
*
*  This file is part of the OpenLink Software Virtuoso Open-Source (VOS)
*  project.
*
*  Copyright (C) 1998-2014 OpenLink Software
*
*  This project is free software; you can redistribute it and/or modify it
*  under the terms of the GNU General Public License as published by the
*  Free Software Foundation; only version 2 of the License, dated June 1991.
*
*  This program is distributed in the hope that it will be useful, but
*  WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
*  General Public License for more details.
*
*  You should have received a copy of the GNU General Public License along
*  with this program; if not, write to the Free Software Foundation, Inc.,
*  51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/

package virtuoso.jena.driver;

import java.sql.*;
import java.util.*;
import javax.sql.*;

import virtuoso.sql.*;

import com.hp.hpl.jena.graph.*;
import com.hp.hpl.jena.graph.impl.*;
import com.hp.hpl.jena.shared.*;
import com.hp.hpl.jena.util.iterator.*;
import com.hp.hpl.jena.datatypes.*;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.rdf.model.impl.*;
import com.hp.hpl.jena.datatypes.xsd.impl.*;

import virtuoso.jdbc3.VirtuosoConnectionPoolDataSource;
import virtuoso.jdbc3.VirtuosoDataSource;


public class VirtGraph extends GraphBase
{
    static {
        VirtuosoQueryEngine.register();
    }

    static public final String DEFAULT = "virt:DEFAULT";
    protected String graphName;
    protected boolean readFromAllGraphs = false;
    protected String url_hostlist;
    protected String user;
    protected String password;
    protected boolean roundrobin = false;
    protected int prefetchSize = 200;
    protected Connection connection = null;
    protected String ruleSet = null;
    protected boolean useSameAs = false;
    protected int queryTimeout = 0;
    static final String S_TTLP_INSERT = "DB.DBA.TTLP(?,'',?,255)";
    static final String sinsert = "sparql insert into graph iri(??) { `iri(??)` `iri(??)` `bif:__rdf_long_from_batch_params(??,??,??)` }";
    static final String sdelete = "sparql delete from graph iri(??) {`iri(??)` `iri(??)` `bif:__rdf_long_from_batch_params(??,??,??)`}";
    static final int BATCH_SIZE = 5000;
    static final int MAX_CMD_SIZE = 36000;
    static final String utf8 = "charset=utf-8";
    static final String charset = "UTF-8";

    private VirtuosoConnectionPoolDataSource pds = new VirtuosoConnectionPoolDataSource();
    private javax.sql.DataSource ds;


    public VirtGraph()
    {
  this(null, "jdbc:virtuoso://localhost:1111/charset=UTF-8", null, null, false);
    }

    public VirtGraph(String graphName)
    {
  this(graphName, "jdbc:virtuoso://localhost:1111/charset=UTF-8", null, null, false);
    }

    public VirtGraph(String graphName, String _url_hostlist, String user,
        String password)
    {
  this(graphName, _url_hostlist, user, password, false);
    }

    public VirtGraph(String url_hostlist, String user, String password)
    {
  this(null, url_hostlist, user, password, false);
    }


    public VirtGraph(String _graphName, javax.sql.DataSource _ds)
    {
  super();

  if (_ds instanceof VirtuosoDataSource) {
      VirtuosoDataSource vds = (VirtuosoDataSource)_ds;
      this.url_hostlist = vds.getServerName();
      this.graphName = _graphName;
      this.user = vds.getUser();
      this.password = vds.getPassword();
  }

  if (this.graphName == null)
      this.graphName = DEFAULT;

  try {
      connection = _ds.getConnection();
      ds = _ds;
      ModelCom m = new ModelCom(this); //don't drop is it needed for initialize internal Jena classes
      TypeMapper tm = TypeMapper.getInstance();
  } catch(Exception e) {
      throw new JenaException(e);
  }
    }


    public VirtGraph(javax.sql.DataSource _ds)
    {   
  this(null, _ds);
    }


    public VirtGraph(String _graphName, ConnectionPoolDataSource _ds)
    {
  super();

  if (_ds instanceof VirtuosoConnectionPoolDataSource) {
      VirtuosoDataSource vds = (VirtuosoDataSource)_ds;
      this.url_hostlist = vds.getServerName();
      this.graphName = _graphName;
      this.user = vds.getUser();
      this.password = vds.getPassword();
  }

  if (this.graphName == null)
      this.graphName = DEFAULT;

  try {
      connection = _ds.getPooledConnection().getConnection();
      ModelCom m = new ModelCom(this); //don't drop is it needed for initialize internal Jena classes
      TypeMapper tm = TypeMapper.getInstance();
  } catch(Exception e) {
      throw new JenaException(e);
  }
    }


    public VirtGraph(ConnectionPoolDataSource _ds)
    {   
  this(null, _ds);
    }


    public VirtGraph(String graphName, String _url_hostlist, String user,
        String password, boolean _roundrobin)
    {
  super();

  this.url_hostlist = _url_hostlist.trim();
  this.roundrobin = _roundrobin;
  this.graphName = graphName;
  this.user = user;
  this.password = password;

  if(this.graphName == null)
      this.graphName = DEFAULT;

  try {
      if (url_hostlist.startsWith("jdbc:virtuoso://")) {

          String url = url_hostlist;
                if (url.toLowerCase().indexOf(utf8) == -1) {
              if (url.charAt(url.length()-1) != '/')
                  url = url + "/charset=UTF-8";
              else
                  url = url + "charset=UTF-8";
          }
                if (roundrobin && url.toLowerCase().indexOf("roundrobin=") == -1) {
          if (url.charAt(url.length()-1) != '/')
                  url = url + "/roundrobin=1";
              else
                  url = url + "roundrobin=1";
          }
    Class.forName("virtuoso.jdbc3.Driver");
    connection = DriverManager.getConnection(url, user, password);
      } else {
    pds.setServerName(url_hostlist);
    pds.setUser(user);
    pds.setPassword(password);
    pds.setCharset(charset);
    pds.setRoundrobin(roundrobin);
    javax.sql.PooledConnection pconn = pds.getPooledConnection();
    connection = pconn.getConnection();
                ds = (javax.sql.DataSource)pds;
      }

      ModelCom m = new ModelCom(this); //don't drop is it needed for initialize internal Jena classes
      TypeMapper tm = TypeMapper.getInstance();
  } catch(Exception e) {
      throw new JenaException(e);
  }

    }

// getters
    public javax.sql.DataSource getDataSource() {
        return ds;
    }

    public String getGraphName()
    {
  return this.graphName;
    }

    public String getGraphUrl()
    {
  return this.url_hostlist;
    }

    public String getGraphUser()
    {
  return this.user;
    }

    public String getGraphPassword()
    {
  return this.password;
    }

    public Connection getConnection()
    {
      return this.connection;
    }


    public int getFetchSize()
    {
      return this.prefetchSize;
    }


    public void setFetchSize(int sz)
    {
      this.prefetchSize = sz;
    }


    public int getQueryTimeout()
    {
      return this.queryTimeout;
    }


    public void setQueryTimeout(int seconds)
    {
      this.queryTimeout = seconds;
    }


    public int getCount()
    {
        return size();
    }


    public void remove(List triples)
    {
        delete(triples.iterator(), null);
    }

    public void remove(Triple t)
    {
        delete(t);
    }


    public boolean getReadFromAllGraphs()
    {
      return readFromAllGraphs;
    }

    public void setReadFromAllGraphs(boolean val)
    {
      readFromAllGraphs = val;
    }


    public String getRuleSet()
    {
  return ruleSet;
    }

    public void setRuleSet(String _ruleSet)
    {
  ruleSet = _ruleSet;
    }

    public boolean getSameAs()
    {
  return useSameAs;
    }

    public void setSameAs(boolean _sameAs)
    {
  useSameAs = _sameAs;
    }



    public void createRuleSet(String ruleSetName, String uriGraphRuleSet)
    {
      checkOpen();

      try {
  java.sql.Statement st = createStatement();
  st.execute("rdfs_rule_set('"+ruleSetName+"', '"+uriGraphRuleSet+"')");
  st.close();
      } catch (Exception e) {
        throw new JenaException(e);
      }
    }


    public void removeRuleSet(String ruleSetName, String uriGraphRuleSet)
    {
      checkOpen();

      try {
  java.sql.Statement st = createStatement();
  st.execute("rdfs_rule_set('"+ruleSetName+"', '"+uriGraphRuleSet+"', 1)");
  st.close();
      } catch (Exception e) {
        throw new JenaException(e);
      }
    }



    private static String escapeString(String s)
    {
      StringBuilder sb = new StringBuilder(s.length());
      int slen = s.length();

      for (int i = 0; i < slen; i++) {
  char c = s.charAt(i);
  int cInt = c;

  if (c == '\\') {
    sb.append("\\\\");
  }
  else if (c == '"') {
    sb.append("\\\"");
  }
  else if (c == '\n') {
    sb.append("\\n");
  }
  else if (c == '\r') {
    sb.append("\\r");
  }
  else if (c == '\t') {
    sb.append("\\t");
  }
  else if (
          cInt >= 0x0 && cInt <= 0x8 ||
    cInt == 0xB || cInt == 0xC ||
    cInt >= 0xE && cInt <= 0x1F ||
    cInt >= 0x7F && cInt <= 0xFFFF)
  {
    sb.append("\\u");
    sb.append(toHexString(cInt, 4));
  }
  else if (cInt >= 0x10000 && cInt <= 0x10FFFF) {
    sb.append("\\U");
    sb.append(toHexString(cInt, 8));
  }
  else {
    sb.append(c);
  }
      }
      return sb.toString();
    }

    private static String toHexString(int decimal, int stringLength) {
      StringBuilder sb = new StringBuilder(stringLength);
      String hexVal = Integer.toHexString(decimal).toUpperCase();

      int nofZeros = stringLength - hexVal.length();
      for (int i = 0; i < nofZeros; i++)
  sb.append('0');

      sb.append(hexVal);
      return sb.toString();
    }


    protected java.sql.Statement createStatement() throws java.sql.SQLException
    {
      checkOpen();
      java.sql.Statement st = connection.createStatement();
      if (queryTimeout > 0)
        st.setQueryTimeout(queryTimeout);
      st.setFetchSize(prefetchSize);
      return st;
    }

    protected java.sql.PreparedStatement prepareStatement(String sql) throws java.sql.SQLException
    {
      checkOpen();
      java.sql.PreparedStatement st = connection.prepareStatement(sql);
      if (queryTimeout > 0)
        st.setQueryTimeout(queryTimeout);
      st.setFetchSize(prefetchSize);
      return st;
    }



// GraphBase overrides
    public static String Node2Str(Node n)
    {
      if (n.isURI()) {
        return "<"+n+">";
      } else if (n.isBlank()) {
        return "_:"+n;
      } else if (n.isLiteral()) {
        String s;
        StringBuffer sb = new StringBuffer();
        sb.append("\"");
        sb.append(escapeString(n.getLiteralLexicalForm()));
        sb.append("\"");

        s = n.getLiteralLanguage();
        if (s != null && s.length() > 0) {
          sb.append("@");
          sb.append(s);
        }
        s = n.getLiteralDatatypeURI();
        if (s != null && s.length() > 0) {
          sb.append("^^<");
          sb.append(s);
          sb.append(">");
        }
        return sb.toString();
      } else {
        return "<"+n+">";
      }
    }

    void bindSubject(PreparedStatement ps, int col, Node n) throws SQLException
    {
      if (n == null)
  return;
      if (n.isURI())
  ps.setString(col, n.toString());
      else if (n.isBlank())
        ps.setString(col, "_:"+n.toString());
      else
        throw new SQLException("Only URI or Blank nodes can be used as subject");
    }

 
    void bindPredicate(PreparedStatement ps, int col, Node n) throws SQLException
    {
      if (n == null)
        return;
      if (n.isURI())
      ps.setString(col, n.toString());
      else
        throw new SQLException("Only URI nodes can be used as predicate");
    }

    void bindObject(PreparedStatement ps, int col, Node n) throws SQLException
    {
      if (n == null)
        return;
      if (n.isURI()) {
  ps.setInt(col, 1);
        ps.setString(col+1, n.toString());
  ps.setNull(col+2, java.sql.Types.VARCHAR);
      } else if (n .isBlank()) {
  ps.setInt(col, 1);
  ps.setString(col+1, "_:"+n.toString());
  ps.setNull(col+2, java.sql.Types.VARCHAR);
      else if (n.isLiteral()) {
        String llang = n.getLiteralLanguage();
        String ltype = n.getLiteralDatatypeURI();
  if (llang != null && llang.length() > 0) {
          ps.setInt(col, 5);
          ps.setString(col+1, n.getLiteralValue().toString());
          ps.setString(col+2, n.getLiteralLanguage());
        } else if (ltype != null && ltype.length() > 0) {
          ps.setInt(col, 4);
          ps.setString(col+1, n.getLiteralValue().toString());
          ps.setString(col+2, n.getLiteralDatatypeURI());
        } else {
          ps.setInt(col, 3);
          ps.setString(col+1, n.getLiteralValue().toString());
          ps.setNull(col+2, java.sql.Types.VARCHAR);
       
      }  else {
  ps.setInt(col, 3);
        ps.setString(col+1, n.toString());
  ps.setNull(col+2, java.sql.Types.VARCHAR);
      }
    }

   
   
//--java5 or newer    @Override
    public void performAdd(Triple t)
    {
      java.sql.PreparedStatement ps;

      try {
        ps = prepareStatement(sinsert);
        ps.setString(1, this.graphName);
        bindSubject(ps, 2, t.getSubject());
        bindPredicate(ps, 3, t.getPredicate());
        bindObject(ps, 4, t.getObject());

  ps.execute();
  ps.close();
      } catch(Exception e) {
        throw new AddDeniedException(e.toString());
      }
    }


    public void performDelete (Triple t)
    {
      java.sql.PreparedStatement ps;

      try {
        ps = prepareStatement(sdelete);
        ps.setString(1, this.graphName);
        bindSubject(ps, 2, t.getSubject());
        bindPredicate(ps, 3, t.getPredicate());
        bindObject(ps, 4, t.getObject());

  ps.execute();
  ps.close();
      } catch(Exception e) {
        throw new DeleteDeniedException(e.toString());
      }
    }


    /**
     * more efficient
     */
//--java5 or newer    @Override
    protected int graphBaseSize()
    {
      StringBuffer sb = new StringBuffer("select count(*) from (sparql define input:storage \"\" ");
       
      if (ruleSet!=null)
        sb.append(" define input:inference '"+ruleSet+"'\n ");
       
      if (useSameAs)
        sb.append(" define input:same-as \"yes\"\n ");

      if ( readFromAllGraphs )
        sb.append(" select * where {?s ?p ?o })f");
      else
        sb.append(" select * where { graph `iri(??)` { ?s ?p ?o }})f");

      ResultSet rs = null;
      int ret = 0;

      checkOpen();

      try {
  java.sql.PreparedStatement ps = prepareStatement(sb.toString());

  if (!readFromAllGraphs)
    ps.setString(1, graphName);

  rs = ps.executeQuery();
  if (rs.next())
    ret = rs.getInt(1);
  rs.close();
  ps.close();
      } catch (Exception e) {
        throw new JenaException(e);
      }
      return ret;
    }


    /** maybe more efficient than default impl
     *
     */
//--java5 or newer    @Override
    protected boolean graphBaseContains(Triple t)
    {
      ResultSet rs = null;
      String S, P, O;
      StringBuffer sb = new StringBuffer("sparql define input:storage \"\" ");
      String exec_text;

      checkOpen();

      S = " ?s ";
      P = " ?p ";
      O = " ?o ";

      if (!Node.ANY.equals(t.getSubject()))
        S = Node2Str(t.getSubject());

      if (!Node.ANY.equals(t.getPredicate()))
        P = Node2Str(t.getPredicate());

      if (!Node.ANY.equals(t.getObject()))
        O = Node2Str(t.getObject());
     
      if (ruleSet!=null)
        sb.append(" define input:inference '"+ruleSet+"'\n ");

      if (useSameAs)
        sb.append(" define input:same-as \"yes\"\n ");

      if ( readFromAllGraphs )
   sb.append(" select * where { " + S +" "+ P +" "+ O +" } limit 1");
      else
        sb.append(" select * where { graph <"+ graphName +"> { " + S +" "+ P +" "+ O +" }} limit 1");

      try {
  java.sql.Statement stmt = createStatement();
  rs = stmt.executeQuery(sb.toString());
  boolean ret = rs.next();
  rs.close();
  stmt.close();
  return ret;
      } catch (Exception e) {
        throw new JenaException(e);
      }
    }


//--java5 or newer    @Override
    public ExtendedIterator<Triple> graphBaseFind(TripleMatch tm)
    {
      String S, P, O;
      StringBuffer sb = new StringBuffer("sparql ");

      checkOpen();

      S = " ?s ";
      P = " ?p ";
      O = " ?o ";

      if (tm.getMatchSubject() != null)
        S = Node2Str(tm.getMatchSubject());

      if (tm.getMatchPredicate() != null)
        P = Node2Str(tm.getMatchPredicate());

      if (tm.getMatchObject() != null)
        O = Node2Str(tm.getMatchObject());

      if (ruleSet!=null)
        sb.append(" define input:inference '"+ruleSet+"'\n ");

      if (useSameAs)
        sb.append(" define input:same-as \"yes\"\n ");

      if ( readFromAllGraphs )
        sb.append(" select * where { "+ S +" "+ P +" "+ O + " }");
      else
        sb.append(" select * from <" + graphName + "> where { " + S +" "+ P +" "+ O + " }");

      try
      {
        java.sql.PreparedStatement stmt;
        stmt = prepareStatement(sb.toString());
  return new VirtResSetIter(this, stmt.executeQuery(), tm);
      } catch (Exception e) {
        throw new JenaException(e);
      }
    }


//--java5 or newer    @Override
    public void close()
    {
      try {
        super.close(); // will set closed = true
        connection.close();
      } catch (Exception e) {
        throw new JenaException(e);
      }
    }
   
   
// Extra functions

    public void clear()
    {
      clearGraph(this.graphName);
      getEventManager().notifyEvent( this, GraphEvents.removeAll );
    }


    public void read (String url, String type)
    {
      String exec_text;

      exec_text ="sparql load \"" + url + "\" into graph <" + graphName + ">";

      checkOpen();
      try {
        java.sql.Statement stmt = createStatement();
        stmt.execute(exec_text);
        stmt.close();
      catch(Exception e) {
        throw new JenaException(e);
      }
    }


//--java5 or newer    @SuppressWarnings("unchecked")
    void add(String _gName, Iterator<Triple> it, List<Triple> list)
    {
      try {
        PreparedStatement ps = prepareStatement(S_TTLP_INSERT);
        StringBuilder sb = new StringBuilder(256);
        int count = 0;
     
        while (it.hasNext())
        {
          Triple t = (Triple) it.next();

          if (list != null)
            list.add(t);

          sb.append(Node2Str(t.getSubject()));
          sb.append(' ');
          sb.append(Node2Str(t.getPredicate()));
          sb.append(' ');
          sb.append(Node2Str(t.getObject()));
          sb.append(" .\n");
          count++;

          if (count > BATCH_SIZE) {
      ps.setString(1, sb.toString());
            ps.setString(2, this.graphName);
      ps.executeUpdate();
      sb.setLength(0);
            count = 0;
          }
        }

        if (count > 0)
        {
    ps.setString(1, sb.toString());
          ps.setString(2, (_gName!=null? _gName: this.graphName));
    ps.executeUpdate();
        }
        ps.close();

      catch(Exception e) {
        throw new JenaException(e);
      }
    }



    void delete(Iterator<Triple> it, List<Triple> list)
    {
      String del_start = "sparql define output:format '_JAVA_' DELETE FROM <";
      java.sql.Statement stmt = null;
      int count = 0;
      StringBuilder data = new StringBuilder(256);

      data.append(del_start);
      data.append(this.graphName);
      data.append("> { ");

      try {
        stmt = createStatement();

        while (it.hasNext())
        {
          Triple t = (Triple) it.next();

          if (list != null)
            list.add(t);

          StringBuilder row = new StringBuilder(256);
          row.append(Node2Str(t.getSubject()));
          row.append(' ');
          row.append(Node2Str(t.getPredicate()));
          row.append(' ');
          row.append(Node2Str(t.getObject()));
          row.append(" .\n");

          if (count > 0 && data.length()+row.length() > MAX_CMD_SIZE) {
            data.append(" }");
      stmt.execute(data.toString());

      data.setLength(0);
            data.append(del_start);
            data.append(this.graphName);
            data.append("> { ");
            count = 0;
          }

          data.append(row);
          count++;
        }

        if (count > 0)
        {
          data.append(" }");
    stmt.execute(data.toString());
        }

      }  catch(Exception e) {
        throw new JenaException(e);
      } finally {
        try {
          stmt.close();
        } catch (Exception e) {}
      }
    }


    void delete_match(TripleMatch tm)
    {
      String S, P, O;
      Node nS, nP, nO;

      checkOpen();

      S = "?s";
      P = "?p";
      O = "?o";

      nS = tm.getMatchSubject();
      nP = tm.getMatchPredicate();
      nO = tm.getMatchObject();

      try {
        if (nS == null && nP == null && nO == null) {

          clearGraph(this.graphName);

        } else if (nS != null && nP != null && nO != null) {
          java.sql.PreparedStatement ps;

          ps = prepareStatement(sdelete);
          ps.setString(1, this.graphName);
          bindSubject(ps, 2, nS);
          bindPredicate(ps, 3, nP);
          bindObject(ps, 4, nO);

          ps.execute();
          ps.close();

        } else  {

          if (nS != null)
            S = Node2Str(nS);

          if (nP != null)
            P = Node2Str(nP);

          if (nO != null)
            O = Node2Str(nO);

          String query = "sparql delete from graph <"+this.graphName+
             "> { "+S+" "+P+" "+O+" } from <"+this.graphName+
             "> where { "+S+" "+P+" "+O+" }";

          java.sql.Statement stmt = createStatement();
          stmt.execute(query);
          stmt.close();
        }
      } catch(Exception e) {
        throw new DeleteDeniedException(e.toString());
      }
    }


    void clearGraph(String name)
    {
      String query = "sparql clear graph iri(??)";

      checkOpen();

      try {
        java.sql.PreparedStatement ps = prepareStatement(query);
        ps.setString(1, name);
        ps.execute();
        ps.close();
      catch(Exception e) {
        throw new JenaException(e);
      }
    }


    public ExtendedIterator reifierTriples( TripleMatch m )
    { return NiceIterator.emptyIterator(); }

    public int reifierSize()
    { return 0; }

   
   
//--java5 or newer    @Override
    public TransactionHandler getTransactionHandler()
    {
      return new VirtTransactionHandler(this);
    }

//--java5 or newer    @Override
    public BulkUpdateHandler getBulkUpdateHandler()
    {
      if (bulkHandler == null)
        bulkHandler = new VirtBulkUpdateHandler(this);
      return bulkHandler;
    }

    protected VirtPrefixMapping m_prefixMapping = null;

    public PrefixMapping getPrefixMapping()
    {
      if ( m_prefixMapping == null)
        m_prefixMapping = new VirtPrefixMapping( this );
      return m_prefixMapping;
    }


    public static Node Object2Node(Object o)
    {
      if (o == null)
        return null;

      if (o instanceof ExtendedString)
      {
        ExtendedString vs = (ExtendedString) o;

        if (vs.getIriType() == ExtendedString.IRI && (vs.getStrType() & 0x01)== 0x01)
        {
          if (vs.toString().indexOf ("_:") == 0)
            return Node.createAnon(AnonId.create(vs.toString().substring(2))); // _:
          else
            return Node.createURI(vs.toString());

        } else if (vs.getIriType() == ExtendedString.BNODE) {
          return Node.createAnon(AnonId.create(vs.toString().substring(9))); // nodeID://

        } else {
          return Node.createLiteral(vs.toString());
        }

      } else if (o instanceof RdfBox) {

        RdfBox rb = (RdfBox)o;
        String rb_type = rb.getType();
        RDFDatatype dt = null;

        if ( rb_type != null)
          dt = TypeMapper.getInstance().getSafeTypeByName(rb_type);

        return Node.createLiteral(rb.toString(), rb.getLang(), dt);

      } else if (o instanceof java.lang.Integer) {

        RDFDatatype dt = null;
        dt = TypeMapper.getInstance().getSafeTypeByName("http://www.w3.org/2001/XMLSchema#integer");
        return Node.createLiteral(o.toString(), null, dt);

      } else if (o instanceof java.lang.Short) {

        RDFDatatype dt = null;
//      dt = TypeMapper.getInstance().getSafeTypeByName("http://www.w3.org/2001/XMLSchema#short");
        dt = TypeMapper.getInstance().getSafeTypeByName("http://www.w3.org/2001/XMLSchema#integer");
        return Node.createLiteral(o.toString(), null, dt);

      } else if (o instanceof java.lang.Float) {

        RDFDatatype dt = null;
        dt = TypeMapper.getInstance().getSafeTypeByName("http://www.w3.org/2001/XMLSchema#float");
        return Node.createLiteral(o.toString(), null, dt);

      } else if (o instanceof java.lang.Double) {

        RDFDatatype dt = null;
        dt = TypeMapper.getInstance().getSafeTypeByName("http://www.w3.org/2001/XMLSchema#double");
        return Node.createLiteral(o.toString(), null, dt);

      } else if (o instanceof java.math.BigDecimal) {

        RDFDatatype dt = null;
        dt = TypeMapper.getInstance().getSafeTypeByName("http://www.w3.org/2001/XMLSchema#decimal");
        return Node.createLiteral(o.toString(), null, dt);

      } else if (o instanceof java.sql.Blob) {

        RDFDatatype dt = null;
        dt = TypeMapper.getInstance().getSafeTypeByName("http://www.w3.org/2001/XMLSchema#hexBinary");
        return Node.createLiteral(o.toString(), null, dt);

      } else if (o instanceof java.sql.Date) {

        RDFDatatype dt = null;
        dt = TypeMapper.getInstance().getSafeTypeByName("http://www.w3.org/2001/XMLSchema#date");
        return Node.createLiteral(o.toString(), null, dt);

      } else if (o instanceof java.sql.Timestamp) {

        RDFDatatype dt = null;
        dt = TypeMapper.getInstance().getSafeTypeByName("http://www.w3.org/2001/XMLSchema#dateTime");
        return Node.createLiteral(Timestamp2String((java.sql.Timestamp)o), null, dt);

      } else if (o instanceof java.sql.Time) {

        RDFDatatype dt = null;
        dt = TypeMapper.getInstance().getSafeTypeByName("http://www.w3.org/2001/XMLSchema#time");
        return Node.createLiteral(o.toString(), null, dt);

      } else {

        return Node.createLiteral(o.toString());
      }
    }

    private static String Timestamp2String(java.sql.Timestamp v)
    {
      GregorianCalendar cal = new GregorianCalendar();
      cal.setTime(v);

      int year = cal.get(Calendar.YEAR);
      int month = cal.get(Calendar.MONTH) + 1;
      int day = cal.get(Calendar.DAY_OF_MONTH);
      int hour = cal.get(Calendar.HOUR_OF_DAY);
      int minute = cal.get(Calendar.MINUTE);
      int second = cal.get(Calendar.SECOND);
      int nanos = v.getNanos();

      String yearS;
      String monthS;
      String dayS;
      String hourS;
      String minuteS;
      String secondS;
      String nanosS;
      String zeros = "000000000";
      String yearZeros = "0000";
      StringBuffer timestampBuf;

      if (year < 1000) {
          yearS = "" + year;
          yearS = yearZeros.substring(0, (4-yearS.length())) + yearS;
      } else {
          yearS = "" + year;
      }

      if (month < 10)
          monthS = "0" + month;
      else
          monthS = Integer.toString(month);

      if (day < 10)
          dayS = "0" + day;
      else
          dayS = Integer.toString(day);

      if (hour < 10)
          hourS = "0" + hour;
      else
          hourS = Integer.toString(hour);

      if (minute < 10)
          minuteS = "0" + minute;
      else
          minuteS = Integer.toString(minute);
     
      if (second < 10)
          secondS = "0" + second;
      else
          secondS = Integer.toString(second);
     
      if (nanos == 0) {
          nanosS = "0";
      } else {
          nanosS = Integer.toString(nanos);

          // Add leading 0
          nanosS = zeros.substring(0, (9-nanosS.length())) + nanosS;

          // Truncate trailing 0
          char[] nanosChar = new char[nanosS.length()];
          nanosS.getChars(0, nanosS.length(), nanosChar, 0);
          int truncIndex = 8;
          while (nanosChar[truncIndex] == '0') {
            truncIndex--;
          }
          nanosS = new String(nanosChar, 0, truncIndex + 1);
      }

      timestampBuf = new StringBuffer();
      timestampBuf.append(yearS);
      timestampBuf.append("-");
      timestampBuf.append(monthS);
      timestampBuf.append("-");
      timestampBuf.append(dayS);
      timestampBuf.append("T");
      timestampBuf.append(hourS);
      timestampBuf.append(":");
      timestampBuf.append(minuteS);
      timestampBuf.append(":");
      timestampBuf.append(secondS);
      if (nanos!=0) {
        timestampBuf.append(".");
        timestampBuf.append(nanosS);
      }
      timestampBuf.append("Z");

      return (timestampBuf.toString());
    }

}
TOP

Related Classes of virtuoso.jena.driver.VirtGraph

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.