001 package users; 002 003 import sale.*; 004 005 /** 006 * A special capability guarding an action object. 007 * 008 * <p>The ActionCapability is itself an Action again, so that you can write code like 009 * this:</p> 010 * 011 * <pre> 012 * public class S extends SalesPoint { 013 * 014 * ... 015 * 016 * public MenuSheet getDefaultMenuSheet() { 017 * 018 * MenuSheet ms = new MenuSheet(); 019 * 020 * <b> ms.addItem ("Capability Test", 021 * (Action) {@link SalesPoint#getUser getUser}().{@link User#getCapability getCapability}("CapTest")); 022 * </b> 023 * return ms; 024 * } 025 * 026 * ... 027 * 028 * } 029 * 030 * </pre> 031 * 032 * <p>Assuming that the CapTest capability is represented by an ActionCapability wrapping 033 * some other Action.</p> 034 * 035 * @see SalesPoint 036 * @see MenuSheet 037 * @see UserManager 038 * @see User 039 * 040 * @author Steffen Zschaler 041 * @version 2.0 05/05/1999 042 * @since v2.0 043 */ 044 public class ActionCapability extends AbstractCapability implements Action { 045 046 /** 047 * ID for serialization. 048 */ 049 private static final long serialVersionUID = 6852773649712428747L; 050 051 /** 052 * Is this capability granted? 053 * 054 * @serial 055 */ 056 private boolean m_fGranted; 057 058 /** 059 * The action guarded. 060 * 061 * @serial 062 */ 063 private Action m_aToDo; 064 065 /** 066 * A message to be presented on denial. 067 * 068 * @serial 069 */ 070 private String m_sOnDeny; 071 072 /** 073 * Create a granted capability. 074 * 075 * @param sName the name of the capability. 076 * @param aToDo the Action to be guarded. 077 */ 078 public ActionCapability(String sName, Action aToDo) { 079 this(sName, null, aToDo, true); 080 } 081 082 /** 083 * Create a new ActionCapability. 084 * 085 * @param sName the name of the capability. 086 * @param sOnDeny a message to be popped up on denial. 087 * @param aToDo the Action to be guarded. 088 * @param fGranted true if this capability is to grant rights. 089 */ 090 public ActionCapability(String sName, String sOnDeny, Action aToDo, boolean fGranted) { 091 super(sName); 092 093 m_sOnDeny = sOnDeny; 094 m_aToDo = aToDo; 095 m_fGranted = fGranted; 096 } 097 098 // Capability interface methods 099 100 /** 101 * Get the ActionCapability that is the inverse to this one. I.e. if this capability grants the right to 102 * execute a given action, the returned capability will deny this right and vice versa. 103 * 104 * @return the ActionCapability that is the inverse to this one. 105 * 106 * @override Never 107 */ 108 public Capability getToggled() { 109 return new ActionCapability(getName(), m_sOnDeny, m_aToDo, !m_fGranted); 110 } 111 112 /** 113 * Return true if this capability is granting rights. 114 * 115 * @return true if this capability is granting rights. 116 * 117 * @override Never 118 */ 119 public boolean isGranted() { 120 return m_fGranted; 121 } 122 123 // Action interface method 124 125 /** 126 * If the capability is granting rights, perform the guarded action; otherwise, 127 * print a message to the user that he/she is not granted the right to 128 * perform this action. 129 * 130 * @param p the process in which to perform the action 131 * @param sp the SalesPoint on which to perform the action. 132 * 133 * @override Never 134 */ 135 public void doAction(SaleProcess p, SalesPoint sp) throws Throwable { 136 // This is not the proper way, normally the two cases should be different subclasses 137 // of Capability, but for the sake of useability I put it like this. 138 if (m_fGranted) { 139 if (m_aToDo != null) { 140 m_aToDo.doAction(p, sp); 141 } 142 } else { 143 if (m_sOnDeny != null) { 144 145 // use the JOptionPane to make it easy to pop up a message box. 146 // Should actually be using a p.popupFormSheet (new MsgForm (...)) instead 147 javax.swing.JOptionPane.showMessageDialog(null, m_sOnDeny, "Error", 148 javax.swing.JOptionPane.ERROR_MESSAGE); 149 } 150 } 151 } 152 }