built general message class instead of subtypes of it

additionally fixed malformed Javadoc in the entire repository
This commit is contained in:
delvh 2019-12-30 18:49:48 +01:00
parent 3a15946284
commit f438724ef7
7 changed files with 255 additions and 166 deletions

View File

@ -15,49 +15,23 @@ import java.util.Formatter;
*/ */
public class LoginCredentials implements Serializable { public class LoginCredentials implements Serializable {
private static final long serialVersionUID = -7395245059059523314L;
private final String name; private final String name;
private final byte[] passwordHash; private final byte[] passwordHash;
private static final long serialVersionUID = -7395245059059523314L;
/** /**
* Creates an in stance of {@link LoginCredentials}. * Creates an in stance of {@link LoginCredentials}.
* *
* @param name the name of the user * @param name the name of the user
* @param password the password of the user (will be converted to a hash) * @param password the password of the user (will be converted to a hash)
* @throws NoSuchAlgorithmException * @throws NoSuchAlgorithmException if the algorithm used is unknown
* @since Envoy Common v0.2-alpha
*/ */
public LoginCredentials(String name, char[] password) throws NoSuchAlgorithmException { public LoginCredentials(String name, char[] password) throws NoSuchAlgorithmException {
this.name = name; this.name = name;
passwordHash = getSha256(toByteArray(password)); passwordHash = getSha256(toByteArray(password));
} }
@Override
public String toString() {
Formatter form = new Formatter();
form.format("LoginCredentials[name=%s,passwordHash=", name);
for (int i = 0; i < passwordHash.length; i++)
form.format("%02x", passwordHash[i]);
form.format("]");
String str = form.toString();
form.close();
return str;
}
private byte[] toByteArray(char[] chars) {
byte[] bytes = new byte[chars.length * 2];
for (int i = 0; i < chars.length; ++i) {
bytes[i * 2] = (byte) (chars[i] >> 8);
bytes[i * 2 + 1] = (byte) (chars[i]);
}
return bytes;
}
private byte[] getSha256(byte[] input) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-256");
return md.digest(input);
}
/** /**
* @return the name of the user performing the login * @return the name of the user performing the login
* @since Envoy Common v0.2-alpha * @since Envoy Common v0.2-alpha
@ -69,4 +43,31 @@ public class LoginCredentials implements Serializable {
* @since Envoy Common v0.2-alpha * @since Envoy Common v0.2-alpha
*/ */
public byte[] getPasswordHash() { return passwordHash; } public byte[] getPasswordHash() { return passwordHash; }
private byte[] getSha256(byte[] input) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-256");
return md.digest(input);
}
private byte[] toByteArray(char[] chars) {
byte[] bytes = new byte[chars.length * 2];
for (int i = 0; i < chars.length; ++i) {
bytes[i * 2] = (byte) (chars[i] >> 8);
bytes[i * 2 + 1] = (byte) (chars[i]);
}
return bytes;
}
@Override
public String toString() {
try (Formatter form = new Formatter()) {
form.format("LoginCredentials[name=%s,passwordHash=", name);
for (byte element : passwordHash) {
form.format("%02x", element);
}
form.format("]");
String str = form.toString();
return str;
}
}
} }

View File

