package open.dolphin.impl.login;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Date;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import open.dolphin.client.AutoRomanListener;
import open.dolphin.client.ClientContext;
import open.dolphin.client.GUIFactory;
import open.dolphin.delegater.UserDelegater;
import open.dolphin.helper.SimpleWorker;
import open.dolphin.infomodel.ModelUtils;
import open.dolphin.infomodel.UserModel;
import open.dolphin.project.Project;
/**
* ログインダイアログ クラス。
*
* @author Kazushi Minagawa, Digital Globe, Inc.
*/
public class LoginDialog extends AbstractLoginDialog {
private LoginPanel view;
//private SignInPanel view;
private StateMgr stateMgr;
private boolean loginFlag;
/** Creates new LoginService */
public LoginDialog() {
}
@Override
protected void tryLogin() {
if(loginFlag) {
return;
}else{
loginFlag = true;
}
// User 情報を取得するためのデリゲータを得る
if (userDlg == null) {
userDlg = new UserDelegater();
}
// トライ出来る最大回数を得る
if (maxTryCount == 0) {
maxTryCount = ClientContext.getInt("loginDialog.maxTryCount");
}
java.util.ResourceBundle bundle = ClientContext.getMyBundle(LoginDialog.class);
java.util.logging.Logger.getLogger(this.getClass().getName()).info(bundle.getString("message.startAuthentication"));
// 試行回数 += 1
tryCount++;
//Task
worker = new SimpleWorker<UserModel, Void>() {
@Override
protected UserModel doInBackground() throws Exception {
String fid = Project.getFacilityId();
String uid = view.getUserIdField().getText().trim();
String password = new String(view.getPasswordField().getPassword());
UserModel userModel = userDlg.login(fid, uid, password);
return userModel;
}
@Override
protected void succeeded(UserModel userModel) {
if (userModel!=null) {
// 5分間テストの場合、有効期間をテストする
if (isTestUser(userModel) && isExpired(userModel)) {
// 評価終了
showTestExpiredError();
setResult(LoginStatus.NOT_AUTHENTICATED);
} else {
// 認証成功
String time = ModelUtils.getDateTimeAsString(new Date());
StringBuilder sb = new StringBuilder();
sb.append(time).append(":");
sb.append(userModel.getUserId()).append(bundle.getString("text.hasLoggedIn"));
java.util.logging.Logger.getLogger(this.getClass().getName()).info(sb.toString());
//----------------------------------
// ユーザモデルを ProjectStub へ保存する
//----------------------------------
Project.getProjectStub().setUserModel(userModel);
//s.oh^ 2014/07/08 クラウド0対応
if(!checkCloudZero()) {
Project.getProjectStub().setUserModel(null);
loginFlag = false;
return;
}
//s.oh$
Project.getProjectStub().setFacilityId(userModel.getFacilityModel().getFacilityId());
Project.getProjectStub().setUserId(userModel.idAsLocal()); // facilityId無し
setResult(LoginStatus.AUTHENTICATED);
//s.oh^ 2014/03/13 傷病名削除診療科対応
getOrcaDeptInfo();
//s.oh$
}
} else {
if (tryCount <= maxTryCount) {
showUserIdPasswordError();
} else {
showTryOutError();
setResult(LoginStatus.NOT_AUTHENTICATED);
}
loginFlag = false;
}
// Enumeration<NetworkInterface> nics;
// try {
// nics = NetworkInterface.getNetworkInterfaces();
// while(nics.hasMoreElements()) {
// NetworkInterface ni = nics.nextElement();
// System.out.println("Name : " + ni.getName());
// System.out.println("Display name : " + ni.getDisplayName());
// byte[] addr = ni.getHardwareAddress();
// StringBuilder sb = new StringBuilder();
// if(addr != null) {
// for(byte b : addr) {
// sb.append(String.format("%02X ", b));
// }
// }
// System.out.println("Hardware address : " + sb.toString());
// }
// } catch (SocketException ex) {
// Logger.getLogger(LoginDialog.class.getName()).log(Level.SEVERE, null, ex);
// }
}
@Override
protected void failed(java.lang.Throwable cause) {
java.util.logging.Logger.getLogger(this.getClass().getName()).warning(bundle.getString("TASK FAILED"));
java.util.logging.Logger.getLogger(this.getClass().getName()).warning(cause.getCause().getMessage());
java.util.logging.Logger.getLogger(this.getClass().getName()).warning(cause.getMessage());
if (tryCount <= maxTryCount) {
//showMessageDialog(cause.getMessage());
showMessageDialog(bundle.getString("error.invalidLogiInfo"));
} else {
showTryOutError();
setResult(LoginStatus.NOT_AUTHENTICATED);
}
loginFlag = false;
}
};
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (SwingWorker.StateValue.DONE == evt.getNewValue()) {
setBusy(false);
worker.removePropertyChangeListener(this);
} else if (SwingWorker.StateValue.STARTED == evt.getNewValue()) {
setBusy(true);
}
}
});
worker.execute();
}
/**
* GUI を構築する。
* @return */
@Override
protected JPanel createComponents() {
view = new LoginPanel();
//view = new SignInPanel();
view.getCancelBtn().setText(GUIFactory.getCancelButtonText());
// イベント接続を行う
connect();
////s.oh^ RSS対応
// view.getLogoLabel().addMouseListener(new MouseListener() {
// @Override
// public void mouseClicked(MouseEvent e) {
// if(e.getClickCount() == 2) {
// showRSSInfo();
// }
// }
// @Override
// public void mousePressed(MouseEvent e) {}
// @Override
// public void mouseReleased(MouseEvent e) {}
// @Override
// public void mouseEntered(MouseEvent e) {}
// @Override
// public void mouseExited(MouseEvent e) {}
// });
////s.oh$
return view;
}
/**
* イベント接続を行う。
*/
private void connect() {
// Mediator ライクな StateMgr
stateMgr = new StateMgr();
// フィールドにリスナを登録する
DocumentListener dl = new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
stateMgr.checkButtons();
}
@Override
public void removeUpdate(DocumentEvent e) {
stateMgr.checkButtons();
}
@Override
public void changedUpdate(DocumentEvent e) {
stateMgr.checkButtons();
}
};
JTextField userIdField = view.getUserIdField();
userIdField.getDocument().addDocumentListener(dl);
userIdField.addFocusListener(AutoRomanListener.getInstance());
userIdField.addActionListener((ActionEvent e) -> {
stateMgr.onUserIdAction();
});
JPasswordField passwdField = view.getPasswordField();
passwdField.getDocument().addDocumentListener(dl);
passwdField.addFocusListener(AutoRomanListener.getInstance());
passwdField.addActionListener((ActionEvent e) -> {
stateMgr.onPasswordAction();
});
}
@Override
protected JButton getLoginButton() {
return view.getLoginBtn();
}
@Override
protected JButton getCancelButton() {
return view.getCancelBtn();
}
@Override
protected JButton getSettingButton() {
return view.getSettingBtn();
}
@Override
protected JProgressBar getProgressBar() {
return view.getProgressBar();
}
/**
* モデルを表示する。
*/
@Override
protected void doWindowOpened() {
String uid = Project.getUserId();
if (uid != null && (!uid.equals(""))) {
view.getUserIdField().setText(uid);
view.getPasswordField().requestFocus();
}
}
/**
* 設定ダイアログから通知を受ける。
* 有効なプロジェクトでればユーザIDをフィールドに設定しパスワードフィールドにフォーカスする。
* @param newValue
**/
@Override
public void setNewParams(Boolean newValue) {
boolean valid = newValue;
if (valid) {
doWindowOpened();
}
}
/**
* ログインボタンを制御する簡易 StateMgr クラス。
*/
class StateMgr {
private boolean okState;
public StateMgr() {
}
/**
* ログインボタンの enable/disable を制御する。
*/
public void checkButtons() {
boolean newOKState = true;
newOKState = newOKState && (!view.getUserIdField().getText().equals(""));
newOKState = newOKState && (view.getPasswordField().getPassword().length >0);
if (newOKState != okState) {
view.getLoginBtn().setEnabled(newOKState);
okState = newOKState;
}
}
/**
* UserId フィールドでリターンきーが押された時の処理を行う。
*/
public void onUserIdAction() {
view.getPasswordField().requestFocus();
}
/**
* Password フィールドでリターンきーが押された時の処理を行う。
*/
public void onPasswordAction() {
if (view.getUserIdField().getText().equals("")) {
view.getUserIdField().requestFocus();
} else if (view.getPasswordField().getPassword().length != 0 && okState) {
view.getLoginBtn().doClick();
}
}
}
}