org.ggp.base.util.game.RemoteGameRepository Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of alloy-ggp-base Show documentation
Show all versions of alloy-ggp-base Show documentation
A modified version of the GGP-Base library for Alloy.
The newest version!
package org.ggp.base.util.game;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import org.ggp.base.util.loader.RemoteResourceLoader;
import external.JSON.JSONArray;
import external.JSON.JSONException;
import external.JSON.JSONObject;
/**
* Remote game repositories provide access to game resources stored on game
* repository servers on the web. These require a network connection to work.
*
* @author Sam
*/
public final class RemoteGameRepository extends GameRepository {
private final String theRepoURL;
public RemoteGameRepository(String theURL) {
theRepoURL = properlyFormatURL(theURL);
}
@Override
protected Set getUncachedGameKeys() {
Set theGameKeys = new HashSet();
try {
JSONArray theArray = RemoteResourceLoader.loadJSONArray(theRepoURL + "/games/");
for(int i = 0; i < theArray.length(); i++) {
theGameKeys.add(theArray.getString(i));
}
} catch (Exception e) {
e.printStackTrace();
}
return theGameKeys;
}
@Override
protected Game getUncachedGame(String theKey) {
return loadSingleGame(getGameURL(theKey));
}
public static Game loadSingleGame(String theGameURL) {
String[] theSplitURL = theGameURL.split("/");
String theKey = theSplitURL[theSplitURL.length-1];
try {
JSONObject theMetadata = getGameMetadataFromRepository(theGameURL);
return loadSingleGameFromMetadata(theKey, theGameURL, theMetadata);
} catch (JSONException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
protected static Game loadSingleGameFromMetadata(String theKey, String theGameURL, JSONObject theMetadata) {
// Ensure that the game URL has a version.
try {
int theVersion = theMetadata.getInt("version");
if (!isVersioned(theGameURL, theVersion)) {
theGameURL = addVersionToGameURL(theGameURL, theVersion);
}
} catch(JSONException e) {
e.printStackTrace();
return null;
}
String theName = null;
try {
theName = theMetadata.getString("gameName");
} catch(JSONException e) {}
String theDescription = getGameResourceFromMetadata(theGameURL, theMetadata, "description");
String theXsltStylesheet = getGameResourceFromMetadata(theGameURL, theMetadata, "stylesheet");
String theJsStylesheet = getGameResourceFromMetadata(theGameURL, theMetadata, "jsStylesheet");
String theRulesheet = Game.preprocessRulesheet(getGameResourceFromMetadata(theGameURL, theMetadata, "rulesheet"));
if (theRulesheet == null || theRulesheet.isEmpty()) return null;
return new Game(theKey, theName, theDescription, theGameURL, theXsltStylesheet, theJsStylesheet, theRulesheet);
}
JSONObject getBundledMetadata() {
try {
return RemoteResourceLoader.loadJSON(theRepoURL + "/games/metadata");
} catch (JSONException e) {
return null;
} catch (IOException e) {
return null;
}
}
// ============================================================================================
protected String getGameURL(String theGameKey) {
return theRepoURL + "/games/" + theGameKey + "/";
}
protected static String addVersionToGameURL(String theGameURL, int theVersion) {
return theGameURL + "v" + theVersion + "/";
}
protected static boolean isVersioned(String theGameURL, int theVersion) {
return theGameURL.endsWith("/v" + theVersion + "/");
}
protected static JSONObject getGameMetadataFromRepository(String theGameURL) throws JSONException, IOException {
return RemoteResourceLoader.loadJSON(theGameURL);
}
protected static String getGameResourceFromMetadata(String theGameURL, JSONObject theMetadata, String theResource) {
try {
String theResourceFile = theMetadata.getString(theResource);
return RemoteResourceLoader.loadRaw(theGameURL + theResourceFile);
} catch (Exception e) {
return null;
}
}
static String properlyFormatURL(String theURL) {
if (!theURL.startsWith("http://"))
theURL = "http://" + theURL;
if (theURL.endsWith("/"))
theURL = theURL.substring(0, theURL.length()-1);
return theURL;
}
}