Returns the enum constant of this type with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this type. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
Returns the enum constant of this type with the specified name.
+The string must match exactly an identifier used to declare an
+enum constant in this type. (Extraneous whitespace characters are
+not permitted.)
+
+
Parameters:
+
name - the name of the enum constant to be returned.
+Starting from the Overview page, you can browse the documentation using the links in each page, and in the navigation bar at the top of each page. The Index and Search box allow you to navigate to specific declarations and summary pages, including: All Packages, All Classes and Interfaces
+
+
Search
+
You can search for definitions of modules, packages, types, fields, methods, system properties and other terms defined in the API, using some or all of the name, optionally using "camelCase" abbreviations. For example:
+
+
j.l.obj will match "java.lang.Object"
+
InpStr will match "java.io.InputStream"
+
HM.cK will match "java.util.HashMap.containsKey(Object)"
+The following sections describe the different kinds of pages in this collection.
+
+
Overview
+
The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.
+
+
+
Package
+
Each package has a page that contains a list of its classes and interfaces, with a summary for each. These pages may contain the following categories:
+
+
Interfaces
+
Classes
+
Enums
+
Exceptions
+
Errors
+
Annotation Types
+
+
+
+
Class or Interface
+
Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a declaration and description, member summary tables, and detailed member descriptions. Entries in each of these sections are omitted if they are empty or not applicable.
+
+
Class Inheritance Diagram
+
Direct Subclasses
+
All Known Subinterfaces
+
All Known Implementing Classes
+
Class or Interface Declaration
+
Class or Interface Description
+
+
+
+
Nested Class Summary
+
Enum Constant Summary
+
Field Summary
+
Property Summary
+
Constructor Summary
+
Method Summary
+
Required Element Summary
+
Optional Element Summary
+
+
+
+
Enum Constant Details
+
Field Details
+
Property Details
+
Constructor Details
+
Method Details
+
Element Details
+
+
Note: Annotation interfaces have required and optional elements, but not methods. Only enum classes have enum constants. The components of a record class are displayed as part of the declaration of the record class. Properties are a feature of JavaFX.
+
The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
+
+
+
Other Files
+
Packages and modules may contain pages with additional information related to the declarations nearby.
+
+
+
Use
+
Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the USE link in the navigation bar.
+
+
+
Tree (Class Hierarchy)
+
There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. Classes are organized by inheritance structure starting with java.lang.Object. Interfaces do not inherit from java.lang.Object.
+
+
When viewing the Overview page, clicking on TREE displays the hierarchy for all packages.
+
When viewing a particular package, class or interface page, clicking on TREE displays the hierarchy for only that package.
+
+
+
+
Serialized Form
+
Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to those who implement rather than use the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See Also" section of the class description.
+
+
+
All Packages
+
The All Packages page contains an alphabetic index of all packages contained in the documentation.
+
+
+
All Classes and Interfaces
+
The All Classes and Interfaces page contains an alphabetic index of all classes and interfaces contained in the documentation, including annotation interfaces, enum classes, and record classes.
+
+
+
Index
+
The Index contains an alphabetic index of all classes, interfaces, constructors, methods, and fields in the documentation, as well as summary pages such as All Packages, All Classes and Interfaces.
+
+
+
+This help file applies to API documentation generated by the standard doclet.
+
+
+
diff --git a/MyLocalChat/doc/jquery-ui.overrides.css b/MyLocalChat/doc/jquery-ui.overrides.css
new file mode 100644
index 0000000..facf852
--- /dev/null
+++ b/MyLocalChat/doc/jquery-ui.overrides.css
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active,
+a.ui-button:active,
+.ui-button:active,
+.ui-button.ui-state-active:hover {
+ /* Overrides the color of selection used in jQuery UI */
+ background: #F8981D;
+ border: 1px solid #F8981D;
+}
diff --git a/MyLocalChat/doc/legal/ASSEMBLY_EXCEPTION b/MyLocalChat/doc/legal/ASSEMBLY_EXCEPTION
new file mode 100644
index 0000000..065b8d9
--- /dev/null
+++ b/MyLocalChat/doc/legal/ASSEMBLY_EXCEPTION
@@ -0,0 +1,27 @@
+
+OPENJDK ASSEMBLY EXCEPTION
+
+The OpenJDK source code made available by Oracle America, Inc. (Oracle) at
+openjdk.java.net ("OpenJDK Code") is distributed under the terms of the GNU
+General Public License version 2
+only ("GPL2"), with the following clarification and special exception.
+
+ Linking this OpenJDK Code statically or dynamically with other code
+ is making a combined work based on this library. Thus, the terms
+ and conditions of GPL2 cover the whole combination.
+
+ As a special exception, Oracle gives you permission to link this
+ OpenJDK Code with certain code licensed by Oracle as indicated at
+ http://openjdk.java.net/legal/exception-modules-2007-05-08.html
+ ("Designated Exception Modules") to produce an executable,
+ regardless of the license terms of the Designated Exception Modules,
+ and to copy and distribute the resulting executable under GPL2,
+ provided that the Designated Exception Modules continue to be
+ governed by the licenses under which they were offered by Oracle.
+
+As such, it allows licensees and sublicensees of Oracle's GPL2 OpenJDK Code
+to build an executable that includes those portions of necessary code that
+Oracle could not provide under GPL2 (or that Oracle has provided under GPL2
+with the Classpath exception). If you modify or add to the OpenJDK code,
+that new GPL2 code may still be combined with Designated Exception Modules
+if the new code is made subject to this exception by its copyright holder.
diff --git a/MyLocalChat/doc/legal/jquery.md b/MyLocalChat/doc/legal/jquery.md
new file mode 100644
index 0000000..a763ec6
--- /dev/null
+++ b/MyLocalChat/doc/legal/jquery.md
@@ -0,0 +1,26 @@
+## jQuery v3.7.1
+
+### jQuery License
+```
+jQuery v 3.7.1
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+```
diff --git a/MyLocalChat/doc/legal/jqueryUI.md b/MyLocalChat/doc/legal/jqueryUI.md
new file mode 100644
index 0000000..8bda9d7
--- /dev/null
+++ b/MyLocalChat/doc/legal/jqueryUI.md
@@ -0,0 +1,49 @@
+## jQuery UI v1.13.2
+
+### jQuery UI License
+```
+Copyright jQuery Foundation and other contributors, https://jquery.org/
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/jquery/jquery-ui
+
+The following license applies to all parts of this software except as
+documented below:
+
+====
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+====
+
+Copyright and related rights for sample code are waived via CC0. Sample
+code is defined as all source code contained within the demos directory.
+
+CC0: http://creativecommons.org/publicdomain/zero/1.0/
+
+====
+
+All files located in the node_modules and external directories are
+externally maintained libraries used by this software which have their
+own licenses; we recommend you read them, as their terms may differ from
+the terms above.
+
+```
diff --git a/MyLocalChat/doc/member-search-index.js b/MyLocalChat/doc/member-search-index.js
new file mode 100644
index 0000000..1b321d7
--- /dev/null
+++ b/MyLocalChat/doc/member-search-index.js
@@ -0,0 +1 @@
+memberSearchIndex = [{"p":"domain","c":"GruppenRoom","l":"addAdmin(User, User)","u":"addAdmin(domain.User,domain.User)"},{"p":"domain","c":"UserChatRoom","l":"addChat(ChatRoom)","u":"addChat(domain.ChatRoom)"},{"p":"fassade","c":"ChatService","l":"addContact(String, String)","u":"addContact(java.lang.String,java.lang.String)"},{"p":"domain","c":"UserContacts","l":"addContact(User)","u":"addContact(domain.User)"},{"p":"domain","c":"UserGruppenRoom","l":"addGruppenRoom(GruppenRoom)","u":"addGruppenRoom(domain.GruppenRoom)"},{"p":"domain","c":"ChatRoom","l":"addMessage(Message)","u":"addMessage(domain.Message)"},{"p":"domain","c":"GruppenRoom","l":"addMessage(User, String)","u":"addMessage(domain.User,java.lang.String)"},{"p":"domain","c":"GruppenRoom","l":"addParticipant(User)","u":"addParticipant(domain.User)"},{"p":"fassade","c":"ChatService","l":"addParticipantToGroup(int, String, String)","u":"addParticipantToGroup(int,java.lang.String,java.lang.String)"},{"p":"domain","c":"UserInfo","l":"AKKU_FAST_LEER"},{"p":"domain","c":"UserInfo","l":"BEI_DER_ARBEIT"},{"p":"domain","c":"UserInfo","l":"BESCHÄFTIGT"},{"p":"ui","c":"Chat","l":"Chat(String, int, int)","u":"%3Cinit%3E(java.lang.String,int,int)"},{"p":"domain","c":"ChatRoom","l":"ChatRoom(User, User)","u":"%3Cinit%3E(domain.User,domain.User)"},{"p":"test","c":"ChatRoomTest","l":"ChatRoomTest()","u":"%3Cinit%3E()"},{"p":"server","c":"ChatServer","l":"ChatServer()","u":"%3Cinit%3E()"},{"p":"fassade","c":"ChatService","l":"ChatService()","u":"%3Cinit%3E()"},{"p":"test","c":"ChatServiceTest","l":"ChatServiceTest()","u":"%3Cinit%3E()"},{"p":"domain","c":"UserChatRoom","l":"clearChatRooms()"},{"p":"domain","c":"UserChatRoom","l":"contains(ChatRoom)","u":"contains(domain.ChatRoom)"},{"p":"domain","c":"UserGruppenRoom","l":"contains(GruppenRoom)","u":"contains(domain.GruppenRoom)"},{"p":"fassade","c":"ChatService","l":"createChatRoom(String, String)","u":"createChatRoom(java.lang.String,java.lang.String)"},{"p":"fassade","c":"ChatService","l":"createGruppenRoom(String, String, String)","u":"createGruppenRoom(java.lang.String,java.lang.String,java.lang.String)"},{"p":"fassade","c":"ChatService","l":"createUser(String)","u":"createUser(java.lang.String)"},{"p":"test","c":"ExceptionTest","l":"ExceptionTest()","u":"%3Cinit%3E()"},{"p":"domain","c":"MessageType","l":"FILE"},{"p":"domain","c":"GruppenRoom","l":"getAdmins()"},{"p":"domain","c":"UserChatRoom","l":"getAllChatRooms()"},{"p":"domain","c":"UserChatRoom","l":"getChatRoomCount()"},{"p":"domain","c":"UserChatRoom","l":"getChatRoomIds()"},{"p":"fassade","c":"ChatService","l":"getChatRoomInfo(int)"},{"p":"domain","c":"UserChatRoom","l":"getChatRoomInfos()"},{"p":"domain","c":"UserContacts","l":"getContactCount()"},{"p":"domain","c":"UserContacts","l":"getContacts()"},{"p":"domain","c":"Message","l":"getContent()"},{"p":"domain","c":"ChatRoom","l":"getCreatedAt()"},{"p":"domain","c":"GruppenRoom","l":"getCreatedAt()"},{"p":"domain","c":"GruppenRoom","l":"getCreator()"},{"p":"domain","c":"GruppenRoom","l":"getDescription()"},{"p":"domain","c":"GruppenRoom","l":"getGroupId()"},{"p":"fassade","c":"ChatService","l":"getGroupMessages(int)"},{"p":"fassade","c":"ChatService","l":"getGruppenRoomInfo(int)"},{"p":"domain","c":"UserGruppenRoom","l":"getGruppenRoomNames()"},{"p":"domain","c":"UserGruppenRoom","l":"getGruppenRooms()"},{"p":"domain","c":"ChatRoom","l":"getMessages()"},{"p":"domain","c":"GruppenRoom","l":"getMessages()"},{"p":"domain","c":"GruppenRoom","l":"getName()"},{"p":"domain","c":"GruppenRoom","l":"getParticipants()"},{"p":"domain","c":"ChatRoom","l":"getRoomId()"},{"p":"domain","c":"Message","l":"getSender()"},{"p":"domain","c":"UserGruppenRoom","l":"getSize()"},{"p":"domain","c":"Message","l":"getTimestamp()"},{"p":"domain","c":"Message","l":"getType()"},{"p":"domain","c":"ChatRoom","l":"getUser1()"},{"p":"domain","c":"ChatRoom","l":"getUser2()"},{"p":"domain","c":"User","l":"getUserChatRoom()"},{"p":"fassade","c":"ChatService","l":"getUserChatRoomIds(String)","u":"getUserChatRoomIds(java.lang.String)"},{"p":"domain","c":"User","l":"getUserContacts()"},{"p":"fassade","c":"ChatService","l":"getUserContacts(String)","u":"getUserContacts(java.lang.String)"},{"p":"domain","c":"User","l":"getUserGruppenRoom()"},{"p":"fassade","c":"ChatService","l":"getUserGruppenRooms(String)","u":"getUserGruppenRooms(java.lang.String)"},{"p":"domain","c":"User","l":"getUserId()"},{"p":"domain","c":"User","l":"getUserInfo()"},{"p":"domain","c":"User","l":"getUsername()"},{"p":"domain","c":"GruppenRoom","l":"GruppenRoom(User, String, String)","u":"%3Cinit%3E(domain.User,java.lang.String,java.lang.String)"},{"p":"test","c":"GruppenRoomTest","l":"GruppenRoomTest()","u":"%3Cinit%3E()"},{"p":"domain","c":"UserContacts","l":"hasContact(User)","u":"hasContact(domain.User)"},{"p":"domain","c":"UserInfo","l":"IM_KINO"},{"p":"domain","c":"MessageType","l":"IMAGE"},{"p":"domain","c":"UserInfo","l":"IN_DER_SCHULE"},{"p":"test","c":"IntegrationTest","l":"IntegrationTest()","u":"%3Cinit%3E()"},{"p":"domain","c":"GruppenRoom","l":"isAdmin(User)","u":"isAdmin(domain.User)"},{"p":"domain","c":"UserChatRoom","l":"isEmpty()"},{"p":"domain","c":"UserGruppenRoom","l":"isEmpty()"},{"p":"domain","c":"User","l":"isOnline()"},{"p":"domain","c":"GruppenRoom","l":"isParticipant(User)","u":"isParticipant(domain.User)"},{"p":"domain","c":"MessageType","l":"LINK"},{"p":"app","c":"Main","l":"Main()","u":"%3Cinit%3E()"},{"p":"app","c":"Main","l":"main(String[])","u":"main(java.lang.String[])"},{"p":"domain","c":"Message","l":"Message(User, String)","u":"%3Cinit%3E(domain.User,java.lang.String)"},{"p":"domain","c":"Message","l":"Message(User, String, MessageType)","u":"%3Cinit%3E(domain.User,java.lang.String,domain.MessageType)"},{"p":"test","c":"MessageTest","l":"MessageTest()","u":"%3Cinit%3E()"},{"p":"domain","c":"GruppenRoom","l":"removeAdmin(User, User)","u":"removeAdmin(domain.User,domain.User)"},{"p":"domain","c":"UserChatRoom","l":"removeChat(ChatRoom)","u":"removeChat(domain.ChatRoom)"},{"p":"domain","c":"UserContacts","l":"removeContact(User)","u":"removeContact(domain.User)"},{"p":"domain","c":"UserGruppenRoom","l":"removeGruppenRoom(GruppenRoom)","u":"removeGruppenRoom(domain.GruppenRoom)"},{"p":"domain","c":"GruppenRoom","l":"removeParticipant(User, User)","u":"removeParticipant(domain.User,domain.User)"},{"p":"domain","c":"UserInfo","l":"SCHLAFE"},{"p":"fassade","c":"ChatService","l":"sendGroupMessage(int, String, String)","u":"sendGroupMessage(int,java.lang.String,java.lang.String)"},{"p":"fassade","c":"ChatService","l":"sendMessage(int, String, String)","u":"sendMessage(int,java.lang.String,java.lang.String)"},{"p":"domain","c":"Message","l":"setContent(String)","u":"setContent(java.lang.String)"},{"p":"domain","c":"User","l":"setOnline(boolean)"},{"p":"domain","c":"Message","l":"setSender(User)","u":"setSender(domain.User)"},{"p":"domain","c":"Message","l":"setTimestamp(LocalDateTime)","u":"setTimestamp(java.time.LocalDateTime)"},{"p":"domain","c":"Message","l":"setType(MessageType)","u":"setType(domain.MessageType)"},{"p":"test","c":"ChatServiceTest","l":"setUp()"},{"p":"test","c":"ExceptionTest","l":"setUp()"},{"p":"domain","c":"User","l":"setUserInfo(UserInfo)","u":"setUserInfo(domain.UserInfo)"},{"p":"domain","c":"UserContacts","l":"showAllContacts()"},{"p":"fassade","c":"ChatService","l":"showMessage(int)"},{"p":"domain","c":"ChatRoom","l":"showMessages()"},{"p":"domain","c":"GruppenRoom","l":"showMessages()"},{"p":"server","c":"ChatServer","l":"startServer()"},{"p":"domain","c":"MessageType","l":"SYSTEM"},{"p":"test","c":"GruppenRoomTest","l":"testAddAdmin()"},{"p":"test","c":"ChatServiceTest","l":"testAddContact()"},{"p":"test","c":"GruppenRoomTest","l":"testAddDuplicateParticipant()"},{"p":"test","c":"ChatRoomTest","l":"testAddMessageToChatRoom()"},{"p":"test","c":"ExceptionTest","l":"testAddNonExistentContact()"},{"p":"test","c":"GruppenRoomTest","l":"testAddParticipant()"},{"p":"test","c":"ChatRoomTest","l":"testChatRoomCreation()"},{"p":"test","c":"IntegrationTest","l":"testCompleteChatWorkflow()"},{"p":"test","c":"ChatServiceTest","l":"testCreateChatRoom()"},{"p":"test","c":"ChatServiceTest","l":"testCreateChatRoomNonExistentUsers()"},{"p":"test","c":"ChatServiceTest","l":"testCreateDuplicateUser()"},{"p":"test","c":"ChatServiceTest","l":"testCreateUser()"},{"p":"test","c":"ExceptionTest","l":"testGetUserContactsNonExistentUser()"},{"p":"test","c":"IntegrationTest","l":"testGroupChatWorkflow()"},{"p":"test","c":"GruppenRoomTest","l":"testGruppenRoomCreation()"},{"p":"test","c":"MessageTest","l":"testMessageCreation()"},{"p":"test","c":"MessageTest","l":"testMessageSetters()"},{"p":"test","c":"MessageTest","l":"testMessageToString()"},{"p":"test","c":"ChatServiceTest","l":"testSendAndReceiveMessages()"},{"p":"test","c":"ExceptionTest","l":"testSendMessageNonExistentUser()"},{"p":"test","c":"ExceptionTest","l":"testSendMessageToNonExistentRoom()"},{"p":"test","c":"ChatRoomTest","l":"testShowMessages()"},{"p":"test","c":"UserTest","l":"testUserContacts()"},{"p":"test","c":"UserTest","l":"testUserCreation()"},{"p":"test","c":"UserTest","l":"testUserEquals()"},{"p":"test","c":"UserTest","l":"testUserStatusChanges()"},{"p":"domain","c":"MessageType","l":"TEXT"},{"p":"domain","c":"GruppenRoom","l":"toString()"},{"p":"domain","c":"Message","l":"toString()"},{"p":"domain","c":"User","l":"toString()"},{"p":"domain","c":"Message","l":"toTimeString()"},{"p":"domain","c":"User","l":"User(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"domain","c":"UserChatRoom","l":"UserChatRoom()","u":"%3Cinit%3E()"},{"p":"domain","c":"UserContacts","l":"UserContacts()","u":"%3Cinit%3E()"},{"p":"domain","c":"UserGruppen","l":"UserGruppen()","u":"%3Cinit%3E()"},{"p":"domain","c":"UserGruppenRoom","l":"UserGruppenRoom()","u":"%3Cinit%3E()"},{"p":"test","c":"UserTest","l":"UserTest()","u":"%3Cinit%3E()"},{"p":"domain","c":"MessageType","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"domain","c":"UserInfo","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"domain","c":"MessageType","l":"values()"},{"p":"domain","c":"UserInfo","l":"values()"},{"p":"domain","c":"UserInfo","l":"VERFÜGBAR"}];updateSearchResults();
\ No newline at end of file
diff --git a/MyLocalChat/doc/module-search-index.js b/MyLocalChat/doc/module-search-index.js
new file mode 100644
index 0000000..0d59754
--- /dev/null
+++ b/MyLocalChat/doc/module-search-index.js
@@ -0,0 +1 @@
+moduleSearchIndex = [];updateSearchResults();
\ No newline at end of file
diff --git a/MyLocalChat/doc/overview-summary.html b/MyLocalChat/doc/overview-summary.html
new file mode 100644
index 0000000..46ffa18
--- /dev/null
+++ b/MyLocalChat/doc/overview-summary.html
@@ -0,0 +1,26 @@
+
+
+
+
+Generated Documentation (Untitled)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
").text(e.label)).appendTo(t)},_move:function(t,e){if(this.menu.element.is(":visible"))return this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),void this.menu.blur()):void this.menu[t](e);this.search(null,e)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){this.isMultiLine&&!this.menu.element.is(":visible")||(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),x.extend(x.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,e){var i=new RegExp(x.ui.autocomplete.escapeRegex(e),"i");return x.grep(t,function(t){return i.test(t.label||t.value||t)})}}),x.widget("ui.autocomplete",x.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(1").text(e))},100))}});x.ui.autocomplete});
\ No newline at end of file
diff --git a/MyLocalChat/doc/script.js b/MyLocalChat/doc/script.js
new file mode 100644
index 0000000..73cd8fa
--- /dev/null
+++ b/MyLocalChat/doc/script.js
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+var moduleSearchIndex;
+var packageSearchIndex;
+var typeSearchIndex;
+var memberSearchIndex;
+var tagSearchIndex;
+function loadScripts(doc, tag) {
+ createElem(doc, tag, 'search.js');
+
+ createElem(doc, tag, 'module-search-index.js');
+ createElem(doc, tag, 'package-search-index.js');
+ createElem(doc, tag, 'type-search-index.js');
+ createElem(doc, tag, 'member-search-index.js');
+ createElem(doc, tag, 'tag-search-index.js');
+}
+
+function createElem(doc, tag, path) {
+ var script = doc.createElement(tag);
+ var scriptElement = doc.getElementsByTagName(tag)[0];
+ script.src = pathtoroot + path;
+ scriptElement.parentNode.insertBefore(script, scriptElement);
+}
+
+function show(tableId, selected, columns) {
+ if (tableId !== selected) {
+ document.querySelectorAll('div.' + tableId + ':not(.' + selected + ')')
+ .forEach(function(elem) {
+ elem.style.display = 'none';
+ });
+ }
+ document.querySelectorAll('div.' + selected)
+ .forEach(function(elem, index) {
+ elem.style.display = '';
+ var isEvenRow = index % (columns * 2) < columns;
+ elem.classList.remove(isEvenRow ? oddRowColor : evenRowColor);
+ elem.classList.add(isEvenRow ? evenRowColor : oddRowColor);
+ });
+ updateTabs(tableId, selected);
+}
+
+function updateTabs(tableId, selected) {
+ document.getElementById(tableId + '.tabpanel')
+ .setAttribute('aria-labelledby', selected);
+ document.querySelectorAll('button[id^="' + tableId + '"]')
+ .forEach(function(tab, index) {
+ if (selected === tab.id || (tableId === selected && index === 0)) {
+ tab.className = activeTableTab;
+ tab.setAttribute('aria-selected', true);
+ tab.setAttribute('tabindex',0);
+ } else {
+ tab.className = tableTab;
+ tab.setAttribute('aria-selected', false);
+ tab.setAttribute('tabindex',-1);
+ }
+ });
+}
+
+function switchTab(e) {
+ var selected = document.querySelector('[aria-selected=true]');
+ if (selected) {
+ if ((e.keyCode === 37 || e.keyCode === 38) && selected.previousSibling) {
+ // left or up arrow key pressed: move focus to previous tab
+ selected.previousSibling.click();
+ selected.previousSibling.focus();
+ e.preventDefault();
+ } else if ((e.keyCode === 39 || e.keyCode === 40) && selected.nextSibling) {
+ // right or down arrow key pressed: move focus to next tab
+ selected.nextSibling.click();
+ selected.nextSibling.focus();
+ e.preventDefault();
+ }
+ }
+}
+
+var updateSearchResults = function() {};
+
+function indexFilesLoaded() {
+ return moduleSearchIndex
+ && packageSearchIndex
+ && typeSearchIndex
+ && memberSearchIndex
+ && tagSearchIndex;
+}
+
+// Workaround for scroll position not being included in browser history (8249133)
+document.addEventListener("DOMContentLoaded", function(e) {
+ var contentDiv = document.querySelector("div.flex-content");
+ window.addEventListener("popstate", function(e) {
+ if (e.state !== null) {
+ contentDiv.scrollTop = e.state;
+ }
+ });
+ window.addEventListener("hashchange", function(e) {
+ history.replaceState(contentDiv.scrollTop, document.title);
+ });
+ contentDiv.addEventListener("scroll", function(e) {
+ var timeoutID;
+ if (!timeoutID) {
+ timeoutID = setTimeout(function() {
+ history.replaceState(contentDiv.scrollTop, document.title);
+ timeoutID = null;
+ }, 100);
+ }
+ });
+ if (!location.hash) {
+ history.replaceState(contentDiv.scrollTop, document.title);
+ }
+});
diff --git a/MyLocalChat/doc/search.js b/MyLocalChat/doc/search.js
new file mode 100644
index 0000000..2246cdd
--- /dev/null
+++ b/MyLocalChat/doc/search.js
@@ -0,0 +1,354 @@
+/*
+ * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+var noResult = {l: "No results found"};
+var loading = {l: "Loading search index..."};
+var catModules = "Modules";
+var catPackages = "Packages";
+var catTypes = "Types";
+var catMembers = "Members";
+var catSearchTags = "Search Tags";
+var highlight = "$&";
+var searchPattern = "";
+var fallbackPattern = "";
+var RANKING_THRESHOLD = 2;
+var NO_MATCH = 0xffff;
+var MIN_RESULTS = 3;
+var MAX_RESULTS = 500;
+var UNNAMED = "";
+function escapeHtml(str) {
+ return str.replace(//g, ">");
+}
+function getHighlightedText(item, matcher, fallbackMatcher) {
+ var escapedItem = escapeHtml(item);
+ var highlighted = escapedItem.replace(matcher, highlight);
+ if (highlighted === escapedItem) {
+ highlighted = escapedItem.replace(fallbackMatcher, highlight)
+ }
+ return highlighted;
+}
+function getURLPrefix(ui) {
+ var urlPrefix="";
+ var slash = "/";
+ if (ui.item.category === catModules) {
+ return ui.item.l + slash;
+ } else if (ui.item.category === catPackages && ui.item.m) {
+ return ui.item.m + slash;
+ } else if (ui.item.category === catTypes || ui.item.category === catMembers) {
+ if (ui.item.m) {
+ urlPrefix = ui.item.m + slash;
+ } else {
+ $.each(packageSearchIndex, function(index, item) {
+ if (item.m && ui.item.p === item.l) {
+ urlPrefix = item.m + slash;
+ }
+ });
+ }
+ }
+ return urlPrefix;
+}
+function createSearchPattern(term) {
+ var pattern = "";
+ var isWordToken = false;
+ term.replace(/,\s*/g, ", ").trim().split(/\s+/).forEach(function(w, index) {
+ if (index > 0) {
+ // whitespace between identifiers is significant
+ pattern += (isWordToken && /^\w/.test(w)) ? "\\s+" : "\\s*";
+ }
+ var tokens = w.split(/(?=[A-Z,.()<>[\/])/);
+ for (var i = 0; i < tokens.length; i++) {
+ var s = tokens[i];
+ if (s === "") {
+ continue;
+ }
+ pattern += $.ui.autocomplete.escapeRegex(s);
+ isWordToken = /\w$/.test(s);
+ if (isWordToken) {
+ pattern += "([a-z0-9_$<>\\[\\]]*?)";
+ }
+ }
+ });
+ return pattern;
+}
+function createMatcher(pattern, flags) {
+ var isCamelCase = /[A-Z]/.test(pattern);
+ return new RegExp(pattern, flags + (isCamelCase ? "" : "i"));
+}
+var watermark = 'Search';
+$(function() {
+ var search = $("#search-input");
+ var reset = $("#reset-button");
+ search.val('');
+ search.prop("disabled", false);
+ reset.prop("disabled", false);
+ search.val(watermark).addClass('watermark');
+ search.blur(function() {
+ if ($(this).val().length === 0) {
+ $(this).val(watermark).addClass('watermark');
+ }
+ });
+ search.on('click keydown paste', function() {
+ if ($(this).val() === watermark) {
+ $(this).val('').removeClass('watermark');
+ }
+ });
+ reset.click(function() {
+ search.val('').focus();
+ });
+ search.focus()[0].setSelectionRange(0, 0);
+});
+$.widget("custom.catcomplete", $.ui.autocomplete, {
+ _create: function() {
+ this._super();
+ this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)");
+ },
+ _renderMenu: function(ul, items) {
+ var rMenu = this;
+ var currentCategory = "";
+ rMenu.menu.bindings = $();
+ $.each(items, function(index, item) {
+ var li;
+ if (item.category && item.category !== currentCategory) {
+ ul.append("
+
+
diff --git a/MyLocalChat/src/main/java/domain/ChatRoom.java b/MyLocalChat/src/main/java/domain/ChatRoom.java
index 65f100f..ced91c1 100644
--- a/MyLocalChat/src/main/java/domain/ChatRoom.java
+++ b/MyLocalChat/src/main/java/domain/ChatRoom.java
@@ -4,56 +4,101 @@ import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
+/**
+ * Repräsentiert einen Chatraum zwischen zwei Benutzern.
+ * Verwaltet Nachrichten und Metadaten der Konversation.
+ */
public class ChatRoom {
- private static int nextRoomId = 1000;
- private int roomId;
- private List messages;
- private final LocalDateTime createdAt;
- private User user1;
- private User user2;
-
+ private static int nextRoomId = 1000; // Zähler für automatische Raum-ID Vergabe
+ private int roomId; // Eindeutige ID des Chatraums
+ private List messages; // Liste aller Nachrichten im Raum
+ private final LocalDateTime createdAt; // Erstellungszeitpunkt des Raums
+ private User user1; // Erster Benutzer im Chat
+ private User user2; // Zweiter Benutzer im Chat
+
+ /**
+ * Erstellt einen neuen Chatraum zwischen zwei Benutzern.
+ *
+ * @param user1 Der erste Benutzer des Chats
+ * @param user2 Der zweite Benutzer des Chats
+ */
public ChatRoom(User user1, User user2) {
- this.roomId = nextRoomId++;
- this.messages = new ArrayList<>();
- this.createdAt = LocalDateTime.now();
+ this.roomId = nextRoomId++; // Vergibt automatische ID
+ this.messages = new ArrayList<>(); // Initialisiert leere Nachrichtenliste
+ this.createdAt = LocalDateTime.now(); // Setzt aktuellen Zeitpunkt
this.user1 = user1;
this.user2 = user2;
}
+
+ /**
+ * Fügt eine Nachricht zum Chatraum hinzu.
+ *
+ * @param message Die hinzuzufügende Nachricht
+ */
public void addMessage(Message message) {
if (messages == null)
- messages = new ArrayList<>();
+ messages = new ArrayList<>(); // Sicherstellt, dass Liste existiert
- messages.add(message);
+ messages.add(message); // Nachricht zur Liste hinzufügen
}
+ // Getter-Methoden für Zugriff auf private Felder
- // Getter und Setter
+ /**
+ * Gibt die eindeutige Raum-ID zurück.
+ *
+ * @return Die ID des Chatraums
+ */
public int getRoomId() {
return roomId;
}
-
-
+ /**
+ * Gibt den ersten Benutzer des Chats zurück.
+ *
+ * @return User-Objekt des ersten Benutzers
+ */
public User getUser1() {
- return user1;
- }
- public User getUser2() {
- return user2;
- }
- public List getMessages() {
+ return user1;
+ }
+
+ /**
+ * Gibt den zweiten Benutzer des Chats zurück.
+ *
+ * @return User-Objekt des zweiten Benutzers
+ */
+ public User getUser2() {
+ return user2;
+ }
+
+ /**
+ * Gibt die Liste aller Nachrichten im Chatraum zurück.
+ *
+ * @return Liste von Message-Objekten
+ */
+ public List getMessages() {
return messages;
}
+ /**
+ * Gibt den Erstellungszeitpunkt des Chatraums zurück.
+ *
+ * @return LocalDateTime des Erstellungszeitpunkts
+ */
public LocalDateTime getCreatedAt() {
return createdAt;
}
-
-
+ /**
+ * Zeigt alle Nachrichten des Chatraums als String-Liste an.
+ *
+ * @return Liste von Nachrichten-Strings oder leere Liste bei keinen Nachrichten
+ */
public List showMessages(){
if (messages == null || messages.isEmpty())
- return new ArrayList<>();
+ return new ArrayList<>(); // Rückgabe leere Liste falls keine Nachrichten
+ // Wandelt jede Nachricht in String um und sammelt in Liste
return messages.stream()
.map(Message::toString)
.toList();
diff --git a/MyLocalChat/src/main/java/domain/GruppenRoom.java b/MyLocalChat/src/main/java/domain/GruppenRoom.java
index bb0c177..126c78b 100644
--- a/MyLocalChat/src/main/java/domain/GruppenRoom.java
+++ b/MyLocalChat/src/main/java/domain/GruppenRoom.java
@@ -5,17 +5,28 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+/**
+ * Repräsentiert einen Gruppenchatraum mit mehreren Teilnehmern und Administratoren.
+ * Bietet Funktionen zur Verwaltung von Teilnehmern, Nachrichten und Admin-Rechten.
+ */
public class GruppenRoom {
- private static int nextGroupId = 1000;
- private final int groupId;
- private final User creator;
- private List admins;
- private List participants;
- private String description;
- private String name;
- private List messages;
- private final LocalDateTime createdAt;
+ private static int nextGroupId = 1000; // Zähler für automatische Gruppen-ID Vergabe
+ private final int groupId; // Eindeutige ID der Gruppe
+ private final User creator; // Ersteller der Gruppe
+ private List admins; // Liste der Administratoren
+ private List participants; // Liste aller Teilnehmer
+ private String description; // Beschreibung der Gruppe
+ private String name; // Name der Gruppe
+ private List messages; // Liste aller Gruppen-Nachrichten
+ private final LocalDateTime createdAt; // Erstellungszeitpunkt der Gruppe
+ /**
+ * Erstellt eine neue Gruppe mit dem angegebenen Ersteller, Namen und Beschreibung.
+ *
+ * @param creator Der Ersteller der Gruppe (darf nicht null sein)
+ * @param name Der Name der Gruppe (darf nicht null sein)
+ * @param description Die Beschreibung der Gruppe (kann null sein)
+ */
public GruppenRoom(User creator, String name, String description) {
Objects.requireNonNull(creator, "Creator darf nicht null sein");
Objects.requireNonNull(name, "Name darf nicht null sein");
@@ -30,13 +41,21 @@ public class GruppenRoom {
this.participants = new ArrayList<>();
this.messages = new ArrayList<>();
- this.admins.add(creator);
- this.participants.add(creator);
+ this.admins.add(creator); // Ersteller wird automatisch Admin
+ this.participants.add(creator); // Ersteller wird automatisch Teilnehmer
// Gruppe beim Creator registrieren
creator.getUserGruppenRoom().addGruppenRoom(this);
}
+ /**
+ * Fügt einen neuen Teilnehmer zur Gruppe hinzu.
+ *
+ * @param user Der hinzuzufügende Benutzer (darf nicht null sein)
+ * @return true wenn der Benutzer erfolgreich hinzugefügt wurde
+ * @throws IllegalArgumentException wenn der Benutzer bereits in der Gruppe ist
+ * @throws IllegalStateException wenn die Gruppe nicht beim Benutzer registriert werden konnte
+ */
public boolean addParticipant(User user) {
Objects.requireNonNull(user, "User darf nicht null sein");
@@ -53,6 +72,15 @@ public class GruppenRoom {
return participants.add(user);
}
+ /**
+ * Entfernt einen Teilnehmer aus der Gruppe.
+ *
+ * @param remover Der Benutzer, der die Entfernung durchführt (darf nicht null sein)
+ * @param userToRemove Der zu entfernende Benutzer (darf nicht null sein)
+ * @return true wenn der Benutzer erfolgreich entfernt wurde
+ * @throws IllegalArgumentException wenn der Entferner keine Berechtigung hat oder
+ * der Creator entfernt werden soll
+ */
public boolean removeParticipant(User remover, User userToRemove) {
Objects.requireNonNull(remover, "Remover darf nicht null sein");
Objects.requireNonNull(userToRemove, "UserToRemove darf nicht null sein");
@@ -76,6 +104,15 @@ public class GruppenRoom {
return participants.remove(userToRemove);
}
+ /**
+ * Befördert einen Teilnehmer zum Administrator.
+ *
+ * @param promoter Der befördernde Administrator (darf nicht null sein)
+ * @param userToPromote Der zu befördernde Benutzer (darf nicht null sein)
+ * @return true wenn der Benutzer erfolgreich zum Admin befördert wurde
+ * @throws IllegalArgumentException wenn der Promoter kein Admin ist, der Benutzer
+ * nicht in der Gruppe ist oder bereits Admin ist
+ */
public boolean addAdmin(User promoter, User userToPromote) {
Objects.requireNonNull(promoter, "Promoter darf nicht null sein");
Objects.requireNonNull(userToPromote, "UserToPromote darf nicht null sein");
@@ -95,6 +132,15 @@ public class GruppenRoom {
return admins.add(userToPromote);
}
+ /**
+ * Entzieht einem Benutzer die Administrator-Rechte.
+ *
+ * @param demoter Der Administrator, der die Rechte entzieht (darf nicht null sein)
+ * @param userToDemote Der Benutzer, dem die Rechte entzogen werden (darf nicht null sein)
+ * @return true wenn die Admin-Rechte erfolgreich entzogen wurden
+ * @throws IllegalArgumentException wenn der Demoter kein Admin ist, der Creator
+ * betroffen ist oder der Benutzer kein Admin ist
+ */
public boolean removeAdmin(User demoter, User userToDemote) {
Objects.requireNonNull(demoter, "Demoter darf nicht null sein");
Objects.requireNonNull(userToDemote, "UserToDemote darf nicht null sein");
@@ -114,6 +160,13 @@ public class GruppenRoom {
return admins.remove(userToDemote);
}
+ /**
+ * Fügt eine Nachricht zur Gruppenkonversation hinzu.
+ *
+ * @param sender Der Absender der Nachricht (darf nicht null sein)
+ * @param content Der Inhalt der Nachricht (darf nicht null sein)
+ * @throws IllegalArgumentException wenn der Absender nicht Gruppenmitglied ist
+ */
public void addMessage(User sender, String content) {
Objects.requireNonNull(sender, "Sender darf nicht null sein");
Objects.requireNonNull(content, "Content darf nicht null sein");
@@ -126,6 +179,11 @@ public class GruppenRoom {
messages.add(message);
}
+ /**
+ * Gibt alle Nachrichten der Gruppe als String-Liste zurück.
+ *
+ * @return Liste der Nachrichten-Strings oder leere Liste bei keinen Nachrichten
+ */
public List showMessages() {
if (messages.isEmpty()) {
return new ArrayList<>();
@@ -136,28 +194,92 @@ public class GruppenRoom {
.toList();
}
+ /**
+ * Überprüft ob ein Benutzer Administrator der Gruppe ist.
+ *
+ * @param user Der zu überprüfende Benutzer
+ * @return true wenn der Benutzer Admin ist, sonst false
+ */
public boolean isAdmin(User user) {
return admins.contains(user);
}
+ /**
+ * Überprüft ob ein Benutzer Teilnehmer der Gruppe ist.
+ *
+ * @param user Der zu überprüfende Benutzer
+ * @return true wenn der Benutzer Teilnehmer ist, sonst false
+ */
public boolean isParticipant(User user) {
return participants.contains(user);
}
- // Getter-Methoden
+ // Getter-Methoden für den Zugriff auf die privaten Felder
+
+ /**
+ * Gibt die eindeutige Gruppen-ID zurück.
+ *
+ * @return Die ID der Gruppe
+ */
public int getGroupId() { return groupId; }
+
+ /**
+ * Gibt den Ersteller der Gruppe zurück.
+ *
+ * @return Der Creator der Gruppe
+ */
public User getCreator() { return creator; }
+
+ /**
+ * Gibt den Namen der Gruppe zurück.
+ *
+ * @return Der Gruppenname
+ */
public String getName() { return name; }
+
+ /**
+ * Gibt die Beschreibung der Gruppe zurück.
+ *
+ * @return Die Gruppenbeschreibung
+ */
public String getDescription() { return description; }
+
+ /**
+ * Gibt den Erstellungszeitpunkt der Gruppe zurück.
+ *
+ * @return Der Zeitpunkt der Gruppenerstellung
+ */
public LocalDateTime getCreatedAt() { return createdAt; }
+
+ /**
+ * Gibt eine Kopie der Admin-Liste zurück.
+ *
+ * @return Liste der Administratoren
+ */
public List getAdmins() { return new ArrayList<>(admins); }
+
+ /**
+ * Gibt eine Kopie der Teilnehmerliste zurück.
+ *
+ * @return Liste der Teilnehmer
+ */
public List getParticipants() { return new ArrayList<>(participants); }
+
+ /**
+ * Gibt eine Kopie der Nachrichtenliste zurück.
+ *
+ * @return Liste der Nachrichten
+ */
public List getMessages() { return new ArrayList<>(messages); }
+ /**
+ * Gibt eine String-Repräsentation der Gruppe zurück.
+ *
+ * @return String mit Gruppenname, ID, Teilnehmer- und Nachrichtenanzahl
+ */
@Override
public String toString() {
return String.format("GruppenRoom{name='%s', id=%d, participants=%d, messages=%d}",
name, groupId, participants.size(), messages.size());
}
-
}
\ No newline at end of file
diff --git a/MyLocalChat/src/main/java/domain/Message.java b/MyLocalChat/src/main/java/domain/Message.java
index 1aaf9f8..fc0c3cf 100644
--- a/MyLocalChat/src/main/java/domain/Message.java
+++ b/MyLocalChat/src/main/java/domain/Message.java
@@ -3,68 +3,143 @@ package domain;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
+/**
+ * Repräsentiert eine Nachricht im Chat-System.
+ * Enthält Informationen über Absender, Inhalt, Zeitstempel und Nachrichtentyp.
+ */
public class Message {
- private User sender;
- private String content;
- private LocalDateTime timestamp;
- private MessageType type;
+ private User sender; // Absender der Nachricht
+ private String content; // Inhalt der Nachricht
+ private LocalDateTime timestamp; // Zeitpunkt der Erstellung
+ private MessageType type; // Typ der Nachricht (TEXT, IMAGE, etc.)
+ /**
+ * Zeitformatierer für die Darstellung des Zeitstempels.
+ * Formatiert die Zeit im Format "HH:mm" (Stunden:Minuten).
+ */
private static final DateTimeFormatter TIME_FORMATTER =
DateTimeFormatter.ofPattern("HH:mm");
+ /**
+ * Erstellt eine neue Textnachricht mit aktuellem Zeitstempel.
+ *
+ * @param sender Der Absender der Nachricht (darf nicht null sein)
+ * @param content Der Inhalt der Nachricht (darf nicht null oder leer sein)
+ */
public Message(User sender, String content) {
this.sender = sender;
this.content = content;
- this.timestamp = LocalDateTime.now();
- this.type = MessageType.TEXT;
+ this.timestamp = LocalDateTime.now(); // Setzt aktuellen Zeitpunkt
+ this.type = MessageType.TEXT; // Standardmäßig Textnachricht
}
+ /**
+ * Erstellt eine neue Nachricht mit spezifischem Typ und aktuellem Zeitstempel.
+ *
+ * @param sender Der Absender der Nachricht (darf nicht null sein)
+ * @param content Der Inhalt der Nachricht (darf nicht null oder leer sein)
+ * @param type Der Typ der Nachricht (TEXT, IMAGE, FILE, etc.)
+ */
public Message(User sender, String content, MessageType type) {
- this(sender, content);
- this.type = type;
+ this(sender, content); // Ruft den Hauptkonstruktor auf
+ this.type = type; // Setzt den spezifischen Nachrichtentyp
}
+ /**
+ * Gibt die Nachricht mit Zeitstempel formatiert zurück.
+ * Format: "[HH:mm] Absender: Nachricht"
+ *
+ * @return Formatierter Nachrichten-String mit Zeitstempel
+ */
public String toTimeString() {
return String.format("[%s] %s: %s",
- timestamp.format(TIME_FORMATTER),
- sender.getUsername(),
- content);
+ timestamp.format(TIME_FORMATTER), // Formatiert Zeit im HH:mm Format
+ sender.getUsername(), // Holt den Benutzernamen des Absenders
+ content); // Nachrichteninhalt
}
+ /**
+ * Gibt die String-Repräsentation der Nachricht zurück.
+ * Verwendet standardmäßig die Zeitstempel-Formatierung.
+ *
+ * @return Formatierte Nachricht als String
+ */
@Override
public String toString() {
- return toTimeString();
+ return toTimeString(); // Verwendet die Zeitstempel-Formatierung
}
+ // Getter- und Setter-Methoden
+
+ /**
+ * Gibt den Absender der Nachricht zurück.
+ *
+ * @return User-Objekt des Absenders
+ */
public User getSender() {
return sender;
}
+ /**
+ * Setzt den Absender der Nachricht.
+ *
+ * @param sender Der neue Absender (darf nicht null sein)
+ */
public void setSender(User sender) {
this.sender = sender;
}
+ /**
+ * Gibt den Inhalt der Nachricht zurück.
+ *
+ * @return Nachrichteninhalt als String
+ */
public String getContent() {
return content;
}
+ /**
+ * Setzt den Inhalt der Nachricht.
+ *
+ * @param content Der neue Nachrichteninhalt (darf nicht null sein)
+ */
public void setContent(String content) {
this.content = content;
}
+ /**
+ * Gibt den Zeitstempel der Nachricht zurück.
+ *
+ * @return LocalDateTime des Erstellungszeitpunkts
+ */
public LocalDateTime getTimestamp() {
return timestamp;
}
+ /**
+ * Setzt den Zeitstempel der Nachricht.
+ *
+ * @param timestamp Der neue Zeitstempel (darf nicht null sein)
+ */
public void setTimestamp(LocalDateTime timestamp) {
this.timestamp = timestamp;
}
+ /**
+ * Gibt den Typ der Nachricht zurück.
+ *
+ * @return MessageType der Nachricht
+ */
public MessageType getType() {
return type;
}
+ /**
+ * Setzt den Typ der Nachricht.
+ *
+ * @param type Der neue Nachrichtentyp
+ */
public void setType(MessageType type) {
this.type = type;
}
diff --git a/MyLocalChat/src/main/java/domain/User.java b/MyLocalChat/src/main/java/domain/User.java
index 19292a6..3172ae6 100644
--- a/MyLocalChat/src/main/java/domain/User.java
+++ b/MyLocalChat/src/main/java/domain/User.java
@@ -2,65 +2,125 @@ package domain;
import java.util.List;
+/**
+ * Repräsentiert einen Benutzer im Chat-System.
+ * Enthält Benutzerinformationen, Kontakte, Chaträume und Gruppenmitgliedschaften.
+ * Jeder Benutzer hat eine eindeutige ID und kann multiple Chat-Beziehungen verwalten.
+ */
public class User {
- private static int nextUserId = 1000;
- private int userId;
- private final String username;
- private boolean isOnline;
- private UserInfo userInfo;
- private UserContacts userContacts;
- private UserChatRoom chatRoom;
- private UserGruppenRoom gruppenRoom;
-
+ private static int nextUserId = 1000; // Zähler für automatische User-ID Vergabe
+ private int userId; // Eindeutige ID des Benutzers
+ private final String username; // Benutzername (final, da unveränderlich)
+ private boolean isOnline; // Online-Status des Benutzers
+ private UserInfo userInfo; // Statusinformation des Benutzers
+ private UserContacts userContacts; // Kontaktliste des Benutzers
+ private UserChatRoom chatRoom; // Verwaltung der Chaträume des Benutzers
+ private UserGruppenRoom gruppenRoom; // Verwaltung der Gruppenmitgliedschaften
+ /**
+ * Erstellt einen neuen Benutzer mit dem angegebenen Benutzernamen.
+ * Der Benutzer wird automatisch als online und "verfügbar" eingestuft.
+ *
+ * @param username Der Benutzername für den neuen Benutzer (darf nicht null oder leer sein)
+ */
public User(String username) {
- this.userId = nextUserId++;
+ this.userId = nextUserId++; // Vergibt automatische eindeutige ID
this.username = username;
- this.isOnline = true;
- this.userInfo = UserInfo.VERFÜGBAR;
- this.userContacts = new UserContacts();
- this.chatRoom = new UserChatRoom();
- this.gruppenRoom = new UserGruppenRoom();
-
+ this.isOnline = true; // Standardmäßig online
+ this.userInfo = UserInfo.VERFÜGBAR; // Standard-Status "verfügbar"
+ this.userContacts = new UserContacts(); // Initialisiert leere Kontaktliste
+ this.chatRoom = new UserChatRoom(); // Initialisiert Chatraum-Verwaltung
+ this.gruppenRoom = new UserGruppenRoom(); // Initialisiert Gruppen-Verwaltung
}
+ /**
+ * Gibt die eindeutige User-ID zurück.
+ *
+ * @return Die ID des Benutzers
+ */
public int getUserId() {
return userId;
}
+ /**
+ * Überprüft den Online-Status des Benutzers.
+ *
+ * @return true wenn der Benutzer online ist, false wenn offline
+ */
public boolean isOnline() {
return isOnline;
}
+ /**
+ * Setzt den Online-Status des Benutzers.
+ *
+ * @param isOnline true für online, false für offline
+ */
public void setOnline(boolean isOnline) {
this.isOnline = isOnline;
}
+ /**
+ * Gibt den Benutzernamen zurück.
+ *
+ * @return Der Benutzername
+ */
public String getUsername() {
return username;
}
+ /**
+ * Gibt den aktuellen Statusinformationen des Benutzers zurück.
+ *
+ * @return UserInfo-Objekt mit den Statusinformationen
+ */
public UserInfo getUserInfo() {
return userInfo;
}
+ /**
+ * Setzt die Statusinformationen des Benutzers.
+ *
+ * @param userInfo Die neuen Statusinformationen
+ */
public void setUserInfo(UserInfo userInfo) {
this.userInfo = userInfo;
}
+ /**
+ * Gibt die Kontaktliste des Benutzers zurück.
+ *
+ * @return UserContacts-Objekt mit allen Kontakten
+ */
public UserContacts getUserContacts() {
return userContacts;
}
+ /**
+ * Gibt die Chatraum-Verwaltung des Benutzers zurück.
+ *
+ * @return UserChatRoom-Objekt mit allen Chaträumen
+ */
public UserChatRoom getUserChatRoom() {
return chatRoom;
}
+ /**
+ * Gibt die Gruppen-Verwaltung des Benutzers zurück.
+ *
+ * @return UserGruppenRoom-Objekt mit allen Gruppenmitgliedschaften
+ */
public UserGruppenRoom getUserGruppenRoom() {
return gruppenRoom;
}
+ /**
+ * Gibt eine String-Repräsentation des Benutzers zurück.
+ * Enthält User-ID, Benutzername, Online-Status und User-Info.
+ *
+ * @return String mit den Benutzerinformationen
+ */
@Override
public String toString() {
return "User [userId=" + userId + ", username=" + username + ", isOnline=" + isOnline + ", userInfo=" + userInfo
diff --git a/MyLocalChat/src/main/java/domain/UserChatRoom.java b/MyLocalChat/src/main/java/domain/UserChatRoom.java
index 7ccf869..02fc575 100644
--- a/MyLocalChat/src/main/java/domain/UserChatRoom.java
+++ b/MyLocalChat/src/main/java/domain/UserChatRoom.java
@@ -4,14 +4,29 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+/**
+ * Verwaltet die Chaträume eines Benutzers.
+ * Enthält Funktionen zum Hinzufügen, Entfernen und Abfragen von Chaträumen.
+ */
public class UserChatRoom {
- private List chatRooms;
+ private List chatRooms; // Liste aller Chaträume des Benutzers
+ /**
+ * Konstruktor für UserChatRoom.
+ * Initialisiert eine leere Liste von Chaträumen.
+ */
public UserChatRoom() {
this.chatRooms = new ArrayList<>();
}
+ /**
+ * Fügt einen Chatraum zur Liste des Benutzers hinzu.
+ *
+ * @param chatRoom Der hinzuzufügende Chatraum (darf nicht null sein)
+ * @return true wenn der Chatraum erfolgreich hinzugefügt wurde
+ * @throws IllegalArgumentException wenn der Chatraum bereits vorhanden ist
+ */
public boolean addChat(ChatRoom chatRoom) {
Objects.requireNonNull(chatRoom, "ChatRoom darf nicht null sein");
@@ -22,6 +37,13 @@ public class UserChatRoom {
return chatRooms.add(chatRoom);
}
+ /**
+ * Entfernt einen Chatraum aus der Liste des Benutzers.
+ *
+ * @param chatRoom Der zu entfernende Chatraum (darf nicht null sein)
+ * @return true wenn der Chatraum erfolgreich entfernt wurde
+ * @throws IllegalArgumentException wenn der Chatraum nicht gefunden wurde
+ */
public boolean removeChat(ChatRoom chatRoom) {
Objects.requireNonNull(chatRoom, "ChatRoom darf nicht null sein");
@@ -32,10 +54,20 @@ public class UserChatRoom {
return chatRooms.remove(chatRoom);
}
+ /**
+ * Gibt eine Kopie aller Chaträume des Benutzers zurück.
+ *
+ * @return Liste aller Chaträume
+ */
public List getAllChatRooms() {
return new ArrayList<>(chatRooms); // Rückgabe einer Kopie für Encapsulation
}
+ /**
+ * Gibt eine Liste aller Chatraum-IDs des Benutzers zurück.
+ *
+ * @return Liste von Chatraum-IDs
+ */
public List getChatRoomIds() {
List ids = new ArrayList<>();
for (ChatRoom room : chatRooms) {
@@ -44,22 +76,46 @@ public class UserChatRoom {
return ids;
}
+ /**
+ * Überprüft ob ein bestimmter Chatraum vorhanden ist.
+ *
+ * @param chatRoom Der zu überprüfende Chatraum
+ * @return true wenn der Chatraum vorhanden ist, sonst false
+ */
public boolean contains(ChatRoom chatRoom) {
return chatRooms.contains(chatRoom);
}
+ /**
+ * Gibt die Anzahl der Chaträume des Benutzers zurück.
+ *
+ * @return Anzahl der Chaträume
+ */
public int getChatRoomCount() {
return chatRooms.size();
}
+ /**
+ * Überprüft ob der Benutzer keine Chaträume hat.
+ *
+ * @return true wenn keine Chaträume vorhanden sind, sonst false
+ */
public boolean isEmpty() {
return chatRooms.isEmpty();
}
+ /**
+ * Entfernt alle Chaträume des Benutzers.
+ */
public void clearChatRooms() {
chatRooms.clear();
}
+ /**
+ * Gibt Informationen aller Chaträume als String-Liste zurück.
+ *
+ * @return Liste von Chatraum-Informationen
+ */
public List getChatRoomInfos() {
List infos = new ArrayList<>();
for (ChatRoom room : chatRooms) {
diff --git a/MyLocalChat/src/main/java/domain/UserContacts.java b/MyLocalChat/src/main/java/domain/UserContacts.java
index fa2ec60..4685de6 100644
--- a/MyLocalChat/src/main/java/domain/UserContacts.java
+++ b/MyLocalChat/src/main/java/domain/UserContacts.java
@@ -4,13 +4,29 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+/**
+ * Verwaltet die Kontaktliste eines Benutzers.
+ * Bietet Funktionen zum Hinzufügen, Entfernen und Verwalten von Kontakten.
+ */
public class UserContacts {
- private List contacts;
+ private List contacts; // Liste aller Kontakte des Benutzers
+ /**
+ * Konstruktor für UserContacts.
+ * Initialisiert eine leere Kontaktliste.
+ */
public UserContacts() {
this.contacts = new ArrayList<>();
}
+ /**
+ * Fügt einen neuen Kontakt zur Kontaktliste hinzu.
+ *
+ * @param user Der hinzuzufügende Benutzer (darf nicht null sein)
+ * @return true wenn der Kontakt erfolgreich hinzugefügt wurde
+ * @throws NullPointerException wenn der Benutzer null ist
+ * @throws IllegalArgumentException wenn der Benutzer bereits in der Kontaktliste existiert
+ */
public boolean addContact(User user) {
if (user == null)
throw new NullPointerException("User darf nicht null sein");
@@ -21,32 +37,61 @@ public class UserContacts {
return contacts.add(user);
}
+ /**
+ * Entfernt einen Kontakt aus der Kontaktliste.
+ *
+ * @param user Der zu entfernende Benutzer (darf nicht null sein)
+ * @return true wenn der Kontakt erfolgreich entfernt wurde, false wenn nicht vorhanden
+ * @throws NullPointerException wenn der Benutzer null ist
+ */
public boolean removeContact(User user) {
if (user == null)
throw new NullPointerException("User darf nicht null sein");
return contacts.remove(user);
}
+ /**
+ * Überprüft ob ein Benutzer in der Kontaktliste vorhanden ist.
+ *
+ * @param user Der zu überprüfende Benutzer (darf nicht null sein)
+ * @return true wenn der Benutzer in der Kontaktliste ist, sonst false
+ * @throws NullPointerException wenn der Benutzer null ist
+ */
public boolean hasContact(User user) {
if (user == null)
throw new NullPointerException("User darf nicht null sein");
return contacts.contains(user);
}
+ /**
+ * Zeigt alle Kontakte als String-Liste an.
+ *
+ * @return Liste von Kontakt-Strings oder leere Liste bei keinen Kontakten
+ */
public List showAllContacts() {
if (contacts == null || contacts.isEmpty()) {
return new ArrayList<>();
}
return contacts.stream()
- .map(User::toString)
+ .map(User::toString) // Wandelt jeden User in String um
.toList();
}
+ /**
+ * Gibt eine Kopie der Kontaktliste zurück.
+ *
+ * @return Liste aller Kontakte (Kopie zur Wahrung der Encapsulation)
+ */
public List getContacts() {
return new ArrayList<>(contacts);
}
+ /**
+ * Gibt die Anzahl der Kontakte zurück.
+ *
+ * @return Anzahl der Kontakte in der Liste
+ */
public int getContactCount() {
return contacts.size();
}
diff --git a/MyLocalChat/src/main/java/domain/UserGruppenRoom.java b/MyLocalChat/src/main/java/domain/UserGruppenRoom.java
index d7c0984..ae0280e 100644
--- a/MyLocalChat/src/main/java/domain/UserGruppenRoom.java
+++ b/MyLocalChat/src/main/java/domain/UserGruppenRoom.java
@@ -3,45 +3,93 @@ package domain;
import java.util.ArrayList;
import java.util.List;
+/**
+ * Verwaltet die Gruppenmitgliedschaften eines Benutzers.
+ * Enthält Funktionen zum Hinzufügen, Entfernen und Abfragen von Gruppenräumen.
+ */
public class UserGruppenRoom {
- private List gruppenRooms;
+ private List gruppenRooms; // Liste aller Gruppenräume des Benutzers
+ /**
+ * Konstruktor für UserGruppenRoom.
+ * Initialisiert eine leere Liste von Gruppenräumen.
+ */
public UserGruppenRoom() {
this.gruppenRooms = new ArrayList<>();
}
+ /**
+ * Fügt einen Gruppenraum zur Liste des Benutzers hinzu.
+ *
+ * @param gruppenRoom Der hinzuzufügende Gruppenraum
+ * @return true wenn der Gruppenraum erfolgreich hinzugefügt wurde,
+ * false wenn der Gruppenraum bereits vorhanden ist
+ */
public boolean addGruppenRoom(GruppenRoom gruppenRoom) {
if (gruppenRooms.contains(gruppenRoom))
- return false;
+ return false; // Gruppenraum bereits vorhanden
return gruppenRooms.add(gruppenRoom);
}
+ /**
+ * Entfernt einen Gruppenraum aus der Liste des Benutzers.
+ *
+ * @param gruppenRoom Der zu entfernende Gruppenraum
+ * @return true wenn der Gruppenraum erfolgreich entfernt wurde,
+ * false wenn der Gruppenraum nicht vorhanden war
+ */
public boolean removeGruppenRoom(GruppenRoom gruppenRoom) {
return gruppenRooms.remove(gruppenRoom);
}
+ /**
+ * Gibt eine Kopie aller Gruppenräume des Benutzers zurück.
+ *
+ * @return Liste aller Gruppenräume (Kopie zur Wahrung der Encapsulation)
+ */
public List getGruppenRooms() {
- return new ArrayList<>(gruppenRooms); // Rückgabe einer Kopie
+ return new ArrayList<>(gruppenRooms);
}
+ /**
+ * Überprüft ob ein bestimmter Gruppenraum vorhanden ist.
+ *
+ * @param gruppenRoom Der zu überprüfende Gruppenraum
+ * @return true wenn der Gruppenraum vorhanden ist, sonst false
+ */
public boolean contains(GruppenRoom gruppenRoom) {
return gruppenRooms.contains(gruppenRoom);
}
+ /**
+ * Gibt die Anzahl der Gruppenräume des Benutzers zurück.
+ *
+ * @return Anzahl der Gruppenräume
+ */
public int getSize() {
return gruppenRooms.size();
}
+ /**
+ * Überprüft ob der Benutzer keine Gruppenräume hat.
+ *
+ * @return true wenn keine Gruppenräume vorhanden sind, sonst false
+ */
public boolean isEmpty() {
return gruppenRooms.isEmpty();
}
+ /**
+ * Gibt die Namen aller Gruppenräume des Benutzers zurück.
+ *
+ * @return Liste von Gruppennamen
+ */
public List getGruppenRoomNames() {
List names = new ArrayList<>();
- for (GruppenRoom room : gruppenRooms) {
- names.add(room.getName());
- }
+ for (GruppenRoom room : gruppenRooms)
+ names.add(room.getName()); // Holt den Namen jedes Gruppenraums
+
return names;
}
}
\ No newline at end of file
diff --git a/MyLocalChat/src/main/java/fassade/ChatService.java b/MyLocalChat/src/main/java/fassade/ChatService.java
index 695ee30..b5967a5 100644
--- a/MyLocalChat/src/main/java/fassade/ChatService.java
+++ b/MyLocalChat/src/main/java/fassade/ChatService.java
@@ -6,12 +6,21 @@ import java.util.List;
import java.util.Map;
import domain.*;
+/**
+ * Zentrale Service-Klasse für die Chat-Anwendungslogik.
+ * Verwaltet Benutzer, Chaträume, Gruppen und Nachrichten.
+ * Stellt die Hauptschnittstelle für alle Chat-Operationen dar.
+ */
public class ChatService {
- private Map chatrooms;
- private Map gruppenRooms;
- private Map users;
- private Map usersById;
+ private Map chatrooms; // Speichert alle Chaträume nach ID
+ private Map gruppenRooms; // Speichert alle Gruppenräume nach ID
+ private Map users; // Speichert Benutzer nach Benutzername
+ private Map usersById; // Speichert Benutzer nach User-ID
+ /**
+ * Konstruktor für den ChatService.
+ * Initialisiert alle benötigten Datenstrukturen.
+ */
public ChatService() {
chatrooms = new HashMap<>();
gruppenRooms = new HashMap<>();
@@ -19,6 +28,13 @@ public class ChatService {
usersById = new HashMap<>();
}
+ /**
+ * Erstellt einen neuen Benutzer mit dem angegebenen Benutzernamen.
+ *
+ * @param userName Der gewünschte Benutzername
+ * @return true wenn der Benutzer erfolgreich erstellt wurde
+ * @throws IllegalArgumentException wenn der Benutzername bereits vergeben ist
+ */
public boolean createUser(String userName) {
if (users.containsKey(userName))
throw new IllegalArgumentException("User existiert bereits: " + userName);
@@ -29,14 +45,34 @@ public class ChatService {
return true;
}
+ /**
+ * Holt einen Benutzer anhand des Benutzernamens (private Hilfsmethode).
+ *
+ * @param userName Der Benutzername
+ * @return User-Objekt oder null wenn nicht gefunden
+ */
private User getUser(String userName) {
return users.get(userName);
}
+ /**
+ * Holt einen Benutzer anhand der User-ID (private Hilfsmethode).
+ *
+ * @param userId Die User-ID
+ * @return User-Objekt oder null wenn nicht gefunden
+ */
private User getUser(int userId) {
return usersById.get(userId);
}
+ /**
+ * Erstellt einen neuen Chatraum zwischen zwei Benutzern.
+ *
+ * @param user1Name Benutzername des ersten Benutzers
+ * @param user2Name Benutzername des zweiten Benutzers
+ * @return Die ID des erstellten Chatraums
+ * @throws IllegalArgumentException wenn ein Benutzer nicht existiert
+ */
public int createChatRoom(String user1Name, String user2Name) {
User user1 = getUser(user1Name);
User user2 = getUser(user2Name);
@@ -44,13 +80,15 @@ public class ChatService {
if (user1 == null || user2 == null)
throw new IllegalArgumentException("User existiert nicht");
+ // Prüft ob bereits ein Chatraum zwischen den Benutzern existiert
for (ChatRoom room : chatrooms.values()) {
if ((room.getUser1().equals(user1) && room.getUser2().equals(user2)) ||
(room.getUser1().equals(user2) && room.getUser2().equals(user1))) {
- return room.getRoomId();
+ return room.getRoomId(); // Gibt existierenden Raum zurück
}
}
+ // Erstellt neuen Chatraum
ChatRoom tempChatRoom = new ChatRoom(user1, user2);
chatrooms.put(tempChatRoom.getRoomId(), tempChatRoom);
user1.getUserChatRoom().addChat(tempChatRoom);
@@ -59,6 +97,15 @@ public class ChatService {
return tempChatRoom.getRoomId();
}
+ /**
+ * Sendet eine Nachricht in einen Chatraum.
+ *
+ * @param roomId Die ID des Chatraums
+ * @param senderName Der Benutzername des Absenders
+ * @param content Der Nachrichteninhalt
+ * @throws IllegalArgumentException wenn Raum oder Absender nicht existieren
+ * oder Absender nicht im Raum ist
+ */
public void sendMessage(int roomId, String senderName, String content) {
ChatRoom room = chatrooms.get(roomId);
if (room == null)
@@ -78,6 +125,13 @@ public class ChatService {
room.addMessage(message);
}
+ /**
+ * Zeigt alle Nachrichten eines Chatraums an.
+ *
+ * @param roomId Die ID des Chatraums
+ * @return Liste der Nachrichten als Strings
+ * @throws IllegalArgumentException wenn der Chatraum nicht existiert
+ */
public List showMessage(int roomId) {
ChatRoom room = chatrooms.get(roomId);
if (room == null)
@@ -86,6 +140,15 @@ public class ChatService {
return room.showMessages();
}
+ /**
+ * Fügt einen Benutzer zur Kontaktliste hinzu.
+ *
+ * @param contactUserName Der Benutzername des hinzuzufügenden Kontakts
+ * @param currentUserName Der Benutzername des aktuellen Benutzers
+ * @return true wenn der Kontakt erfolgreich hinzugefügt wurde
+ * @throws IllegalArgumentException wenn ein Benutzer nicht existiert oder
+ * Selbsthinzufügung versucht wird
+ */
public boolean addContact(String contactUserName, String currentUserName) {
if (!users.containsKey(contactUserName))
throw new IllegalArgumentException("User existiert nicht: " + contactUserName);
@@ -104,6 +167,13 @@ public class ChatService {
return currentUser.getUserContacts().addContact(contactUser);
}
+ /**
+ * Zeigt alle Kontakte eines Benutzers an.
+ *
+ * @param userName Der Benutzername
+ * @return Liste der Kontakte als Strings
+ * @throws IllegalArgumentException wenn der Benutzer nicht existiert
+ */
public List getUserContacts(String userName) {
if (!users.containsKey(userName))
throw new IllegalArgumentException("User existiert nicht: " + userName);
@@ -112,6 +182,13 @@ public class ChatService {
return user.getUserContacts().showAllContacts();
}
+ /**
+ * Gibt alle Chatraum-IDs eines Benutzers zurück.
+ *
+ * @param userName Der Benutzername
+ * @return Liste der Chatraum-IDs
+ * @throws IllegalArgumentException wenn der Benutzer nicht existiert
+ */
public List getUserChatRoomIds(String userName) {
if (!users.containsKey(userName))
throw new IllegalArgumentException("User existiert nicht: " + userName);
@@ -120,6 +197,13 @@ public class ChatService {
return user.getUserChatRoom().getChatRoomIds();
}
+ /**
+ * Gibt Informationen über einen Chatraum zurück.
+ *
+ * @param roomId Die ID des Chatraums
+ * @return String mit Chatraum-Informationen
+ * @throws IllegalArgumentException wenn der Chatraum nicht existiert
+ */
public String getChatRoomInfo(int roomId) {
ChatRoom room = chatrooms.get(roomId);
if (room == null)
@@ -128,7 +212,15 @@ public class ChatService {
return room.toString();
}
- // Gruppen-Funktionen
+ /**
+ * Erstellt einen neuen Gruppenraum.
+ *
+ * @param creatorName Der Benutzername des Erstellers
+ * @param groupName Der Name der Gruppe
+ * @param description Die Beschreibung der Gruppe
+ * @return Die ID des erstellten Gruppenraums
+ * @throws IllegalArgumentException wenn der Ersteller nicht existiert
+ */
public int createGruppenRoom(String creatorName, String groupName, String description) {
User creator = getUser(creatorName);
if (creator == null) {
@@ -140,6 +232,16 @@ public class ChatService {
return gruppenRoom.getGroupId();
}
+ /**
+ * Fügt einen Teilnehmer zu einer Gruppe hinzu.
+ *
+ * @param groupId Die ID der Gruppe
+ * @param adderName Der Benutzername des hinzufügenden Admins
+ * @param userToAddName Der Benutzername des hinzuzufügenden Benutzers
+ * @return true wenn der Benutzer erfolgreich hinzugefügt wurde
+ * @throws IllegalArgumentException wenn Gruppe, Admin oder Benutzer nicht existieren
+ * oder der Admin keine Berechtigung hat
+ */
public boolean addParticipantToGroup(int groupId, String adderName, String userToAddName) {
GruppenRoom group = gruppenRooms.get(groupId);
User adder = getUser(adderName);
@@ -156,6 +258,14 @@ public class ChatService {
return group.addParticipant(userToAdd);
}
+ /**
+ * Sendet eine Nachricht in einen Gruppenraum.
+ *
+ * @param groupId Die ID der Gruppe
+ * @param senderName Der Benutzername des Absenders
+ * @param content Der Nachrichteninhalt
+ * @throws IllegalArgumentException wenn Gruppe oder Absender nicht existieren
+ */
public void sendGroupMessage(int groupId, String senderName, String content) {
GruppenRoom group = gruppenRooms.get(groupId);
User sender = getUser(senderName);
@@ -166,6 +276,13 @@ public class ChatService {
group.addMessage(sender, content);
}
+ /**
+ * Zeigt alle Nachrichten eines Gruppenraums an.
+ *
+ * @param groupId Die ID der Gruppe
+ * @return Liste der Nachrichten als Strings
+ * @throws IllegalArgumentException wenn die Gruppe nicht existiert
+ */
public List getGroupMessages(int groupId) {
GruppenRoom group = gruppenRooms.get(groupId);
if (group == null) {
@@ -175,6 +292,13 @@ public class ChatService {
return group.showMessages();
}
+ /**
+ * Zeigt alle Gruppenräume eines Benutzers an.
+ *
+ * @param userName Der Benutzername
+ * @return Liste der Gruppennamen
+ * @throws IllegalArgumentException wenn der Benutzer nicht existiert
+ */
public List getUserGruppenRooms(String userName) {
User user = getUser(userName);
if (user == null) {
@@ -184,12 +308,18 @@ public class ChatService {
return user.getUserGruppenRoom().getGruppenRoomNames();
}
+ /**
+ * Gibt Informationen über einen Gruppenraum zurück.
+ *
+ * @param groupId Die ID der Gruppe
+ * @return String mit Gruppenraum-Informationen
+ * @throws IllegalArgumentException wenn der Gruppenraum nicht existiert
+ */
public String getGruppenRoomInfo(int groupId) {
GruppenRoom room = gruppenRooms.get(groupId);
if (room == null)
throw new IllegalArgumentException("Gruppenraum existiert nicht: " + groupId);
-
return room.toString();
}
}
\ No newline at end of file
diff --git a/MyLocalChat/src/main/java/server/ChatServer.java b/MyLocalChat/src/main/java/server/ChatServer.java
index 73350de..f77589d 100644
--- a/MyLocalChat/src/main/java/server/ChatServer.java
+++ b/MyLocalChat/src/main/java/server/ChatServer.java
@@ -7,15 +7,15 @@ import java.util.*;
public class ChatServer {
private static List clientWriters = new ArrayList<>();
+ /**
+ *
+ */
public static void startServer() {
- System.out.println("🚀 Starte LocalChat server...");
try (ServerSocket serverSocket = new ServerSocket(12345)) {
- System.out.println("✅ server läuft auf Port 12345");
while (true) {
Socket clientSocket = serverSocket.accept();
- System.out.println("🔗 Neuer Client verbunden");
new Thread(new ClientHandler(clientSocket)).start();
}
} catch (IOException e) {
@@ -23,6 +23,9 @@ public class ChatServer {
}
}
+ /**
+ *
+ */
private static class ClientHandler implements Runnable {
private Socket socket;
private PrintWriter out;
@@ -32,23 +35,22 @@ public class ChatServer {
this.socket = socket;
}
+ /**
+ *
+ */
public void run() {
try {
out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
- // Username vom Client empfangen
username = in.readLine();
- System.out.println("👤 " + username + " ist beigetreten");
clientWriters.add(out);
- broadcast("🌟 " + username + " hat den Chat betreten");
- // Nachrichten empfangen und verteilen
String message;
while ((message = in.readLine()) != null) {
- System.out.println("📩 " + username + ": " + message);
+
broadcast(username + ": " + message);
}
} catch (IOException e) {
@@ -61,6 +63,9 @@ public class ChatServer {
}
}
+ /**
+ * @param message
+ */
private static void broadcast(String message) {
for (PrintWriter writer : clientWriters) {
writer.println(message);