package com.javafun.timetracking.security;
import javafun.utils.StringUtils;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.TextOutputCallback;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
/**
* Handles the callbacks to show a RCP/RAP UI for the LoginModule.
*/
public class TimetrackingCallbackHandler extends AbstractLoginDialog {
private Text _text;
private Text _passwordText;
private String _namePrompt;
private String _passPrompt;
public TimetrackingCallbackHandler() {
this(Display.getDefault().getActiveShell());
}
protected TimetrackingCallbackHandler(final Shell parentShell) {
super(parentShell);
}
protected Point getInitialSize() {
return new Point(280, 240);
}
protected Control createDialogArea(final Composite parent) {
Composite dialogarea = (Composite) super.createDialogArea(parent);
dialogarea.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite composite = new Composite(dialogarea, SWT.NONE);
composite.setLayout(new GridLayout());
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
createCallbackHandlers(composite);
return composite;
}
@Override
protected Control createButtonBar(final Composite parent) {
Control control = super.createButtonBar(parent);
getButton(OK).setEnabled(false);
return control;
}
private void createCallbackHandlers(final Composite composite) {
Callback[] callbacks = getCallbacks();
for (int i = 0; i < callbacks.length; i++) {
Callback callback = callbacks[i];
if (callback instanceof TextOutputCallback) {
createTextoutputHandler(composite, (TextOutputCallback) callback);
} else if (callback instanceof NameCallback) {
createNameHandler(composite, (NameCallback) callback);
} else if (callback instanceof PasswordCallback) {
createPasswordHandler(composite, (PasswordCallback) callback);
}
}
}
private void createPasswordHandler(final Composite composite, final PasswordCallback callback) {
Label label = new Label(composite, SWT.NONE);
_passPrompt = callback.getPrompt();
label.setText(_passPrompt);
label.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
_passwordText = new Text(composite, SWT.SINGLE | SWT.LEAD | SWT.PASSWORD | SWT.BORDER);
_passwordText.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
_passwordText.addModifyListener(new ModifyListener() {
public void modifyText(final ModifyEvent event) {
validateFields(callback);
}
});
}
private void createNameHandler(final Composite composite, final NameCallback callback) {
Label label = new Label(composite, SWT.NONE);
_namePrompt = callback.getPrompt();
label.setText(_namePrompt);
label.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
_text = new Text(composite, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
_text.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
_text.addModifyListener(new ModifyListener() {
public void modifyText(final ModifyEvent event) {
validateFields(callback);
}
});
}
private void createTextoutputHandler(final Composite composite, final TextOutputCallback callback) {
int messageType = callback.getMessageType();
int dialogMessageType = IMessageProvider.NONE;
switch (messageType) {
case TextOutputCallback.INFORMATION:
dialogMessageType = IMessageProvider.INFORMATION;
break;
case TextOutputCallback.WARNING:
dialogMessageType = IMessageProvider.WARNING;
break;
case TextOutputCallback.ERROR:
dialogMessageType = IMessageProvider.ERROR;
break;
}
setMessage(callback.getMessage(), dialogMessageType);
}
public void internalHandle() {
}
private void validateFields(final Callback callback) {
if (callback instanceof NameCallback) {
((NameCallback) callback).setName(_text.getText());
} else if (callback instanceof PasswordCallback) {
((PasswordCallback) callback).setPassword(_passwordText.getText().toCharArray());
}
if (StringUtils.isBlank(_text.getText())) {
getButton(OK).setEnabled(false);
setErrorMessage("Enter " + _namePrompt);
} else if (StringUtils.isBlank(_passwordText.getText())) {
getButton(OK).setEnabled(false);
setErrorMessage("Enter " + _passPrompt);
} else {
setErrorMessage(null);
getButton(OK).setEnabled(true);
}
}
}