Skip to content

Commit

Permalink
Fix Resource Loading for .jar release
Browse files Browse the repository at this point in the history
  • Loading branch information
PhilKes committed Jan 19, 2020
1 parent 4ab995d commit d9acaf3
Show file tree
Hide file tree
Showing 5 changed files with 182 additions and 77 deletions.
26 changes: 14 additions & 12 deletions src/client/Client.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public class Client {
private int loadingCount;
private AtomicBoolean loading;
private Stage loadingStage;
private String theme = "Default";
private String theme="Default";

/**
* Storing all Controllers of open FXMLs, top of stack = current active Controller
Expand Down Expand Up @@ -274,7 +274,7 @@ public void storeMessageLocal(Message message) {
*/
private void storeMessageStore() {
System.out.println("Storing local messages");
new MessageParser().storeMessageStore(messageStore);
new MessageParser().storeMessageStore(messageStore, true);
messageStore.getMessages().clear();
}

Expand All @@ -293,6 +293,7 @@ public void fetchAndShowLocalMessageStore() {
}

public void resetLocalMessageStore() {
messageStore.getMessages().clear();
if(new MessageParser().resetMessageStore(getAccount().getUserName())) {
((UIControllerWithInfo) peekController()).showInfo("MessageStore has been reset", UIControllerWithInfo.InfoType.SUCCESS);
}
Expand Down Expand Up @@ -366,19 +367,20 @@ public void setLoading(boolean loading) {
}
}

public void changeTheme(String newTheme){
String def = getClass().getResource("./presentation/resources/main.css").toExternalForm();
String ocean = getClass().getResource("./presentation/resources/BlueTheme.css").toExternalForm();
theme = newTheme;
if(newTheme.equals("Default")){
for(UIController controller : controllerStack){
Parent parent = controller.getStage().getScene().getRoot();
public void changeTheme(String newTheme) {
String def=getClass().getResource("presentation/resources/main.css").toExternalForm();
String ocean=getClass().getResource("presentation/resources/BlueTheme.css").toExternalForm();
theme=newTheme;
if(newTheme.equals("Default")) {
for(UIController controller : controllerStack) {
Parent parent=controller.getStage().getScene().getRoot();
parent.getStylesheets().clear();
parent.getStylesheets().add(def);
}
}else if(newTheme.equals("Ocean")){
for(UIController controller : controllerStack){
Parent parent = controller.getStage().getScene().getRoot();
}
else if(newTheme.equals("Ocean")) {
for(UIController controller : controllerStack) {
Parent parent=controller.getStage().getScene().getRoot();
parent.getStylesheets().clear();
parent.getStylesheets().add(ocean);
}
Expand Down
25 changes: 11 additions & 14 deletions src/client/MessageParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.File;
import java.io.InputStream;

/**
Expand Down Expand Up @@ -34,6 +33,7 @@ public MessageStore getMessageStore(String userName) {
MessageStore store=null;
InputStream in=FXUtil.getMessageStoreFileStream(userName);
if(in==null) {
System.out.println("Empty MessageStore");
return new MessageStore();
}
try {
Expand All @@ -47,10 +47,13 @@ public MessageStore getMessageStore(String userName) {
return store;
}

public boolean storeMessageStore(MessageStore store) {
public boolean storeMessageStore(MessageStore store, boolean merge) {
System.out.println("Storing MessageStore of " + store.getUserName());
MessageStore fileStore=getMessageStore(store.getUserName());
fileStore.getMessages().addAll(store.getMessages());
MessageStore fileStore=store;
if(merge) {
fileStore=getMessageStore(store.getUserName());
fileStore.getMessages().addAll(store.getMessages());
}
try {
jaxbMarshaller.marshal(fileStore, FXUtil.getMessageStoreFileOutStream(store.getUserName()));
//jaxbMarshaller.marshal(fileStore, System.out);
Expand All @@ -63,15 +66,9 @@ public boolean storeMessageStore(MessageStore store) {
}

public boolean resetMessageStore(String userName) {
File store = FXUtil.getMessageStoreFile(userName);
if (store.exists()) {
if (store.delete()) {
return true;
} else {
return false;
}
} else {
return true;
}
MessageStore store=new MessageStore();
store.setUserName(userName);
storeMessageStore(store, false);
return true;
}
}
160 changes: 119 additions & 41 deletions src/client/presentation/FXUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,28 @@
import org.apache.commons.io.FileUtils;

import java.io.*;
import java.util.Arrays;
import java.util.Base64;
import java.util.List;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
* JavaFX Util Class for external resoruces,...
*/
public class FXUtil {
public static boolean onJar=false;
private static final Image DEFAULT_AVATAR_MIN=new Image(UIController.class.getResourceAsStream("resources/default_avatar_min.png"));
private static final Image DEFAULT_AVATAR=new Image(UIController.class.getResourceAsStream("resources/default_avatar.png"));
private static final Image DEFAULT_ICON=new Image(UIController.class.getResourceAsStream("resources/icon.png"));
public static final Image DEFAULT_GROUP_PIC=new Image(UIController.class.getResourceAsStream("resources/icon.png"));
public static final double SMILEY_BAR_HEIGHT = 46.0, SMILEY_BAR_WIDTH = 687.0;
private static final File SMILEY_PATH = getSmileyDirFile();
public static final double SMILEY_BAR_HEIGHT=46.0, SMILEY_BAR_WIDTH=687.0;
public static final List<String> SMILEY_PATHS=getSmileyImagePaths();

public static Image getDefaultAvatarMin() {
return DEFAULT_AVATAR_MIN;
Expand Down Expand Up @@ -123,74 +130,145 @@ public static void showInfo(Label labelInfo, String message, UIControllerWithInf
public static OutputStream getMessageStoreFileOutStream(String userName) {
File file=null;
try {
String resourceUrl=UIController.class.getResource("resources/").getPath();
String resourceUrl=null;
if(onJar) {
resourceUrl="client/";
}
else {
resourceUrl=UIController.class.getResource("resources/").getPath();
}
resourceUrl+="messageStore_" + userName + ".xml";
System.out.println("ResourceURL: " + resourceUrl);
file=new File(resourceUrl);
file.createNewFile();
OutputStream output=new FileOutputStream(file);
return output;
} catch(FileNotFoundException e) {
}
catch(FileNotFoundException e) {
e.printStackTrace();
} catch(IOException e) {
}
catch(IOException e) {
e.printStackTrace();
}

return null;
}

public static InputStream getMessageStoreFileStream(String userName) {
return UIController.class.getResourceAsStream("resources/messageStore_" + userName + ".xml");
if(onJar) {
final URI url;
try {
return new FileInputStream("client/messageStore_" + userName + ".xml");
}

catch(IOException e) {
e.printStackTrace();
}
}
else {
return UIController.class.getResourceAsStream("resources/messageStore_" + userName + ".xml");
}
return null;
}

public static File getMessageStoreFile(String userName) {
return new File(UIController.class.getResource("resources/").getPath() + "messageStore_" + userName + ".xml");
if(onJar) {
return new File("client/messageStore_" + userName + ".xml");
}
else {
return new File(UIController.class.getResource("resources/").getPath() + "messageStore_" + userName + ".xml");
}
}

public static File getSmileyDirFile() {
return new File(UIController.class.getResource("resources/smileys/").getPath());
File f=new File(FXUtil.class.getResource("resources/smileys/").getPath());
System.out.println("Smiley path :" + f.getPath());
return f;
}

/* public static Image getSmileyImage(int i) {
File smileyDir = SMILEY_PATH;
File[] smileys = null;
smileys= smileyDir.listFiles();
if(smileys.length<i || i<0) {
return null;
}
File smiley = smileys[i];
return new Image(smiley.toURI().toString());
}*/
public static Image getSmileyImage(int i) {
File smileyDir = SMILEY_PATH;
File[] smileys = smileyDir.listFiles();
if(smileys.length<i || i<0) {
return null;
}
File smiley = smileys[i];
return new Image(smiley.toURI().toString());
return new Image(UIController.class.getResourceAsStream(SMILEY_PATHS.get(i)));
}

public static String getSmileyImagePath(int i) {
File smileyDir = SMILEY_PATH;
File[] smileys = smileyDir.listFiles();
if (smileys.length < i) {
return null;
public static List<String> getSmileyImagePaths() {
try {
return getPaths("resources/smileys/");
}
File smiley = smileys[i];
return smiley.getPath();
catch(IOException e) {
e.printStackTrace();
}
return null;
}

public static List<String> getSmileyImagePaths() {
File smileyDir = SMILEY_PATH;
File[] smileys = smileyDir.listFiles();
return Arrays.stream(smileys).map(f -> f.getPath()).collect(Collectors.toList());
public static List<String> getPaths(String folderPath) throws IOException {
final File jarFile=new File(FXUtil.class.getProtectionDomain().getCodeSource().getLocation().getPath());
List<String> filePaths=new ArrayList<>();
if(jarFile.isFile()) { // Run with JAR file
System.out.println("JAR File: " + jarFile.getPath());
onJar=true;
try {
final URI url=FXUtil.class.getResource(folderPath).toURI();
FileSystem fileSystem=FileSystems.newFileSystem(url, Collections.<String, Object>emptyMap());
Path path=fileSystem.getPath("/client/presentation/resources/smileys");
Stream<Path> walk=Files.walk(path, 1);
for(Iterator<Path> it=walk.iterator(); it.hasNext(); ) {
Path next=it.next();
filePaths.add("/client/presentation/resources/smileys/" + next.getFileName().toString());
}
filePaths.remove(0); //Folder entry
Collections.sort(filePaths);
}
catch(URISyntaxException e) {
e.printStackTrace();
}
}
else { // Run with IDE
final URL url=FXUtil.class.getResource(folderPath);
if(url!=null) {
try {
final File apps=new File(url.toURI());
for(File app : apps.listFiles()) {
filePaths.add(folderPath + "/" + app.getName());
}
}
catch(URISyntaxException ex) {
// never happens
}
}
}
return filePaths;
}

public static String convertFileToBase64(String filePath){
byte[] fileContent = new byte[0];
public static String convertFileToBase64(String filePath) {
byte[] fileContent=new byte[0];
try {
fileContent = FileUtils.readFileToByteArray(new File(filePath));
} catch (IOException e) {
fileContent=FileUtils.readFileToByteArray(new File(filePath));
}
catch(IOException e) {
e.printStackTrace();
}
return Base64.getEncoder().encodeToString(fileContent);
}

public static Image convertBase64ToImage(String base64Picture){
byte[] imageBytes= new byte[0];
public static Image convertBase64ToImage(String base64Picture) {
byte[] imageBytes=new byte[0];
try {
imageBytes = com.sun.org.apache.xml.internal.security.utils.Base64.decode(base64Picture.getBytes());
} catch (Base64DecodingException e) {
imageBytes=com.sun.org.apache.xml.internal.security.utils.Base64.decode(base64Picture.getBytes());
}
catch(Base64DecodingException e) {
e.printStackTrace();
}
ByteArrayInputStream is=new ByteArrayInputStream(imageBytes);
Expand All @@ -216,7 +294,7 @@ public static Rectangle2D getImageCropBounds(Image image) {
* Sets cropped Image into imageview or loads default image if no image available
*/
public static void setBase64PicInImageView(ImageView imgView, String base64Picture) {
setBase64PicInImageView(imgView, base64Picture, false);
setBase64PicInImageView(imgView, base64Picture, false);
}

public static void setBase64PicInImageView(ImageView imgView, String profilePicture, boolean isGroupPicture) {
Expand All @@ -226,22 +304,22 @@ public static void setBase64PicInImageView(ImageView imgView, String profilePict
imgView.setViewport(FXUtil.getImageCropBounds(image));
}
else {/** Default Avatar */
Image img = isGroupPicture ? FXUtil.DEFAULT_GROUP_PIC : FXUtil.getDefaultAvatar();
Image img=isGroupPicture ? FXUtil.DEFAULT_GROUP_PIC : FXUtil.getDefaultAvatar();
imgView.setImage(img);
imgView.setViewport(new Rectangle2D(0, 0, img.getWidth(), img.getHeight()));
}
}

public static String uploadPictureViaFileChooser(Stage stage, ImageView image) throws Exception {
String base64ProfilePic = "";
String base64ProfilePic="";
FileChooser fileChooser=new FileChooser();
fileChooser.setTitle("Choose profile picture");

fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Image Files", "*.png", "*.jpg", "*.gif", "*.bmp", "*.jpeg"));

File file=fileChooser.showOpenDialog(stage);
if(file!=null && file.length()>3000000) {
throw new Exception("Image file is too large. Please, upload a picture < 3 MB");
throw new Exception("Image file is too large. Please, upload a picture < 3 MB");

}
else if(file!=null) {
Expand Down
Loading

0 comments on commit d9acaf3

Please sign in to comment.