Advertisement
radon5k

Untitled

Jan 2nd, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.81 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Random;
  4. import java.util.function.Predicate;
  5.  
  6. interface MessageProcessor {
  7. void processMessage(Message msg);
  8. }
  9.  
  10. /** A given interface to archive select messages (DO NOT CHANGE) **/
  11. interface MessageArchiver {
  12. void archiveMessages(List<Message> messages, Predicate<Message> filter);
  13. }
  14.  
  15. /** A given class to represent a message (DO NOT CHANGE) **/
  16. class Message {
  17. private String subject;
  18. private String body;
  19.  
  20. public Message(String subject, String body) {
  21. this.subject = subject;
  22. this.body = body;
  23. }
  24.  
  25. public String getSubject() {
  26. return subject;
  27. }
  28.  
  29. public String getBody() {
  30. return body;
  31. }
  32.  
  33. @Override
  34. public String toString() {
  35. return "Message{" +
  36. "subject: " + Util.abbreviate(subject, 20) +
  37. ", body: " + Util.abbreviate(body, 40) + "}";
  38. }
  39. }
  40.  
  41. /**
  42. * Test class that works on developer boxes but fails on small VMs.
  43. *
  44. * Fix this class to work on 64Mb VM
  45. */
  46. public class SmallMemoryMessageTest {
  47.  
  48. public static void main(String []args) {
  49. MessageProcessor processor = Util.createMessageProcessor();
  50. MessageArchiver archiver = Util.createMessageArchiver();
  51. List<Message> messages = new ArrayList<>(Util.EXPECTED_TOTAL);
  52. Predicate<Message> p = (x) -> x.getSubject().startsWith("A");
  53. for (int i = 0; i < Util.EXPECTED_TOTAL; i++) {
  54. Message msg = Util.random();
  55. processor.processMessage(msg);
  56. messages.add(msg);
  57. }
  58.  
  59.  
  60. archiver.archiveMessages(messages, m -> m.getSubject().startsWith("A"));
  61.  
  62. /*
  63. * DO NOT CHANGE ANYTHING BELOW THIS LINE.
  64. * PROGRAM MUST EXIT SUCCESSFULLY
  65. */
  66. Util.validate();
  67. }
  68. }
  69.  
  70. /** A given utility class (DO NOT CHANGE) **/
  71. class Util {
  72. static final int EXPECTED_TOTAL = 98765;
  73. static final int EXPECTED_ARCHIVED = 3799;
  74.  
  75. static Message random() {
  76. String subject = randomSubject();
  77. String body = randomBody();
  78. Message m = new Message(subject, body);
  79. return m;
  80. }
  81.  
  82. static int count = 0;
  83.  
  84. static String randomSubject() {
  85. StringBuilder sb = new StringBuilder(128);
  86. sb.append((char) ((int) 'A' + (count++ % 26)));
  87. Random r = new Random();
  88. while (sb.length() < 128) {
  89. char c = (char) r.nextInt(127);
  90. if (Character.isLetterOrDigit(c)) {
  91. sb.append(c);
  92. }
  93. }
  94. return sb.toString();
  95. }
  96.  
  97. static String randomBody() {
  98. StringBuilder sb = new StringBuilder(4096);
  99. Random r = new Random();
  100. while (sb.length() < 4096) {
  101. char c = (char) r.nextInt(127);
  102. if (!Character.isISOControl(c)) {
  103. sb.append(c);
  104. }
  105. }
  106. return sb.toString();
  107. }
  108.  
  109. static String abbreviate(String s, int n) {
  110. return s.length() > n + 3 ? s.substring(0, n - 3) + "..." : s;
  111. }
  112.  
  113. static MessageProcessor createMessageProcessor() {
  114. return new TestProcessor();
  115. }
  116.  
  117. static MessageArchiver createMessageArchiver() {
  118. return new TestArchiver();
  119. }
  120.  
  121. static void validate() {
  122. if (TestArchiver.count != EXPECTED_TOTAL ||
  123. TestArchiver.archived != EXPECTED_ARCHIVED) {
  124. throw new IllegalStateException("Failed to archive all messages!");
  125. }
  126. System.out.println("SUCCESS. PROCESSED: " + TestArchiver.count + " ARCHIVED: " + TestArchiver.archived);
  127. }
  128. }
  129.  
  130. /** Noop implementation of a message processor (DO NOT CHANGE) **/
  131. class TestProcessor implements MessageProcessor {
  132. long count = 0;
  133. @Override
  134. public void processMessage(Message msg) {
  135. if(++count%1000 == 0) {
  136. System.out.println("Processed: " + (count) + " Latest: " + msg);
  137. System.out.flush();
  138. }
  139. }
  140. }
  141.  
  142. /** Noop implementation of a message archiver (DO NOT CHANGE) **/
  143. class TestArchiver implements MessageArchiver {
  144. static int count = 0;
  145. long bytes = 0;
  146. static long archived = 0;
  147. @Override
  148. public void archiveMessages(List<Message> messages, Predicate<Message> filter) {
  149. if(messages.size() < 1000) {
  150. System.err.println("WARNING: message list too short, this will drastically reduce performance!");
  151. }
  152. messages.stream().filter(filter).forEach(this::archiveOne);
  153. System.out.println("Archived: " + bytes + " bytes.");
  154. count += messages.size();
  155. bytes = 0;
  156. }
  157. private void archiveOne(Message msg) {
  158. bytes += msg.getSubject().getBytes().length + 1;
  159. bytes += msg.getBody().getBytes().length;
  160. archived++;
  161. }
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement