Mega Code Archive

 
Categories / Java / Design Pattern
 

Decorator Design Pattern in Java

/* Software Architecture Design Patterns in Java by Partha Kuchana  Auerbach Publications */ import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.Properties; import java.util.Vector; public class DecoratorClient {   public static void main(String[] args) {     LoggerFactory factory = new LoggerFactory();     Logger logger = factory.getLogger();     HTMLLogger hLogger = new HTMLLogger(logger);     //the decorator object provides the same interface.     hLogger.log("A Message to Log");     EncryptLogger eLogger = new EncryptLogger(logger);     eLogger.log("A Message to Log");   } } // End of class class ConsoleLogger implements Logger {   public void log(String msg) {     System.out.println(msg);   } } class MiscUtil {   public static boolean hasDuplicates(Vector v) {     int i = 0;     int j = 0;     boolean duplicates = false;     for (i = 0; i < v.size() - 1; i++) {       for (j = (i + 1); j < v.size(); j++) {         if (v.elementAt(i).toString().equalsIgnoreCase(             v.elementAt(j).toString())) {           duplicates = true;         }       }     }     return duplicates;   }   public static Vector removeDuplicates(Vector s) {     int i = 0;     int j = 0;     boolean duplicates = false;     Vector v = new Vector();     for (i = 0; i < s.size(); i++) {       duplicates = false;       for (j = (i + 1); j < s.size(); j++) {         if (s.elementAt(i).toString().equalsIgnoreCase(             s.elementAt(j).toString())) {           duplicates = true;         }       }       if (duplicates == false) {         v.addElement(s.elementAt(i).toString().trim());       }     }     return v;   }   public static Vector removeDuplicateDomains(Vector s) {     int i = 0;     int j = 0;     boolean duplicates = false;     String str1 = "";     String str2 = "";     Vector v = new Vector();     for (i = 0; i < s.size(); i++) {       duplicates = false;       for (j = (i + 1); j < s.size(); j++) {         str1 = "";         str2 = "";         str1 = s.elementAt(i).toString().trim();         str2 = s.elementAt(j).toString().trim();         if (str1.indexOf('@') > -1) {           str1 = str1.substring(str1.indexOf('@'));         }         if (str2.indexOf('@') > -1) {           str2 = str2.substring(str2.indexOf('@'));         }         if (str1.equalsIgnoreCase(str2)) {           duplicates = true;         }       }       if (duplicates == false) {         v.addElement(s.elementAt(i).toString().trim());       }     }     return v;   }   public static boolean areVectorsEqual(Vector a, Vector b) {     if (a.size() != b.size()) {       return false;     }     int i = 0;     int vectorSize = a.size();     boolean identical = true;     for (i = 0; i < vectorSize; i++) {       if (!(a.elementAt(i).toString().equalsIgnoreCase(b.elementAt(i)           .toString()))) {         identical = false;       }     }     return identical;   }   public static Vector removeDuplicates(Vector a, Vector b) {     int i = 0;     int j = 0;     boolean present = true;     Vector v = new Vector();     for (i = 0; i < a.size(); i++) {       present = false;       for (j = 0; j < b.size(); j++) {         if (a.elementAt(i).toString().equalsIgnoreCase(             b.elementAt(j).toString())) {           present = true;         }       }       if (!(present)) {         v.addElement(a.elementAt(i));       }     }     return v;   } }// end of class class LoggerDecorator implements Logger {   Logger logger;   public LoggerDecorator(Logger inp_logger) {     logger = inp_logger;   }   public void log(String DataLine) {     /*      * Default implementation to be overriden by subclasses.      */     logger.log(DataLine);   } }// end of class interface Logger {   public void log(String msg); } class HTMLLogger extends LoggerDecorator {   public HTMLLogger(Logger inp_logger) {     super(inp_logger);   }   public void log(String DataLine) {     /*      * Added functionality      */     DataLine = makeHTML(DataLine);     /*      * Now forward the encrypted text to the FileLogger for storage      */     logger.log(DataLine);   }   public String makeHTML(String DataLine) {     /*      * Make it into an HTML document.      */     DataLine = "<HTML><BODY>" + "<b>" + DataLine + "</b>"         + "</BODY></HTML>";     return DataLine;   } }// end of class class FileUtil {   DataOutputStream dos;   /*    * Utility method to write a given text to a file    */   public boolean writeToFile(String fileName, String dataLine,       boolean isAppendMode, boolean isNewLine) {     if (isNewLine) {       dataLine = "\n" + dataLine;     }     try {       File outFile = new File(fileName);       if (isAppendMode) {         dos = new DataOutputStream(new FileOutputStream(fileName, true));       } else {         dos = new DataOutputStream(new FileOutputStream(outFile));       }       dos.writeBytes(dataLine);       dos.close();     } catch (FileNotFoundException ex) {       return (false);     } catch (IOException ex) {       return (false);     }     return (true);   }   /*    * Reads data from a given file    */   public String readFromFile(String fileName) {     String DataLine = "";     try {       File inFile = new File(fileName);       BufferedReader br = new BufferedReader(new InputStreamReader(           new FileInputStream(inFile)));       DataLine = br.readLine();       br.close();     } catch (FileNotFoundException ex) {       return (null);     } catch (IOException ex) {       return (null);     }     return (DataLine);   }   public boolean isFileExists(String fileName) {     File file = new File(fileName);     return file.exists();   }   public boolean deleteFile(String fileName) {     File file = new File(fileName);     return file.delete();   }   /*    * Reads data from a given file into a Vector    */   public Vector fileToVector(String fileName) {     Vector v = new Vector();     String inputLine;     try {       File inFile = new File(fileName);       BufferedReader br = new BufferedReader(new InputStreamReader(           new FileInputStream(inFile)));       while ((inputLine = br.readLine()) != null) {         v.addElement(inputLine.trim());       }       br.close();     } // Try     catch (FileNotFoundException ex) {       //     } catch (IOException ex) {       //     }     return (v);   }   /*    * Writes data from an input vector to a given file    */   public void vectorToFile(Vector v, String fileName) {     for (int i = 0; i < v.size(); i++) {       writeToFile(fileName, (String) v.elementAt(i), true, true);     }   }   /*    * Copies unique rows from a source file to a destination file    */   public void copyUniqueElements(String sourceFile, String resultFile) {     Vector v = fileToVector(sourceFile);     v = MiscUtil.removeDuplicates(v);     vectorToFile(v, resultFile);   } } // end FileUtil class FileLogger implements Logger {   private static FileLogger logger;   //Prevent clients from using the constructor   private FileLogger() {   }   public static FileLogger getFileLogger() {     if (logger == null) {       logger = new FileLogger();     }     return logger;   }   public synchronized void log(String msg) {     FileUtil futil = new FileUtil();     futil.writeToFile("log.txt", msg, true, true);   } } class EncryptLogger extends LoggerDecorator {   public EncryptLogger(Logger inp_logger) {     super(inp_logger);   }   public void log(String DataLine) {     /*      * Added functionality      */     DataLine = encrypt(DataLine);     /*      * Now forward the encrypted text to the FileLogger for storage      */     logger.log(DataLine);   }   public String encrypt(String DataLine) {     /*      * Apply simple encryption by Transposition... Shift all characters by      * one position.      */     DataLine = DataLine.substring(DataLine.length() - 1)         + DataLine.substring(0, DataLine.length() - 1);     return DataLine;   } }// end of class class LoggerFactory {   public boolean isFileLoggingEnabled() {     Properties p = new Properties();     try {       p.load(ClassLoader.getSystemResourceAsStream("Logger.properties"));       String fileLoggingValue = p.getProperty("FileLogging");       if (fileLoggingValue.equalsIgnoreCase("ON") == true)         return true;       else         return false;     } catch (IOException e) {       return false;     }   }   public Logger getLogger() {     if (isFileLoggingEnabled()) {       return FileLogger.getFileLogger();     } else {       return new ConsoleLogger();     }   } }