Advertisement
nolog1n

Untitled

Jan 19th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.09 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.io.OutputStreamWriter;
  5. import java.io.PrintWriter;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. import java.util.List;
  9. import java.util.TreeMap;
  10. import java.util.stream.Collectors;
  11. import java.util.stream.IntStream;
  12.  
  13.  
  14. class WebserverThread extends Thread {
  15. // Синхронизация не нужна. У TemplateProcessor нет изменяемого состояния.
  16. private final TemplateProcessor templateProcessor;
  17.  
  18. private final LinkedDocumentCollection ldc;
  19.  
  20. private final Socket client;
  21.  
  22. public WebserverThread(TemplateProcessor templateProcessor, LinkedDocumentCollection ldc, Socket socket) {
  23. this.templateProcessor = templateProcessor;
  24. this.ldc = ldc;
  25. this.client = socket;
  26. }
  27.  
  28. public void communicate() throws IOException {
  29. BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
  30. PrintWriter out = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));
  31.  
  32. try {
  33. String requestLine = in.readLine();
  34. if (requestLine == null)
  35. return;
  36. in.lines().takeWhile(l -> !l.equals("")).count();
  37.  
  38. System.out.println("=> Request header received");
  39.  
  40. HttpRequest request;
  41. try {
  42. request = new HttpRequest(requestLine);
  43. } catch (InvalidRequestException ex) {
  44. System.out.println("=> Bad request!");
  45. out.print(new HttpResponse(HttpStatus.BadRequest));
  46. return;
  47. }
  48.  
  49. if (request.getMethod() != HttpMethod.GET) {
  50. System.out.println("=> Invalid method!");
  51. out.print(new HttpResponse(HttpStatus.MethodNotAllowed));
  52. return;
  53. }
  54.  
  55. HttpResponse response;
  56. if (request.getPath().equals("/")) {
  57. System.out.println("=> Query for main page");
  58. response = handleMainPage();
  59. } else if (request.getPath().equals("/search")) {
  60. System.out.println("=> Search query");
  61. String query = request.getParameters().get("query");
  62. response = handleSearchRequest(query);
  63. } else {
  64. System.out.println("=> File query");
  65. String fileName = request.getPath().substring(1);
  66. response = handleFileRequest(fileName);
  67. }
  68. out.print(response);
  69. }
  70. finally {
  71. out.close();
  72. }
  73. }
  74.  
  75. private HttpResponse handleMainPage() {
  76. TreeMap<String, String> varass = new TreeMap<>();
  77. varass.put("%value", "");
  78. varass.put("%results", "");
  79. String body = templateProcessor.replace(varass);
  80. return new HttpResponse(HttpStatus.Ok, body);
  81. }
  82.  
  83. private HttpResponse handleSearchRequest(String query) {
  84. double pageRankDampingFactor = 0.85;
  85. double weightingFactor = 0.6;
  86.  
  87. TreeMap<String, String> varass = new TreeMap<>();
  88. varass.put("%value", query);
  89. varass.put("%results", "");
  90.  
  91. double[] relevance = null;
  92.  
  93. StringBuilder msgBuilder = new StringBuilder();
  94.  
  95. // DocumentCollection.match изменяет состояние ldc в процессе исполнения, поэтому ставим блокировку перед входом в метод
  96. // Нам также нужен неизмененный список названий страниц, чтобы заполнить html-код, поэтому оставляем блокировку до завершения генерации таблицы
  97. synchronized (ldc) {
  98. relevance = ldc.match(query, pageRankDampingFactor, weightingFactor);
  99. // Или же копируем названия страниц в отдельный список и снимаем блокировку здесь
  100. // List<String> pageNames = IntStream.range(0, ldc.numDocuments()).boxed().map(i -> ldc.get(i).getTitle()).collect(Collectors.toList());
  101. if (ldc.numDocuments() > 0)
  102. msgBuilder.append("<tr><td><b>ID</b></td><td><b>Page</b></td><td><b>Relevance</b></td></tr>");
  103.  
  104. for(int i = 0; i < ldc.numDocuments(); ++i) {
  105. msgBuilder.append("<tr>");
  106. msgBuilder.append("<td>").append(i + 1).append("</td>");
  107. msgBuilder.append("<td><a href=\"").append(ldc.get(i).getTitle()).append("\">").append(ldc.get(i).getTitle()).append("</a></td>");
  108. msgBuilder.append("<td>").append(relevance[i]).append("</td>");
  109. msgBuilder.append("</tr>");
  110. }
  111. }
  112.  
  113. varass.put("%results", msgBuilder.toString());
  114. String body = templateProcessor.replace(varass);
  115. return new HttpResponse(HttpStatus.Ok, body);
  116. }
  117.  
  118.  
  119. private HttpResponse handleFileRequest(String fileName) {
  120. if (fileName.contains("/"))
  121. return new HttpResponse(HttpStatus.Forbidden);
  122. String[] fileContents = Terminal.readFile(fileName);
  123. if (fileContents == null) {
  124. return new HttpResponse(HttpStatus.NotFound);
  125. }
  126. String body = fileContents[1];
  127. return new HttpResponse(HttpStatus.Ok, body);
  128. }
  129.  
  130.  
  131. @Override
  132. public void run() {
  133. try {
  134. communicate();
  135. }
  136. catch (IOException ex) {
  137. ex.printStackTrace();
  138. }
  139. finally {
  140. try {
  141. client.close();
  142. }
  143. catch (IOException ex) {
  144. ex.printStackTrace();
  145. }
  146. }
  147.  
  148. }
  149. }
  150.  
  151.  
  152. public class WebServerThreads {
  153.  
  154. public static void main(String[] args) throws IOException {
  155. // Создаем один обработчик шаблонов
  156. TemplateProcessor tp = new TemplateProcessor("html/search.html");
  157.  
  158. // Создаем разделяемую коллекцию документов
  159. LinkedDocumentCollection prelim = new LinkedDocumentCollection();
  160. prelim.appendDocument(new LinkedDocument("B.txt", "", "", null, null, "link:A.txt link:E.txt", "B.txt"));
  161. LinkedDocumentCollection sharedLDC = prelim.crawl();
  162.  
  163. ServerSocket serverSocket = new ServerSocket(8000);
  164.  
  165. // Ожидаем новые соединения
  166. while(true) {
  167. try {
  168. Socket client = serverSocket.accept();
  169. // При новом входящем соединении создаём новый поток, передаём ему ссылки на разделяемые данные
  170. WebserverThread thread = new WebserverThread(tp, sharedLDC, client);
  171. // Запускаем поток
  172. thread.start();
  173. }
  174. catch (IOException ex) {
  175. ex.printStackTrace();
  176. System.exit(-1);
  177. }
  178. }
  179. }
  180.  
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement