Added package batch file, configured application for building applications.
This commit is contained in:
parent
a9c335dcca
commit
cca7fc544a
|
@ -111,3 +111,4 @@ buildNumber.properties
|
||||||
|
|
||||||
.idea/
|
.idea/
|
||||||
clusters/
|
clusters/
|
||||||
|
output/
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
call mvn clean package
|
||||||
|
call jpackage ^
|
||||||
|
--type app-image ^
|
||||||
|
--verbose ^
|
||||||
|
--dest target\image ^
|
||||||
|
--name CrystalKeep ^
|
||||||
|
--icon src/main/resources/nl/andrewlalis/crystalkeep/ui/images/cluster_node_icon.png ^
|
||||||
|
--module crystalkeep/nl.andrewlalis.crystalkeep.CrystalKeep ^
|
||||||
|
--module-path target\modules ^
|
||||||
|
--module-path target\classes ^
|
||||||
|
--win-console ^
|
55
pom.xml
55
pom.xml
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
<groupId>nl.andrewlalis</groupId>
|
<groupId>nl.andrewlalis</groupId>
|
||||||
<artifactId>crystalkeep</artifactId>
|
<artifactId>crystalkeep</artifactId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>0.0.1</version>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<maven.compiler.source>11</maven.compiler.source>
|
<maven.compiler.source>11</maven.compiler.source>
|
||||||
|
@ -14,23 +14,11 @@
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
<javafx.version>16</javafx.version>
|
<javafx.version>16</javafx.version>
|
||||||
|
<project.mainClass>nl.andrewlalis.crystalkeep.CrystalKeep</project.mainClass>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
|
||||||
<groupId>org.openjfx</groupId>
|
|
||||||
<artifactId>javafx-maven-plugin</artifactId>
|
|
||||||
<version>0.0.4</version>
|
|
||||||
<configuration>
|
|
||||||
<mainClass>nl.andrewlalis.crystalkeep.CrystalKeep</mainClass>
|
|
||||||
<noManPages>true</noManPages>
|
|
||||||
<stripDebug>true</stripDebug>
|
|
||||||
<compress>2</compress>
|
|
||||||
<noHeaderFiles>true</noHeaderFiles>
|
|
||||||
<launcher>crystalkeep</launcher>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
@ -42,27 +30,36 @@
|
||||||
<version>2.22.2</version>
|
<version>2.22.2</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.openjfx</groupId>
|
||||||
<artifactId>maven-assembly-plugin</artifactId>
|
<artifactId>javafx-maven-plugin</artifactId>
|
||||||
<version>3.3.0</version>
|
<version>0.0.4</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<archive>
|
<source>${java.version}</source>
|
||||||
<manifest>
|
<target>${java.version}</target>
|
||||||
<mainClass>nl.andrewlalis.crystalkeep.CrystalKeep</mainClass>
|
<release>${java.version}</release>
|
||||||
</manifest>
|
<mainClass>${project.mainClass}</mainClass>
|
||||||
</archive>
|
<jlinkVerbose>true</jlinkVerbose>
|
||||||
<descriptorRefs>
|
<jmodsPath>${project.build.directory}/modules</jmodsPath>
|
||||||
<descriptorRef>jar-with-dependencies</descriptorRef>
|
<mainClass>${main.class}</mainClass>
|
||||||
</descriptorRefs>
|
<stripDebug>true</stripDebug>
|
||||||
<appendAssemblyId>true</appendAssemblyId>
|
<jlinkZipName>test</jlinkZipName>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<!-- Copies all dependencies into a target/modules directory so that jpackage can reference this. -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-dependency-plugin</artifactId>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<id>make-assembly</id>
|
<id>copy-dependencies</id>
|
||||||
<phase>package</phase>
|
<phase>prepare-package</phase>
|
||||||
<goals>
|
<goals>
|
||||||
<goal>single</goal>
|
<goal>copy-dependencies</goal>
|
||||||
</goals>
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<includeScope>runtime</includeScope>
|
||||||
|
<outputDirectory>${project.build.directory}/modules</outputDirectory>
|
||||||
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
|
@ -6,11 +6,13 @@ import javafx.geometry.Pos;
|
||||||
import javafx.scene.control.*;
|
import javafx.scene.control.*;
|
||||||
import javafx.scene.layout.VBox;
|
import javafx.scene.layout.VBox;
|
||||||
import javafx.stage.FileChooser;
|
import javafx.stage.FileChooser;
|
||||||
|
import javafx.util.Duration;
|
||||||
import nl.andrewlalis.crystalkeep.io.ClusterIO;
|
import nl.andrewlalis.crystalkeep.io.ClusterIO;
|
||||||
import nl.andrewlalis.crystalkeep.model.*;
|
import nl.andrewlalis.crystalkeep.model.*;
|
||||||
import nl.andrewlalis.crystalkeep.view.ClusterTreeItem;
|
import nl.andrewlalis.crystalkeep.view.ClusterTreeItem;
|
||||||
import nl.andrewlalis.crystalkeep.view.CrystalItemTreeCell;
|
import nl.andrewlalis.crystalkeep.view.CrystalItemTreeCell;
|
||||||
import nl.andrewlalis.crystalkeep.view.ShardTreeItem;
|
import nl.andrewlalis.crystalkeep.view.ShardTreeItem;
|
||||||
|
import org.controlsfx.control.Notifications;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
@ -82,8 +84,11 @@ public class MainViewController implements ModelListener {
|
||||||
this.model.setActiveClusterPassword(pw);
|
this.model.setActiveClusterPassword(pw);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
Notifications.create()
|
||||||
new Alert(Alert.AlertType.WARNING, "Could not load cluster.").showAndWait();
|
.text("Could not load cluster. Check that your password is correct.")
|
||||||
|
.hideAfter(Duration.seconds(3))
|
||||||
|
.owner(this.shardDetailContainer.getScene().getWindow())
|
||||||
|
.show();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
model.setActiveCluster(cluster);
|
model.setActiveCluster(cluster);
|
||||||
|
@ -115,6 +120,8 @@ public class MainViewController implements ModelListener {
|
||||||
chooser.setSelectedExtensionFilter(new FileChooser.ExtensionFilter("Cluster Files", "cts"));
|
chooser.setSelectedExtensionFilter(new FileChooser.ExtensionFilter("Cluster Files", "cts"));
|
||||||
if (path != null) {
|
if (path != null) {
|
||||||
chooser.setInitialDirectory(path.getParent().toFile());
|
chooser.setInitialDirectory(path.getParent().toFile());
|
||||||
|
} else {
|
||||||
|
chooser.setInitialDirectory(ClusterIO.CLUSTER_PATH.toFile());
|
||||||
}
|
}
|
||||||
File file = chooser.showSaveDialog(this.clusterTreeView.getScene().getWindow());
|
File file = chooser.showSaveDialog(this.clusterTreeView.getScene().getWindow());
|
||||||
if (file == null) return;
|
if (file == null) return;
|
||||||
|
@ -154,16 +161,27 @@ public class MainViewController implements ModelListener {
|
||||||
pw = this.promptPassword().orElse(new char[0]);
|
pw = this.promptPassword().orElse(new char[0]);
|
||||||
}
|
}
|
||||||
ClusterIO loader = new ClusterIO();
|
ClusterIO loader = new ClusterIO();
|
||||||
|
if (!path.getFileName().toString().trim().toLowerCase().endsWith(".cts")) {
|
||||||
|
path = path.resolveSibling(path.getFileName() + ".cts");
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
if (pw.length == 0) {
|
if (pw.length == 0) {
|
||||||
loader.saveUnencrypted(model.getActiveCluster(), path);
|
loader.saveUnencrypted(model.getActiveCluster(), path);
|
||||||
} else {
|
} else {
|
||||||
loader.save(model.getActiveCluster(), path, pw);
|
loader.save(model.getActiveCluster(), path, pw);
|
||||||
}
|
}
|
||||||
|
Notifications.create()
|
||||||
|
.text("Cluster saved to " + path)
|
||||||
|
.hideAfter(Duration.seconds(3))
|
||||||
|
.owner(this.shardDetailContainer.getScene().getWindow())
|
||||||
|
.show();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
var alert = new Alert(Alert.AlertType.ERROR, "Could not save cluster.");
|
Notifications.create()
|
||||||
alert.showAndWait();
|
.text("Could not save cluster.")
|
||||||
|
.hideAfter(Duration.seconds(3))
|
||||||
|
.owner(this.shardDetailContainer.getScene().getWindow())
|
||||||
|
.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,8 +33,15 @@ import java.security.spec.KeySpec;
|
||||||
* @see nl.andrewlalis.crystalkeep.io.serialization.ClusterSerializer
|
* @see nl.andrewlalis.crystalkeep.io.serialization.ClusterSerializer
|
||||||
*/
|
*/
|
||||||
public class ClusterIO {
|
public class ClusterIO {
|
||||||
public static final Path CLUSTER_PATH = Path.of("clusters");
|
public static final Path CLUSTER_PATH = Path.of(System.getProperty("user.home"), ".crystalkeep", "clusters");
|
||||||
public static final int FILE_VERSION = 1;
|
public static final int FILE_VERSION = 1;
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
Files.createDirectories(CLUSTER_PATH);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private final SecureRandom random;
|
private final SecureRandom random;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,13 @@
|
||||||
package nl.andrewlalis.crystalkeep.util;
|
package nl.andrewlalis.crystalkeep.util;
|
||||||
|
|
||||||
public class StringUtils {
|
public class StringUtils {
|
||||||
|
public static final String[] IMAGE_TYPES = {
|
||||||
|
"png", "jpg", "jpeg", "gif"
|
||||||
|
};
|
||||||
|
public static final String[] PLAIN_TEXT_TYPES = {
|
||||||
|
"txt"
|
||||||
|
};
|
||||||
|
|
||||||
public static boolean endsWithAny(String s, String... suffixes) {
|
public static boolean endsWithAny(String s, String... suffixes) {
|
||||||
for (String suffix : suffixes) {
|
for (String suffix : suffixes) {
|
||||||
if (s.endsWith(suffix)) return true;
|
if (s.endsWith(suffix)) return true;
|
||||||
|
|
|
@ -74,12 +74,18 @@ public class FileShardViewModel extends ShardViewModel<FileShard> {
|
||||||
gp.add(extractFileButton, 1, 2);
|
gp.add(extractFileButton, 1, 2);
|
||||||
container.getChildren().add(gp);
|
container.getChildren().add(gp);
|
||||||
|
|
||||||
if (StringUtils.endsWithAny(shard.getFileName().toLowerCase(), ".png", ".jpg", ".jpeg", ".gif")) {
|
if (StringUtils.endsWithAny(shard.getFileName().toLowerCase(), StringUtils.IMAGE_TYPES)) {
|
||||||
container.getChildren().add(new Separator(Orientation.HORIZONTAL));
|
container.getChildren().add(new Separator(Orientation.HORIZONTAL));
|
||||||
ImageView imageView = new ImageView(new Image(new ByteArrayInputStream(shard.getContents())));
|
ImageView imageView = new ImageView(new Image(new ByteArrayInputStream(shard.getContents())));
|
||||||
imageView.setPreserveRatio(true);
|
imageView.setPreserveRatio(true);
|
||||||
ScrollPane scrollPane = new ScrollPane(imageView);
|
ScrollPane scrollPane = new ScrollPane(imageView);
|
||||||
container.getChildren().add(scrollPane);
|
container.getChildren().add(scrollPane);
|
||||||
|
} else if (StringUtils.endsWithAny(shard.getFileName().toLowerCase(), StringUtils.PLAIN_TEXT_TYPES)) {
|
||||||
|
container.getChildren().add(new Separator(Orientation.HORIZONTAL));
|
||||||
|
TextArea textArea = new TextArea(new String(shard.getContents()));
|
||||||
|
textArea.setEditable(false);
|
||||||
|
textArea.setWrapText(true);
|
||||||
|
container.getChildren().add(textArea);
|
||||||
}
|
}
|
||||||
|
|
||||||
return container;
|
return container;
|
||||||
|
|
Loading…
Reference in New Issue