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");
}
}