/* * Copyright (c) 2010 Mysema Ltd. * All rights reserved. * */ package com.mysema.rdfbean.virtuoso; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.NoSuchElementException; import javax.annotation.Nullable; import com.mysema.commons.lang.CloseableIterator; import com.mysema.query.QueryException; import com.mysema.rdfbean.model.ID; import com.mysema.rdfbean.model.NODE; import com.mysema.rdfbean.model.RepositoryException; import com.mysema.rdfbean.model.STMT; import com.mysema.rdfbean.model.UID; /** * @author tiwe * */ public class STMTIterator implements CloseableIterator<STMT> { private final Converter converter; private final Statement stmt; private final ResultSet rs; @Nullable private final ID subject; @Nullable private final UID predicate; @Nullable private final NODE object; private final UID defaultGraph; @Nullable private Boolean next; private int graphColumn = -1, subjectColumn = -1, predicateColumn = -1, objectColumn = -1; public STMTIterator( Converter converter, Statement stmt, ResultSet rs, @Nullable ID subject, @Nullable UID predicate, @Nullable NODE object, UID defaultGraph) { this.converter = converter; this.stmt = stmt; this.rs = rs; this.subject = subject; this.predicate = predicate; this.object = object; this.defaultGraph = defaultGraph; try { ResultSetMetaData rsmd = rs.getMetaData(); for (int i = 1; i <= rsmd.getColumnCount(); i++) { String label = rsmd.getColumnName(i); if (label.equalsIgnoreCase("g")) { graphColumn = i; } else if (label.equalsIgnoreCase("s")) { subjectColumn = i; } else if (label.equalsIgnoreCase("p")) { predicateColumn = i; } else if (label.equalsIgnoreCase("o")) { objectColumn = i; } } } catch (Exception e) { throw new RepositoryException(e); } } @Override public void close() { AbstractQueryImpl.close(stmt, rs); } @Override public boolean hasNext() { if (next == null) { try { next = rs.next(); } catch (SQLException e) { close(); throw new QueryException(e); } } return next; } @Override public STMT next() { if (hasNext()) { next = null; try { return extractRow(); } catch (SQLException e) { throw new RepositoryException(e); } } else { throw new NoSuchElementException(); } } @Override public void remove() { throw new UnsupportedOperationException(); } protected STMT extractRow() throws SQLException { UID g = null; ID s = subject; UID p = predicate; NODE o = object; Object val = null; try { if (graphColumn != -1) { val = rs.getObject(graphColumn); g = (UID) converter.toNODE(val); if (defaultGraph.equals(g)) { g = null; } } } catch (ClassCastException ccex) { throw new IllegalArgumentException("Unexpected resource type encountered. Was expecting UID: " + val, ccex); } if (s == null) { try { val = rs.getObject(subjectColumn); s = (ID) converter.toNODE(val); } catch (ClassCastException ccex) { throw new IllegalArgumentException("Unexpected resource type encountered. Was expecting ID: " + val, ccex); } } if (p == null) { try { val = rs.getObject(predicateColumn); p = (UID) converter.toNODE(val); } catch (ClassCastException ccex) { throw new IllegalArgumentException("Unexpected resource type encountered. Was expecting UID: " + val, ccex); } } if (o == null) { o = converter.toNODE(rs.getObject(objectColumn)); } return new STMT(s, p, o, g); } }