Advertisement
STEPAN_KODER_228

СТЕПАН ПРИКОЛ 5

May 22nd, 2023
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.23 KB | None | 0 0
  1. Certainly! Here's the modified code with the string constants extracted as private static fields:
  2.  
  3. ```java
  4. package org.example;
  5.  
  6. import org.w3c.dom.Document;
  7. import org.w3c.dom.Element;
  8. import org.xml.sax.InputSource;
  9.  
  10. import javax.xml.parsers.DocumentBuilder;
  11. import javax.xml.parsers.DocumentBuilderFactory;
  12. import javax.xml.parsers.ParserConfigurationException;
  13. import java.io.StringReader;
  14. import java.io.StringWriter;
  15.  
  16. public abstract sealed class ClientMessage implements Serializable permits ClientMessage.ListMembers, ClientMessage.LoginRequest, ClientMessage.Logout, ClientMessage.Message {
  17. private final Type type;
  18. private final String name;
  19.  
  20. ClientMessage(Type type, String name) {
  21. this.type = type;
  22. this.name = name;
  23. }
  24.  
  25. public Type getType() {
  26. return type;
  27. }
  28.  
  29. public String getName() {
  30. return name;
  31. }
  32.  
  33. public enum Type {
  34. Command,
  35. Event
  36. }
  37.  
  38. public static final class LoginRequest extends ClientMessage {
  39. private final String userName;
  40.  
  41. public LoginRequest(String userName) {
  42. super(Type.Command, "login");
  43. this.userName = userName;
  44. }
  45.  
  46. public String getUserName() {
  47. return userName;
  48. }
  49. }
  50.  
  51. public static final class Message extends ClientMessage {
  52. private final String messageText;
  53. private final int sessionID;
  54.  
  55. public Message(int sessionID, String messageText) {
  56. super(Type.Command, "message");
  57. this.messageText = messageText;
  58. this.sessionID = sessionID;
  59. }
  60.  
  61. public String getMessageText() {
  62. return messageText;
  63. }
  64.  
  65. public int getSessionID() {
  66. return sessionID;
  67. }
  68. }
  69.  
  70. public static final class Logout extends ClientMessage {
  71. private final int sessionID;
  72.  
  73. public Logout(int sessionID) {
  74. super(Type.Command, "logout");
  75. this.sessionID = sessionID;
  76. }
  77.  
  78. public int getSessionID() {
  79. return sessionID;
  80. }
  81. }
  82.  
  83. public static final class ListMembers extends ClientMessage {
  84. private final int sessionID;
  85.  
  86. public ListMembers(int sessionID) {
  87. super(Type.Command, "list");
  88. this.sessionID = sessionID;
  89. }
  90.  
  91. public int getSessionID() {
  92. return sessionID;
  93. }
  94. }
  95.  
  96. public static String serialize(ClientMessage message) throws ParserConfigurationException {
  97. DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
  98. DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
  99. Document document = documentBuilder.newDocument();
  100.  
  101. Element rootElement = document.createElement("command");
  102. rootElement.setAttribute("name", message.getName());
  103.  
  104. serializeCommand(message, document, rootElement);
  105.  
  106. document.appendChild(rootElement);
  107.  
  108. StringWriter writer = new StringWriter();
  109. try {
  110. XmlUtil.writeDocument(document, writer);
  111. } catch (Exception e) {
  112. throw new RuntimeException(e);
  113. }
  114.  
  115. return writer.toString();
  116. }
  117.  
  118. private static void serializeCommand(ClientMessage message, Document document, Element rootElement) {
  119. if (message instanceof ClientMessage.LoginRequest loginRequest) {
  120. serializeLoginRequest(document, rootElement, loginRequest);
  121. } else if (message instanceof ClientMessage.ListMembers listMembers) {
  122. serializeListMembers(document, rootElement, listMembers);
  123. } else if (message instanceof ClientMessage.Message msg) {
  124. serializeMessage(document, rootElement, msg);
  125. } else if (message instanceof ClientMessage.Logout logout) {
  126. serializeLogout(document, rootElement, logout);
  127. }
  128. }
  129.  
  130. private static void serializeLoginRequest(Document document, Element rootElement, ClientMessage.LoginRequest loginRequest) {
  131. Element nameElement = document.createElement("name");
  132. nameElement.setTextContent(loginRequest.getUserName());
  133. rootElement.appendChild(nameElement);
  134. }
  135.  
  136. private static void serializeListMembers(Document document, Element rootElement, ClientMessage.ListMembers listMembers) {
  137. Element session
  138.  
  139. Element = document.createElement("session");
  140. sessionElement.setTextContent(String.valueOf(listMembers.getSessionID()));
  141. rootElement.appendChild(sessionElement);
  142. }
  143.  
  144. private static void serializeMessage(Document document, Element rootElement, ClientMessage.Message message) {
  145. Element messageElement = document.createElement("message");
  146. messageElement.setTextContent(message.getMessageText());
  147. Element sessionElement = document.createElement("session");
  148. sessionElement.setTextContent(String.valueOf(message.getSessionID()));
  149. rootElement.appendChild(messageElement);
  150. rootElement.appendChild(sessionElement);
  151. }
  152.  
  153. private static void serializeLogout(Document document, Element rootElement, ClientMessage.Logout logout) {
  154. Element sessionElement = document.createElement("session");
  155. sessionElement.setTextContent(String.valueOf(logout.getSessionID()));
  156. rootElement.appendChild(sessionElement);
  157. }
  158.  
  159. private static final String TAG_NAME = "name";
  160. private static final String TAG_SESSION = "session";
  161.  
  162. public static ClientMessage deserializeXml(String xml) throws Exception {
  163. DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
  164. DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
  165.  
  166. // Create an InputSource from the XML string
  167. InputSource inputSource = new InputSource(new StringReader(xml));
  168.  
  169. Document document = documentBuilder.parse(inputSource);
  170.  
  171. Element rootElement = document.getDocumentElement();
  172. String commandName = rootElement.getAttribute("name");
  173.  
  174. switch (commandName) {
  175. case "login":
  176. return deserializeLoginRequest(rootElement);
  177. case "list":
  178. return deserializeListMembers(rootElement);
  179. case "message":
  180. return deserializeMessage(rootElement);
  181. case "logout":
  182. return deserializeLogout(rootElement);
  183. default:
  184. throw new IllegalArgumentException("Invalid XML structure.");
  185. }
  186. }
  187.  
  188. private static ClientMessage.LoginRequest deserializeLoginRequest(Element rootElement) {
  189. Element nameElement = (Element) rootElement.getElementsByTagName(TAG_NAME).item(0);
  190. String userName = nameElement.getTextContent();
  191. return new ClientMessage.LoginRequest(userName);
  192. }
  193.  
  194. private static ClientMessage.ListMembers deserializeListMembers(Element rootElement) {
  195. Element sessionElement = (Element) rootElement.getElementsByTagName(TAG_SESSION).item(0);
  196. int sessionID = Integer.parseInt(sessionElement.getTextContent());
  197. return new ClientMessage.ListMembers(sessionID);
  198. }
  199.  
  200. private static ClientMessage.Message deserializeMessage(Element rootElement) {
  201. Element messageElement = (Element) rootElement.getElementsByTagName("message").item(0);
  202. String messageText = messageElement.getTextContent();
  203. Element sessionElement = (Element) rootElement.getElementsByTagName(TAG_SESSION).item(0);
  204. int sessionID = Integer.parseInt(sessionElement.getTextContent());
  205. return new ClientMessage.Message(sessionID, messageText);
  206. }
  207.  
  208. private static ClientMessage.Logout deserializeLogout(Element rootElement) {
  209. Element sessionElement = (Element) rootElement.getElementsByTagName(TAG_SESSION).item(0);
  210. int sessionID = Integer.parseInt(sessionElement.getTextContent());
  211. return new ClientMessage.Logout(sessionID);
  212. }
  213. }
  214. ```
  215.  
  216. In this updated version, the string constants `TAG_NAME` and `TAG_SESSION` have been defined as private static fields. These fields are then used in the `deserializeXml` method and extracted methods for improved code readability and maintainability.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement