Created the RelationalServerFactory, which is the SDB equivalent to ServerFactory

This commit is contained in:
Obique PSWG
2015-09-29 08:49:47 -05:00
parent cd763e1bf2
commit dbdfd59539
8 changed files with 71 additions and 32 deletions
@@ -58,8 +58,8 @@ public class RelationalServerData extends RelationalDatabase {
insertTableMetadata = prepareStatement("INSERT INTO "+META_TABLE+" (table_name, last_imported) VALUES (?, ?)");
}
public boolean linkTableWithSdb(String table, String sdbPath) {
File sdb = new File(sdbPath);
public boolean linkTableWithSdb(String table, String filepath) {
File sdb = new File(filepath);
if (!sdb.isFile())
return false;
long sdbModified = sdb.lastModified();
@@ -0,0 +1,46 @@
package resources.server_info;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
public class RelationalServerFactory {
private static final RelationalServerFactory INSTANCE = new RelationalServerFactory();
private static final String BASE_PATH = "serverdata/";
private static final Map <String, Object> FILE_LOAD_LOCKING = new HashMap<>();
public static RelationalServerData getServerData(String file, String ... tables) {
return INSTANCE.getData(file, tables);
}
private RelationalServerData getData(String file, String ... tables) {
final Object lock = getFileLocking(file);
synchronized (lock) {
File f = new File(BASE_PATH + file);
File parent = f.getParentFile();
RelationalServerData data = new RelationalServerData(BASE_PATH + file);
for (String table : tables) {
String path;
if (table.contains("/")) {
path = BASE_PATH + table + ".sdb";
table = table.substring(table.lastIndexOf('/')+1);
} else
path = parent.getPath() + File.separator + table + ".sdb";
if (!data.linkTableWithSdb(table, path))
return null;
}
return data;
}
}
private Object getFileLocking(String file) {
synchronized (FILE_LOAD_LOCKING) {
Object o = FILE_LOAD_LOCKING.get(file);
if (o == null)
FILE_LOAD_LOCKING.put(file, o = new Object());
return o;
}
}
}
@@ -18,11 +18,12 @@ import resources.radial.RadialOption;
import resources.radial.Radials;
import resources.server_info.Log;
import resources.server_info.RelationalServerData;
import resources.server_info.RelationalServerFactory;
public class TerminalService extends Service {
private static final String GET_ALL_TEMPLATES_SQL = "SELECT iff FROM iff_to_script";
private static final String GET_SCRIPT_FOR_IFF_SQL = "SELECT script FROM iff_to_script WHERE iff = ?";
private static final String GET_ALL_TEMPLATES_SQL = "SELECT iff FROM radials";
private static final String GET_SCRIPT_FOR_IFF_SQL = "SELECT script FROM radials WHERE iff = ?";
private final Set<String> templates;
private final RelationalServerData iffDatabase;
@@ -31,9 +32,8 @@ public class TerminalService extends Service {
public TerminalService() {
templates = new HashSet<>();
iffDatabase = new RelationalServerData("serverdata/radial/radials.db");
if (!iffDatabase.linkTableWithSdb("iff_to_script", "serverdata/radial/radials.sdb"))
iffDatabase = RelationalServerFactory.getServerData("radial/radials.db", "radials");
if (iffDatabase == null)
throw new main.ProjectSWG.CoreException("Unable to load sdb files for StaticService");
getAllTemplatesStatement = iffDatabase.prepareStatement(GET_ALL_TEMPLATES_SQL);
+3 -2
View File
@@ -16,6 +16,7 @@ import resources.player.Player;
import resources.player.PlayerEvent;
import resources.server_info.Log;
import resources.server_info.RelationalServerData;
import resources.server_info.RelationalServerFactory;
public class CityService extends Service {
@@ -25,8 +26,8 @@ public class CityService extends Service {
private final PreparedStatement getAllCitiesStatement;
public CityService() {
spawnDatabase = new RelationalServerData("serverdata/map/cities.db");
if (!spawnDatabase.linkTableWithSdb("cities", "serverdata/map/cities.sdb"))
spawnDatabase = RelationalServerFactory.getServerData("map/cities.db", "cities");
if (spawnDatabase == null)
throw new main.ProjectSWG.CoreException("Unable to load sdb files for StaticService");
getAllCitiesStatement = spawnDatabase.prepareStatement(GET_ALL_CITIES_FROM_TERRAIN);
}
+4 -13
View File
@@ -13,10 +13,10 @@ import resources.objects.SWGObject;
import resources.objects.cell.CellObject;
import resources.server_info.Log;
import resources.server_info.RelationalServerData;
import resources.server_info.RelationalServerFactory;
public class ClientObjectLoader {
private static final String FILE_PREFIX = "serverdata/buildout/";
private static final String GET_CLIENT_OBJECTS_SQL = "SELECT objects.*, areas.adjust_coordinates, areas.terrain "
+ "FROM objects, areas "
+ "WHERE areas.event == '' AND objects.area_id = areas.id "
@@ -27,15 +27,15 @@ public class ClientObjectLoader {
public ClientObjectLoader() {
strings = (CrcStringTableData) ClientFactory.getInfoFromFile("misc/object_template_crc_string_table.iff");
clientSdb = new RelationalServerData(FILE_PREFIX+"buildouts.db");
clientSdb = RelationalServerFactory.getServerData("buildout/buildouts.db", "areas", "objects");
if (clientSdb == null)
throw new main.ProjectSWG.CoreException("Unable to load sdb files for ClientObjectLoader");
}
public Map<Long, SWGObject> loadClientObjects(Terrain terrain) {
System.out.println("ClientObjectLoader: Loading client objects...");
Log.i("ClientObjectLoader", "Loading client objects...");
Map<Long, SWGObject> objects = new Hashtable<>(4*1024);
if (!loadTables())
return objects;
try (ResultSet set = clientSdb.prepareStatement(GET_CLIENT_OBJECTS_SQL).executeQuery()) {
set.setFetchSize(1500);
ColumnIndexes ind = new ColumnIndexes(set);
@@ -68,15 +68,6 @@ public class ClientObjectLoader {
return obj;
}
private boolean loadTables() {
if (!clientSdb.linkTableWithSdb("areas", FILE_PREFIX+"areas.sdb") || !clientSdb.linkTableWithSdb("objects", FILE_PREFIX+"objects.sdb")) {
System.err.println("ObjectManager: Failed to load client objects! Cannot link SDB");
Log.e("ObjectManager", "Failed to load client object SDB files!");
return false;
}
return true;
}
private static class ColumnIndexes {
public final int idInd;
@@ -289,6 +289,10 @@ public class CharacterCreationService extends Service {
return null;
}
private CreatureObject createCreature(ObjectManager objManager, String template, Location location, String buildingId, String cell) {
return null;
}
private PlayerObject createPlayer(ObjectManager objManager, String template) {
SWGObject obj = objManager.createObject(template);
if (obj instanceof PlayerObject)
+3 -5
View File
@@ -41,6 +41,7 @@ import resources.control.Service;
import resources.objects.building.BuildingObject;
import resources.objects.SWGObject;
import resources.server_info.RelationalServerData;
import resources.server_info.RelationalServerFactory;
import resources.spawn.SpawnerType;
import resources.spawn.Spawner;
import services.objects.ObjectManager;
@@ -56,12 +57,9 @@ public final class SpawnerService extends Service {
public SpawnerService(ObjectManager objectManager) {
this.objectManager = objectManager;
spawners = new ArrayList<>();
spawnerDatabase = new RelationalServerData("serverdata/spawn/static.db");
if(!(spawnerDatabase.linkTableWithSdb("static", "serverdata/spawn/static.sdb") &&
spawnerDatabase.linkTableWithSdb("buildings", "serverdata/building/buildings.sdb"))) {
spawnerDatabase = RelationalServerFactory.getServerData("spawn/static.db", "static", "building/buildings");
if (spawnerDatabase == null)
throw new main.ProjectSWG.CoreException("Unable to load sdb files for SpawnerService");
}
}
@Override
+4 -5
View File
@@ -36,6 +36,7 @@ import resources.control.Service;
import resources.objects.SWGObject;
import resources.objects.building.BuildingObject;
import resources.server_info.RelationalServerData;
import resources.server_info.RelationalServerFactory;
import services.objects.ObjectManager;
public class StaticService extends Service {
@@ -51,12 +52,10 @@ public class StaticService extends Service {
this.databaseMutex = new Object();
this.objectManager = objectManager;
spawnDatabase = new RelationalServerData("serverdata/static/spawns.db");
if (!spawnDatabase.linkTableWithSdb("spawns", "serverdata/static/spawns.sdb") ||
!spawnDatabase.linkTableWithSdb("types", "serverdata/static/types.sdb")) {
spawnDatabase = RelationalServerFactory.getServerData("static/spawns.db", "spawns", "types");
if (spawnDatabase == null)
throw new main.ProjectSWG.CoreException("Unable to load sdb files for StaticService");
}
getSupportingStatement = spawnDatabase.prepareStatement(GET_SUPPORTING_SQL);
}