package main;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import org.json.JSONArray;
import org.json.JSONObject;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.swing.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.*;
public class ImportJSON extends Application {
private File sourceWorldJSON = new File("World.json");
private File sourceWorldXML = new File("World.xml");
private File sourceCommonXML = new File("Common.xml");
private Document documentWorldXML = null, documentCommonXML = null;
private File saveAs = null;
private Button btnStart;
private Label lblCheckFiles = new Label("Dateiprüfung:"), lblCheckJWorldSON = new Label("check"), lblCheckWorldXML = new Label("check"), lblCheckCommonXML = new Label("check");
private TextArea txtImport = new TextArea();
private static JSONObject jsonFull, jsonData;
private static ObservableList<String> listTypes = FXCollections.observableArrayList();
private static JSONArray arrayHeroClassesOriginal, arrayKingdomsOriginal, arrayTraitsOriginal, arrayTroopsOriginal, arraySpellsOriginal, arrayWeaponsOriginal;
@Override
public void start(Stage primaryStage) throws Exception{
lblCheckFiles.setFont(Font.font("Arial", FontWeight.BOLD, 15));
lblCheckFiles.setPadding(new Insets(0,0,10,0));
GridPane gridLabels = new GridPane();
gridLabels.setHgap(10);
gridLabels.setVgap(5);
gridLabels.setPadding(new Insets(10,0,10,20));
gridLabels.add(lblCheckFiles,0,0,2,1);
gridLabels.add(new Label("World.json: "),0,1);
gridLabels.add(lblCheckJWorldSON,1,1);
gridLabels.add(new Label("World.xml: "),0,2);
gridLabels.add(lblCheckWorldXML,1,2);
gridLabels.add(new Label("Common.xml: "),0,3);
gridLabels.add(lblCheckCommonXML,1,3);
txtImport.setPrefWidth(600);
txtImport.setPrefHeight(500);
VBox boxTextArea = new VBox(txtImport);
boxTextArea.setPadding(new Insets(10));
btnStart = new Button("Start");
btnStart.setPrefHeight(40);
btnStart.setPrefWidth(100);
Button btnClose = new Button("Schließen");
btnClose.setPrefHeight(40);
btnClose.setPrefWidth(100);
HBox boxButtons = new HBox(btnStart, btnClose);
boxButtons.setAlignment(Pos.CENTER_RIGHT);
boxButtons.setPadding(new Insets(10));
boxButtons.setSpacing(20);
VBox root = new VBox(gridLabels, boxTextArea, boxButtons);
primaryStage.setTitle("Data Import");
primaryStage.setScene(new Scene(root));
primaryStage.show();
if(sourceWorldJSON.exists()) {
lblCheckJWorldSON.setText("Datei gefunden!");
} else {
lblCheckJWorldSON.setText("FEHLER: Datei nicht gefunden!");
btnStart.setDisable(true);
}
if(sourceWorldXML.exists()) {
lblCheckWorldXML.setText("Datei gefunden!");
} else {
lblCheckWorldXML.setText("FEHLER: Datei nicht gefunden!");
btnStart.setDisable(true);
}
if(sourceCommonXML.exists()) {
lblCheckCommonXML.setText("Datei gefunden!");
} else {
lblCheckCommonXML.setText("FEHLER: Datei nicht gefunden!");
btnStart.setDisable(true);
}
FileChooser fileChooser = new FileChooser();
fileChooser.setInitialFileName("Data.json");
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("JSON", "*.json"));
btnStart.setOnAction(event -> {
btnStart.setDisable(true);
saveAs = fileChooser.showSaveDialog(primaryStage);
importData();
});
btnClose.setOnAction(event -> System.exit(0));
}
private void importData() {
System.out.println("Speicherort --> "+saveAs.getAbsolutePath()+"\n");
txtImport.appendText("Temporäre XML Dateien erzeugen\n");
File tempWorldXML = createTempXML(sourceWorldXML);
documentWorldXML = convertXML(tempWorldXML);
File tempCommonXML = createTempXML(sourceCommonXML);
documentCommonXML = convertXML(tempCommonXML);
try {
txtImport.appendText("JSON Quelldatei einlesen und JSONObject erstellen\n");
FileReader fileReader = new FileReader(sourceWorldJSON);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String fileContent = bufferedReader.readLine();
bufferedReader.close();
jsonFull = new JSONObject(fileContent);
arrayHeroClassesOriginal = jsonFull.getJSONArray("HeroClasses");
arrayKingdomsOriginal = jsonFull.getJSONArray("Kingdoms");
arrayTraitsOriginal = jsonFull.getJSONArray("Traits");
arrayTroopsOriginal = jsonFull.getJSONArray("Troops");
arraySpellsOriginal = jsonFull.getJSONArray("Spells");
arrayWeaponsOriginal = jsonFull.getJSONArray("Weapons");
JSONObject newHeroClasses = createHeroClasses(arrayHeroClassesOriginal);
JSONObject newKingdoms = createKingdoms(arrayKingdomsOriginal);
JSONObject newTraits = createTraits(arrayTraitsOriginal);
JSONObject newTroops = createTroops(arrayTroopsOriginal);
JSONObject newSpells = createSpells(arraySpellsOriginal);
JSONObject newWeapons = createWeapons(arrayWeaponsOriginal);
JSONObject manaBonus = new JSONObject();
for(int colorNr=0; colorNr<=5; colorNr++) {
String colorName="", searchBonus, searchDescription;
switch(colorNr) {
case 0:
colorName = "Blue";
break;
case 1:
colorName = "Green";
break;
case 2:
colorName = "Red";
break;
case 3:
colorName = "Yellow";
break;
case 4:
colorName = "Purple";
break;
case 5:
colorName = "Brown";
break;
}
searchBonus = "[BONUS_COLOR_"+colorNr+"]";
searchDescription = "[BONUS_COLOR_DESCRIPTION_"+colorNr+"]";
manaBonus.put("Bonus"+colorName, findXMLContent(searchBonus, documentCommonXML));
manaBonus.put("Bonus"+colorName+"Description", findXMLContent(searchDescription, documentCommonXML));
}
JSONObject typeBonus = new JSONObject();
for(String type : listTypes) {
String typeUC = type.toUpperCase();
String searchBonus, searchDescription;
for(int a=3; a<=4; a++) {
searchBonus = "[BONUS_TROOPTYPE_"+typeUC+"_"+a+"]";
searchDescription ="[BONUS_TROOPTYPE_DESCRIPTION_"+typeUC+"_"+a+"]";
typeBonus.put(type+"_"+a, findXMLContent(searchBonus, documentCommonXML));
typeBonus.put(type+"_"+a+"_"+"Description", findXMLContent(searchDescription, documentCommonXML));
}
}
jsonData = new JSONObject();
jsonData.put("HeroClasses", newHeroClasses);
jsonData.put("Kingdoms", newKingdoms);
jsonData.put("Traits", newTraits);
jsonData.put("Troops", newTroops);
jsonData.put("Spells", newSpells);
jsonData.put("Weapons", newWeapons);
jsonData.put("ManaBonus",manaBonus);
jsonData.put("TypeBonus", typeBonus);
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, "Datei konnte nicht gefunden werden:\n" + e.toString(), "Datei nicht gefunden", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
saveNewJSON(jsonData.toString());
if(tempWorldXML.delete()) {
System.out.println("tempWorld.xml gelöscht");
txtImport.appendText("tempWorld.xml gelöscht\n");
}
if(tempCommonXML.delete()) {
System.out.println("tempCommon.xml gelöscht");
txtImport.appendText("tempCommon.xml gelöscht\n");
}
saveStatistic("-----------------------------------------------------------");
btnStart.setDisable(false);
}
private File createTempXML(File file) {
System.out.println(file+" wird temporär neu erstellt");
String fileContent = "", line;
try {
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
while((line = bufferedReader.readLine()) != null) {
line = line.replace("&", "&");
fileContent += line+"\n";
}
bufferedReader.close();
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, "Datei konnte nicht gefunden werden:\n" + e.toString(), "Datei nicht gefunden", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
File tempXML = null;
if(file.equals(sourceWorldXML)) {
tempXML = new File("tempWorld.xml");
}
if(file.equals(sourceCommonXML)) {
tempXML = new File("tempCommon.xml");
}
if(tempXML != null) {
try {
FileWriter fw = new FileWriter(tempXML);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(fileContent);
bw.close();
System.out.println("Temporäre Datei \""+tempXML+"\" erstellt!\n");
} catch (IOException e) {
e.printStackTrace();
}
}
return tempXML;
}
private Document convertXML(File tempXML) {
Document documentXML = null;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
documentXML = builder.parse(tempXML);
} catch (SAXException | ParserConfigurationException | IOException e) {
e.printStackTrace();
}
return documentXML;
}
private JSONObject createHeroClasses(JSONArray originalHeroClasses) {
JSONObject objectHeroClasses = new JSONObject();
for(int classNr=0; classNr<originalHeroClasses.length(); classNr++) {
JSONObject heroClassOriginal = (JSONObject) originalHeroClasses.get(classNr);
JSONObject heroClassNew = new JSONObject();
String className = findXMLContent(heroClassOriginal.getString("Name"), documentWorldXML);
heroClassNew.put("Name", className);
JSONArray arrayClassAugments = heroClassOriginal.getJSONArray("Augment");
String augment_1 = arrayClassAugments.getString(0);
String augment_2 = arrayClassAugments.getString(1);
String augment_3 = arrayClassAugments.getString(2);
heroClassNew.put("Augment_1", augment_1);
heroClassNew.put("Augment_2", augment_2);
heroClassNew.put("Augment_3", augment_3);
JSONArray arrayClassAugmentNames = heroClassOriginal.getJSONArray("AugmentName");
String augmentName_1 = findXMLContent(arrayClassAugmentNames.getString(0), documentWorldXML);
String augmentName_2 = findXMLContent(arrayClassAugmentNames.getString(1), documentWorldXML);
String augmentName_3 = findXMLContent(arrayClassAugmentNames.getString(2), documentWorldXML);
heroClassNew.put("AugmentName_1", augmentName_1);
heroClassNew.put("AugmentName_2", augmentName_2);
heroClassNew.put("AugmentName_3", augmentName_3);
JSONArray arrayClassTraits = heroClassOriginal.getJSONArray("Traits");
String trait_1 = getTraitName(arrayClassTraits.getString(0));
String trait_2 = getTraitName(arrayClassTraits.getString(1));
String trait_3 = getTraitName(arrayClassTraits.getString(2));
heroClassNew.put("Trait_1", trait_1);
heroClassNew.put("Trait_2", trait_2);
heroClassNew.put("Trait_3", trait_3);
objectHeroClasses.put(className, heroClassNew);
System.out.println("HeroClass: "+className);
}
txtImport.appendText("HeroClasses: "+objectHeroClasses.length()+"\n\n");
saveStatistic("HeroClasses: "+objectHeroClasses.length());
System.out.println("HeroClasses: "+objectHeroClasses.length());
return objectHeroClasses;
}
private JSONObject createKingdoms(JSONArray originalKingdoms) {
JSONObject objectKingdoms = new JSONObject();
for(int kingdomNr=0; kingdomNr<originalKingdoms.length(); kingdomNr++) {
JSONObject kingdomOriginal = (JSONObject) originalKingdoms.get(kingdomNr);
JSONObject kingdomNew = new JSONObject();
if(kingdomOriginal.getBoolean("Tutorial")) {
continue;
}
String kingdomName = findXMLContent(kingdomOriginal.getString("Name"), documentWorldXML);
kingdomNew.put("Name", kingdomName);
String bannerName = findXMLContent(kingdomOriginal.getString("BannerName"), documentWorldXML);
String bannerDesc = findXMLContent(kingdomOriginal.getString("BannerManaDescription"), documentWorldXML);
kingdomNew.put("BannerName", bannerName);
kingdomNew.put("BannerDescription", bannerDesc);
JSONArray arrayTroopIds = kingdomOriginal.getJSONArray("TroopIds");
JSONArray arrayTroopNames = getTroopNames(arrayTroopIds);
kingdomNew.put("Troops", arrayTroopNames);
for(int i=2; i<5; i++) {
int id = kingdomOriginal.getInt("Id");
String bonusCode = "[BONUS_KINGDOM_"+id+"_"+i+"]";
String bonus = findXMLContent(bonusCode, documentCommonXML);
kingdomNew.put("Bonus_"+i, bonus);
String bonusDescCode = "[BONUS_KINGDOM_DESCRIPTION_"+id+"_"+i+"]";
String bonusDesc = findXMLContent(bonusDescCode, documentCommonXML);
kingdomNew.put("Bonus_"+i+"_Description", bonusDesc);
}
String fileBase = kingdomOriginal.getString("FileBase");
kingdomNew.put("FileBase", fileBase);
objectKingdoms.put(kingdomName, kingdomNew);
if(kingdomOriginal.getBoolean("Used")) {
System.out.println("Kingdom: "+kingdomName);
} else {
txtImport.appendText("Kingdom: "+kingdomName+" (Ungenutzt)\n");
saveStatistic("Kingdom: "+kingdomName+" (Ungenutzt)");
System.out.println("Kingdom: "+kingdomName+" (Ungenutzt)");
}
}
txtImport.appendText("Kingdoms: "+objectKingdoms.length()+"\n\n");
saveStatistic("Kingdoms: "+objectKingdoms.length());
System.out.println("Kingdoms: "+objectKingdoms.length());
return objectKingdoms;
}
private JSONObject createTraits(JSONArray originalTraits) {
JSONObject objectTraits = new JSONObject();
for(int traitNr=0; traitNr<originalTraits.length(); traitNr++) {
JSONObject traitOriginal = (JSONObject) originalTraits.get(traitNr);
JSONObject traitNew = new JSONObject();
String traitName = findXMLContent(traitOriginal.getString("Name"), documentWorldXML);
traitNew.put("Name", traitName);
String traitDesc = findXMLContent(traitOriginal.getString("Description"), documentWorldXML);
traitNew.put("Description", traitDesc);
objectTraits.put(traitName, traitNew);
System.out.println("Trait: "+traitName);
}
txtImport.appendText("Traits: "+objectTraits.length()+"\n\n");
saveStatistic("Traits: "+objectTraits.length());
System.out.println("Traits: "+objectTraits.length());
return objectTraits;
}
private JSONObject createTroops(JSONArray originalTroops) {
JSONObject objectTroops = new JSONObject();
for(int troopNr = 0; troopNr< originalTroops.length(); troopNr++) {
JSONObject troopOriginal = (JSONObject) originalTroops.get(troopNr);
JSONObject troopNew = new JSONObject();
if(troopOriginal.getInt("Id") == 6127) {
continue;
}
String troopName = findXMLContent(troopOriginal.getString("Name"), documentWorldXML);
troopNew.put("Name", troopName);
String typ = troopOriginal.getString("TroopType");
troopNew.put("Typ", typ);
String rarity = getRarity(troopOriginal.getString("TroopRarity"));
troopNew.put("Rarity", rarity);
int id = troopOriginal.getInt("Id");
boolean used = false;
for(int i=0; i<arrayKingdomsOriginal.length(); i++) {
JSONObject kingdom = arrayKingdomsOriginal.getJSONObject(i);
JSONArray troopIds = kingdom.getJSONArray("TroopIds");
for(int j=0; j<troopIds.length(); j++) {
if(troopIds.getInt(j) == id) {
used = true;
String kingdomName = findXMLContent(kingdom.getString("Name"), documentWorldXML);
troopNew.put("Kingdom", kingdomName);
break;
}
}
if(used) {
break;
}
}
JSONObject manaColors = troopOriginal.getJSONObject("ManaColors");
troopNew.put("PrimaryColor", troopOriginal.getString("PrimaryColor"));
troopNew.put("ManaColors", manaColors);
int spellId = troopOriginal.getInt("SpellId");
for(int i=0; i<arraySpellsOriginal.length(); i++) {
JSONObject spell = arraySpellsOriginal.getJSONObject(i);
if(spell.getInt("Id") == spellId) {
String spellName = findXMLContent(spell.getString("Name"), documentWorldXML);
troopNew.put("Spell", spellName);
troopNew.put("Cost", spell.getInt("Cost"));
break;
}
}
JSONArray arrayTroopTraits = troopOriginal.getJSONArray("Traits");
String trait_1 = getTraitName(arrayTroopTraits.getString(0));
String trait_2 = getTraitName(arrayTroopTraits.getString(1));
String trait_3 = getTraitName(arrayTroopTraits.getString(2));
troopNew.put("Trait_1", trait_1);
troopNew.put("Trait_2", trait_2);
troopNew.put("Trait_3", trait_3);
String description = findXMLContent(troopOriginal.getString("Description"), documentWorldXML);
troopNew.put("Description", description);
String fileBase = troopOriginal.getString("FileBase");
troopNew.put("FileBase", fileBase);
JSONArray healthIncrease = troopOriginal.getJSONArray("HealthIncrease");
JSONArray armorIncrease = troopOriginal.getJSONArray("ArmorIncrease");
JSONArray attackIncrease = troopOriginal.getJSONArray("AttackIncrease");
JSONArray spellpowerIncrease = troopOriginal.getJSONArray("SpellPowerIncrease");
int baseHealth = troopOriginal.getInt("Health_Base");
int baseArmor = troopOriginal.getInt("Armor_Base");
int baseAttack = troopOriginal.getInt("Attack_Base");
int baseSpellpower = troopOriginal.getInt("SpellPower_Base");
JSONArray healthLevel = calculateLevelStats(baseHealth, healthIncrease);
troopNew.put("HealthPerLevel", healthLevel);
JSONArray armorLevel = calculateLevelStats(baseArmor, armorIncrease);
troopNew.put("ArmorPerLevel", armorLevel);
JSONArray attackLevel = calculateLevelStats(baseAttack, attackIncrease);
troopNew.put("AttackPerLevel", attackLevel);
JSONArray magicLevel = calculateLevelStats(baseSpellpower, spellpowerIncrease);
troopNew.put("MagicPerLevel", magicLevel);
if(!listTypes.contains(troopOriginal.getString("TroopType"))) {
listTypes.add(troopOriginal.getString("TroopType"));
}
if(used) {
System.out.println("Troop: "+troopName);
} else {
txtImport.appendText("Troop: "+troopName+" (Ungenutzt)\n");
saveStatistic("Troop: "+troopName+" (Ungenutzt)");
System.out.println("Troop: "+troopName+" (Ungenutzt)");
}
objectTroops.put(troopName, troopNew);
}
txtImport.appendText("Troops: "+objectTroops.length()+"\n\n");
saveStatistic("Troops: "+objectTroops.length());
System.out.println("Troops: "+objectTroops.length());
return objectTroops;
}
private JSONObject createSpells(JSONArray originalSpells) {
JSONObject objectSpells = new JSONObject();
for(int spellNr=0; spellNr<originalSpells.length(); spellNr++) {
JSONObject spellOriginal = (JSONObject) originalSpells.get(spellNr);
JSONObject spellNew = new JSONObject();
String spellName = findXMLContent(spellOriginal.getString("Name"), documentWorldXML);
spellNew.put("Name", spellName);
String traitDesc = findXMLContent(spellOriginal.getString("Description"), documentWorldXML);
spellNew.put("Description", traitDesc);
objectSpells.put(spellName, spellNew);
System.out.println("Trait: "+spellName);
}
txtImport.appendText("Traits: "+objectSpells.length()+"\n\n");
saveStatistic("Traits: "+objectSpells.length());
System.out.println("Traits: "+objectSpells.length());
return objectSpells;
}
private JSONObject createWeapons(JSONArray originalWeapons) {
JSONObject objectWeapons = new JSONObject();
for(int weaponNr=0; weaponNr<originalWeapons.length(); weaponNr++) {
JSONObject weaponOriginal = (JSONObject) originalWeapons.get(weaponNr);
JSONObject weaponNew = new JSONObject();
String weaponName = findXMLContent(weaponOriginal.getString("Name"), documentWorldXML);
weaponNew.put("Name", weaponName);
String rarity = getRarity(weaponOriginal.getString("WeaponRarity"));
weaponNew.put("Rarity", rarity);
JSONObject manaColors = weaponOriginal.getJSONObject("ManaColors");
weaponNew.put("ManaColors", manaColors);
String fileBase = weaponOriginal.getString("FileBase");
weaponNew.put("FileBase", fileBase);
objectWeapons.put(weaponName, weaponNew);
System.out.println("Weapon: "+weaponName);
}
txtImport.appendText("Weapons: "+objectWeapons.length()+"\n\n");
saveStatistic("Weapons: "+objectWeapons.length());
System.out.println("Weapons: "+objectWeapons.length());
return objectWeapons;
}
private String getRarity(String replace) {
switch(replace) {
case "Uncommon":
return "Rare";
case "Rare":
return "UltraRare";
case "UltraRare":
return "Epic";
case "Epic":
return "Legendary";
case "Legendary":
return "Mythic";
default:
return "----";
}
}
private JSONArray getTroopNames(JSONArray troopIds) {
JSONArray troopNames = new JSONArray();
for(int i=0; i<troopIds.length(); i++) {
int id = troopIds.getInt(i);
for(int j=0; j<arrayTroopsOriginal.length(); j++) {
JSONObject troop = arrayTroopsOriginal.getJSONObject(j);
if(troop.getInt("Id") == id) {
String troopName = findXMLContent(troop.getString("Name"), documentWorldXML);
troopNames.put(i, troopName);
break;
}
}
}
return troopNames;
}
private String getTraitName(String code) {
String traitName = "----";
for(int i=0; i<arrayTraitsOriginal.length(); i++) {
JSONObject trait = arrayTraitsOriginal.getJSONObject(i);
if(trait.getString("Code").equals(code)) {
String trait1Code = trait.getString("Name");
traitName = findXMLContent(trait1Code, documentWorldXML);
return traitName;
}
}
return traitName;
}
private JSONArray calculateLevelStats(int base, JSONArray increase) {
JSONArray levelUp = new JSONArray();
for(int i=0; i<increase.length(); i++) {
if(i == 0) {
levelUp.put(i, base+increase.getInt(i));
} else {
levelUp.put(i, levelUp.getInt(i-1)+increase.getInt(i));
}
}
return levelUp;
}
private String findXMLContent(String searchString, Document documentXML) {
String foundString;
NodeList childList = documentXML.getElementsByTagName("Text");
int length = childList.getLength();
for(int i=0; i<length; i++) {
if(childList.item(i).getAttributes().getLength() == 1) {
NamedNodeMap nodemap = childList.item(i).getAttributes();
if(nodemap.getNamedItem("tag").getTextContent().equals(searchString)) {
foundString = childList.item(i).getTextContent();
return foundString;
}
}
}
return searchString;
}
private void saveNewJSON(String jsonNew) {
try {
FileWriter fw = new FileWriter(saveAs);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(jsonNew);
bw.close();
System.out.println("Neue Datei \""+saveAs+"\" erstellt!");
} catch (IOException e) {
e.printStackTrace();
}
}
private void saveStatistic(String save) {
try {
FileWriter fw = new FileWriter(new File("statistic.txt"), true);
BufferedWriter bw = new BufferedWriter(fw);
bw.append(save).append("\n");
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}