//[C] 2002 Sun Microsystems, Inc.--- 
 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.Iterator; 
 
public class RunVisitorPattern { 
  public static void main(String[] arguments) { 
    System.out.println("Example for the Visitor pattern"); 
    System.out.println(); 
    System.out 
        .println("This sample will use a ProjectCostVisitor to calculate"); 
    System.out.println(" the total amount required to complete a Project."); 
    System.out.println(); 
 
    System.out.println("Deserializing a test Project for Visitor pattern"); 
    System.out.println(); 
    if (!(new File("data.ser").exists())) { 
      DataCreator.serialize("data.ser"); 
    } 
    Project project = (Project) (DataRetriever.deserializeData("data.ser")); 
 
    System.out 
        .println("Creating a ProjectCostVisitor, to calculate the total cost of the project."); 
    ProjectCostVisitor visitor = new ProjectCostVisitor(); 
    visitor.setHourlyRate(100); 
 
    System.out 
        .println("Moving throuhg the Project, calculating total cost"); 
    System.out 
        .println(" by passing the Visitor to each of the ProjectItems."); 
    visitProjectItems(project, visitor); 
    System.out.println("The total cost for the project is: " 
        + visitor.getTotalCost()); 
  } 
 
  private static void visitProjectItems(ProjectItem item, 
      ProjectVisitor visitor) { 
    item.accept(visitor); 
    if (item.getProjectItems() != null) { 
      Iterator subElements = item.getProjectItems().iterator(); 
      while (subElements.hasNext()) { 
        visitProjectItems((ProjectItem) subElements.next(), visitor); 
      } 
    } 
  } 
} 
 
interface Contact extends Serializable { 
  public static final String SPACE = " "; 
 
  public String getFirstName(); 
 
  public String getLastName(); 
 
  public String getTitle(); 
 
  public String getOrganization(); 
 
  public void setFirstName(String newFirstName); 
 
  public void setLastName(String newLastName); 
 
  public void setTitle(String newTitle); 
 
  public void setOrganization(String newOrganization); 
} 
 
class Task implements ProjectItem { 
  private String name; 
 
  private ArrayList projectItems = new ArrayList(); 
 
  private Contact owner; 
 
  private double timeRequired; 
 
  public Task() { 
  } 
 
  public Task(String newName, Contact newOwner, double newTimeRequired) { 
    name = newName; 
    owner = newOwner; 
    timeRequired = newTimeRequired; 
  } 
 
  public String getName() { 
    return name; 
  } 
 
  public ArrayList getProjectItems() { 
    return projectItems; 
  } 
 
  public Contact getOwner() { 
    return owner; 
  } 
 
  public double getTimeRequired() { 
    return timeRequired; 
  } 
 
  public void setName(String newName) { 
    name = newName; 
  } 
 
  public void setOwner(Contact newOwner) { 
    owner = newOwner; 
  } 
 
  public void setTimeRequired(double newTimeRequired) { 
    timeRequired = newTimeRequired; 
  } 
 
  public void addProjectItem(ProjectItem element) { 
    if (!projectItems.contains(element)) { 
      projectItems.add(element); 
    } 
  } 
 
  public void removeProjectItem(ProjectItem element) { 
    projectItems.remove(element); 
  } 
 
  public void accept(ProjectVisitor v) { 
    v.visitTask(this); 
  } 
} 
 
class Deliverable implements ProjectItem { 
  private String name; 
 
  private String description; 
 
  private Contact owner; 
 
  private double materialsCost; 
 
  private double productionCost; 
 
  public Deliverable() { 
  } 
 
  public Deliverable(String newName, String newDescription, Contact newOwner, 
      double newMaterialsCost, double newProductionCost) { 
    name = newName; 
    description = newDescription; 
    owner = newOwner; 
    materialsCost = newMaterialsCost; 
    productionCost = newProductionCost; 
  } 
 
  public String getName() { 
    return name; 
  } 
 
  public String getDescription() { 
    return description; 
  } 
 
  public Contact getOwner() { 
    return owner; 
  } 
 
  public double getMaterialsCost() { 
    return materialsCost; 
  } 
 
  public double getProductionCost() { 
    return productionCost; 
  } 
 
  public void setMaterialsCost(double newCost) { 
    materialsCost = newCost; 
  } 
 
