Skip to content

Commit

Permalink
Ability to load/store worlds in datastore, plus reininitialization
Browse files Browse the repository at this point in the history
  • Loading branch information
Max-Hailperin committed Mar 19, 2012
1 parent 708017b commit 378c419
Show file tree
Hide file tree
Showing 6 changed files with 240 additions and 18 deletions.
135 changes: 117 additions & 18 deletions Gack/src/edu/gac/mcs270/gack/client/ui/GraphicalUserInterface.java
Expand Up @@ -24,6 +24,8 @@
import edu.gac.mcs270.gack.client.Utility;
import edu.gac.mcs270.gack.shared.Loader;
import edu.gac.mcs270.gack.shared.LoaderAsync;
import edu.gac.mcs270.gack.shared.Persistence;
import edu.gac.mcs270.gack.shared.PersistenceAsync;
import edu.gac.mcs270.gack.shared.domain.AutoPerson;
import edu.gac.mcs270.gack.shared.domain.Person;
import edu.gac.mcs270.gack.shared.domain.Scroll;
Expand All @@ -44,6 +46,9 @@ public class GraphicalUserInterface implements EntryPoint, MessageDisplay {
private MenuItem mntmLookAround;
private MenuItem mntmListPossessions;
private MenuItem mntmChangePlayersName;
private MenuItem mntmInit;
private MenuItem mntmLoad;
private MenuItem mntmSave;

private void playTurn() {
registry.trigger(pace);
Expand All @@ -55,27 +60,30 @@ public void displayMessage(String message){
Element element = textArea.getElement();
element.setScrollTop(element.getScrollHeight());
}

private void start(Person player, String heading){
this.player = player;
this.registry = new Registry();
AutoPerson.setRegistry(registry);
textArea.setText(heading + "\n");
configureMenus();
}

/**
* This is the entry point method.
*/
public void onModuleLoad() {
this.registry = new Registry();
AutoPerson.setRegistry(registry);

LoaderAsync loader = GWT.create(Loader.class);
final GraphicalUserInterface gui = this;
loader.getPlayer(new AsyncCallback<Person>(){
final LoaderAsync loader = GWT.create(Loader.class);
final AsyncCallback<Person> loaderCallback = new AsyncCallback<Person>(){
public void onSuccess(Person player){
gui.player = player;
textArea.setText("Welcome to the Imaginary Land of Gack\n");
configureMenus();
start(player, "Welcome to the Imaginary Land of Gack");
}

public void onFailure(Throwable caught){
throw new Error("Server trouble", caught);
}
});
};
loader.getPlayer(loaderCallback);

Utility.setMessageDisplay(this);
RootPanel rootPanel = RootPanel.get();
Expand All @@ -88,6 +96,44 @@ public void onFailure(Throwable caught){
verticalPanel.add(menuBar);
menuBar.setWidth("100%");

final PersistenceAsync persistence = GWT.create(Persistence.class);
MenuBar persistenceBar = new MenuBar(true);
MenuItem mntmPersistence = new MenuItem("World", false, persistenceBar);

mntmInit = new MenuItem("Reinitialize", false, new Command() {
public void execute() {
displayMessage("\n>>> Reinitialize world");
loader.getPlayer(loaderCallback);
}
});
persistenceBar.addItem(mntmInit);

mntmLoad = new MenuItem("Load...", false, new Command() {
public void execute() {
new LoadDialog(persistence, GraphicalUserInterface.this);
}
});
persistenceBar.addItem(mntmLoad);

mntmSave = new MenuItem("Save", false, new Command() {
public void execute() {
displayMessage("\n>>> Save world");
persistence.savePlayer(player,
new AsyncCallback<Void>(){
public void onSuccess(Void v){
displayMessage("Saving of " + player + "'s world succeeded.");
}

public void onFailure(Throwable caught){
displayMessage("WARNING: Saving of " + player + "'s world failed.");
}
});

}
});
persistenceBar.addItem(mntmSave);
menuBar.addItem(mntmPersistence);

MenuBar menuBar_1 = new MenuBar(true);

MenuItem mntmGetInfo = new MenuItem("Get info", false, menuBar_1);
Expand All @@ -98,7 +144,6 @@ public void execute() {
player.lookAround();
}
});
mntmLookAround.setEnabled(false);
menuBar_1.addItem(mntmLookAround);

mntmListPossessions = new MenuItem("List possessions", false, new Command() {
Expand All @@ -107,7 +152,6 @@ public void execute() {
player.listPossessions();
}
});
mntmListPossessions.setEnabled(false);
menuBar_1.addItem(mntmListPossessions);
menuBar.addItem(mntmGetInfo);
MenuBar menuBar_2 = new MenuBar(true);
Expand All @@ -116,27 +160,22 @@ public void execute() {
MenuBar goMenu = new MenuBar(true);

mntmGo = new MenuItem("Go", false, goMenu);
mntmGo.setEnabled(false);
menuBar_2.addItem(mntmGo);
MenuBar menuBar_4 = new MenuBar(true);

mntmTake = new MenuItem("Take", false, menuBar_4);
mntmTake.setEnabled(false);
menuBar_2.addItem(mntmTake);
MenuBar menuBar_5 = new MenuBar(true);

mntmDrop = new MenuItem("Drop", false, menuBar_5);
mntmDrop.setEnabled(false);
menuBar_2.addItem(mntmDrop);
MenuBar menuBar_6 = new MenuBar(true);

mntmRead = new MenuItem("Read", false, menuBar_6);
mntmRead.setEnabled(false);
menuBar_2.addItem(mntmRead);
MenuBar menuBar_7 = new MenuBar(true);

mntmGive = new MenuItem("Give", false, menuBar_7);
mntmGive.setEnabled(false);
menuBar_2.addItem(mntmGive);
menuBar.addItem(mntmAct);
MenuBar menuBar_8 = new MenuBar(true);
Expand All @@ -149,7 +188,6 @@ public void execute() {
new NameDialog(GraphicalUserInterface.this);
}
});
mntmChangePlayersName.setEnabled(false);
menuBar_8.addItem(mntmChangePlayersName);
MenuBar paceMenuBar = new MenuBar(true);

Expand All @@ -170,6 +208,8 @@ public void execute() {
menuBar_8.addItem(mntmSetPace);
menuBar.addItem(mntmConfigure);

disableMenuItems();

textArea = new TextArea();
verticalPanel.add(textArea);
textArea.setWidth("100%");
Expand All @@ -185,10 +225,17 @@ private void selectPace(int newPace) {
}

private void configureMenus() {
configureWorldMenu();
configureGetInfoMenu();
configureActMenu();
configureConfigureMenu();
}

private void configureWorldMenu(){
mntmInit.setEnabled(true);
mntmLoad.setEnabled(true);
mntmSave.setEnabled(true);
}

private void configureActMenu() {
configureGoMenu();
Expand Down Expand Up @@ -316,4 +363,56 @@ public void onKeyPress(KeyPressEvent event) {
nameBox.setFocus(true);
}
}

private static class LoadDialog extends DialogBox {
public LoadDialog(final PersistenceAsync persistence,
final GraphicalUserInterface gui) {
this.setModal(true);
this.setText("Input name");
final TextBox nameBox = new TextBox();
this.setWidget(nameBox);
nameBox.addKeyPressHandler(new KeyPressHandler() {
public void onKeyPress(KeyPressEvent event) {
if (event.getCharCode() == KeyCodes.KEY_ENTER) {
final String name = nameBox.getText();
gui.displayMessage("\n>>> Load world of " + name);
gui.disableMenuItems();
persistence.getPlayer(name,
new AsyncCallback<Person>(){
public void onSuccess(Person player){
if(player == null){
gui.displayMessage("No saved world existed for " + name);
gui.configureMenus();
} else {
gui.start(player, "Welcome back, " + name + ".");
}
}

public void onFailure(Throwable caught){
gui.displayMessage("Loading failed due to technical difficulties.");
gui.displayMessage(caught.getMessage());
gui.configureMenus();
}
});
LoadDialog.this.hide();
}
}});
this.show();
nameBox.setFocus(true);
}
}

private void disableMenuItems(){
mntmGo.setEnabled(false);
mntmTake.setEnabled(false);
mntmDrop.setEnabled(false);
mntmRead.setEnabled(false);
mntmGive.setEnabled(false);
mntmLookAround.setEnabled(false);
mntmListPossessions.setEnabled(false);
mntmChangePlayersName.setEnabled(false);
mntmInit.setEnabled(false);
mntmLoad.setEnabled(false);
mntmSave.setEnabled(false);
}
}
32 changes: 32 additions & 0 deletions Gack/src/edu/gac/mcs270/gack/server/PMF.java
@@ -0,0 +1,32 @@
package edu.gac.mcs270.gack.server;

/* Copyright (c) 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

//package com.google.appengine.demos.jdoexamples;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;

public final class PMF {
private static final PersistenceManagerFactory pmfInstance =
JDOHelper.getPersistenceManagerFactory("transactions-optional");

private PMF() {}

public static PersistenceManagerFactory get() {
return pmfInstance;
}
}
56 changes: 56 additions & 0 deletions Gack/src/edu/gac/mcs270/gack/server/PersistenceImpl.java
@@ -0,0 +1,56 @@
package edu.gac.mcs270.gack.server;

import javax.jdo.JDOObjectNotFoundException;
import javax.jdo.PersistenceManager;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import edu.gac.mcs270.gack.shared.Persistence;
import edu.gac.mcs270.gack.shared.domain.Person;

public class PersistenceImpl extends RemoteServiceServlet implements Persistence {
private static final long serialVersionUID = 7649793065322010303L;

@PersistenceCapable(identityType=IdentityType.APPLICATION)
private static class SavedPlayer {
@SuppressWarnings("unused")
@PrimaryKey
private String name;

@Persistent(serialized = "true")
private Person player;

public SavedPlayer(String name, Person player) {
super();
this.name = name;
this.player = player;
}

public Person getPlayer() {
return player;
}
}

public Person getPlayer(String name){
PersistenceManager persistenceManager = PMF.get().getPersistenceManager();
try{
return persistenceManager.getObjectById(SavedPlayer.class, name).getPlayer();
} catch(JDOObjectNotFoundException e){
return null;
}
}

public void savePlayer(Person player){
SavedPlayer sp = new SavedPlayer(player.getName(), player);
PMF.get().getPersistenceManager().makePersistent(sp);
}

public PersistenceImpl() {
super();
}
}

12 changes: 12 additions & 0 deletions Gack/src/edu/gac/mcs270/gack/shared/Persistence.java
@@ -0,0 +1,12 @@
package edu.gac.mcs270.gack.shared;

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;

import edu.gac.mcs270.gack.shared.domain.Person;

@RemoteServiceRelativePath("persistence")
public interface Persistence extends RemoteService {
Person getPlayer(String name);
void savePlayer(Person player);
}
13 changes: 13 additions & 0 deletions Gack/src/edu/gac/mcs270/gack/shared/PersistenceAsync.java
@@ -0,0 +1,13 @@
package edu.gac.mcs270.gack.shared;

import com.google.gwt.user.client.rpc.AsyncCallback;

import edu.gac.mcs270.gack.shared.domain.Person;

public interface PersistenceAsync {

void getPlayer(String name, AsyncCallback<Person> callback);

void savePlayer(Person player, AsyncCallback<Void> callback);

}
10 changes: 10 additions & 0 deletions Gack/war/WEB-INF/web.xml
Expand Up @@ -16,6 +16,16 @@
<url-pattern>/gack/loader</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>persistenceImpl</servlet-name>
<servlet-class>edu.gac.mcs270.gack.server.PersistenceImpl</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>persistenceImpl</servlet-name>
<url-pattern>/gack/persistence</url-pattern>
</servlet-mapping>

<!-- Default page to serve -->
<welcome-file-list>
<welcome-file>Gack.html</welcome-file>
Expand Down

0 comments on commit 378c419

Please sign in to comment.