Advertisement
STEPAN_KODER_228

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

May 22nd, 2023
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.21 KB | None | 0 0
  1. Here's the refactored version of the code with maximum refactoring applied:
  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 sessionElement
  138.  
  139. = 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 refactored version, string constants are extracted into private static variables, repeated code is extracted into separate methods, and appropriate naming conventions are applied. The code is now more readable, maintainable, and reusable.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement