Advertisement
STEPAN_KODER_228

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

May 22nd, 2023
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.69 KB | None | 0 0
  1. Certainly! Here's the refactored code for the `ServerMessage` class with maximum refactoring applied:
  2.  
  3. ```java
  4. import org.w3c.dom.*;
  5.  
  6. import javax.xml.parsers.*;
  7. import java.io.*;
  8. import java.util.ArrayList;
  9. import java.util.Collections;
  10. import java.util.List;
  11.  
  12. public abstract sealed class ServerMessage implements Serializable
  13. permits ServerMessage.EmptySuccess, ServerMessage.Error, ServerMessage.ListMembers,
  14. ServerMessage.ListMessages, ServerMessage.LoginResponse, ServerMessage.NewMessage {
  15. private final ErrorType errorType;
  16.  
  17. protected ServerMessage(ErrorType errorType) {
  18. this.errorType = errorType;
  19. }
  20.  
  21. public ErrorType getErrorType() {
  22. return errorType;
  23. }
  24.  
  25. public enum ErrorType {
  26. ERROR, SUCCESS
  27. }
  28.  
  29. public static final class LoginResponse extends ServerMessage {
  30. private final int sessionID;
  31.  
  32. public LoginResponse(int sessionId) {
  33. super(ErrorType.SUCCESS);
  34. sessionID = sessionId;
  35. }
  36.  
  37. public int getSessionID() {
  38. return sessionID;
  39. }
  40. }
  41.  
  42. public static final class Error extends ServerMessage {
  43. private final String message;
  44.  
  45. public Error(String message) {
  46. super(ErrorType.ERROR);
  47. this.message = message;
  48. }
  49.  
  50. public String getMessage() {
  51. return message;
  52. }
  53. }
  54.  
  55. public static final class EmptySuccess extends ServerMessage {
  56. EmptySuccess() {
  57. super(ErrorType.SUCCESS);
  58. }
  59. }
  60.  
  61. public static final class ListMembers extends ServerMessage {
  62. private final List<User> userList;
  63.  
  64. public ListMembers(List<User> userList) {
  65. super(ErrorType.SUCCESS);
  66. this.userList = userList;
  67. }
  68.  
  69. public List<User> getUserList() {
  70. return userList == null ? Collections.emptyList() : userList;
  71. }
  72. }
  73.  
  74. public static final class ListMessages extends ServerMessage {
  75. private final List<TextMessage> messages;
  76.  
  77. public ListMessages(List<TextMessage> messages) {
  78. super(ErrorType.SUCCESS);
  79. this.messages = messages;
  80. }
  81.  
  82. public List<TextMessage> getMessages() {
  83. return messages == null ? Collections.emptyList() : messages;
  84. }
  85. }
  86.  
  87. public static final class NewMessage extends ServerMessage {
  88. private final TextMessage message;
  89.  
  90. public NewMessage(TextMessage message) {
  91. super(ErrorType.SUCCESS);
  92. this.message = message;
  93. }
  94.  
  95. public TextMessage getMessage() {
  96. return message;
  97. }
  98. }
  99.  
  100. public static ServerMessage deserializeXml(String xml) throws Exception {
  101. DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
  102. DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
  103.  
  104. // Create an InputSource from the XML string
  105. InputSource inputSource = new InputSource(new StringReader(xml));
  106.  
  107. Document document = documentBuilder.parse(inputSource);
  108.  
  109. Element rootElement = document.getDocumentElement();
  110. String rootTagName = rootElement.getTagName();
  111.  
  112. return switch (rootTagName) {
  113. case TAG_ERROR -> deserializeError(rootElement);
  114. case TAG_SUCCESS -> deserializeSuccess(rootElement);
  115. default -> throw new IllegalArgumentException("Invalid XML structure.");
  116. };
  117. }
  118.  
  119. public static String serialize(ServerMessage message) throws ParserConfigurationException {
  120. DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
  121. DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
  122. Document document = documentBuilder.newDocument();
  123.  
  124. Element rootElement;
  125. if (message.getErrorType() == ServerMessage.ErrorType.ERROR) {
  126. rootElement = document.createElement(TAG_ERROR);
  127. serializeError(document, rootElement, (ServerMessage.Error) message);
  128. } else {
  129. rootElement = document.createElement(TAG_SUCCESS);
  130.  
  131. if (message instanceof ServerMessage.ListMembers listMembers) {
  132. serializeListMembers(document, rootElement, listMembers);
  133. } else if (message instanceof ServerMessage.NewMessage newMessage) {
  134. serializeNewMessage(document, rootElement, newMessage
  135.  
  136. );
  137. } else if (message instanceof ServerMessage.LoginResponse loginResponse) {
  138. serializeLoginResponse(document, rootElement, loginResponse);
  139. }
  140. }
  141.  
  142. document.appendChild(rootElement);
  143.  
  144. StringWriter writer = new StringWriter();
  145. try {
  146. XmlUtil.writeDocument(document, writer);
  147. } catch (Exception e) {
  148. throw new RuntimeException(e);
  149. }
  150.  
  151. return writer.toString();
  152. }
  153.  
  154. private static void serializeListMembers(Document document, Element rootElement,
  155. ServerMessage.ListMembers listMembers) {
  156. Element listUsersElement = document.createElement(TAG_LIST_USERS);
  157. List<User> userList = listMembers.getUserList();
  158.  
  159. for (User user : userList) {
  160. Element userElement = document.createElement(TAG_USER);
  161. Element nameElement = document.createElement(TAG_NAME);
  162. nameElement.setTextContent(user.name());
  163. Element typeElement = document.createElement(TAG_TYPE);
  164. typeElement.setTextContent(String.valueOf(user.sessionID()));
  165.  
  166. userElement.appendChild(nameElement);
  167. userElement.appendChild(typeElement);
  168. listUsersElement.appendChild(userElement);
  169. }
  170.  
  171. rootElement.appendChild(listUsersElement);
  172. }
  173.  
  174. private static void serializeNewMessage(Document document, Element rootElement,
  175. ServerMessage.NewMessage newMessage) {
  176. Element eventElement = document.createElement(TAG_EVENT);
  177. eventElement.setAttribute(ATTR_NAME, EVENT_NAME_MESSAGE);
  178.  
  179. Element messageElement = document.createElement(TAG_MESSAGE);
  180. messageElement.setTextContent(newMessage.getMessage().text());
  181. Element nameElement = document.createElement(TAG_NAME);
  182. nameElement.setTextContent(newMessage.getMessage().name());
  183.  
  184. eventElement.appendChild(messageElement);
  185. eventElement.appendChild(nameElement);
  186. rootElement.appendChild(eventElement);
  187. }
  188.  
  189. private static void serializeLoginResponse(Document document, Element rootElement,
  190. ServerMessage.LoginResponse loginResponse) {
  191. Element sessionElement = document.createElement(TAG_SESSION);
  192. sessionElement.setTextContent(String.valueOf(loginResponse.getSessionID()));
  193. rootElement.appendChild(sessionElement);
  194. }
  195.  
  196. private static void serializeError(Document document, Element rootElement, ServerMessage.Error errorMessage) {
  197. Element messageElement = document.createElement(TAG_MESSAGE);
  198. messageElement.setTextContent(errorMessage.getMessage());
  199. rootElement.appendChild(messageElement);
  200. }
  201.  
  202. private static ServerMessage.ListMembers deserializeListUsers(Element childElement) {
  203. NodeList userNodes = childElement.getElementsByTagName(TAG_USER);
  204. List<User> userList = new ArrayList<>(userNodes.getLength());
  205.  
  206. for (int i = 0; i < userNodes.getLength(); i++) {
  207. Element userElement = (Element) userNodes.item(i);
  208. String name = userElement.getElementsByTagName(TAG_NAME).item(0).getTextContent();
  209. Integer sessionID = Integer.parseInt(userElement.getElementsByTagName(TAG_TYPE).item(0).getTextContent());
  210.  
  211. userList.add(new User(name, sessionID));
  212. }
  213.  
  214. return new ServerMessage.ListMembers(userList);
  215. }
  216.  
  217. private static ServerMessage.NewMessage deserializeEvent(Element childElement) {
  218. Element messageElem = (Element) childElement.getElementsByTagName(TAG_MESSAGE).item(0);
  219. String message = messageElem.getTextContent();
  220. Element nameElem = (Element) childElement.getElementsByTagName(TAG_NAME).item(0);
  221. String name = nameElem.getTextContent();
  222.  
  223. return new ServerMessage.NewMessage(new TextMessage(name, message));
  224. }
  225.  
  226. private static ServerMessage.LoginResponse deserializeSession(Element childElement) {
  227. String sessionID = childElement.getTextContent();
  228. return new ServerMessage.LoginResponse(Integer.parseInt(sessionID));
  229. }
  230.  
  231. private static ServerMessage deserializeSuccess(Element rootElement) {
  232. NodeList nodeList = rootElement.getChildNodes();
  233.  
  234. if (nodeList.getLength() != 1 || nodeList.item(0).getNodeType() != Element.ELEMENT_NODE) {
  235. throw new IllegalArgumentException("Invalid XML structure.");
  236. }
  237.  
  238. Element childElement = (Element) nodeList.item(0);
  239. String childTagName = childElement.getTagName();
  240.  
  241. return switch (childTagName
  242.  
  243. ) {
  244. case TAG_LIST_USERS -> deserializeListUsers(childElement);
  245. case TAG_EVENT -> deserializeEvent(childElement);
  246. case TAG_SESSION -> deserializeSession(childElement);
  247. default -> throw new IllegalStateException("Unexpected value: " + childTagName);
  248. };
  249. }
  250.  
  251. private static ServerMessage deserializeError(Element rootElement) {
  252. Element messageElement = (Element) rootElement.getElementsByTagName(TAG_MESSAGE).item(0);
  253. String errorMessage = messageElement.getTextContent();
  254. return new ServerMessage.Error(errorMessage);
  255. }
  256.  
  257. // Constants for XML tags and attributes
  258. private static final String TAG_ERROR = "error";
  259. private static final String TAG_SUCCESS = "success";
  260. private static final String TAG_LIST_USERS = "listusers";
  261. private static final String TAG_USER = "user";
  262. private static final String TAG_NAME = "name";
  263. private static final String TAG_TYPE = "type";
  264. private static final String TAG_EVENT = "event";
  265. private static final String TAG_MESSAGE = "message";
  266. private static final String TAG_SESSION = "session";
  267. private static final String ATTR_NAME = "name";
  268. private static final String EVENT_NAME_MESSAGE = "message";
  269. }
  270. ```
  271.  
  272. In this refactored version, the code has been simplified and improved by extracting string constants to private static variables, extracting repeated code into separate methods, and applying appropriate naming conventions. This makes the code more readable, maintainable, and reusable.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement