LordPankake

Dumb meme

Sep 3rd, 2018
568
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.40 KB | None | 0 0
  1. package me.genericskid.challenge;
  2.  
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.logging.Logger;
  6.  
  7. import me.genericskid.challenge.Driver.Drawer.DrawBuilder;
  8. import me.genericskid.challenge.Driver.Formatter.FormatterBuilder;
  9. import me.genericskid.challenge.Driver.Template.TemplateBuilder;
  10.  
  11. public class Driver {
  12.     public static void main(String[] args) {
  13.         long dxTime = System.currentTimeMillis();
  14.         Logger logger = Logger.getLogger("DrawTask");
  15.         try {
  16.             logger.info("Setting up factories");
  17.             Factories.setup();
  18.             logger.info("Creating Drawer-Factory");
  19.             Drawer.Factory factory = Factories.getFactory(Drawer.class);
  20.             Drawer.DrawBuilder builder = factory.create();
  21.             builder.setDrawSize(7);
  22.             builder.setDrawChar("T");
  23.             builder.setWhitespaceChar(" ");
  24.             logger.info("Creating Drawer");
  25.             try(Drawer draw = builder.build()) {
  26.                 logger.info("Running Drawer");
  27.                 draw.draw();
  28.             } finally {
  29.                 dxTime = System.currentTimeMillis() - dxTime;
  30.                 logger.info("Drawer finished task & disposed, total process time: " + dxTime);
  31.             }
  32.         } catch (Exception e) {
  33.             String content = null;
  34.             // Create exception string.
  35.             if (e.getMessage() != null) {
  36.                 content = e.getMessage();
  37.             } else if (e.getCause() != null){
  38.                 if (e.getCause().getMessage() != null) {
  39.                     content = e.getCause().getMessage();
  40.                 } else {
  41.                     content = e.toString();
  42.                 }
  43.             } else {
  44.                 content = e.toString();
  45.             }
  46.             logger.severe("Fatal exception: " + content);
  47.         }
  48.     }
  49.  
  50.     /**
  51.      * Draw utility.
  52.      */
  53.     static class Drawer implements AutoCloseable {
  54.         /**
  55.          * Delegate for creating initial strings. Output of the {@link #draw}
  56.          * call is based off of modifications of these original strings.
  57.          */
  58.         private final Template template;
  59.         /**
  60.          * The formatter that finalizes the style of the output.
  61.          */
  62.         private final Formatter format;
  63.         /**
  64.          * Size of the drawn element.
  65.          */
  66.         private final int size;
  67.  
  68.         public Drawer(int size, String defaultChar, String paddingChar) {
  69.             this.size = size * 2;
  70.             // setup template generator
  71.             Template.Factory factoryTemplate = Factories.getFactory(Template.class);
  72.             Template.TemplateBuilder builderTemplate = factoryTemplate.create();
  73.             builderTemplate.setDefaultChar(defaultChar);
  74.             this.template = builderTemplate.build();
  75.             // setup formatter
  76.             Formatter.Factory factoryFormatter = Factories.getFactory(Formatter.class);
  77.             Formatter.FormatterBuilder builderFormatter = factoryFormatter.create();
  78.             builderFormatter.setPaddingChar(paddingChar);
  79.             this.format = builderFormatter.build();
  80.         }
  81.  
  82.         /**
  83.          * Create the text-image.
  84.          */
  85.         public final void draw() {
  86.             int width = size;
  87.             for (int i = 0; i < size; i += 2) {
  88.                 String strTemplate = template.size(i + 1);
  89.                 String strFormat = format.center(strTemplate, width);
  90.                 System.out.println(strFormat);
  91.             }
  92.         }
  93.        
  94.         // ==================================================================================//
  95.         // ====================                  FACTORY                   ==================//
  96.         // ==================================================================================//
  97.        
  98.         static interface Factory extends FactoryBase<DrawBuilder> {
  99.             DrawBuilder create();
  100.         }
  101.        
  102.         static class DrawBuilder implements BuilderBase<Drawer> {
  103.             private String drawChar, whiteChar;
  104.             private int size;
  105.            
  106.             public void setDrawChar(String drawChar) { this.drawChar = drawChar; }
  107.             public void setWhitespaceChar(String whiteChar) { this.whiteChar = whiteChar; }
  108.             public void setDrawSize(int size) { this.size = size; }
  109.            
  110.             public Drawer build() {
  111.                 return new Drawer(size, drawChar, whiteChar);
  112.             }
  113.         }
  114.  
  115.         @Override
  116.         public void close() throws Exception {
  117.             System.out.close();
  118.         }
  119.     }
  120.    
  121.     /**
  122.      * String generator with initial values.
  123.      */
  124.     static class Template {
  125.         private final String def, base;
  126.  
  127.         public Template(String def) {
  128.             this.def = def;
  129.             StringBuilder tmpBase = new StringBuilder();
  130.             while (tmpBase.length() < 512)
  131.                 tmpBase.append(def);
  132.             base = tmpBase.toString();
  133.         }
  134.  
  135.         /**
  136.          * Create a string of the given length.
  137.          *
  138.          * @param len
  139.          *            String length to create.
  140.          * @return String of given length.
  141.          */
  142.         public final String size(int len) {
  143.             return base.substring(0, len);
  144.         }
  145.        
  146.         // ==================================================================================//
  147.         // ====================                  FACTORY                   ==================//
  148.         // ==================================================================================//
  149.        
  150.         static interface Factory extends FactoryBase<TemplateBuilder> {
  151.             TemplateBuilder create();
  152.         }
  153.        
  154.         static class TemplateBuilder implements BuilderBase<Template> {
  155.             private String defaultChar;
  156.            
  157.             public void setDefaultChar(String defaultChar) { this.defaultChar = defaultChar; }
  158.            
  159.             public Template build() {
  160.                 return new Template(defaultChar);
  161.             }
  162.         }
  163.     }
  164.    
  165.     /**
  166.      * String formatter.
  167.      */
  168.     static class Formatter {
  169.         private final String paddingChar;
  170.        
  171.         Formatter(String paddingChar) {
  172.             this.paddingChar = paddingChar;
  173.         }
  174.    
  175.         public String center(String s, int size) {
  176.             StringBuilder sb = new StringBuilder(size);
  177.             for (int i = 0; i < (size - s.length()) / 2; i++)
  178.                 sb.append(paddingChar);
  179.             sb.append(s);
  180.             while (sb.length() < size)
  181.                 sb.append(paddingChar);
  182.             return sb.toString();
  183.         }
  184.        
  185.         // ==================================================================================//
  186.         // ====================                  FACTORY                   ==================//
  187.         // ==================================================================================//
  188.        
  189.         static interface Factory extends FactoryBase<FormatterBuilder> {
  190.             FormatterBuilder create();
  191.         }
  192.        
  193.         static class FormatterBuilder implements BuilderBase<Formatter> {
  194.             private String paddingChar;
  195.            
  196.             public void setPaddingChar(String paddingChar) { this.paddingChar = paddingChar; }
  197.            
  198.             public Formatter build() {
  199.                 return new Formatter(paddingChar);
  200.             }
  201.         }
  202.     }
  203.    
  204.     /**
  205.      * Factory instance handler.
  206.      */
  207.     static class Factories {
  208.         @SuppressWarnings("rawtypes")
  209.         private static final Map<Class, FactoryBase> factories = new HashMap<>();
  210.        
  211.         public static void setup() {
  212.             factories.put(Drawer.class, new Drawer.Factory() {
  213.                 @Override
  214.                 public DrawBuilder create() {
  215.                     return new DrawBuilder();
  216.                 }
  217.             });
  218.             factories.put(Template.class, new Template.Factory() {
  219.                 @Override
  220.                 public TemplateBuilder create() {
  221.                     return new TemplateBuilder();
  222.                 }
  223.             });
  224.             factories.put(Formatter.class, new Formatter.Factory() {
  225.                 @Override
  226.                 public FormatterBuilder create() {
  227.                     return new FormatterBuilder();
  228.                 }
  229.             });
  230.         }
  231.        
  232.         /**
  233.          * @param host
  234.          *            Type of class that the factory is associated with.
  235.          * @return Factory associated with the given host-class.
  236.          */
  237.         @SuppressWarnings("unchecked")
  238.         public static <T extends FactoryBase<?>> T getFactory(Class<?> host) {
  239.             return (T) factories.get(host);
  240.         }
  241.     }
  242.  
  243.     /**
  244.      * Factory outline.
  245.      *
  246.      * @param <T>
  247.      *            Type of object to be generated by the Factory.
  248.      */
  249.     interface FactoryBase<T> {
  250.         T create();
  251.     }
  252.  
  253.     /**
  254.      * Builder outline.
  255.      *
  256.      * @param <T>
  257.      *            Type of object to be generated by the factory.
  258.      */
  259.     interface BuilderBase<T> {
  260.         T build();
  261.     }
  262. }
Advertisement
Add Comment
Please, Sign In to add comment