package polly.rx.entities;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.PostLoad;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import polly.rx.core.orion.QuadrantUtils;
import polly.rx.core.orion.model.OrionObjectUtil;
import polly.rx.core.orion.model.Quadrant;
import polly.rx.core.orion.model.Sector;
import polly.rx.core.orion.model.SectorType;
import de.skuzzle.polly.sdk.PersistenceManagerV2.Write;
import de.skuzzle.polly.sdk.time.Time;
import de.skuzzle.polly.tools.Check;
import de.skuzzle.polly.tools.EqualsHelper;
import de.skuzzle.polly.tools.Equatable;
@Entity
@NamedQueries({
@NamedQuery(
name = DBQuadrant.QUERY_ALL_QUADRANTS,
query= "SELECT q FROM DBQuadrant q"
),
@NamedQuery(
name = DBQuadrant.QUERY_QUADRANT_BY_NAME,
query = "SELECT q FROM DBQuadrant q WHERE q.name = ?1"
)
})
public class DBQuadrant implements Quadrant {
public final static String QUERY_ALL_QUADRANTS = "QUERY_ALL_QUADRANTS"; //$NON-NLS-1$
public final static String QUERY_QUADRANT_BY_NAME = "QUERY_QUADRANT_BY_NAME"; //$NON-NLS-1$
private final static String GENERATOR = "SECT_GEN"; //$NON-NLS-1$
@Id
@SequenceGenerator(name = GENERATOR)
@GeneratedValue(strategy = GenerationType.TABLE, generator = GENERATOR)
private int id;
private String name;
private int maxX;
private int maxY;
@Temporal(TemporalType.TIMESTAMP)
private Date date;
@OneToMany
private Collection<DBSector> sectors;
private transient final Map<String, DBSector> sectorMap;
/**
* @deprecated Use for JPA only
*/
@Deprecated
public DBQuadrant() {
this.sectorMap = new HashMap<>();
}
public DBQuadrant(String name) {
this.sectorMap = new HashMap<>();
this.sectors = new ArrayList<>();
this.name = name;
}
public synchronized DBSector updateFrom(Sector sector, Write write) {
Check.objects(sector, write).notNull()
.andString(sector.getQuadName()).equal(this.name);
if (sector.getType() == SectorType.NONE) {
return null;
}
// sector is a new sector!
assert !this.sectors.contains(sector);
this.maxX = Math.max(this.maxX, sector.getX());
this.maxY = Math.max(this.maxY, sector.getY());
final DBSector dbSector = new DBSector(sector);
write.single(dbSector);
write.all(dbSector.getRessources());
this.sectors.add(dbSector);
this.sectorMap.put(QuadrantUtils.createMapKey(dbSector), dbSector);
return dbSector;
}
@PostLoad
private void createSectorMap() {
for (final DBSector s : this.sectors) {
this.maxX = Math.max(this.maxX, s.getX());
this.maxY = Math.max(this.maxY, s.getY());
this.sectorMap.put(QuadrantUtils.createMapKey(s), s);
}
}
@Override
public int hashCode() {
return OrionObjectUtil.quadrantHash(this);
}
@Override
public final boolean equals(Object obj) {
return EqualsHelper.testEquality(this, obj);
}
@Override
public Class<?> getEquivalenceClass() {
return Quadrant.class;
}
@Override
public boolean actualEquals(Equatable o) {
return OrionObjectUtil.quadrantsEquals(this, (Quadrant) o);
}
@Override
public String getName() {
return this.name;
}
@Override
public DBSector getSector(int x, int y) {
DBSector s = this.sectorMap.get(QuadrantUtils.createMapKey(x, y));
if (s == null) {
s = new DBSector();
s.setQuadName(this.name);
s.setX(x);
s.setY(y);
s.setType(SectorType.NONE);
s.setDate(Time.currentTime());
s.setRessources(new ArrayList<DBProduction>());
}
return s;
}
@Override
public Collection<DBSector> getSectors() {
return this.sectors;
}
@Override
public int getMaxX() {
return this.maxX;
}
@Override
public int getMaxY() {
return this.maxY;
}
@Override
public String toString() {
return OrionObjectUtil.quadrantString(this);
}
}