package code3;

import java.util.Map;

public class Client {

  public static void main(String[] args) {

      Guard widgetGuard1 = new ElementalGuard("source");
      Guard widgetGuard2 = new ElementalGuard("target");

      ElementalWidget widget1 = (ElementalWidget)widgetGuard1.getWidget();
      ElementalWidget widget2 = (ElementalWidget)widgetGuard2.getWidget();


      // do some events with widget1 as the source
      Map eventMap1 = widgetGuard1.getEvents();
      Map actionMap1 = widgetGuard2.getActions();
      
      WidgetEvent event11 = (WidgetEvent)eventMap1.get("event1");
      widget1.addEvent1Listener(event11);
      Action action11 = (Action)actionMap1.get("action1");
      WidgetEvent event12 = (WidgetEvent)eventMap1.get("event2");
      widget1.addEvent2Listener(event12);
      Action action12 = (Action)actionMap1.get("action2");
      
      SourceMediator mediator11 = new SourceMediator();
      mediator11.setPair(event11, action11);
      
      SourceMediator mediator12 = new SourceMediator();
      mediator12.setPair(event12, action12);
      
      System.err.println("widget1 => widget2 #############");
      widget1.doEvent1();
      widget1.doEvent2();
      
      // do some events with widget2 as the source
      Map eventMap2 = widgetGuard2.getEvents();
      Map actionMap2 = widgetGuard1.getActions();
      
      WidgetEvent event21 = (WidgetEvent)eventMap2.get("event1");
      Action action21 = (Action)actionMap2.get("action1");
      WidgetEvent event22 = (WidgetEvent)eventMap2.get("event2");
      Action action22 = (Action)actionMap2.get("action2");
      
      SourceMediator mediator21 = new SourceMediator();
      mediator21.setPair(event21, action21);
      
      SourceMediator mediator22 = new SourceMediator();
      mediator22.setPair(event22, action22);
      
      System.err.println("widget2 => widget1 #############");
      widget2.doEvent1();
      widget2.doEvent2();
      
      // now try to pair widget1 with itself
      // adding a pair to mediator 21 means that target will
      // still hear the event. this is desired
      mediator21.setPair(event11, action21);
      System.err.println("widget1 => widget1 #############");
      widget1.doEvent1();
      // now kill off this latest event and wiggle the widget
	// and see what happens
      mediator21.removePair(event11);
      widget1.doEvent1();
  }
    
}
