diff --git a/src/resources/server_info/RelationalServerData.java b/src/resources/server_info/RelationalServerData.java index 639c264a..4c930901 100644 --- a/src/resources/server_info/RelationalServerData.java +++ b/src/resources/server_info/RelationalServerData.java @@ -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(); diff --git a/src/resources/server_info/RelationalServerFactory.java b/src/resources/server_info/RelationalServerFactory.java new file mode 100644 index 00000000..1cc0ad57 --- /dev/null +++ b/src/resources/server_info/RelationalServerFactory.java @@ -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 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; + } + } + +} diff --git a/src/services/galaxy/terminals/TerminalService.java b/src/services/galaxy/terminals/TerminalService.java index 0345835f..11a4249b 100644 --- a/src/services/galaxy/terminals/TerminalService.java +++ b/src/services/galaxy/terminals/TerminalService.java @@ -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 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); diff --git a/src/services/map/CityService.java b/src/services/map/CityService.java index 5e3c5047..4582d807 100644 --- a/src/services/map/CityService.java +++ b/src/services/map/CityService.java @@ -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); } diff --git a/src/services/objects/ClientObjectLoader.java b/src/services/objects/ClientObjectLoader.java index 488e9721..e7b3201b 100644 --- a/src/services/objects/ClientObjectLoader.java +++ b/src/services/objects/ClientObjectLoader.java @@ -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 loadClientObjects(Terrain terrain) { System.out.println("ClientObjectLoader: Loading client objects..."); Log.i("ClientObjectLoader", "Loading client objects..."); Map 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; diff --git a/src/services/player/CharacterCreationService.java b/src/services/player/CharacterCreationService.java index 96967c60..1a24fe05 100644 --- a/src/services/player/CharacterCreationService.java +++ b/src/services/player/CharacterCreationService.java @@ -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) diff --git a/src/services/spawn/SpawnerService.java b/src/services/spawn/SpawnerService.java index ab6e8117..a80c36c8 100644 --- a/src/services/spawn/SpawnerService.java +++ b/src/services/spawn/SpawnerService.java @@ -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 diff --git a/src/services/spawn/StaticService.java b/src/services/spawn/StaticService.java index e9c157bb..ded9b5fa 100644 --- a/src/services/spawn/StaticService.java +++ b/src/services/spawn/StaticService.java @@ -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); }