package com.nicewuerfel.blockown.database; import com.google.common.base.Optional; import com.nicewuerfel.blockown.Ownable; import com.nicewuerfel.blockown.OwnedBlock; import com.nicewuerfel.blockown.OwnedEntity; import com.nicewuerfel.blockown.OwningState; import com.nicewuerfel.blockown.User; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Iterator; import java.util.UUID; class OwningIterator implements Iterator<OwningState> { private final java.sql.Statement stmnt; private ResultSet rs; private int state = 0; OwningIterator(java.sql.Statement stmnt) { this.stmnt = stmnt; rs = getBlockOwnings(); if (rs == null) { rs = getEntityOwnings(); } } private synchronized ResultSet getBlockOwnings() { try { String query = "SELECT * \nFROM " + Database.BLOCK_TABLE + ";"; ResultSet rs = stmnt.executeQuery(query); return rs; } catch (SQLException e) { return null; } } private synchronized ResultSet getEntityOwnings() { try { String query = "SELECT * \nFROM " + Database.ENTITY_TABLE + ";"; ResultSet rs = stmnt.executeQuery(query); return rs; } catch (SQLException e) { return null; } } @Override protected void finalize() throws Throwable { if (stmnt != null) { stmnt.close(); } } @Override public synchronized boolean hasNext() { try { return state == 0 || (state == 1 && !rs.isLast()); } catch (SQLException e) { return false; } } @Override public synchronized OwningState next() { if (state == 2) { return null; } if (state == 0) { if (rs == null) { rs = getEntityOwnings(); state++; if (rs == null) { state++; return null; } } } try { if (state == 0) { if (rs.next()) { String worldName = rs.getString(Database.WORLD_COLUMN); int x = rs.getInt(Database.X_COLUMN); int y = rs.getInt(Database.Y_COLUMN); int z = rs.getInt(Database.Z_COLUMN); UUID id = UUID.fromString(rs.getString(Database.PLAYER_ID_COLUMN)); Ownable ownable = OwnedBlock.newInstance(worldName, x, y, z); User user = User.getInstance(id); return new OwningState(ownable, Optional.of(user)); } else { rs = getEntityOwnings(); state++; if (rs == null) { state++; stmnt.close(); return null; } } } if (state == 1) { if (rs.next()) { String worldName = rs.getString(Database.WORLD_COLUMN); UUID entityId = UUID.fromString(rs.getString(Database.ENTITY_ID_COLUMN)); UUID playerId = UUID.fromString(rs.getString(Database.PLAYER_ID_COLUMN)); Ownable ownable = OwnedEntity.newInstance(entityId, worldName); User user = User.getInstance(playerId); return new OwningState(ownable, Optional.of(user)); } else { state++; stmnt.close(); return null; } } stmnt.close(); return null; } catch (SQLException e) { return null; } } @Override public void remove() { throw new IllegalStateException("Can't remove elements through read-only iterator"); } }