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.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 javax.swing.*;
import java.awt.event.*;
/**
* A simple GUI button that implemetns its own ActionListener.
*
* @author Jan Hannemann
* @author Gregor Kiczales
* @version 1.0, 05/13/02
*
*/
public class Button extends JButton {
/**
* Creates a Button widget. An ActionListener is also added that calls
* the <code>doClick(ActionEvent)</code> method when the button is pressed
*
* @param s the button label
*/
public Button(String s) {
super(s);
this.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
doClick(e);
}
});
}
/**
* An empty method that is called when the button is clicked.
*
* @param e the actionEvent that was created when the button was clicked.
*/
public void doClick(ActionEvent e) {}
}</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.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 javax.swing.JFrame;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
/**
* Represents a regular GUI frame. No pattern-specific modifications are
* needed here. A WindowListener is added.
*
* @author Jan Hannemann
* @author Gregor Kiczales
* @version 1.0, 05/13/02
*
*/
public class Frame extends JFrame {
/**
* Creates a <code>Frame</code> with a given title.
*
* @param s the frame title
*/
public Frame(String s) {
super(s);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
</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.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):
*/
/**
* 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 AspectJ version.</i><p>
*
* 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, 06/13/02
*
* @see Button
* @see Panel
* @see Frame
* @see MyChain
*/
public class Main {
/**
* Implements a GUI-motivated example for the Chain Of Rspsonsibility design
* pattern.<p>
*
* 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.
*
* @param args command line parameters, unused
*/
public static void main(String[] args) {
Frame frame = new Frame("Chain of Responsibility");
Panel panel = new Panel();
Button button = new Button("Click me to see the Chain Of Responsibility pattern in action! Use <SHIFT> and <CTRL> during clicks to see different behavior");
MyChain.aspectOf().setSuccessor(button, panel);
MyChain.aspectOf().setSuccessor(panel, frame);
MyChain.aspectOf().setNotification(true);
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.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 javax.swing.*;
/**
* A regular GUI JPanel with no modifications
*
* @author Jan Hannemann
* @author Gregor Kiczales
* @version 1.0, 05/13/02
*
*/
public class Panel extends JPanel {}
</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