package open.dolphin.impl.login; import java.awt.event.ActionEvent; import java.awt.event.ItemEvent; 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 MultiUserLoginDialog extends AbstractLoginDialog { private LoginPanelUser view; private StateMgr stateMgr; private boolean loginFlag; /** Creates new LoginService */ public MultiUserLoginDialog() { } @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(MultiUserLoginDialog.class); java.util.logging.Logger.getLogger(this.getClass().getName()).info(bundle.getString("message.startAuthenitication")); // 試行回数 += 1 tryCount++; //Task worker = new SimpleWorker<UserModel, Void>() { @Override protected UserModel doInBackground() throws Exception { String fid = Project.getFacilityId(); String uid = (String)view.getUsersCmb().getSelectedItem(); 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) { // 認証成功 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; } } @Override protected void failed(java.lang.Throwable cause) { java.util.logging.Logger.getLogger(this.getClass().getName()).warning("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.invalidLoginInfo")); } 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() { String names = Project.getString("login.set.users"); String[] name = names.split("\\s*,\\s*"); int cnt = name.length; String[] data = new String[cnt]; System.arraycopy(name, 0, data, 0, cnt); DefaultComboBoxModel cmbModel = new DefaultComboBoxModel(data); view = new LoginPanelUser(); view.getUsersCmb().setModel(cmbModel); //minagawa^ mac jdk7 view.getCancelBtn().setText(GUIFactory.getCancelButtonText()); //minagawa // イベント接続を行う connect(); 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(); } }; view.getUsersCmb().addItemListener((ItemEvent e) -> { if (e.getStateChange() == ItemEvent.SELECTED) { 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("")) { return; } int cnt = view.getUsersCmb().getItemCount(); for (int i=0; i < cnt; i++) { String test = (String)view.getUsersCmb().getItemAt(i); if (test.equals(uid)) { view.getUsersCmb().setSelectedIndex(i); view.getPasswordField().requestFocus(); break; } } } /** * 設定ダイアログから通知を受ける。 * 有効なプロジェクトでればユーザ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.getUsersCmb().getSelectedItem()!=null); newOKState = newOKState && (view.getPasswordField().getPassword().length >0); if (newOKState != okState) { loginAction.setEnabled(newOKState); okState = newOKState; } } /** * UserId フィールドでリターンきーが押された時の処理を行う。 */ public void onUserIdAction() { view.getPasswordField().requestFocus(); } /** * Password フィールドでリターンきーが押された時の処理を行う。 */ public void onPasswordAction() { if (view.getUsersCmb().getSelectedItem()==null) { view.getUsersCmb().requestFocus(); } else if (view.getPasswordField().getPassword().length != 0 && okState) { view.getLoginBtn().doClick(); } } } }