package polly.rx.core.orion.datasource; import java.util.Collections; import java.util.List; import polly.rx.core.orion.AlienManager; import polly.rx.core.orion.OrionException; import polly.rx.core.orion.model.AlienRace; import polly.rx.core.orion.model.AlienSpawn; import polly.rx.core.orion.model.DefaultAlienRace; import polly.rx.core.orion.model.Sector; import polly.rx.entities.DBAlienRace; import polly.rx.entities.DBAlienSpawn; import polly.rx.entities.DBSector; import de.skuzzle.polly.sdk.PersistenceManagerV2; import de.skuzzle.polly.sdk.PersistenceManagerV2.Param; import de.skuzzle.polly.sdk.PersistenceManagerV2.Read; import de.skuzzle.polly.sdk.PersistenceManagerV2.Write; import de.skuzzle.polly.sdk.exceptions.DatabaseException; public class DBAlienManager implements AlienManager { private final PersistenceManagerV2 persistence; public DBAlienManager(PersistenceManagerV2 persistence) { this.persistence = persistence; } private DBAlienRace findRace(Read read, AlienRace r) { if (r instanceof DBAlienRace) { return (DBAlienRace) r; } return read.findSingle(DBAlienRace.class, DBAlienRace.FIND_RACE, new Param(r.getName(), r.getSubName(), r.isAggressive())); } private DBSector findSector(Read read, Sector s) { if (s instanceof DBSector) { return (DBSector) s; } return read.findSingle(DBSector.class, DBSector.QUERY_FIND_SECTOR, new Param(s.getQuadName(), s.getX(), s.getY())); } private DBAlienSpawn findSpawn(Read read, AlienSpawn spawn) { if (spawn instanceof DBAlienSpawn) { return (DBAlienSpawn) spawn; } final DBSector dbs = findSector(read, spawn.getSector()); final DBAlienRace dbr = findRace(read, spawn.getRace()); return read.findSingle(DBAlienSpawn.class, DBAlienSpawn.FIND_SPAWN, new Param( spawn.getName(), dbr, dbs)); } @Override public AlienRace addRace(String name, String subName, boolean aggressive) throws OrionException { try (final Write w = this.persistence.write()) { final DBAlienRace check = this.findRace(w.read(), new DefaultAlienRace(name, subName, aggressive)); if (check != null) { return check; } final DBAlienRace race = new DBAlienRace(name, subName, aggressive); w.single(race); return race; } catch (DatabaseException e) { throw new OrionException(e); } } @Override public AlienRace getRaceById(int id) { return this.persistence.atomic().find(DBAlienRace.class, id); } @Override public AlienSpawn getSpawnById(int spawnId) { return this.persistence.atomic().find(DBAlienSpawn.class, spawnId); } @Override public AlienSpawn addSpawn(String name, AlienRace race, Sector sector) throws OrionException { try (final Write w = this.persistence.write()) { final Read read = w.read(); final DBSector dbs = this.findSector(read, sector); if (dbs == null) { throw new OrionException(); // TODO: message } final DBAlienRace dbr = this.findRace(read, race); if (dbr == null) { throw new OrionException(); } final DBAlienSpawn dbas = new DBAlienSpawn(name, dbr, dbs); w.single(dbas); return dbas; } catch (DatabaseException e) { throw new OrionException(e); } } @Override public List<DBAlienSpawn> getSpawnsByQuadrant(String quadName) { return this.persistence.atomic().findList(DBAlienSpawn.class, DBAlienSpawn.SPAWN_BY_QUADRANT, new Param(quadName)); } @Override public List<DBAlienSpawn> getSpawnsBySector(Sector sector) { try (final Read r = this.persistence.read()) { final DBSector dbs = this.findSector(r, sector); if (dbs == null) { return Collections.emptyList(); } return r.findList(DBAlienSpawn.class, DBAlienSpawn.SPAWN_BY_SECTOR, new Param(dbs)); } } @Override public void removeAlienSpawn(AlienSpawn spawn) throws OrionException { try (final Write w = this.persistence.write()) { final Read r = w.read(); final DBAlienSpawn dbas = this.findSpawn(r, spawn); if (dbas != null) { w.remove(dbas); } } catch (DatabaseException e) { throw new OrionException(e); } } @Override public void removeRace(AlienRace race) throws OrionException { try (final Write w = this.persistence.write()) { final Read r = w.read(); final DBAlienRace dbas = this.findRace(r, race); final List<DBAlienSpawn> spawns = r.findList(DBAlienSpawn.class, DBAlienSpawn.FIND_SPAWN_BY_RACE, new Param(dbas)); if (!spawns.isEmpty()) { throw new OrionException("Please delete spawns for this race first"); } if (dbas != null) { w.remove(dbas); } } catch (DatabaseException e) { throw new OrionException(e); } } @Override public List<DBAlienRace> getAllRaces() { return this.persistence.atomic().findList(DBAlienRace.class, DBAlienRace.ALL_RACES); } @Override public List<DBAlienSpawn> getAllSpawns() { return this.persistence.atomic().findList(DBAlienSpawn.class, DBAlienSpawn.ALL_SPAWNS); } }