HTWG-MONOPOLY
Steffen Gorenflo
Timotheus Ruprecht
MVC - Architektur
GUI

Google Guice
@Inject
public MonopolyFactory(@Named("FieldSize") int fieldSize) { this.fieldSize = fieldSize; }@Inject
public Controller(IControllerFactory controllerFactory, IMonopolyDAO database) {
// set dependencies
this.factory = controllerFactory;
this.database = database;
// do other init stuff
}Google Guice
@Override
protected void configure() {
// define the size of the game
bindConstant().annotatedWith(Names.named("FieldSize")).to("28");
// define the main controller of the game
bind(IController.class).to(de.htwg.monopoly.controller.impl.Controller.class);
// define the factory for the underlying model
bind(IControllerFactory.class).to(de.htwg.monopoly.factory.impl.MonopolyFactory.class);
// hibernate
bind(IMonopolyDAO.class).to(de.htwg.monopoly.persistence.hibernate.MonopolyHibernateDAO.class);
// couchdb
// bind(IMonopolyDAO.class).to(de.htwg.monopoly.persistence.couchdb.MonopolyCouchdbDAO.class);
// db40
// bind(IMonopolyDAO.class).to(de.htwg.monopoly.persistence.db4o.MonopolyDb4oDAO.class);
}
Plugin Interface
// define Plugins
Multibinder<MonopolyPlugin> plugins = Multibinder.newSetBinder(binder(), MonopolyPlugin.class);
plugins.addBinding().to(de.htwg.monopoly.plugins.PluginOne.class);
plugins.addBinding().to(de.htwg.monopoly.plugins.PluginTwo.class);public interface MonopolyPlugin extends IObserver {
String getName();
void enable(IController controller);
void disable();
}Jenkins
Sonar
Project Lombok
public class PersistencePlayer extends CouchDbDocument{
@Getter
@Setter
private String name;
@Getter
@Setter
private Integer budget;
@Getter
@Setter
private Integer position;
@Getter
@Setter
private Integer prisonRound;
@Getter
@Setter
private Boolean inPrison;
@Getter
@Setter
private Collection<Integer> ownershipPositions;
@Getter
@Setter
private Integer prisonFreeCard;
@Getter
@Setter
private PlayerIcon icon;
}Project Lombok
@Data
public class PersistencePlayer extends CouchDbDocument{
private String name;
private Integer budget;
private Integer position;
private Integer prisonRound;
private Boolean inPrison;
private Collection<Integer> ownershipPositions;
private Integer prisonFreeCard;
private PlayerIcon icon;
}Maven Repository
Datenbank - Interface
public interface IMonopolyDAO {
void saveGame(final IMonopolyGame context);
IMonopolyGame getGameById(final String id);
void deleteGameById(final String id);
void updateGame(final IMonopolyGame game);
List<IMonopolyGame> getAllGames();
boolean containsGameById(final String id);
}
db4o
public class MonopolyDb4oDAO implements IMonopolyDAO {
private EmbeddedObjectContainer db;
public MonopolyDb4oDAO() {
db = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), "monopoly.data"); }
@Override public void saveGame(IMonopolyGame context) { db.store(context); }
@Override public IMonopolyGame getGameById(final String id) {
List<IMonopolyGame> games = db.query(new Predicate<IMonopolyGame>() {
@Override
public boolean match(IMonopolyGame game) { return (game.getId().equals(id)); }
if (games.isEmpty()) { return null; }
return games.get(0);
}
@Override public void deleteGameById(String id) { db.delete(getGameById(id)); }
@Override public List<IMonopolyGame> getAllGames() { return db.query(IMonopolyGame.class); }
@Override public boolean containsGameById(String id) { ... }
public void closeDB() { db.close(); }
@Override public void updateGame(IMonopolyGame game) {
deleteGameById(game.getId());
saveGame(game);
}
}Hibernate
@Entity
@Table(name = "game")
@Data
public class PersistentGame implements Serializable {
@Id
@Column(name = "id")
private String id;
@OneToMany(mappedBy = "game")
@Column(name = "player")
private List<PersistentPlayer> players;
private String name;
private Integer currentPlayerIndex;
private boolean drawnCardFlag;
private int diceFlag;
private String message;
private int parkingMoney;
private String phase;
private int numberOfFields;
}
couchdb
@Data
public class PersistenceGame
extends CouchDbDocument {
private String name;
private Collection<PersistencePlayer> players;
private Integer currentPlayerIndex;
private PersistencePlayfield playfield;
private String message;
private boolean drawnCardFlag;
private int diceFlag;
}@Data
public class PersistencePlayer
extends CouchDbDocument{
private String name;
private Integer budget;
private Integer position;
private Integer prisonRound;
private Boolean inPrison;
private Collection<Integer> ownershipPositions;
private Integer prisonFreeCard;
private PlayerIcon icon;
}
@Data
public class PersistencePlayfield
extends CouchDbDocument{
private Integer numberOfFields;
private String currentPlayer;
private Integer parkingMoney;
private String gamePhase;
}couchdb
// transform from monopoly game object to couchdb object
public PersistenceGame transformToCouchDb(IMonopolyGame game) { ... }
// transform from couchdb object to monopoly game object
public IMonopolyGame transformFromCouchDb(PersistenceGame game) { ... }
// a big constructor
IMonopolyGame monopolyGame = new MonopolyGame(playerController, playfield, question,
GameStatus.valueOf(game.getPlayfield().getGamePhase()), game.getName(),
game.getPlayfield().getParkingMoney(), game.getMessage(), game.getDiceFlag(),
game.isDrawnCardFlag(), dice, game.getId(), game.getRevision());couchdb
Performance Profiling
CouchDB
db4o
hibernate
Performance Testing
Anzahl Threads: 10
Anzahl Wiederholungen: 100
Performance Testing
Actor
public class Actor extends UntypedActor {
public Actor() { }
@Override
public void onReceive(Object msg) throws Exception {
if (msg instanceof ActorMessage && "update" == ((ActorMessage) msg).getMessage())
GameStatus phase = ((ActorMessage) msg).getGameStatus();
((ActorMessage) msg).getController().notifyObservers(phase);
}
}
}
public class ActorMessage implements Serializable {
private IController controller;
private String message;
private GameStatus status;
public ActorMessage(String message, IController controller, GameStatus phase) {
this.controller = controller;
this.message = message;
this.status = phase;
}
}Fragen?
Copy of HTWG-Monopoly
By rugo
Copy of HTWG-Monopoly
- 503