Add configurator GUI
This commit is contained in:
parent
1d574b3ee1
commit
a6728214b2
|
@ -1,31 +1,50 @@
|
|||
package pl.mikorosa.dziecoin;
|
||||
|
||||
import pl.mikorosa.dziecoin.database.DatabaseConnection;
|
||||
import pl.mikorosa.dziecoin.gui.ImportRuntime;
|
||||
import pl.mikorosa.dziecoin.gui.MainFrame;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class Main {
|
||||
public static int difficulty;
|
||||
public static Blockchain blockchain;
|
||||
public static MainFrame mainFrame;
|
||||
public static DatabaseConnection db;
|
||||
public static MainFrame mainFrame;
|
||||
|
||||
public static void main(String[] args) {
|
||||
db = new DatabaseConnection();
|
||||
|
||||
ImportRuntime importRuntime = new ImportRuntime();
|
||||
importRuntime.setVisible(true);
|
||||
}
|
||||
|
||||
public static void initImport(String blocksCSVPath, String transactionCSVPath, String NFTCSVPath, boolean autoImportToDatabase) {
|
||||
blockchain = new Blockchain(blocksCSVPath, transactionCSVPath, NFTCSVPath, autoImportToDatabase);
|
||||
mainFrame = new MainFrame();
|
||||
mainFrame.setVisible(true);
|
||||
}
|
||||
|
||||
public static void initFromDatabase(boolean importToDatabase) {
|
||||
blockchain = new Blockchain(importToDatabase);
|
||||
mainFrame = new MainFrame();
|
||||
mainFrame.setVisible(true);
|
||||
}
|
||||
|
||||
public static void initFromZero(boolean autoImportToDatabase) {
|
||||
Wallet w1 = new Wallet();
|
||||
Wallet w2 = new Wallet();
|
||||
Wallet w3 = new Wallet();
|
||||
|
||||
difficulty = 4;
|
||||
blockchain = new Blockchain(w1.getAddress(), false);
|
||||
|
||||
blockchain = new Blockchain(w1.getAddress(), autoImportToDatabase);
|
||||
mainFrame = new MainFrame();
|
||||
mainFrame.setVisible(true);
|
||||
|
||||
NFT n1 = new NFT(w1.getAddress(), "licencja na wozek widlowy");
|
||||
NFT n2 = new NFT(w1.getAddress(), "legitymacja");
|
||||
|
||||
List<Transaction> t1 = new ArrayList<>();
|
||||
t1.add(new Transaction(w1.getAddress(), w2.getAddress(), 5));
|
||||
|
@ -33,13 +52,16 @@ public class Main {
|
|||
Block b1 = new Block(blockchain.getLatestBlock().getHash(), blockchain.getLength() + 1, t1);
|
||||
|
||||
b1.addNFT(n1);
|
||||
b1.addNFT(n2);
|
||||
|
||||
b1.mineBlock();
|
||||
|
||||
|
||||
try {
|
||||
blockchain.addBlock(b1);
|
||||
} catch (BlockchainIntegrityException e) {
|
||||
System.out.println("Blockchain Integrity Exception: " + e.getMessage());
|
||||
JOptionPane.showMessageDialog(null, "Unable to add a block: " + e.getMessage(), "Fatal error", JOptionPane.ERROR_MESSAGE);
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
List<Transaction> t2 = new ArrayList<>();
|
||||
|
@ -52,7 +74,14 @@ public class Main {
|
|||
try {
|
||||
blockchain.addBlock(b2);
|
||||
} catch (BlockchainIntegrityException e) {
|
||||
System.out.println("Blockchain Integrity Exception: " + e.getMessage());
|
||||
JOptionPane.showMessageDialog(null, "Unable to add a block: " + e.getMessage(), "Fatal error", JOptionPane.ERROR_MESSAGE);
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
try {
|
||||
blockchain.exportData(0b111);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,254 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="pl.mikorosa.dziecoin.gui.ImportRuntime">
|
||||
<grid id="27dc6" binding="panel" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<xy x="20" y="20" width="738" height="400"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<grid id="197a7" layout-manager="GridLayoutManager" row-count="1" column-count="4" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<component id="1297" class="javax.swing.JLabel">
|
||||
<constraints>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Difficulty"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="f882a" class="javax.swing.JTextField" binding="difficulty">
|
||||
<constraints>
|
||||
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
|
||||
<preferred-size width="150" height="-1"/>
|
||||
</grid>
|
||||
</constraints>
|
||||
<properties/>
|
||||
</component>
|
||||
<component id="7e134" class="javax.swing.JButton" binding="runButton" default-binding="true">
|
||||
<constraints>
|
||||
<grid row="0" column="3" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Run"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="16627" class="javax.swing.JCheckBox" binding="updateDatabaseCheckBox" default-binding="true">
|
||||
<constraints>
|
||||
<grid row="0" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Update database?"/>
|
||||
</properties>
|
||||
</component>
|
||||
</children>
|
||||
</grid>
|
||||
<grid id="7b5b3" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<tabbedpane id="38380" binding="tabbedPane1" default-binding="true">
|
||||
<constraints>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false">
|
||||
<preferred-size width="200" height="200"/>
|
||||
</grid>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<grid id="f9e4d" layout-manager="GridLayoutManager" row-count="4" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<tabbedpane title="Create new"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<component id="816e7" class="javax.swing.JLabel">
|
||||
<constraints>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="This will create:"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="b09ad" class="javax.swing.JLabel">
|
||||
<constraints>
|
||||
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="- 3 wallets"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="66f6f" class="javax.swing.JLabel">
|
||||
<constraints>
|
||||
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="- 2 NFTs (assigned to first wallet)"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="9d938" class="javax.swing.JLabel">
|
||||
<constraints>
|
||||
<grid row="3" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="- 3 blocks consisting of 4 transactions"/>
|
||||
</properties>
|
||||
</component>
|
||||
</children>
|
||||
</grid>
|
||||
<grid id="ebcc8" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<tabbedpane title="Import from files"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<grid id="ad958" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<component id="b7191" class="javax.swing.JButton" binding="browseBlock">
|
||||
<constraints>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Browse for blocks.csv"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="58e66" class="javax.swing.JButton" binding="browseTransaction">
|
||||
<constraints>
|
||||
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Browse for transactions.csv"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="a0011" class="javax.swing.JButton" binding="browseNFT">
|
||||
<constraints>
|
||||
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Browse for nfts.csv"/>
|
||||
</properties>
|
||||
</component>
|
||||
</children>
|
||||
</grid>
|
||||
<grid id="8fe77" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<component id="1be19" class="javax.swing.JLabel" binding="blockLabel">
|
||||
<constraints>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="No file selected"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="2a87d" class="javax.swing.JLabel" binding="transactionLabel">
|
||||
<constraints>
|
||||
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="No file selected"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="35e38" class="javax.swing.JLabel" binding="NFTLabel">
|
||||
<constraints>
|
||||
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="No file selected"/>
|
||||
</properties>
|
||||
</component>
|
||||
</children>
|
||||
</grid>
|
||||
</children>
|
||||
</grid>
|
||||
<grid id="975dd" layout-manager="GridLayoutManager" row-count="6" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<tabbedpane title="Import from database"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<component id="7c5e2" class="javax.swing.JLabel">
|
||||
<constraints>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Database connection details:"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="1446d" class="javax.swing.JLabel">
|
||||
<constraints>
|
||||
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Type: MySQL"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="8786f" class="javax.swing.JLabel">
|
||||
<constraints>
|
||||
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Server: helium.mikorosa.pl"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="ac823" class="javax.swing.JLabel">
|
||||
<constraints>
|
||||
<grid row="3" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Port: 3306"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="fe1f9" class="javax.swing.JLabel">
|
||||
<constraints>
|
||||
<grid row="4" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Username: dziecoin"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="f43d3" class="javax.swing.JLabel">
|
||||
<constraints>
|
||||
<grid row="5" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Database: dziecoin"/>
|
||||
</properties>
|
||||
</component>
|
||||
</children>
|
||||
</grid>
|
||||
</children>
|
||||
</tabbedpane>
|
||||
</children>
|
||||
</grid>
|
||||
</children>
|
||||
</grid>
|
||||
</form>
|
|
@ -0,0 +1,111 @@
|
|||
package pl.mikorosa.dziecoin.gui;
|
||||
|
||||
import pl.mikorosa.dziecoin.Main;
|
||||
import pl.mikorosa.dziecoin.database.DatabaseConnection;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
import static pl.mikorosa.dziecoin.Main.*;
|
||||
|
||||
public class ImportRuntime extends JFrame {
|
||||
private JPanel panel;
|
||||
private JTextField difficulty;
|
||||
private JButton runButton;
|
||||
private JTabbedPane tabbedPane1;
|
||||
private JButton browseBlock;
|
||||
private JButton browseTransaction;
|
||||
private JButton browseNFT;
|
||||
private JCheckBox updateDatabaseCheckBox;
|
||||
private JLabel blockLabel;
|
||||
private JLabel transactionLabel;
|
||||
private JLabel NFTLabel;
|
||||
|
||||
private String blocksCSVPath;
|
||||
private String transactionsCSVPath;
|
||||
private String NFTsCSVPath;
|
||||
|
||||
public enum ImportType {
|
||||
NEW,
|
||||
FROM_FILE,
|
||||
FROM_DATABASE
|
||||
}
|
||||
|
||||
public ImportRuntime() {
|
||||
super("DzieCoin Initial Configuration");
|
||||
this.setContentPane(this.panel);
|
||||
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
this.setPreferredSize(new Dimension(640, 360));
|
||||
this.pack();
|
||||
|
||||
runButton.addActionListener(e -> {
|
||||
int diff = 0;
|
||||
ImportType type = null;
|
||||
|
||||
String errorMessage = "";
|
||||
String input;
|
||||
|
||||
try {
|
||||
input = difficulty.getText();
|
||||
if(input == null) throw new Exception();
|
||||
diff = Integer.parseInt(input);
|
||||
if(diff <= 0) throw new Exception();
|
||||
} catch(Exception ex) {
|
||||
errorMessage = "Input correct number";
|
||||
}
|
||||
|
||||
if(tabbedPane1.getSelectedIndex() == 0) type = ImportType.NEW;
|
||||
if(tabbedPane1.getSelectedIndex() == 1) type = ImportType.FROM_FILE;
|
||||
if(tabbedPane1.getSelectedIndex() == 2) type = ImportType.FROM_DATABASE;
|
||||
|
||||
if(!errorMessage.isEmpty()) JOptionPane.showMessageDialog(null, errorMessage, "DzieCoin Initial Configuration", JOptionPane.ERROR_MESSAGE);
|
||||
else if(type == ImportType.FROM_FILE) {
|
||||
if(blocksCSVPath == null || transactionsCSVPath == null || NFTsCSVPath == null) JOptionPane.showMessageDialog(null, "Choose all three files to proceed", "DzieCoin Initial Configuration", JOptionPane.ERROR_MESSAGE);
|
||||
else {
|
||||
runButton.setEnabled(false);
|
||||
|
||||
Main.difficulty = diff;
|
||||
Main.db = new DatabaseConnection();
|
||||
|
||||
this.setVisible(false);
|
||||
this.dispose();
|
||||
|
||||
initImport(blocksCSVPath, transactionsCSVPath, NFTsCSVPath, updateDatabaseCheckBox.isSelected());
|
||||
}
|
||||
}
|
||||
else {
|
||||
runButton.setEnabled(false);
|
||||
|
||||
Main.difficulty = diff;
|
||||
Main.db = new DatabaseConnection();
|
||||
|
||||
this.setVisible(false);
|
||||
this.dispose();
|
||||
|
||||
if(type == ImportType.NEW) initFromZero(updateDatabaseCheckBox.isSelected());
|
||||
if(type == ImportType.FROM_DATABASE) initFromDatabase(updateDatabaseCheckBox.isSelected());
|
||||
}
|
||||
});
|
||||
|
||||
browseBlock.addActionListener(e -> {
|
||||
JFileChooser fc = new JFileChooser();
|
||||
fc.showOpenDialog(null);
|
||||
blockLabel.setText(fc.getSelectedFile().getName());
|
||||
blocksCSVPath = fc.getSelectedFile().getAbsolutePath();
|
||||
});
|
||||
|
||||
browseTransaction.addActionListener(e -> {
|
||||
JFileChooser fc = new JFileChooser();
|
||||
fc.showOpenDialog(null);
|
||||
transactionLabel.setText(fc.getSelectedFile().getName());
|
||||
transactionsCSVPath = fc.getSelectedFile().getAbsolutePath();
|
||||
});
|
||||
|
||||
browseNFT.addActionListener(e -> {
|
||||
JFileChooser fc = new JFileChooser();
|
||||
fc.showOpenDialog(null);
|
||||
NFTLabel.setText(fc.getSelectedFile().getName());
|
||||
NFTsCSVPath = fc.getSelectedFile().getAbsolutePath();
|
||||
});
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue