1 package org
.argeo
.cms
.widgets
.auth
;
3 import java
.io
.IOException
;
4 import java
.util
.Arrays
;
6 import javax
.security
.auth
.callback
.Callback
;
7 import javax
.security
.auth
.callback
.CallbackHandler
;
8 import javax
.security
.auth
.callback
.NameCallback
;
9 import javax
.security
.auth
.callback
.PasswordCallback
;
10 import javax
.security
.auth
.callback
.TextOutputCallback
;
11 import javax
.security
.auth
.callback
.UnsupportedCallbackException
;
13 import org
.eclipse
.swt
.SWT
;
14 import org
.eclipse
.swt
.events
.KeyEvent
;
15 import org
.eclipse
.swt
.events
.KeyListener
;
16 import org
.eclipse
.swt
.events
.ModifyEvent
;
17 import org
.eclipse
.swt
.events
.ModifyListener
;
18 import org
.eclipse
.swt
.events
.SelectionEvent
;
19 import org
.eclipse
.swt
.events
.SelectionListener
;
20 import org
.eclipse
.swt
.layout
.GridData
;
21 import org
.eclipse
.swt
.widgets
.Combo
;
22 import org
.eclipse
.swt
.widgets
.Composite
;
23 import org
.eclipse
.swt
.widgets
.Control
;
24 import org
.eclipse
.swt
.widgets
.Label
;
25 import org
.eclipse
.swt
.widgets
.Text
;
28 * A composite that can populate itself based on {@link Callback}s. It can be
29 * used directly as a {@link CallbackHandler} or be used by one by calling the
30 * {@link #createCallbackHandlers(Callback[])}.
32 * Supported standard {@link Callback}s are:<br>
34 * <li>{@link PasswordCallback}</li>
35 * <li>{@link NameCallback}</li>
36 * <li>{@link TextOutputCallback}</li>
40 * Supported Argeo {@link Callback}s are:<br>
42 * <li>{@link LocaleChoice}</li>
46 public class CompositeCallbackHandler
extends Composite
implements
48 private static final long serialVersionUID
= -928223893722723777L;
50 private boolean wasUsedAlready
= false;
51 private boolean isSubmitted
= false;
52 private boolean isCanceled
= false;
54 public CompositeCallbackHandler(Composite parent
, int style
) {
59 public synchronized void handle(final Callback
[] callbacks
)
60 throws IOException
, UnsupportedCallbackException
{
62 if (wasUsedAlready
&& !isSubmitted() && !isCanceled()) {
64 for (Control control
: getChildren())
70 for (Callback callback
: callbacks
)
71 checkCallbackSupported(callback
);
72 // create controls synchronously in the UI thread
73 getDisplay().syncExec(new Runnable() {
77 createCallbackHandlers(callbacks
);
82 wasUsedAlready
= true;
84 // while (!isSubmitted() && !isCanceled()) {
87 // } catch (InterruptedException e) {
92 // cleanCallbacksAfterCancel(callbacks);
95 public void checkCallbackSupported(Callback callback
)
96 throws UnsupportedCallbackException
{
97 if (callback
instanceof TextOutputCallback
98 || callback
instanceof NameCallback
99 || callback
instanceof PasswordCallback
100 || callback
instanceof LocaleChoice
) {
103 throw new UnsupportedCallbackException(callback
);
108 * Set writable callbacks to null if the handle is canceled (check is done
111 public void cleanCallbacksAfterCancel(Callback
[] callbacks
) {
113 for (Callback callback
: callbacks
) {
114 if (callback
instanceof NameCallback
) {
115 ((NameCallback
) callback
).setName(null);
116 } else if (callback
instanceof PasswordCallback
) {
117 PasswordCallback pCallback
= (PasswordCallback
) callback
;
118 char[] arr
= pCallback
.getPassword();
120 Arrays
.fill(arr
, '*');
121 pCallback
.setPassword(null);
128 public void createCallbackHandlers(Callback
[] callbacks
) {
129 Composite composite
= this;
130 for (int i
= 0; i
< callbacks
.length
; i
++) {
131 Callback callback
= callbacks
[i
];
132 if (callback
instanceof TextOutputCallback
) {
133 createLabelTextoutputHandler(composite
,
134 (TextOutputCallback
) callback
);
135 } else if (callback
instanceof NameCallback
) {
136 createNameHandler(composite
, (NameCallback
) callback
);
137 } else if (callback
instanceof PasswordCallback
) {
138 createPasswordHandler(composite
, (PasswordCallback
) callback
);
139 } else if (callback
instanceof LocaleChoice
) {
140 createLocaleHandler(composite
, (LocaleChoice
) callback
);
145 protected Text
createNameHandler(Composite composite
,
146 final NameCallback callback
) {
147 Label label
= new Label(composite
, SWT
.NONE
);
148 label
.setText(callback
.getPrompt());
149 final Text text
= new Text(composite
, SWT
.SINGLE
| SWT
.LEAD
151 if (callback
.getDefaultName() != null) {
152 // set default value, if provided
153 text
.setText(callback
.getDefaultName());
154 callback
.setName(callback
.getDefaultName());
156 text
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
157 text
.addModifyListener(new ModifyListener() {
158 private static final long serialVersionUID
= 7300032545287292973L;
160 public void modifyText(ModifyEvent event
) {
161 callback
.setName(text
.getText());
164 text
.addSelectionListener(new SelectionListener() {
165 private static final long serialVersionUID
= 1820530045857665111L;
168 public void widgetSelected(SelectionEvent e
) {
172 public void widgetDefaultSelected(SelectionEvent e
) {
177 text
.addKeyListener(new KeyListener() {
178 private static final long serialVersionUID
= -8698107785092095713L;
181 public void keyReleased(KeyEvent e
) {
185 public void keyPressed(KeyEvent e
) {
191 protected Text
createPasswordHandler(Composite composite
,
192 final PasswordCallback callback
) {
193 Label label
= new Label(composite
, SWT
.NONE
);
194 label
.setText(callback
.getPrompt());
195 final Text passwordText
= new Text(composite
, SWT
.SINGLE
| SWT
.LEAD
196 | SWT
.PASSWORD
| SWT
.BORDER
);
198 .setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
199 passwordText
.addModifyListener(new ModifyListener() {
200 private static final long serialVersionUID
= -7099363995047686732L;
202 public void modifyText(ModifyEvent event
) {
203 callback
.setPassword(passwordText
.getTextChars());
206 passwordText
.addSelectionListener(new SelectionListener() {
207 private static final long serialVersionUID
= 1820530045857665111L;
210 public void widgetSelected(SelectionEvent e
) {
214 public void widgetDefaultSelected(SelectionEvent e
) {
221 protected Combo
createLocaleHandler(Composite composite
,
222 final LocaleChoice callback
) {
223 String
[] labels
= callback
.getSupportedLocalesLabels();
224 if (labels
.length
== 0)
226 Label label
= new Label(composite
, SWT
.NONE
);
227 label
.setText("Language");
229 final Combo combo
= new Combo(composite
, SWT
.READ_ONLY
);
230 combo
.setItems(labels
);
231 combo
.select(callback
.getDefaultIndex());
232 combo
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
233 combo
.addSelectionListener(new SelectionListener() {
234 private static final long serialVersionUID
= 38678989091946277L;
237 public void widgetSelected(SelectionEvent e
) {
238 callback
.setSelectedIndex(combo
.getSelectionIndex());
242 public void widgetDefaultSelected(SelectionEvent e
) {
248 protected Label
createLabelTextoutputHandler(Composite composite
,
249 final TextOutputCallback callback
) {
250 Label label
= new Label(composite
, SWT
.NONE
);
251 label
.setText(callback
.getMessage());
252 GridData data
= new GridData(SWT
.FILL
, SWT
.FILL
, true, true);
253 data
.horizontalSpan
= 2;
254 label
.setLayoutData(data
);
256 // TODO: find a way to pass this information
257 // int messageType = callback.getMessageType();
258 // int dialogMessageType = IMessageProvider.NONE;
259 // switch (messageType) {
260 // case TextOutputCallback.INFORMATION:
261 // dialogMessageType = IMessageProvider.INFORMATION;
263 // case TextOutputCallback.WARNING:
264 // dialogMessageType = IMessageProvider.WARNING;
266 // case TextOutputCallback.ERROR:
267 // dialogMessageType = IMessageProvider.ERROR;
270 // setMessage(callback.getMessage(), dialogMessageType);
273 synchronized boolean isSubmitted() {
277 synchronized boolean isCanceled() {
281 protected synchronized void submit() {
286 protected synchronized void cancel() {