@ -1,7 +1,9 @@
package envoy.data; package envoy.data;
import java.io.Serializable; import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.Optional;
/** /**
* Represents a unique message with a unique, numeric ID. Further metadata * Represents a unique message with a unique, numeric ID. Further metadata
@ -13,66 +15,119 @@ import java.util.Date;
* Created: <strong>28.12.2019</strong><br> * Created: <strong>28.12.2019</strong><br>
* *
* @author Kai S. K. Engelbart * @author Kai S. K. Engelbart
* @author Leon Hofmeister
* @since Envoy Common v0.2-alpha * @since Envoy Common v0.2-alpha
*/ */
public abstract class Message implements Serializable { public abstract class Message implements Serializable {
private final long id; /**
private final User sender, recipient; * This enum defines all possible statuses a {link Message} can have.
private final Date date; *
* @since Envoy Common v0.2-alpha
*/
public static enum MessageStatus {
private MessageStatus status; /**
* is selected, if a message was sent but not received by the server yet.
*/
WAITING,
/**
* is selected, if a sent message was received by the server.
*/
SENT,
/**
* is selected, if a message was delivered from the server to the recipient, but
* has not been read yet.
*/
RECEIVED,
/**
* is selected, if a recipient opened the corresponding chat of said message.
*/
READ
}
private static final long serialVersionUID = -4393477412979594435L; private static final long serialVersionUID = -4393477412979594435L;
private final long id;
private final User sender, recipient;
private final Date date;
private final String text;
private final MessageAttachment<?> messageAttachment;
private MessageStatus status;
/** /**
* Initializes a {@link Message} from the client's perspective. The current date * Initializes a {@link Message} from the client's perspective. The current date
* is used as the message date and the status is set to * is used as the message date and the status is set to
* {@link MessageStatus#WAITING}. * {@link MessageStatus#WAITING}.
* *
* @param <T> the type of the attachment
* @param id unique ID * @param id unique ID
* @param sender the user who sends the message * @param sender the user who sends the message
* @param recipient the user who receives the message * @param recipient the user who receives the message
* @param text the text content of the message
* @param attachment the attachment of the message, if present
* @since Envoy Common v0.2-alpha * @since Envoy Common v0.2-alpha
*/ */
public Message(long id, User sender, User recipient) { public <T> Message(long id, User sender, User recipient, String text, @SuppressWarnings("rawtypes") Optional<MessageAttachment> attachment) {
this.id = id; this.id = id;
this.sender = sender; this.sender = sender;
this.recipient = recipient; this.recipient = recipient;
date = new Date(); this.text = text;
status = MessageStatus.WAITING; this.messageAttachment = attachment.isEmpty() ? null : attachment.get();
this.date = new Date();
this.status = MessageStatus.WAITING;
} }
/**
* @return the ID of this message
* @since Envoy Common v0.2-alpha
*/
public long getId() { return id; }
/**
* @return the sender of this message
* @since Envoy Common v0.2-alpha
*/
public User getSender() { return sender; }
/**
* @return the recipient of this message
* @since Envoy Common v0.2-alpha
*/
public User getRecipient() { return recipient; }
/** /**
* @return the date at which this message was created * @return the date at which this message was created
* @since Envoy Common v0.2-alpha * @since Envoy Common v0.2-alpha
*/ */
public Date getDate() { return date; } public Date getDate() { return date; }
/**
* @return the ID of this message
* @since Envoy Common v0.2-alpha
*/
public long getId() { return id; }
/**
* @param <T> the type of the message attachment
* @return the messageAttachment
* @since Envoy Common v0.2-alpha
*/
public <T> MessageAttachment<?> getMessageAttachment() { return messageAttachment; }
/**
* @return the recipient of this message
* @since Envoy Common v0.2-alpha
*/
public User getRecipient() { return recipient; }
/**
* @return the sender of this message
* @since Envoy Common v0.2-alpha
*/
public User getSender() { return sender; }
/** /**
* @return the current status of this message * @return the current status of this message
* @since Envoy Common v0.2-alpha * @since Envoy Common v0.2-alpha
*/ */
public MessageStatus getStatus() { return status; } public MessageStatus getStatus() { return status; }
/**
* @return the text content of this message
* @since Envoy Common v0.2-alpha
*/
public String getText() { return text; }
/** /**
* Changes the current {@link MessageStatus} to the next logical status.<br> * Changes the current {@link MessageStatus} to the next logical status.<br>
* <br> * <br>
@ -91,7 +146,14 @@ public abstract class Message implements Serializable {
status = MessageStatus.values()[status.ordinal() + 1]; status = MessageStatus.values()[status.ordinal() + 1];
} }
public static enum MessageStatus { @Override
WAITING, SENT, RECEIVED, READ public String toString() {
return String.format("TextMessage[id=%d,sender=%s,recipient=%s,date=%s,status=%s,content=%s]",
id,
sender,
recipient,
new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(date),
status,
text);
} }
} }

View File

@ -0,0 +1,26 @@
package envoy.data;
import java.io.Serializable;
import javax.swing.Scrollable;
/**
* This Interface should be used for any type supposed to be a {@link Message}
* attachment (i.e. images or sound).<br>
* <br>
* Project: <strong>envoy-common</strong><br>
* File: <strong>MessageAttachment.java</strong><br>
* Created: <strong>30 Dec 2019</strong><br>
*
* @author Leon Hofmeister
* @param <T> the type of this message attachment
* @since Envoy Common v0.2-alpha
*/
public interface MessageAttachment<T> extends Serializable, Scrollable {
/**
* @return the type implementing this interface
* @since Envoy Common v0.2-alpha
*/
T get();
}

View File

@ -1,54 +0,0 @@
package envoy.data;
import java.text.SimpleDateFormat;
/**
* Represents a {@link Message} with content that is comprised of text.<br>
* <br>
* Project: <strong>envoy-common</strong><br>
* File: <strong>TextMessage.java</strong><br>
* Created: <strong>28.12.2019</strong><br>
*
* @author Kai S. K. Engelbart
* @since Envoy Common v0.2-alpha
*/
public class TextMessage extends Message {
private final String content;
private static final long serialVersionUID = 1538164720632899917L;
/**
* Initializes a {@link TextMessage} from the client's perspective. The current
* date
* is used as the message date and the status is set to
* {@link envoy.data.Message.MessageStatus#WAITING}.
*
* @param id unique ID
* @param sender the user who sends the message
* @param recipient the user who receives the message
* @param content the content of the message
* @since Envoy Common v0.2-alpha
*/
public TextMessage(long id, User sender, User recipient, String content) {
super(id, sender, recipient);
this.content = content;
}
@Override
public String toString() {
return String.format("TextMessage[id=%d,sender=%s,recipient=%s,date=%s,status=%s,content=%s]",
getId(),
getSender(),
getRecipient(),
new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(getDate()),
getStatus(),
content);
}
/**
* @return the content of this {@link TextMessage}
* @since Envoy Common v0.2-alpha
*/
public String getContent() { return content; }
}

View File

@ -15,13 +15,43 @@ import java.io.Serializable;
*/ */
public class User implements Serializable { public class User implements Serializable {
/**
* This enum defines all possible statuses a user can have.
*
* @since Envoy Common v0.2-alpha
*/
public static enum UserStatus {
/**
* select this, if a user is online and can be interacted with
*/
ONLINE,
/**
* select this, if a user is online but unavailable at the moment (sudden
* interruption)
*/
AWAY,
/**
* select this, if a user is online but unavailable at the moment (polite way)
*/
BUSY,
/**
* select this, if a user is offline
*/
OFFLINE;
}
private static final long serialVersionUID = 3530947374856708236L;
private final long id; private final long id;
private final String name; private final String name;
private UserStatus status; private UserStatus status;
private static final long serialVersionUID = 3530947374856708236L;
/** /**
* Initializes a {@link User}. The {@link UserStatus} is set to * Initializes a {@link User}. The {@link UserStatus} is set to
* {@link UserStatus#OFFLINE}. * {@link UserStatus#OFFLINE}.
@ -36,9 +66,6 @@ public class User implements Serializable {
status = UserStatus.OFFLINE; status = UserStatus.OFFLINE;
} }
@Override
public String toString() { return String.format("User[id=%d,name=%s,status=%s]", id, name, status); }
/** /**
* @return the ID of this {@link User} * @return the ID of this {@link User}
* @since Envoy Client v0.2-alpha * @since Envoy Client v0.2-alpha
@ -65,7 +92,6 @@ public class User implements Serializable {
*/ */
public void setStatus(UserStatus status) { this.status = status; } public void setStatus(UserStatus status) { this.status = status; }
public static enum UserStatus { @Override
ONLINE, AWAY, BUSY, OFFLINE; public String toString() { return String.format("User[id=%d,name=%s,status=%s]", id, name, status); }
}
} }

View File

@ -12,9 +12,24 @@ public class EnvoyException extends Exception {
private static final long serialVersionUID = 2096147309395387479L; private static final long serialVersionUID = 2096147309395387479L;
public EnvoyException(String message, Throwable cause) { super(message, cause); } /**
* @param message the message to display once this Exception is thrown
* @since Envoy Common v0.2-alpha
*/
public EnvoyException(String message) { super(message); } public EnvoyException(String message) { super(message); }
/**
* @param message the message to display once this Exception is thrown
* @param cause the {@link Throwable} which resulted in the throw of an
* EnvoyException
* @since Envoy Common v0.2-alpha
*/
public EnvoyException(String message, Throwable cause) { super(message, cause); }
/**
* @param cause the {@link Throwable} which resulted in the throw of an
* EnvoyException
* @since Envoy Common v0.2-alpha
*/
public EnvoyException(Throwable cause) { super(cause); } public EnvoyException(Throwable cause) { super(cause); }
} }

View File

@ -11,8 +11,6 @@ import java.io.ObjectOutputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.Serializable; import java.io.Serializable;
import envoy.exception.EnvoyException;
/** /**
* Project: <strong>envoy-client</strong><br> * Project: <strong>envoy-client</strong><br>
* File: <strong>SerializationUtils.java</strong><br> * File: <strong>SerializationUtils.java</strong><br>
@ -23,16 +21,19 @@ import envoy.exception.EnvoyException;
*/ */
public class SerializationUtils { public class SerializationUtils {
private SerializationUtils() {} private static byte[] intToBytes(int n) { return new byte[] { (byte) (n >>> 24), (byte) (n >>> 16), (byte) (n >>> 8), (byte) n }; }
/** /**
* Deserializes an arbitrary {@link Serializable} object from a file. * Deserializes an arbitrary {@link Serializable} object from a file.
* *
* @param <T> the type of the object to deserialize * @param <T> the type of the object to deserialize
* @param file the file deserialize from * @param file the file to deserialize from
* @param serializedClass the class of the object to deserialize * @param serializedClass the class of the object to deserialize
* @return the deserialized object * @return the deserialized object
* @throws EnvoyException if an error occurred during deserialization * @throws IOException if something failed while deserializing the
* object
* @throws ClassNotFoundException if the deserialized object can not be linked
* to a class
* @since Envoy Common v0.2-alpha * @since Envoy Common v0.2-alpha
*/ */
public static <T extends Serializable> T read(File file, Class<T> serializedClass) throws IOException, ClassNotFoundException { public static <T extends Serializable> T read(File file, Class<T> serializedClass) throws IOException, ClassNotFoundException {
@ -40,6 +41,18 @@ public class SerializationUtils {
return read(new FileInputStream(file), serializedClass); return read(new FileInputStream(file), serializedClass);
} }
/**
* @param <T> the deserialized object
* @param in the {@link InputStream} of a serialized Object
* @param serializedClass the object type to convert the deserialized object
* into
* @return the deserialized object
* @throws IOException if something failed while deserializing the
* object
* @throws ClassNotFoundException if the deserialized object can not be linked
* to a class
* @since Envoy Common v0.2-alpha
*/
public static <T extends Serializable> T read(InputStream in, Class<T> serializedClass) throws IOException, ClassNotFoundException { public static <T extends Serializable> T read(InputStream in, Class<T> serializedClass) throws IOException, ClassNotFoundException {
try (ObjectInputStream oin = new ObjectInputStream(in)) { try (ObjectInputStream oin = new ObjectInputStream(in)) {
return serializedClass.cast(oin.readObject()); return serializedClass.cast(oin.readObject());
@ -90,5 +103,5 @@ public class SerializationUtils {
out.write(objBytes); out.write(objBytes);
} }
private static byte[] intToBytes(int n) { return new byte[] { (byte) (n >>> 24), (byte) (n >>> 16), (byte) (n >>> 8), (byte) n }; } private SerializationUtils() {}
} }