diff --git a/pom.xml b/pom.xml
index ab26dac6..1019d98a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -92,6 +92,9 @@
2.8.2
2.17
4.1.3
+ 3.0.0
+
+ ${main.basedir}/modules/Fading Suns Revised Edition/json
diff --git a/think-machine-random/pom.xml b/think-machine-random/pom.xml
index 489561e8..c00b4646 100644
--- a/think-machine-random/pom.xml
+++ b/think-machine-random/pom.xml
@@ -13,6 +13,8 @@
${basedir}/..
+ ${main.basedir}/think-machine-random/target/classes/Fading Suns Revised Edition/json
+
@@ -29,7 +31,48 @@
false
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+
+ compile
+
+ java
+
+
+
+
+ com.softwaremagico.tm.cache.FactoryCacheGenerator
+ false
+ true
+
+
+
+ maven-antrun-plugin
+ ${maven-antrun-plugin.version}
+
+
+ compile
+
+ false
+
+
+
+
+
+
+
+
+ run
+
+
+
+
+
diff --git a/think-machine-random/src/main/java/com/softwaremagico/tm/cache/FactoryCacheGenerator.java b/think-machine-random/src/main/java/com/softwaremagico/tm/cache/FactoryCacheGenerator.java
new file mode 100644
index 00000000..0ae5a1db
--- /dev/null
+++ b/think-machine-random/src/main/java/com/softwaremagico/tm/cache/FactoryCacheGenerator.java
@@ -0,0 +1,58 @@
+package com.softwaremagico.tm.cache;
+
+/*-
+ * #%L
+ * Think Machine (Rules)
+ * %%
+ * Copyright (C) 2017 - 2021 Softwaremagico
+ * %%
+ * This software is designed by Jorge Hortelano Otero. Jorge Hortelano Otero
+ * Valencia (Spain).
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; If not, see .
+ * #L%
+ */
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import com.softwaremagico.tm.InvalidXmlElementException;
+import com.softwaremagico.tm.file.modules.ModuleManager;
+import com.softwaremagico.tm.log.ConfigurationLog;
+import com.softwaremagico.tm.log.MachineModulesLog;
+import com.softwaremagico.tm.log.MachineXmlReaderLog;
+import com.softwaremagico.tm.random.predefined.characters.NpcFactory;
+import org.reflections.Reflections;
+import org.slf4j.LoggerFactory;
+
+public class FactoryCacheGenerator {
+
+ public static void main(String[] args) throws InvalidXmlElementException {
+ disableLogs();
+ final NpcFactoryCacheLoader npcFactoryCacheLoader = new NpcFactoryCacheLoader();
+ for (final String moduleName : ModuleManager.getAvailableModules()) {
+ npcFactoryCacheLoader.save(NpcFactory.class, moduleName, NpcFactory.getInstance().getTranslatorFile());
+ }
+ }
+
+ private static void disableLogs() {
+ Logger logger = (Logger) LoggerFactory.getLogger(MachineXmlReaderLog.class);
+ logger.setLevel(Level.OFF);
+ logger = (Logger) LoggerFactory.getLogger(ConfigurationLog.class);
+ logger.setLevel(Level.OFF);
+ logger = (Logger) LoggerFactory.getLogger(MachineModulesLog.class);
+ logger.setLevel(Level.OFF);
+ logger = (Logger) LoggerFactory.getLogger(Reflections.class);
+ logger.setLevel(Level.OFF);
+ }
+}
diff --git a/think-machine-random/src/main/java/com/softwaremagico/tm/cache/ModuleLoaderEnforcer.java b/think-machine-random/src/main/java/com/softwaremagico/tm/cache/ModuleLoaderEnforcer.java
new file mode 100644
index 00000000..88e59e7b
--- /dev/null
+++ b/think-machine-random/src/main/java/com/softwaremagico/tm/cache/ModuleLoaderEnforcer.java
@@ -0,0 +1,74 @@
+package com.softwaremagico.tm.cache;
+
+/*-
+ * #%L
+ * Think Machine (Random Generator)
+ * %%
+ * Copyright (C) 2017 - 2021 Softwaremagico
+ * %%
+ * This software is designed by Jorge Hortelano Otero. Jorge Hortelano Otero
+ * Valencia (Spain).
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; If not, see .
+ * #L%
+ */
+
+import com.softwaremagico.tm.InvalidXmlElementException;
+import com.softwaremagico.tm.log.MachineLog;
+import com.softwaremagico.tm.random.party.RandomPartyFactory;
+import com.softwaremagico.tm.random.predefined.characters.NpcFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class ModuleLoaderEnforcer {
+
+ public static int loadAllFactories(String language, String moduleName) {
+ final long startTime = System.nanoTime();
+ final AtomicInteger loadedElements = new AtomicInteger(0);
+
+ loadedElements.addAndGet(com.softwaremagico.tm.file.modules.ModuleLoaderEnforcer.loadAllFactories(language, moduleName));
+
+ List> futures = new ArrayList<>();
+
+ futures.add(CompletableFuture.runAsync(() -> {
+ try {
+ loadedElements.addAndGet(RandomPartyFactory.getInstance().getElements(language, moduleName).size());
+ } catch (InvalidXmlElementException e) {
+ MachineLog.errorMessage(com.softwaremagico.tm.file.modules.ModuleLoaderEnforcer.class.getName(), e);
+ }
+ }));
+ CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
+ futures = new ArrayList<>();
+
+ //Second level
+ futures.add(CompletableFuture.runAsync(() -> {
+ try {
+ loadedElements.addAndGet(NpcFactory.getInstance().getElements(language, moduleName).size());
+ } catch (InvalidXmlElementException e) {
+ MachineLog.errorMessage(com.softwaremagico.tm.file.modules.ModuleLoaderEnforcer.class.getName(), e);
+ }
+ }));
+ CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
+
+
+ final long duration = (System.nanoTime() - startTime);
+ MachineLog.info(com.softwaremagico.tm.file.modules.ModuleLoaderEnforcer.class.getName(),
+ "All factories loaded! Total {} elements loaded in {} milliseconds.",
+ loadedElements.get(), duration / 1000000);
+ return loadedElements.get();
+ }
+}
diff --git a/think-machine-random/src/main/java/com/softwaremagico/tm/cache/NpcFactoryCacheLoader.java b/think-machine-random/src/main/java/com/softwaremagico/tm/cache/NpcFactoryCacheLoader.java
new file mode 100644
index 00000000..8f79d958
--- /dev/null
+++ b/think-machine-random/src/main/java/com/softwaremagico/tm/cache/NpcFactoryCacheLoader.java
@@ -0,0 +1,98 @@
+package com.softwaremagico.tm.cache;
+
+/*-
+ * #%L
+ * Think Machine (Rules)
+ * %%
+ * Copyright (C) 2017 - 2021 Softwaremagico
+ * %%
+ * This software is designed by Jorge Hortelano Otero. Jorge Hortelano Otero
+ * Valencia (Spain).
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; If not, see .
+ * #L%
+ */
+
+import com.google.gson.GsonBuilder;
+import com.softwaremagico.tm.InvalidXmlElementException;
+import com.softwaremagico.tm.character.benefices.AvailableBenefice;
+import com.softwaremagico.tm.character.benefices.BeneficeDefinition;
+import com.softwaremagico.tm.character.blessings.Blessing;
+import com.softwaremagico.tm.character.characteristics.Characteristic;
+import com.softwaremagico.tm.character.characteristics.CharacteristicDefinition;
+import com.softwaremagico.tm.character.equipment.DamageType;
+import com.softwaremagico.tm.character.equipment.armours.Armour;
+import com.softwaremagico.tm.character.equipment.shields.Shield;
+import com.softwaremagico.tm.character.equipment.weapons.Accessory;
+import com.softwaremagico.tm.character.equipment.weapons.Ammunition;
+import com.softwaremagico.tm.character.equipment.weapons.Weapon;
+import com.softwaremagico.tm.character.factions.Faction;
+import com.softwaremagico.tm.character.occultism.OccultismPath;
+import com.softwaremagico.tm.character.races.Race;
+import com.softwaremagico.tm.character.skills.AvailableSkill;
+import com.softwaremagico.tm.json.*;
+import com.softwaremagico.tm.json.factories.FactoryElements;
+import com.softwaremagico.tm.json.factories.cache.FactoryCacheLoader;
+import com.softwaremagico.tm.json.factories.cache.InvalidCacheFile;
+import com.softwaremagico.tm.random.predefined.characters.Npc;
+import com.softwaremagico.tm.random.predefined.characters.NpcFactory;
+import com.softwaremagico.tm.random.selectors.IRandomPreference;
+
+import java.util.List;
+
+public class NpcFactoryCacheLoader extends FactoryCacheLoader {
+
+ @Override
+ public List load(String language, String moduleName) {
+ try {
+ final FactoryElements factoryElements = load(NpcFactory.class, NpcFactoryElements.class, language, moduleName);
+ if (factoryElements != null && !factoryElements.getElements().isEmpty()) {
+ return factoryElements.getElements();
+ }
+ } catch (InvalidCacheFile invalidCacheFile) {
+ // Not cache file on this module.
+ }
+ return null;
+ }
+
+ @Override
+ protected FactoryElements getFactoryElements(String moduleName, String language) throws InvalidXmlElementException {
+ return new NpcFactoryElements(language, moduleName);
+ }
+
+ @Override
+ protected GsonBuilder initGsonBuilder(final String language, final String moduleName) {
+ final GsonBuilder gsonBuilder = new GsonBuilder();
+ gsonBuilder.setPrettyPrinting();
+ gsonBuilder.registerTypeAdapter(AvailableSkill.class, new AvailableSkillAdapter(language, moduleName));
+ gsonBuilder.registerTypeAdapter(CharacteristicDefinition.class, new CharacteristicDefinitionAdapter(language, moduleName));
+ gsonBuilder.registerTypeAdapter(Characteristic.class, new CharacteristicAdapter(language, moduleName));
+ gsonBuilder.registerTypeAdapter(Accessory.class, new AccessoryAdapter(language, moduleName));
+ gsonBuilder.registerTypeAdapter(DamageType.class, new DamageTypeAdapter(language, moduleName));
+ gsonBuilder.registerTypeAdapter(Ammunition.class, new AmmunitionAdapter(language, moduleName));
+ gsonBuilder.registerTypeAdapter(Race.class, new RaceAdapter(language, moduleName));
+ gsonBuilder.registerTypeAdapter(Faction.class, new FactionAdapter(language, moduleName));
+ gsonBuilder.registerTypeAdapter(Weapon.class, new WeaponAdapter(language, moduleName));
+ gsonBuilder.registerTypeAdapter(Armour.class, new ArmourAdapter(language, moduleName));
+ gsonBuilder.registerTypeAdapter(Shield.class, new ShieldAdapter(language, moduleName));
+ gsonBuilder.registerTypeAdapter(BeneficeDefinition.class, new BeneficeDefinitionAdapter(language, moduleName));
+ gsonBuilder.registerTypeAdapter(AvailableBenefice.class, new AvailableBeneficeAdapter(language, moduleName));
+ gsonBuilder.registerTypeAdapter(Blessing.class, new BlessingAdapter(language, moduleName));
+ gsonBuilder.registerTypeAdapter(OccultismPath.class, new OccultismPathAdapter(language, moduleName));
+ gsonBuilder.registerTypeAdapter(IRandomPreference.class, new RandomPreferenceAdapter());
+ return gsonBuilder;
+ }
+
+
+}
diff --git a/think-machine-random/src/main/java/com/softwaremagico/tm/cache/NpcFactoryElements.java b/think-machine-random/src/main/java/com/softwaremagico/tm/cache/NpcFactoryElements.java
new file mode 100644
index 00000000..eab2c83e
--- /dev/null
+++ b/think-machine-random/src/main/java/com/softwaremagico/tm/cache/NpcFactoryElements.java
@@ -0,0 +1,57 @@
+package com.softwaremagico.tm.cache;
+
+/*-
+ * #%L
+ * Think Machine (Rules)
+ * %%
+ * Copyright (C) 2017 - 2021 Softwaremagico
+ * %%
+ * This software is designed by Jorge Hortelano Otero. Jorge Hortelano Otero
+ * Valencia (Spain).
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; If not, see .
+ * #L%
+ */
+
+import com.softwaremagico.tm.InvalidXmlElementException;
+import com.softwaremagico.tm.json.factories.FactoryElements;
+import com.softwaremagico.tm.json.factories.cache.FactoryCacheLoader;
+import com.softwaremagico.tm.random.predefined.characters.Npc;
+import com.softwaremagico.tm.random.predefined.characters.NpcFactory;
+
+import java.sql.Timestamp;
+import java.util.Date;
+
+public class NpcFactoryElements extends FactoryElements {
+
+ public NpcFactoryElements() {
+ super();
+ creationTime = new Timestamp(new Date().getTime());
+ }
+
+ public NpcFactoryElements(String language, String moduleName) throws InvalidXmlElementException {
+ this();
+ creationTime = new Timestamp(new Date().getTime());
+
+ //Skip Json generation in loop.
+ final NpcFactory npcFactory = new NpcFactory() {
+ @Override
+ public FactoryCacheLoader getFactoryCacheLoader() {
+ return null;
+ }
+ };
+
+ setElements(npcFactory.getElements(language, moduleName));
+ }
+}
diff --git a/think-machine-random/src/main/java/com/softwaremagico/tm/cache/RandomPreferenceAdapter.java b/think-machine-random/src/main/java/com/softwaremagico/tm/cache/RandomPreferenceAdapter.java
new file mode 100644
index 00000000..3b303fea
--- /dev/null
+++ b/think-machine-random/src/main/java/com/softwaremagico/tm/cache/RandomPreferenceAdapter.java
@@ -0,0 +1,67 @@
+package com.softwaremagico.tm.cache;
+
+/*-
+ * #%L
+ * Think Machine (Core)
+ * %%
+ * Copyright (C) 2017 - 2018 Softwaremagico
+ * %%
+ * This software is designed by Jorge Hortelano Otero. Jorge Hortelano Otero
+ * Valencia (Spain).
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; If not, see .
+ * #L%
+ */
+
+import com.google.gson.*;
+import com.softwaremagico.tm.random.selectors.IRandomPreference;
+import org.reflections.Reflections;
+
+import java.lang.reflect.Type;
+import java.util.Set;
+
+public class RandomPreferenceAdapter implements JsonSerializer, JsonDeserializer {
+ private static final String PREFERENCE = "preference";
+ private static final String VALUE = "value";
+ private final Set> classes;
+
+ public RandomPreferenceAdapter() {
+ final Reflections reflections = new Reflections("com.softwaremagico.tm");
+ classes = reflections.getSubTypesOf(IRandomPreference.class);
+ }
+
+
+ @Override
+ public JsonElement serialize(IRandomPreference element, Type elementType, JsonSerializationContext jsonSerializationContext) {
+ final JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty(PREFERENCE, element.getClass().getSimpleName());
+ jsonObject.addProperty(VALUE, element.name());
+ return jsonObject;
+ }
+
+ @Override
+ public IRandomPreference deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
+ final JsonObject jsonObject = jsonElement.getAsJsonObject();
+ for (final Class extends IRandomPreference> preference : classes) {
+ if (preference.getSimpleName().equals(jsonObject.get(PREFERENCE).getAsString())) {
+ for (final Object constant : preference.getEnumConstants()) {
+ if (constant.toString().equals(jsonObject.get(VALUE).getAsString())) {
+ return (IRandomPreference) constant;
+ }
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/think-machine-random/src/main/java/com/softwaremagico/tm/random/selectors/IRandomPreference.java b/think-machine-random/src/main/java/com/softwaremagico/tm/random/selectors/IRandomPreference.java
index dd384338..2c06ae05 100644
--- a/think-machine-random/src/main/java/com/softwaremagico/tm/random/selectors/IRandomPreference.java
+++ b/think-machine-random/src/main/java/com/softwaremagico/tm/random/selectors/IRandomPreference.java
@@ -32,5 +32,7 @@ public interface IRandomPreference extends Comparable {
String name();
+
+
IRandomPreference getDefault();
}
diff --git a/think-machine-random/src/test/java/com/softwaremagico/tm/json/JsonCacheLoaderTests.java b/think-machine-random/src/test/java/com/softwaremagico/tm/json/JsonCacheLoaderTests.java
new file mode 100644
index 00000000..74083692
--- /dev/null
+++ b/think-machine-random/src/test/java/com/softwaremagico/tm/json/JsonCacheLoaderTests.java
@@ -0,0 +1,87 @@
+package com.softwaremagico.tm.json;
+
+/*-
+ * #%L
+ * Think Machine (Core)
+ * %%
+ * Copyright (C) 2017 - 2018 Softwaremagico
+ * %%
+ * This software is designed by Jorge Hortelano Otero. Jorge Hortelano Otero
+ * Valencia (Spain).
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; If not, see .
+ * #L%
+ */
+
+import com.softwaremagico.tm.InvalidXmlElementException;
+import com.softwaremagico.tm.cache.NpcFactoryCacheLoader;
+import com.softwaremagico.tm.file.PathManager;
+import com.softwaremagico.tm.json.factories.cache.FactoryCacheLoader;
+import com.softwaremagico.tm.random.predefined.characters.Npc;
+import com.softwaremagico.tm.random.predefined.characters.NpcFactory;
+import com.softwaremagico.tm.random.selectors.SpecializationPreferences;
+import com.softwaremagico.tm.random.selectors.TechnologicalPreferences;
+import org.junit.Assert;
+import org.testng.annotations.Test;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.util.List;
+
+@Test(groups = {"jsonCache"})
+public class JsonCacheLoaderTests {
+ private static final String LANGUAGE = "es";
+ private static final int ITERATIONS = 5;
+
+ @Test
+ public void loadNpcCache() {
+ NpcFactoryCacheLoader npcFactoryCacheLoader = new NpcFactoryCacheLoader();
+ List npcs = npcFactoryCacheLoader.load(LANGUAGE, PathManager.DEFAULT_MODULE_FOLDER);
+ Assert.assertTrue(npcs.size() > 0);
+ //Check random configuration enums.
+ Npc alMalik = npcs.stream().filter(npc -> npc.getId().equals("alMalik")).findFirst().orElseThrow(AssertionError::new);
+ Assert.assertTrue(alMalik.getPreferences().contains(TechnologicalPreferences.FUTURIST));
+ Assert.assertTrue(alMalik.getPreferences().contains(SpecializationPreferences.SPECIALIZED));
+ }
+
+ @Test()
+ public void checkNpcsImprovement() throws InvalidXmlElementException {
+ //Skip Json generation.
+ NpcFactory npcFactory = new NpcFactory() {
+ @Override
+ public FactoryCacheLoader getFactoryCacheLoader() {
+ return null;
+ }
+ };
+
+
+ Instant start = Instant.now();
+ for (int i = 0; i < ITERATIONS; i++) {
+ npcFactory.getElements(LANGUAGE, PathManager.DEFAULT_MODULE_FOLDER);
+ npcFactory.removeData();
+ }
+ Instant end = Instant.now();
+ Duration xmlMethod = Duration.between(start, end);
+
+ start = Instant.now();
+ for (int i = 0; i < ITERATIONS; i++) {
+ NpcFactoryCacheLoader npcFactoryCacheLoader = new NpcFactoryCacheLoader();
+ Assert.assertTrue(npcFactoryCacheLoader.load(LANGUAGE, PathManager.DEFAULT_MODULE_FOLDER).size() > 0);
+ NpcFactory.getInstance().removeData();
+ }
+ end = Instant.now();
+ Duration jsonMethod = Duration.between(start, end);
+ Assert.assertTrue(jsonMethod.getNano() < xmlMethod.getNano());
+ }
+}
diff --git a/think-machine-rules/pom.xml b/think-machine-rules/pom.xml
index 6d288555..2933b8eb 100644
--- a/think-machine-rules/pom.xml
+++ b/think-machine-rules/pom.xml
@@ -1,4 +1,5 @@
-
+
4.0.0
think-machine-rules
jar
@@ -14,13 +15,11 @@
${basedir}/..
- ${main.basedir}/modules/Fading Suns Revised Edition/json
- ${main.basedir}/think-machine-rules/target/classes/Fading Suns Revised Edition/json
-
2.5.3
com.softwaremagico.tm.Main
images/ThinkingMachine_logo.png
- 3.0.0
+ ${main.basedir}/think-machine-rules/target/classes/Fading Suns Revised Edition/json
+
@@ -58,7 +57,7 @@
- com.softwaremagico.tm.json.factories.cache.FactoryCacheLoader
+ com.softwaremagico.tm.json.factories.cache.FactoryCacheGenerator
false
true
@@ -74,12 +73,12 @@
false
-
+
-
+
-
+
diff --git a/think-machine-rules/src/main/java/com/softwaremagico/tm/json/ArmourAdapter.java b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/ArmourAdapter.java
index 2e116b50..c925a467 100644
--- a/think-machine-rules/src/main/java/com/softwaremagico/tm/json/ArmourAdapter.java
+++ b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/ArmourAdapter.java
@@ -24,8 +24,6 @@
* #L%
*/
-import java.lang.reflect.Type;
-
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
@@ -34,9 +32,11 @@
import com.softwaremagico.tm.character.equipment.armours.ArmourFactory;
import com.softwaremagico.tm.log.MachineLog;
+import java.lang.reflect.Type;
+
public class ArmourAdapter extends ElementAdapter {
- protected ArmourAdapter(String language, String moduleName) {
+ public ArmourAdapter(String language, String moduleName) {
super(language, moduleName);
}
diff --git a/think-machine-rules/src/main/java/com/softwaremagico/tm/json/AvailableBeneficeAdapter.java b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/AvailableBeneficeAdapter.java
index 78382520..da7523d6 100644
--- a/think-machine-rules/src/main/java/com/softwaremagico/tm/json/AvailableBeneficeAdapter.java
+++ b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/AvailableBeneficeAdapter.java
@@ -24,8 +24,6 @@
* #L%
*/
-import java.lang.reflect.Type;
-
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
@@ -34,9 +32,11 @@
import com.softwaremagico.tm.character.benefices.AvailableBeneficeFactory;
import com.softwaremagico.tm.log.MachineLog;
+import java.lang.reflect.Type;
+
public class AvailableBeneficeAdapter extends ElementAdapter {
- protected AvailableBeneficeAdapter(String language, String moduleName) {
+ public AvailableBeneficeAdapter(String language, String moduleName) {
super(language, moduleName);
}
diff --git a/think-machine-rules/src/main/java/com/softwaremagico/tm/json/BeneficeDefinitionAdapter.java b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/BeneficeDefinitionAdapter.java
new file mode 100644
index 00000000..cc42947d
--- /dev/null
+++ b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/BeneficeDefinitionAdapter.java
@@ -0,0 +1,52 @@
+package com.softwaremagico.tm.json;
+
+/*-
+ * #%L
+ * Think Machine (Core)
+ * %%
+ * Copyright (C) 2017 - 2018 Softwaremagico
+ * %%
+ * This software is designed by Jorge Hortelano Otero. Jorge Hortelano Otero
+ * Valencia (Spain).
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; If not, see .
+ * #L%
+ */
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+import com.softwaremagico.tm.InvalidXmlElementException;
+import com.softwaremagico.tm.character.benefices.BeneficeDefinition;
+import com.softwaremagico.tm.character.benefices.BeneficeDefinitionFactory;
+import com.softwaremagico.tm.log.MachineLog;
+
+import java.lang.reflect.Type;
+
+public class BeneficeDefinitionAdapter extends ElementAdapter {
+
+ public BeneficeDefinitionAdapter(String language, String moduleName) {
+ super(language, moduleName);
+ }
+
+ @Override
+ public BeneficeDefinition deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
+ try {
+ return BeneficeDefinitionFactory.getInstance().getElement(super.getElementId(jsonElement), super.getLanguage(), super.getModuleName());
+ } catch (InvalidXmlElementException e) {
+ MachineLog.errorMessage(this.getClass().getName(), e);
+ return null;
+ }
+ }
+}
diff --git a/think-machine-rules/src/main/java/com/softwaremagico/tm/json/BlessingAdapter.java b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/BlessingAdapter.java
index 906ab433..672d72c3 100644
--- a/think-machine-rules/src/main/java/com/softwaremagico/tm/json/BlessingAdapter.java
+++ b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/BlessingAdapter.java
@@ -24,8 +24,6 @@
* #L%
*/
-import java.lang.reflect.Type;
-
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
@@ -34,9 +32,11 @@
import com.softwaremagico.tm.character.blessings.BlessingFactory;
import com.softwaremagico.tm.log.MachineLog;
+import java.lang.reflect.Type;
+
public class BlessingAdapter extends ElementAdapter {
- protected BlessingAdapter(String language, String moduleName) {
+ public BlessingAdapter(String language, String moduleName) {
super(language, moduleName);
}
diff --git a/think-machine-rules/src/main/java/com/softwaremagico/tm/json/CharacteristicAdapter.java b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/CharacteristicAdapter.java
index 560e2be1..b86f4968 100644
--- a/think-machine-rules/src/main/java/com/softwaremagico/tm/json/CharacteristicAdapter.java
+++ b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/CharacteristicAdapter.java
@@ -35,7 +35,7 @@
public class CharacteristicAdapter extends ElementAdapter {
private static final String VALUE = "value";
- protected CharacteristicAdapter(String language, String moduleName) {
+ public CharacteristicAdapter(String language, String moduleName) {
super(language, moduleName);
}
diff --git a/think-machine-rules/src/main/java/com/softwaremagico/tm/json/OccultismPathAdapter.java b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/OccultismPathAdapter.java
new file mode 100644
index 00000000..c44fba3f
--- /dev/null
+++ b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/OccultismPathAdapter.java
@@ -0,0 +1,52 @@
+package com.softwaremagico.tm.json;
+
+/*-
+ * #%L
+ * Think Machine (Core)
+ * %%
+ * Copyright (C) 2017 - 2018 Softwaremagico
+ * %%
+ * This software is designed by Jorge Hortelano Otero. Jorge Hortelano Otero
+ * Valencia (Spain).
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; If not, see .
+ * #L%
+ */
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+import com.softwaremagico.tm.InvalidXmlElementException;
+import com.softwaremagico.tm.character.occultism.OccultismPath;
+import com.softwaremagico.tm.character.occultism.OccultismPathFactory;
+import com.softwaremagico.tm.log.MachineLog;
+
+import java.lang.reflect.Type;
+
+public class OccultismPathAdapter extends ElementAdapter {
+
+ public OccultismPathAdapter(String language, String moduleName) {
+ super(language, moduleName);
+ }
+
+ @Override
+ public OccultismPath deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
+ try {
+ return OccultismPathFactory.getInstance().getElement(super.getElementId(jsonElement), super.getLanguage(), super.getModuleName());
+ } catch (InvalidXmlElementException e) {
+ MachineLog.errorMessage(this.getClass().getName(), e);
+ return null;
+ }
+ }
+}
diff --git a/think-machine-rules/src/main/java/com/softwaremagico/tm/json/WeaponAdapter.java b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/WeaponAdapter.java
index 09cf442c..748014b8 100644
--- a/think-machine-rules/src/main/java/com/softwaremagico/tm/json/WeaponAdapter.java
+++ b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/WeaponAdapter.java
@@ -24,8 +24,6 @@
* #L%
*/
-import java.lang.reflect.Type;
-
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
@@ -34,9 +32,11 @@
import com.softwaremagico.tm.character.equipment.weapons.WeaponFactory;
import com.softwaremagico.tm.log.MachineLog;
+import java.lang.reflect.Type;
+
public class WeaponAdapter extends ElementAdapter {
- protected WeaponAdapter(String language, String moduleName) {
+ public WeaponAdapter(String language, String moduleName) {
super(language, moduleName);
}
diff --git a/think-machine-rules/src/main/java/com/softwaremagico/tm/json/factories/cache/FactoryCacheGenerator.java b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/factories/cache/FactoryCacheGenerator.java
new file mode 100644
index 00000000..28f705c5
--- /dev/null
+++ b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/factories/cache/FactoryCacheGenerator.java
@@ -0,0 +1,85 @@
+package com.softwaremagico.tm.json.factories.cache;
+
+/*-
+ * #%L
+ * Think Machine (Rules)
+ * %%
+ * Copyright (C) 2017 - 2021 Softwaremagico
+ * %%
+ * This software is designed by Jorge Hortelano Otero. Jorge Hortelano Otero
+ * Valencia (Spain).
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; If not, see .
+ * #L%
+ */
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import com.softwaremagico.tm.InvalidXmlElementException;
+import com.softwaremagico.tm.character.benefices.BeneficeDefinitionFactory;
+import com.softwaremagico.tm.character.blessings.BlessingFactory;
+import com.softwaremagico.tm.character.equipment.armours.ArmourFactory;
+import com.softwaremagico.tm.character.equipment.weapons.WeaponFactory;
+import com.softwaremagico.tm.character.planets.PlanetFactory;
+import com.softwaremagico.tm.character.skills.SkillsDefinitionsFactory;
+import com.softwaremagico.tm.file.modules.ModuleManager;
+import com.softwaremagico.tm.log.ConfigurationLog;
+import com.softwaremagico.tm.log.MachineModulesLog;
+import com.softwaremagico.tm.log.MachineXmlReaderLog;
+import org.reflections.Reflections;
+import org.slf4j.LoggerFactory;
+
+public class FactoryCacheGenerator {
+
+ public static void main(String[] args) throws InvalidXmlElementException {
+ disableLogs();
+ final WeaponsFactoryCacheLoader weaponsFactoryCacheLoader = new WeaponsFactoryCacheLoader();
+ for (final String moduleName : ModuleManager.getAvailableModules()) {
+ weaponsFactoryCacheLoader.save(WeaponFactory.class, moduleName, WeaponFactory.getInstance().getTranslatorFile());
+ }
+ final ArmourFactoryCacheLoader armourFactoryCacheLoader = new ArmourFactoryCacheLoader();
+ for (final String moduleName : ModuleManager.getAvailableModules()) {
+ armourFactoryCacheLoader.save(ArmourFactory.class, moduleName, ArmourFactory.getInstance().getTranslatorFile());
+ }
+ final SkillDefinitionsFactoryCacheLoader skillDefinitionsFactoryCacheLoader = new SkillDefinitionsFactoryCacheLoader();
+ for (final String moduleName : ModuleManager.getAvailableModules()) {
+ skillDefinitionsFactoryCacheLoader.save(SkillsDefinitionsFactory.class, moduleName, SkillsDefinitionsFactory.getInstance().getTranslatorFile());
+ }
+ final BlessingFactoryCacheLoader blessingFactoryCacheLoader = new BlessingFactoryCacheLoader();
+ for (final String moduleName : ModuleManager.getAvailableModules()) {
+ blessingFactoryCacheLoader.save(BlessingFactory.class, moduleName, BlessingFactory.getInstance().getTranslatorFile());
+ }
+ final BeneficeDefinitionFactoryCacheLoader beneficeDefinitionFactoryCacheLoader = new BeneficeDefinitionFactoryCacheLoader();
+ for (final String moduleName : ModuleManager.getAvailableModules()) {
+ beneficeDefinitionFactoryCacheLoader.save(BeneficeDefinitionFactory.class, moduleName,
+ BeneficeDefinitionFactory.getInstance().getTranslatorFile());
+ }
+ final PlanetFactoryCacheLoader planetFactoryCacheLoader = new PlanetFactoryCacheLoader();
+ for (final String moduleName : ModuleManager.getAvailableModules()) {
+ planetFactoryCacheLoader.save(PlanetFactory.class, moduleName,
+ PlanetFactory.getInstance().getTranslatorFile());
+ }
+ }
+
+ private static void disableLogs() {
+ Logger logger = (Logger) LoggerFactory.getLogger(MachineXmlReaderLog.class);
+ logger.setLevel(Level.OFF);
+ logger = (Logger) LoggerFactory.getLogger(ConfigurationLog.class);
+ logger.setLevel(Level.OFF);
+ logger = (Logger) LoggerFactory.getLogger(MachineModulesLog.class);
+ logger.setLevel(Level.OFF);
+ logger = (Logger) LoggerFactory.getLogger(Reflections.class);
+ logger.setLevel(Level.OFF);
+ }
+}
diff --git a/think-machine-rules/src/main/java/com/softwaremagico/tm/json/factories/cache/FactoryCacheLoader.java b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/factories/cache/FactoryCacheLoader.java
index abe85bbb..25841a8d 100644
--- a/think-machine-rules/src/main/java/com/softwaremagico/tm/json/factories/cache/FactoryCacheLoader.java
+++ b/think-machine-rules/src/main/java/com/softwaremagico/tm/json/factories/cache/FactoryCacheLoader.java
@@ -24,30 +24,16 @@
* #L%
*/
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.Logger;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.softwaremagico.tm.Element;
import com.softwaremagico.tm.InvalidXmlElementException;
import com.softwaremagico.tm.XmlFactory;
-import com.softwaremagico.tm.character.benefices.BeneficeDefinitionFactory;
-import com.softwaremagico.tm.character.blessings.BlessingFactory;
-import com.softwaremagico.tm.character.equipment.armours.ArmourFactory;
-import com.softwaremagico.tm.character.equipment.weapons.WeaponFactory;
-import com.softwaremagico.tm.character.planets.PlanetFactory;
-import com.softwaremagico.tm.character.skills.SkillsDefinitionsFactory;
import com.softwaremagico.tm.file.PathManager;
-import com.softwaremagico.tm.file.modules.ModuleManager;
import com.softwaremagico.tm.json.factories.FactoryElements;
import com.softwaremagico.tm.language.Language;
import com.softwaremagico.tm.language.LanguagePool;
-import com.softwaremagico.tm.log.ConfigurationLog;
import com.softwaremagico.tm.log.MachineLog;
-import com.softwaremagico.tm.log.MachineModulesLog;
-import com.softwaremagico.tm.log.MachineXmlReaderLog;
-import org.reflections.Reflections;
-import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.BufferedWriter;
@@ -65,47 +51,6 @@
public abstract class FactoryCacheLoader> {
protected static final String GSON_TEMPORAL_FOLDER = "json";
- public static void main(String[] args) throws InvalidXmlElementException {
- disableLogs();
- final WeaponsFactoryCacheLoader weaponsFactoryCacheLoader = new WeaponsFactoryCacheLoader();
- for (final String moduleName : ModuleManager.getAvailableModules()) {
- weaponsFactoryCacheLoader.save(WeaponFactory.class, moduleName, WeaponFactory.getInstance().getTranslatorFile());
- }
- final ArmourFactoryCacheLoader armourFactoryCacheLoader = new ArmourFactoryCacheLoader();
- for (final String moduleName : ModuleManager.getAvailableModules()) {
- armourFactoryCacheLoader.save(ArmourFactory.class, moduleName, ArmourFactory.getInstance().getTranslatorFile());
- }
- final SkillDefinitionsFactoryCacheLoader skillDefinitionsFactoryCacheLoader = new SkillDefinitionsFactoryCacheLoader();
- for (final String moduleName : ModuleManager.getAvailableModules()) {
- skillDefinitionsFactoryCacheLoader.save(SkillsDefinitionsFactory.class, moduleName, SkillsDefinitionsFactory.getInstance().getTranslatorFile());
- }
- final BlessingFactoryCacheLoader blessingFactoryCacheLoader = new BlessingFactoryCacheLoader();
- for (final String moduleName : ModuleManager.getAvailableModules()) {
- blessingFactoryCacheLoader.save(BlessingFactory.class, moduleName, BlessingFactory.getInstance().getTranslatorFile());
- }
- final BeneficeDefinitionFactoryCacheLoader beneficeDefinitionFactoryCacheLoader = new BeneficeDefinitionFactoryCacheLoader();
- for (final String moduleName : ModuleManager.getAvailableModules()) {
- beneficeDefinitionFactoryCacheLoader.save(BeneficeDefinitionFactory.class, moduleName,
- BeneficeDefinitionFactory.getInstance().getTranslatorFile());
- }
- final PlanetFactoryCacheLoader planetFactoryCacheLoader = new PlanetFactoryCacheLoader();
- for (final String moduleName : ModuleManager.getAvailableModules()) {
- planetFactoryCacheLoader.save(PlanetFactory.class, moduleName,
- PlanetFactory.getInstance().getTranslatorFile());
- }
- }
-
- private static void disableLogs() {
- Logger logger = (Logger) LoggerFactory.getLogger(MachineXmlReaderLog.class);
- logger.setLevel(Level.OFF);
- logger = (Logger) LoggerFactory.getLogger(ConfigurationLog.class);
- logger.setLevel(Level.OFF);
- logger = (Logger) LoggerFactory.getLogger(MachineModulesLog.class);
- logger.setLevel(Level.OFF);
- logger = (Logger) LoggerFactory.getLogger(Reflections.class);
- logger.setLevel(Level.OFF);
- }
-
protected static String getJsonContent(String moduleName, String language, String file) throws InvalidCacheFile {
return readFile(getPath(moduleName, language, file));
}