| /*
 
 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();
 }
 }
 
 }
 
 
 
 |