  public void setProductionCost(double newCost) { 
    productionCost = newCost; 
  } 
 
  public void setName(String newName) { 
    name = newName; 
  } 
 
  public void setDescription(String newDescription) { 
    description = newDescription; 
  } 
 
  public void setOwner(Contact newOwner) { 
    owner = newOwner; 
  } 
 
  public void accept(ProjectVisitor v) { 
    v.visitDeliverable(this); 
  } 
 
  public ArrayList getProjectItems() { 
    return null; 
  } 
} 
 
interface ProjectVisitor { 
  public void visitDependentTask(DependentTask p); 
 
  public void visitDeliverable(Deliverable p); 
 
  public void visitTask(Task p); 
 
  public void visitProject(Project p); 
} 
 
interface ProjectItem extends Serializable { 
  public void accept(ProjectVisitor v); 
 
  public ArrayList getProjectItems(); 
} 
 
class ContactImpl implements Contact { 
  private String firstName; 
 
  private String lastName; 
 
  private String title; 
 
  private String organization; 
 
  public ContactImpl() { 
  } 
 
  public ContactImpl(String newFirstName, String newLastName, 
      String newTitle, String newOrganization) { 
    firstName = newFirstName; 
    lastName = newLastName; 
    title = newTitle; 
    organization = newOrganization; 
  } 
 
  public String getFirstName() { 
    return firstName; 
  } 
 
  public String getLastName() { 
    return lastName; 
  } 
 
  public String getTitle() { 
    return title; 
  } 
 
  public String getOrganization() { 
    return organization; 
  } 
 
  public void setFirstName(String newFirstName) { 
    firstName = newFirstName; 
  } 
 
  public void setLastName(String newLastName) { 
    lastName = newLastName; 
  } 
 
  public void setTitle(String newTitle) { 
    title = newTitle; 
  } 
 
  public void setOrganization(String newOrganization) { 
    organization = newOrganization; 
  } 
 
  public String toString() { 
    return firstName + SPACE + lastName; 
  } 
} 
 
class DataCreator { 
  private static final String DEFAULT_FILE = "data.ser"; 
 
  public static void main(String[] args) { 
    String fileName; 
    if (args.length == 1) { 
      fileName = args[0]; 
    } else { 
      fileName = DEFAULT_FILE; 
    } 
    serialize(fileName); 
  } 
 
  public static void serialize(String fileName) { 
    try { 
      serializeToFile(createData(), fileName); 
    } catch (IOException exc) { 
      exc.printStackTrace(); 
    } 
  } 
 
  private static Serializable createData() { 
    Contact contact = new ContactImpl("Test", "Subject", "Volunteer", 
        "United Patterns Consortium"); 
 
    Project project = new Project("Project 1", "Test Project"); 
 
    Task task1 = new Task("Task 1", contact, 1); 
    Task task2 = new Task("Task 2", contact, 1); 
 
    project.addProjectItem(new Deliverable("Deliverable 1", 
        "Layer 1 deliverable", contact, 50.0, 50.0)); 
    project.addProjectItem(task1); 
    project.addProjectItem(task2); 
    project.addProjectItem(new DependentTask("Dependent Task 1", contact, 
        1, 1)); 
 
    Task task3 = new Task("Task 3", contact, 1); 
    Task task4 = new Task("Task 4", contact, 1); 
    Task task5 = new Task("Task 5", contact, 1); 
    Task task6 = new Task("Task 6", contact, 1); 
 
    DependentTask dtask2 = new DependentTask("Dependent Task 2", contact, 
        1, 1); 
 
    task1.addProjectItem(task3); 
    task1.addProjectItem(task4); 
    task1.addProjectItem(task5); 
    task1.addProjectItem(dtask2); 
 
    dtask2.addDependentTask(task5); 
    dtask2.addDependentTask(task6); 
    dtask2.addProjectItem(new Deliverable("Deliverable 2", 
        "Layer 3 deliverable", contact, 50.0, 50.0)); 
 
    task3.addProjectItem(new Deliverable("Deliverable 3", 
        "Layer 3 deliverable", contact, 50.0, 50.0)); 
    task4.addProjectItem(new Task("Task 7", contact, 1)); 
    task4.addProjectItem(new Deliverable("Deliverable 4", 
        "Layer 3 deliverable", contact, 50.0, 50.0)); 
    return project; 
  } 
 
