/* * Copyright (c) 2010 Mysema Ltd. * All rights reserved. * */ package com.mysema.rdfbean.virtuoso; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.NoSuchElementException; import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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.STMT; import com.mysema.rdfbean.model.UID; /** * @author tiwe * */ public class GraphResultIterator implements CloseableIterator<STMT> { private static final Logger logger = LoggerFactory.getLogger(GraphResultIterator.class); private final Statement stmt; private final ResultSet rs; private final String query; private final Converter converter; @Nullable private Boolean next = null; private final boolean hasContext; public GraphResultIterator(Statement stmt, ResultSet rs, String query, Converter converter) { try { this.stmt = stmt; this.rs = rs; this.hasContext = rs.getMetaData().getColumnCount() > 3; this.query = query; this.converter = converter; } catch (SQLException e) { throw new QueryException(e); } } @Override public void close() { AbstractQueryImpl.close(stmt, rs); } @Override public boolean hasNext() { if (next == null) { try { next = rs.next(); } catch (SQLException e) { close(); logger.warn("Caught exception for query " + query, e); throw new QueryException(e); } } return next; } @Override public STMT next() { if (hasNext()) { try { next = null; ID subject = (ID) converter.toNODE(rs.getObject(1)); UID predicate = (UID) converter.toNODE(rs.getObject(2)); NODE object = converter.toNODE(rs.getObject(3)); if (hasContext) { UID context = (UID) converter.toNODE(rs.getObject(4)); return new STMT(subject, predicate, object, context); } else { return new STMT(subject, predicate, object); } } catch (SQLException e) { close(); logger.warn("Caught exception for query " + query, e); throw new QueryException(e); } } else { throw new NoSuchElementException(); } } @Override public void remove() { throw new UnsupportedOperationException(); } }