diff --git a/fasel-jfx/build.gradle b/fasel-jfx/build.gradle index 12bc5ea..0a8b5e2 100644 --- a/fasel-jfx/build.gradle +++ b/fasel-jfx/build.gradle @@ -6,24 +6,32 @@ repositories { mavenCentral() } -// Note that the test dependencies (junit, …) are inferred from the -// sourceSet.test of the core subproject -dependencies { - implementation 'com.jfoenix:jfoenix:8.0.7' - implementation 'de.jensd:fontawesomefx:8.9' - implementation 'javax.persistence:javax.persistence-api:2.2' - implementation 'com.j256.ormlite:ormlite-core:5.1' +ext { + smackVersion="4.4.0-alpha2-SNAPSHOT" } -repositories { - mavenLocal() - mavenCentral() +dependencies { + + // Smack + compile "org.igniterealtime.smack:smack-java7:$smackVersion" + compile "org.igniterealtime.smack:smack-resolver-dnsjava:$smackVersion" + compile "org.igniterealtime.smack:smack-tcp:$smackVersion" + compile "org.igniterealtime.smack:smack-openpgp:$smackVersion" + compile "org.igniterealtime.smack:smack-experimental:$smackVersion" + + // JFX + implementation 'com.jfoenix:jfoenix:8.0.7' + implementation 'de.jensd:fontawesomefx:8.9' + + // Database + implementation 'javax.persistence:javax.persistence-api:2.2' + implementation 'com.j256.ormlite:ormlite-core:5.1' + implementation 'com.j256.ormlite:ormlite-jdbc:5.1' + implementation 'com.h2database:h2:1.4.197' } jfx { - // minimal requirement for jfxJar-task mainClass = 'de.vanitasvitae.fasel.sample.Main' - // minimal requirement for jfxNative-task vendor = 'vanitasvitae' } \ No newline at end of file diff --git a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/FaselApplication.java b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/FaselApplication.java index bb9042e..41d49d6 100644 --- a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/FaselApplication.java +++ b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/FaselApplication.java @@ -20,7 +20,7 @@ public class FaselApplication extends Application { LoginController controller = loader.getController(); controller.setApplication(this); Scene scene = new Scene(root, 1200, 741); - primaryStage.setTitle("Hello World"); + primaryStage.setTitle("Fasel - Login"); primaryStage.setScene(scene); primaryStage.show(); } diff --git a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/FaselDBTest.java b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/FaselDBTest.java new file mode 100644 index 0000000..713d58b --- /dev/null +++ b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/FaselDBTest.java @@ -0,0 +1,50 @@ +package de.vanitasvitae.fasel; + +import java.sql.SQLException; + +import com.j256.ormlite.jdbc.JdbcConnectionSource; +import com.j256.ormlite.support.ConnectionSource; +import com.j256.ormlite.table.TableUtils; +import de.vanitasvitae.fasel.db.AbstractDatabase; +import de.vanitasvitae.fasel.db.entity.Account; + +public class FaselDBTest { + + private AbstractDatabase database; + + public static void main(String[] args) throws SQLException { + FaselDBTest db = new FaselDBTest(); + db.insert(); + db.get(); + } + + public FaselDBTest() throws SQLException { + database = new AbstractDatabase() { + @Override + public ConnectionSource getConnectionSource() throws SQLException { + ConnectionSource connectionSource = + new JdbcConnectionSource("jdbc:h2:~/.local/share/fasel/db/fasel"); + return connectionSource; + } + }; + TableUtils.createTableIfNotExists(database.getConnectionSource(), Account.class); + } + + public void insert() throws SQLException { + + String username = "alice@wonderland.lit"; + String id = "1234"; + + String password = "swordfish"; + + Account account = new Account(id, username, password); + + database.getAccountsDao().create(account); + } + + public void get() throws SQLException { + for (Account account : database.getAccountsDao().queryForAll()) { + System.out.print(account.getAccountId() + " " + account.getJid() + " " + account.getPassword()); + } + } +} diff --git a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/AbstractDatabase.java b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/AbstractDatabase.java index 86d2399..a09c8a5 100644 --- a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/AbstractDatabase.java +++ b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/AbstractDatabase.java @@ -6,14 +6,22 @@ import com.j256.ormlite.dao.Dao; import com.j256.ormlite.dao.DaoManager; import com.j256.ormlite.support.ConnectionSource; import de.vanitasvitae.fasel.db.entity.Account; +import de.vanitasvitae.fasel.db.entity.Contact; +import de.vanitasvitae.fasel.db.entity.XmppEntity; public abstract class AbstractDatabase { - public abstract ConnectionSource getConnectionSource(); + public abstract ConnectionSource getConnectionSource() throws SQLException; public Dao getAccountsDao() throws SQLException { return DaoManager.createDao(getConnectionSource(), Account.class); } + public Dao getXmppEntityDao() throws SQLException { + return DaoManager.createDao(getConnectionSource(), XmppEntity.class); + } + public Dao getContactsDao() throws SQLException { + return DaoManager.createDao(getConnectionSource(), Contact.class); + } } diff --git a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/dao/XmppEntityDao.java b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/dao/XmppEntityDao.java new file mode 100644 index 0000000..e455f6c --- /dev/null +++ b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/dao/XmppEntityDao.java @@ -0,0 +1,8 @@ +package de.vanitasvitae.fasel.db.dao; + +import com.j256.ormlite.dao.Dao; +import de.vanitasvitae.fasel.db.entity.XmppEntity; + +public interface XmppEntityDao extends Dao { + +} diff --git a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/dao/impl/AccountDaoImpl.java b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/dao/impl/AccountDaoImpl.java index beae87b..c356f27 100644 --- a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/dao/impl/AccountDaoImpl.java +++ b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/dao/impl/AccountDaoImpl.java @@ -9,7 +9,7 @@ import de.vanitasvitae.fasel.db.entity.Account; public class AccountDaoImpl extends BaseDaoImpl implements AccountDao { - protected AccountDaoImpl(ConnectionSource connectionSource) + public AccountDaoImpl(ConnectionSource connectionSource) throws SQLException { super(connectionSource, Account.class); } diff --git a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/dao/impl/XmppEntityDaoImpl.java b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/dao/impl/XmppEntityDaoImpl.java new file mode 100644 index 0000000..1d99c0a --- /dev/null +++ b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/dao/impl/XmppEntityDaoImpl.java @@ -0,0 +1,15 @@ +package de.vanitasvitae.fasel.db.dao.impl; + +import java.sql.SQLException; + +import com.j256.ormlite.dao.BaseDaoImpl; +import com.j256.ormlite.support.ConnectionSource; +import de.vanitasvitae.fasel.db.dao.XmppEntityDao; +import de.vanitasvitae.fasel.db.entity.XmppEntity; + +public class XmppEntityDaoImpl extends BaseDaoImpl implements XmppEntityDao { + + protected XmppEntityDaoImpl(ConnectionSource connectionSource) throws SQLException { + super(connectionSource, XmppEntity.class); + } +} diff --git a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/entity/Account.java b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/entity/Account.java index 30eb19e..7b7d4e2 100644 --- a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/entity/Account.java +++ b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/entity/Account.java @@ -8,16 +8,48 @@ import de.vanitasvitae.fasel.db.dao.impl.AccountDaoImpl; @DatabaseTable(tableName = "accounts", daoClass = AccountDaoImpl.class) public class Account { - @DatabaseField(id = true, dataType = DataType.LONG) + private String TAG = "fasel_db"; + + @DatabaseField(id = true, dataType = DataType.STRING) private String accountId; - @DatabaseField(canBeNull = false, dataType = DataType.STRING_BYTES) + @DatabaseField(canBeNull = false, dataType = DataType.STRING) private String jid; - @DatabaseField(canBeNull = false, dataType = DataType.STRING_BYTES) - private char[] password; + @DatabaseField(canBeNull = false, dataType = DataType.STRING) + private String password; public Account() { } + + public Account(String accountId, String jid, String password) { + this.accountId = accountId; + this.jid = jid; + this.password = password; + } + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + + public String getJid() { + return jid; + } + + public void setJid(String jid) { + this.jid = jid; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } } diff --git a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/entity/BaseMessage.java b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/entity/BaseMessage.java new file mode 100644 index 0000000..53b2bd2 --- /dev/null +++ b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/entity/BaseMessage.java @@ -0,0 +1,30 @@ +package de.vanitasvitae.fasel.db.entity; + +import java.util.Date; + +import com.j256.ormlite.field.DataType; +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; + +@DatabaseTable(tableName = "messages") +public class BaseMessage { + + public BaseMessage() { + + } + + @DatabaseField(id = true, columnName = "messageId") + private String messageId; + + @DatabaseField(columnName = "senderJid", dataType = DataType.STRING) + private String senderJid; + + @DatabaseField(columnName = "accountId", foreign = true) + private Account account; + + @DatabaseField(columnName = "sendDate", dataType = DataType.DATE) + private Date sendDate; + + @DatabaseField(columnName = "receiveDate", dataType = DataType.DATE) + private Date receiveDate; +} diff --git a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/entity/Contact.java b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/entity/Contact.java new file mode 100644 index 0000000..da5f4af --- /dev/null +++ b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/entity/Contact.java @@ -0,0 +1,14 @@ +package de.vanitasvitae.fasel.db.entity; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; + +@DatabaseTable(tableName = "contacts") +public class Contact extends XmppEntity { + + @DatabaseField(id = true) + private String id; + + @DatabaseField(foreign = true) + private XmppEntity baseEntity; +} diff --git a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/entity/TextMessage.java b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/entity/TextMessage.java new file mode 100644 index 0000000..bcc53dd --- /dev/null +++ b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/entity/TextMessage.java @@ -0,0 +1,20 @@ +package de.vanitasvitae.fasel.db.entity; + +import com.j256.ormlite.field.DataType; +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; + +@DatabaseTable(tableName = "textmessages") +public class TextMessage extends BaseMessage { + + public TextMessage() { + + } + + @DatabaseField(canBeNull = false, foreign = true, foreignAutoRefresh = true) + private BaseMessage baseMessage; + + @DatabaseField(columnName = "body", dataType = DataType.STRING) + private String body; + +} diff --git a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/entity/XmppEntity.java b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/entity/XmppEntity.java new file mode 100644 index 0000000..0c7af41 --- /dev/null +++ b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/db/entity/XmppEntity.java @@ -0,0 +1,16 @@ +package de.vanitasvitae.fasel.db.entity; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; +import de.vanitasvitae.fasel.db.dao.impl.XmppEntityDaoImpl; + +@DatabaseTable(tableName = "entities", daoClass = XmppEntityDaoImpl.class) +public class XmppEntity { + + @DatabaseField(id = true) + private String id; + + @DatabaseField + private String jid; + +} diff --git a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/ui/fragment/LoginFragmentController.java b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/ui/fragment/LoginFragmentController.java index 79a202a..b50d794 100644 --- a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/ui/fragment/LoginFragmentController.java +++ b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/ui/fragment/LoginFragmentController.java @@ -6,6 +6,9 @@ import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXPasswordField; import com.jfoenix.controls.JFXTextField; import de.vanitasvitae.fasel.FaselApplication; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; @@ -43,13 +46,30 @@ public class LoginFragmentController { }); } + private static void setUsernameValidator(JFXTextField text_username) { + text_username.textProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observableValue, String oldValue, String newValue) { + ObservableList styleClass = text_username.getStyleClass(); + if (newValue.length() < 5) { + if (styleClass.contains("error")) { + return; + } + styleClass.add("error"); + } else { + styleClass.removeAll("error"); + } + } + }); + } + private void switchToMainScene() throws IOException { FXMLLoader loader = new FXMLLoader(); loader.setLocation(getClass().getResource("/fxml/container/main_container.fxml")); Parent root = loader.load(); Scene scene = new Scene(root, 1200, 741); - main.getPrimaryStage().setTitle("Hello World"); + main.getPrimaryStage().setTitle("Fasel"); main.getPrimaryStage().setScene(scene); // primaryStage.show(); } diff --git a/fasel-jfx/src/main/java/de/vanitasvitae/fasel/xmpp/XmppConnectionService.java b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/xmpp/XmppConnectionService.java new file mode 100644 index 0000000..a328470 --- /dev/null +++ b/fasel-jfx/src/main/java/de/vanitasvitae/fasel/xmpp/XmppConnectionService.java @@ -0,0 +1,28 @@ +package de.vanitasvitae.fasel.xmpp; + +import java.io.IOException; + +import org.jivesoftware.smack.SmackException; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.tcp.XMPPTCPConnection; + +import org.jxmpp.stringprep.XmppStringprepException; + +public class XmppConnectionService { + + private final XMPPTCPConnection connection; + + public XmppConnectionService(String username, String serverAddress, String password) + throws XmppStringprepException { + connection = new XMPPTCPConnection(username, password, serverAddress); + } + + public void login() throws InterruptedException, IOException, SmackException, XMPPException { + connection.connect(); + connection.login(); + } + + public void attachDatabase() { + + } +} diff --git a/fasel-jfx/src/main/resources/fxml/container/login_container.fxml b/fasel-jfx/src/main/resources/fxml/container/login_container.fxml index 7a343dc..8b6ed34 100644 --- a/fasel-jfx/src/main/resources/fxml/container/login_container.fxml +++ b/fasel-jfx/src/main/resources/fxml/container/login_container.fxml @@ -3,11 +3,7 @@ - + diff --git a/fasel.mv.db b/fasel.mv.db new file mode 100644 index 0000000..cc8a798 Binary files /dev/null and b/fasel.mv.db differ