  private static void serializeToFile(Serializable content, String fileName) 
      throws IOException { 
    ObjectOutputStream serOut = new ObjectOutputStream( 
        new FileOutputStream(fileName)); 
    serOut.writeObject(content); 
    serOut.close(); 
  } 
} 
 
class DataRetriever { 
  public static Object deserializeData(String fileName) { 
    Object returnValue = null; 
    try { 
      File inputFile = new File(fileName); 
      if (inputFile.exists() && inputFile.isFile()) { 
        ObjectInputStream readIn = new ObjectInputStream( 
            new FileInputStream(fileName)); 
        returnValue = readIn.readObject(); 
        readIn.close(); 
      } else { 
        System.err.println("Unable to locate the file " + fileName); 
      } 
    } catch (ClassNotFoundException exc) { 
      exc.printStackTrace(); 
 
    } catch (IOException exc) { 
      exc.printStackTrace(); 
 
    } 
    return returnValue; 
  } 
} 
 
class DependentTask extends Task { 
  private ArrayList dependentTasks = new ArrayList(); 
 
  private double dependencyWeightingFactor; 
 
  public DependentTask() { 
  } 
 
  public DependentTask(String newName, Contact newOwner, 
      double newTimeRequired, double newWeightingFactor) { 
    super(newName, newOwner, newTimeRequired); 
    dependencyWeightingFactor = newWeightingFactor; 
  } 
 
  public ArrayList getDependentTasks() { 
    return dependentTasks; 
  } 
 
  public double getDependencyWeightingFactor() { 
    return dependencyWeightingFactor; 
  } 
 
  public void setDependencyWeightingFactor(double newFactor) { 
    dependencyWeightingFactor = newFactor; 
  } 
 
  public void addDependentTask(Task element) { 
    if (!dependentTasks.contains(element)) { 
      dependentTasks.add(element); 
    } 
  } 
 
  public void removeDependentTask(Task element) { 
    dependentTasks.remove(element); 
  } 
 
  public void accept(ProjectVisitor v) { 
    v.visitDependentTask(this); 
  } 
} 
 
class Project implements ProjectItem { 
  private String name; 
 
  private String description; 
 
  private ArrayList projectItems = new ArrayList(); 
 
  public Project() { 
  } 
 
  public Project(String newName, String newDescription) { 
    name = newName; 
    description = newDescription; 
  } 
 
  public String getName() { 
    return name; 
  } 
 
  public String getDescription() { 
    return description; 
  } 
 
  public ArrayList getProjectItems() { 
    return projectItems; 
  } 
 
  public void setName(String newName) { 
    name = newName; 
  } 
 
  public void setDescription(String newDescription) { 
    description = newDescription; 
  } 
 
  public void addProjectItem(ProjectItem element) { 
    if (!projectItems.contains(element)) { 
      projectItems.add(element); 
    } 
  } 
 
  public void removeProjectItem(ProjectItem element) { 
    projectItems.remove(element); 
  } 
 
  public void accept(ProjectVisitor v) { 
    v.visitProject(this); 
  } 
} 
 
class ProjectCostVisitor implements ProjectVisitor { 
  private double totalCost; 
 
  private double hourlyRate; 
 
  public double getHourlyRate() { 
    return hourlyRate; 
  } 
 
  public double getTotalCost() { 
    return totalCost; 
  } 
 
  public void setHourlyRate(double rate) { 
    hourlyRate = rate; 
  } 
 
  public void resetTotalCost() { 
    totalCost = 0.0; 
  } 
 
  public void visitDependentTask(DependentTask p) { 
    double taskCost = p.getTimeRequired() * hourlyRate; 
    taskCost *= p.getDependencyWeightingFactor(); 
    totalCost += taskCost; 
  } 
 
  public void visitDeliverable(Deliverable p) { 
    totalCost += p.getMaterialsCost() + p.getProductionCost(); 
  } 
 
  public void visitTask(Task p) { 
    totalCost += p.getTimeRequired() * hourlyRate; 
  } 
 
  public void visitProject(Project p) { 
  } 
} 
 
 
            
       
  |