277294.ijbsn.asiaButton.java2004-03-24T16:00:00Z2004-03-24T16:00:00Z<br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.java;
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* This file is part of the design patterns project at UBC
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/.
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is ca.ubc.cs.spl.patterns.
*
* Contributor(s):
*/
import javax.swing.*;
import java.awt.event.*;
/**
* GUI element at the start of the responsibility chain. A click on the
* button starts a request. The <code>Button</code> will not handle the
* request, but pass it on to its successor.
*
* @author Jan Hannemann
* @author Gregor Kiczales
* @version 1.0, 05/13/02
*
*/
public class Button extends JButton implements Handler {
/**
* the successor in the chain of responsibility
*/
protected Handler successor;
/**
* Creates a <code>Button</code> with a given label and successor.
*
* @param s The button label
* @param successor The successor in the chain of responsibility
*/
public Button(String s, Handler successor) {
super(s);
this.successor = successor;
this.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("\nStarting new request...");
handleRequest();
}
});
}
/**
* Implements the method to handle requests as defined by the
* <code>Handler</code> interface. The request is not handled here.
*
* @see Handler
*/
public void handleRequest() {
System.out.println("Request received by: Button (unhandled: forwarded)");
successor.handleRequest();
}
}
</TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2004-03-24T16:00:00ZFrame.java2004-03-24T16:00:00Z2004-03-24T16:00:00Z<br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.java;
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* This file is part of the design patterns project at UBC
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/.
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is ca.ubc.cs.spl.patterns.
*
* Contributor(s):
*/
import javax.swing.JFrame;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
/**
* Represents a regular GUI frame modified to be able to accept requests.
*
* @author Jan Hannemann
* @author Gregor Kiczales
* @version 1.0, 05/13/02
*
*/
public class Frame extends JFrame implements Handler {
/**
* the successor in the chain of responsibility
*/
protected Handler successor;
/**
* Creates a <code>Frame</code> with a given title. The frame
* does not have a successor and handles request that it receives.
*
* @param s the frame title
*/
public Frame(String s) {
super(s);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
/**
* Implements the method to handle requests as defined by the
* <code>Handler</code> interface. The request is handled here.
*
* @see Handler
*/
public void handleRequest() {
System.out.println("Request received by: Frame (handled)");
}
}
</TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2004-03-24T16:00:00ZHandler.java2004-03-24T16:00:00Z2004-03-24T16:00:00Z<br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.java;
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* This file is part of the design patterns project at UBC
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/.
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is ca.ubc.cs.spl.patterns.
*
* Contributor(s):
*/
/**
* Defines the interface for asking Handlers if they want to handle a request.
*
* @author Jan Hannemann
* @author Gregor Kiczales
* @version 1.0, 05/13/02
*
*/
public interface Handler {
public void handleRequest();
}
</TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2004-03-24T16:00:00ZMain.java2004-03-24T16:00:00Z2004-03-24T16:00:00Z<br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.java;
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* This file is part of the design patterns project at UBC
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/.
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is ca.ubc.cs.spl.patterns.
*
* Contributor(s):
*/
/**
* Implements a GUI-motivated example for the Chain Of Rspsonsibility design
* pattern.<p>
*
* Intent: <i>Avoid coupling the sender of a request to its receiver by giving
* more than one object a chance to handle the request. Chain the receiving
* objects and pass the request along the chain until an object handles it.
* </i><p>
*
* Participatng objects are a <code>Frame</code>, a <code>Panel</code>, and
* <code>Button</code>
*
* A click on the button triggers an event (request) that gets passed along
* the widget hierarchy (button -> panel -> frame).
*
* The <code>Handler</code> interface defines the <code>handleRequest()</code>
* method for asking an object if it is willing to handle the request.
*
* <p><i>This is the Java version.</i><p>
*
* In this version, the event not handled by button and panel. Only frame
* handles the event.
*
* @author Jan Hannemann
* @author Gregor Kiczales
* @version 1.0, 05/13/02
*
* @see Button
* @see Panel
* @see Frame
* @see Handler
*/
public class Main {
/**
* Implements the driver for the chain of responisbility example.
* It creates a simple GUI consisting of a <code>Button</code> in a
* <code>Panel</code> in a <code>Frame</code>.
*
* Clicking the button will start a request, that gets passed on
* along the following chain: button, panel, frame. the frame handles
* the event. <p>
*
* The following messages should be observed on a buttonclick: <OL>
* <LI> An Indication that the request was started
* <LI> Request received by: Button (unhandled: forwarded)
* <LI> Request received by: Panel (unhandled: forwarded)
* <LI> Request received by: Frame (handled)
* </UL>
*/
public static void main(String[] args) {
Frame frame = new Frame("Chain of Responsibility");
Panel panel = new Panel(frame);
Button button = new Button("Click me to see the Chain Of Responsibility pattern in action!", panel);
frame.getContentPane().add(panel);
panel.add(button);
frame.pack();
frame.setVisible(true);
}
}</TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2004-03-24T16:00:00ZMyChain.java2004-03-24T16:00:00Z2004-03-24T16:00:00Z<br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.aspectj;
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* This file is part of the design patterns project at UBC
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/.
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is ca.ubc.cs.spl.patterns.
*
* Contributor(s):
*/
import java.awt.event.ActionEvent;
import ca.ubc.cs.spl.pattern.library.ChainOfResponsibilityProtocol;
/**
* Implements an instance of the abstracted ChainOfResponsibility design
* pattern. Here, the a click on the button triggers an event (request)
* that gets passed along the widget hierarchy (button -> panel -> frame).
*
* In this implementation, the request is handled by the panel if the
* CTRL mask is active (i.e., if the CTRL key was pressed while the button
* was clicked). If the SHIFT mask is active, the frame handles the request.
* Otherwise, the request is unhandled.
*
* @author Jan Hannemann
* @author Gregor Kiczales
* @version 1.0, 05/13/02
*
*/
public aspect MyChain extends ChainOfResponsibilityProtocol {
/**
* Frame, Panel and Button are all Handlers
*/
declare parents: Frame implements Handler;
declare parents: Panel implements Handler;
declare parents: Button implements Handler;
// declare parents: ActionEvent implements Object; // this would be nice! doesn't work on classes where AJ does not control the source
protected pointcut eventTrigger(Handler handler, Object event): call(void Button.doClick(ActionEvent)) && target(handler) && args(event);
public boolean Frame.acceptRequest(Object event) {
if (event instanceof ActionEvent) {
ActionEvent ae = (ActionEvent) event;
return ((ae.getModifiers() & ActionEvent.SHIFT_MASK) != 0 );
}
return false;
}
public void Frame.handleRequest(Object event) {
MyChain.aspectOf().note("Class "+this.getClass().getName() + " is handling the event");
}
public boolean Panel.acceptRequest(Object event) {
if (event instanceof ActionEvent) {
ActionEvent ae = (ActionEvent) event;
return ((ae.getModifiers() & ActionEvent.CTRL_MASK) != 0 );
}
return false;
}
public void Panel.handleRequest(Object event) {
MyChain.aspectOf().note("Class "+this.getClass().getName() + " is handling the event");
}
}
</TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2004-03-24T16:00:00ZPanel.java2004-03-24T16:00:00Z2004-03-24T16:00:00Z<br/><TEXTAREA name="code" class="java" rows="16" cols="100">package examples.chainOfResponsibility.java;
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* This file is part of the design patterns project at UBC
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/.
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is ca.ubc.cs.spl.patterns.
*
* Contributor(s):
*/
import javax.swing.*;
/**
* Represents a regular GUI panel modified to be able to accept requests.
*
* @author Jan Hannemann
* @author Gregor Kiczales
* @version 1.0, 05/13/02
*
*/
public class Panel extends JPanel implements Handler {
/**
* the successor in the chain of responsibility
*/
protected Handler successor;
/**
* Creates a <code>Panel</code> with a given successor.
*
* @param successor The successor in the chain of responsibility
*/
public Panel(Handler successor) {
super();
this.successor = successor;
}
/**
* Implements the method to handle requests as defined by the
* <code>Handler</code> interface. The request is not handled here.
*
* @see Handler
*/
public void handleRequest() {
System.out.println("Request received by: Panel (unhandled: forwarded)");
successor.handleRequest();
}
}
</TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2004-03-24T16:00:00Zfiles.lst2004-03-24T16:00:00Z2004-03-24T16:00:00Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2004-03-24T16:00:00Z