Add start for standalone jar DB exporting

This commit is contained in:
James Seibel
2024-12-05 18:46:57 -06:00
parent 54dd65b0a3
commit 872421f39f
@@ -16,10 +16,9 @@
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.distanthorizons.core.jar;
import com.seibel.distanthorizons.core.file.fullDatafile.FullDataSourceProviderV2;
import com.seibel.distanthorizons.core.pos.DhSectionPos;
import com.seibel.distanthorizons.core.sql.dto.FullDataSourceV2DTO;
import com.seibel.distanthorizons.core.sql.repo.FullDataSourceV2Repo;
@@ -51,7 +50,7 @@ import java.util.concurrent.atomic.AtomicReference;
public class JarMain
{
public static final Logger logger = LogManager.getLogger(JarMain.class.getSimpleName());
public static List<String> programArgs;
public static List<String> argList;
public static final boolean isDarkTheme = DarkModeDetector.isDarkMode();
public static boolean isOffline = WebDownloader.netIsAvailable();
@@ -61,9 +60,9 @@ public class JarMain
public static void main(String[] args)
{
programArgs = Arrays.asList(args);
argList = Arrays.asList(args);
if (!programArgs.contains("--no-custom-logger"))
if (!argList.contains("--no-custom-logger"))
{
LoggerContext context = (LoggerContext) LogManager.getContext(false);
try
@@ -80,58 +79,185 @@ public class JarMain
logger.debug("Running " + ModInfo.READABLE_NAME + " standalone jar");
logger.warn("The standalone jar is still a massive WIP, expect bugs");
logger.debug("Java version " + System.getProperty("java.version"));
// logger.debug(programArgs);
//logger.debug(argList);
// Sets up the local
if (JarUtils.accessFile("assets/lod/lang/" + Locale.getDefault().toString().toLowerCase() + ".json") == null)
if (args.length == 0 || Arrays.asList(args).contains("--gui"))
{
logger.warn("The language setting [" + Locale.getDefault().toString().toLowerCase() + "] isn't allowed yet. Defaulting to [" + Locale.US.toString().toLowerCase() + "].");
Locale.setDefault(Locale.US);
// Sets up the local
if (JarUtils.accessFile("assets/lod/lang/" + Locale.getDefault().toString().toLowerCase() + ".json") == null)
{
logger.warn("The language setting [" + Locale.getDefault().toString().toLowerCase() + "] isn't allowed yet. Defaulting to [" + Locale.US.toString().toLowerCase() + "].");
Locale.setDefault(Locale.US);
}
JarDependencySetup.createInitialBindings();
startGUI();
}
JarDependencySetup.createInitialBindings();
if (Arrays.asList(args).contains("--parse"))
else if (argList.get(0).equals("--export"))
{
// proof-of-concept ability to open DH Sqlite files for parsing by external programs.
FullDataSourceV2Repo repo = null;
Byte exportDetailLevel = null;
Long exportPos = null;
boolean showHelp = argList.contains("help");
if (!showHelp)
{
// assume something is wrong unless we find a valid arg set
showHelp = true;
if (argList.size() == 1)
{
// only --export
showHelp = false;
}
else if (argList.size() == 2)
{
// --export 0
String detailLevelString = argList.get(1);
try
{
exportDetailLevel = Byte.parseByte(detailLevelString);
showHelp = false;
}
catch (NumberFormatException e)
{
logger.error("Unable to parse detail level ["+detailLevelString+"], error: ["+e.getMessage()+"].");
}
}
else if (argList.size() == 4)
{
// --export 0 1 -2
String detailLevelString = argList.get(1);
String posXString = argList.get(2);
String posZString = argList.get(3);
try
{
byte detailLevel = Byte.parseByte(detailLevelString);
int posX = Integer.parseInt(posXString);
int posZ = Integer.parseInt(posZString);
exportPos = DhSectionPos.encode(detailLevel, posX, posZ);
showHelp = false;
}
catch (NumberFormatException e)
{
logger.error("Unable to parse position ["+detailLevelString+"], ["+posXString+"], ["+posZString+"], error: ["+e.getMessage()+"].");
}
}
}
if (showHelp)
{
logger.info("--export parses the 'DistantHorizons.sqlite' file next to this jar and exports the given data into a CSV file. \n" +
"Usage: \n" +
"--export [LOD position Detail Level] [LOD position X] [LOD position Z] \n" +
"\tExport the given position's data if present. \n" +
"\tThe detail level should be absolute, IE 0 = block sized, 1 = 2x2 blocks, etc. \n" +
"--export [LOD position Detail Level]\n" +
"\tExport all data for a given detail level.\n" +
"\tThe detail level should be absolute, IE 0 = block sized, 1 = 2x2 blocks, etc. \n" +
"--export\n" +
"\tExport the entire database.\n");
return;
}
// find the database file
File dbFile = new File("./DistantHorizons.sqlite");
if (!dbFile.exists())
{
logger.error("Unable to find a database to parse at: ["+dbFile.getAbsolutePath()+"].");
return;
}
// set the export file
File exportFile = new File("DistantHorizons-export.csv"); // TODO allow setting an export folder
if (exportFile.isDirectory())
{
logger.error("Export file can't be a folder. Given path: ["+exportFile+"].");
return;
}
// create the export file
try
{
long pos = DhSectionPos.encode(DhSectionPos.SECTION_BLOCK_DETAIL_LEVEL, 0, 0);
File dbFile = new File("./DistantHorizons.sqlite");
logger.info("Attempting to parse pos ["+DhSectionPos.toString(pos)+"] for DB file ["+dbFile+"].");
boolean ignored = exportFile.mkdirs(); // we don't care if we're making new directories of if they already exist
if (exportFile.exists())
{
logger.error("Export file already exists: ["+exportFile.getAbsolutePath()+"].");
return;
}
else if (exportFile.createNewFile())
{
logger.error("Failed to create file: ["+exportFile.getAbsolutePath()+"].");
return;
}
}
catch (Exception e)
{
logger.error("Unable to create export file: ["+exportFile.getAbsolutePath()+"].");
return;
}
logger.info("LOD data will be exported to ["+exportFile.getAbsolutePath()+"].");
FullDataSourceV2Repo repo;
try
{
repo = new FullDataSourceV2Repo(FullDataSourceV2Repo.DEFAULT_DATABASE_TYPE, dbFile);
FullDataSourceV2DTO dto = repo.getByKey(pos);
if (dto == null)
{
logger.info("No DTO found at pos ["+DhSectionPos.toString(pos)+"]");
}
else
{
logger.info("DTO ["+DhSectionPos.toString(pos)+"] checksum: ["+dto.dataChecksum+"].");
}
}
catch (SQLException e)
{
System.err.println(e.getMessage()+"\n\n");
e.printStackTrace();
logger.error("Failed to initialize connection with database: ["+exportFile.getAbsolutePath()+"], error: ["+e.getMessage()+"].", e);
return;
}
finally
if (exportPos != null)
{
if (repo != null)
{
repo.close();
}
exportLodDataAtPosition(repo, exportFile, exportPos);
}
else if (exportDetailLevel != null)
{
exportAllAtDetailLevel(repo, exportFile, exportDetailLevel);
}
else
{
exportEntireDatabase(repo, exportFile);
}
}
else if (args.length == 0 || Arrays.asList(args).contains("--gui"))
{
startGUI();
return;
}
}
private static void exportLodDataAtPosition(FullDataSourceV2Repo repo, File exportFile, long pos)
{
FullDataSourceV2DTO dto = repo.getByKey(pos);
if (dto == null)
{
logger.error("Unable to find any data at the position ["+DhSectionPos.toString(pos)+"].");
return;
}
// TODO need a way to create datasources (specifically data mappings) without a MC level object to deserialize with
//dto.createPooledDataSource();
}
private static void exportAllAtDetailLevel(FullDataSourceV2Repo repo, File exportFile, byte detailLevel)
{
// TODO
}
private static void exportEntireDatabase(FullDataSourceV2Repo repo, File exportFile)
{
// TODO
}
public static void startGUI()