package org.jblooming.operator.businessLogic; import org.jblooming.ApplicationException; import org.jblooming.PlatformRuntimeException; import org.jblooming.anagraphicalData.AnagraphicalData; import org.jblooming.messaging.MailHelper; import org.jblooming.ontology.businessLogic.DeleteHelper; import org.jblooming.operator.Operator; import org.jblooming.oql.OqlQuery; import org.jblooming.oql.QueryHelper; import org.jblooming.page.HibernatePage; import org.jblooming.persistence.PersistenceHome; import org.jblooming.persistence.exceptions.PersistenceException; import org.jblooming.security.*; import org.jblooming.security.SecurityException; import org.jblooming.system.SystemConstants; import org.jblooming.waf.constants.*; import org.jblooming.waf.exceptions.ActionException; import org.jblooming.waf.html.display.Paginator; import org.jblooming.waf.html.input.Selector; import org.jblooming.waf.html.table.ListHeader; import org.jblooming.waf.settings.ApplicationState; import org.jblooming.waf.state.PersistentSearch; import org.jblooming.waf.view.ClientEntries; import org.jblooming.waf.view.ClientEntry; import org.jblooming.waf.view.PageState; import javax.servlet.http.HttpServletRequest; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.TreeMap; /** * @author Pietro Polsinelli : ppolsinelli@open-lab.com */ public class OperatorAction { public void cmdAdd(PageState pageState, Class operatorClass) throws org.jblooming.security.SecurityException, ApplicationException, PersistenceException { Operator operator; try { operator = (Operator) operatorClass.newInstance(); } catch (Exception e) { throw new RuntimeException(e); } operator.setIdAsNew(); Operator logged = pageState.getLoggedOperator(); OperatorHelper.SecuritySettings sst = OperatorHelper.getSecuritySettings(logged, operator); if (!sst.canWrite) throw new SecurityException(SecurityConstants.I18N_PERMISSION_LACKING, PlatformPermissions.operator_canWrite); make(operator, pageState); pageState.setMainObject(operator); } public void cmdEdit(PageState pageState, Class operatorClass) throws SecurityException, PersistenceException, ApplicationException { Operator operator = (Operator) PersistenceHome.findByPrimaryKey(operatorClass, pageState.getMainObjectId()); if (operator.getAnagraphicalData() == null) { AnagraphicalData ad = new AnagraphicalData(); ad.store(); operator.setAnagraphicalData(ad); } make(operator, pageState); pageState.setMainObject(operator); } public void cmdFind(PageState pageState) throws PersistenceException { Operator logged = pageState.getLoggedOperator(); String hql = "select user from " + Operator.class.getName() + " as user order by user.name"; QueryHelper qhelp = new QueryHelper(hql); boolean recoveredFromSavedFilter = PersistentSearch.feedFromSavedSearch(pageState); String filter = pageState.getEntry(Fields.FORM_PREFIX + "filter").stringValueNullIfEmpty(); if (filter != null && filter.trim().length() > 0) { qhelp.addQBEORClauses( filter, qhelp.getOrElement("user.loginName", "loginName", QueryHelper.TYPE_CHAR), qhelp.getOrElement("user.name", "name", QueryHelper.TYPE_CHAR), qhelp.getOrElement("user.surname", "surname", QueryHelper.TYPE_CHAR) ); } boolean showHidden = pageState.getEntry("SHOW_HIDDEN_OPERATOR").checkFieldValue(); qhelp.addOQLClause("user.enabled=:showHidden","showHidden",!showHidden); ListHeader.orderAction(qhelp, "OPLH", pageState); pageState.setPage( HibernatePage.getHibernatePageInstance(qhelp.toHql().getQuery(), Paginator.getWantedPageNumber(pageState), Paginator.getWantedPageSize(pageState))); } public void cmdDelete(PageState pageState) throws SecurityException, PersistenceException { Operator logged = pageState.getLoggedOperator(); Operator operator = (Operator) PersistenceHome.findByPrimaryKey(Operator.class, pageState.getMainObjectId()); OperatorHelper.SecuritySettings sst = OperatorHelper.getSecuritySettings(logged, operator); if (!sst.canRead) throw new SecurityException(SecurityConstants.I18N_PERMISSION_LACKING, PlatformPermissions.operator_canWrite); pageState.setMainObject(operator); DeleteHelper.cmdDelete(operator, pageState); } public void cmdSaveAndLogin(PageState pageState, Class operatorClass, HttpServletRequest request) throws SecurityException, ActionException, PersistenceException, ApplicationException { cmdSave(pageState, operatorClass); pageState.getSessionState().setLoggedOperator((Operator) pageState.getMainObject()); } public void cmdSave(PageState pageState, Class operatorClass) throws SecurityException, ActionException, PersistenceException, ApplicationException { boolean invalidClientEntries = false; Operator operator; AnagraphicalData ad; if (PersistenceHome.NEW_EMPTY_ID.equals(pageState.mainObjectId)) { try { operator = (Operator) operatorClass.newInstance(); operator.setIdAsNew(); } catch (InstantiationException e) { throw new PlatformRuntimeException(e); } catch (IllegalAccessException e) { throw new PlatformRuntimeException(e); } ad = new AnagraphicalData(); operator.setAnagraphicalData(ad); } else operator = (Operator) PersistenceHome.findByPrimaryKey(operatorClass, pageState.getMainObjectId()); Operator logged = pageState.getLoggedOperator(); OperatorHelper.SecuritySettings sst = OperatorHelper.getSecuritySettings(logged, operator); if (!sst.canWrite) throw new SecurityException(SecurityConstants.I18N_PERMISSION_LACKING, PlatformPermissions.operator_canWrite); pageState.setMainObject(operator); try { operator.setName(pageState.getEntry(OperatorConstants.FLD_NAME).stringValue()); } catch (ActionException e) { e.printStackTrace(); } try { operator.setSurname(pageState.getEntry(OperatorConstants.FLD_SURNAME).stringValue()); } catch (ActionException e) { invalidClientEntries = true; } try { final ClientEntry entry = pageState.getEntryAndSetRequired("LOGIN_NAME"); final String loginName = entry.stringValue(); if (!loginName.equals(operator.getLoginName())) { OqlQuery oq = new OqlQuery("from " + Operator.class.getName() + " user where user.loginName = :userLN"); oq.getQuery().setString("userLN", loginName); List sameLogin = oq.list(); if (sameLogin != null && sameLogin.size() > 0) { entry.errorCode = FieldErrorConstants.ERR_KEY_MUST_BE_UNIQUE; throw new ActionException(); } operator.setLoginName(loginName); } } catch (ActionException e) { invalidClientEntries = true; } try { ClientEntry pswCe = pageState.getEntry("PWD"); ClientEntry pswCeRT = pageState.getEntry("PWD_RETYPE"); String psw = pswCe.stringValue(); if (!psw.equals(OperatorConstants.PASSWORD_MASK)) { // test for password sufficient length final String minLen = ApplicationState.getApplicationSetting(SystemConstants.FLD_PASSWORD_MIN_LEN); int minLength = minLen != null ? Integer.parseInt(minLen) : 0; if (psw.length() < minLength) { pswCe.errorCode = "ERR_PASSWORD_TOO_SHORT"; throw new ActionException(); } // test for retyped password identical if (!psw.equals(pswCeRT.stringValue())) { pswCe.errorCode = "ERR_PASSWORD_MUST_BE_IDENTICAL"; pswCeRT.setValue(""); throw new ActionException(); } operator.changePassword(psw); } } catch (ActionException e) { invalidClientEntries = true; } try { operator.setPersonalIdentificationAnswer(pageState.getEntry("USER_PIA").stringValue()); } catch (ActionException e) { e.printStackTrace(); } try { operator.setPersonalIdentificationQuestion(pageState.getEntry("USER_PIQ").stringValue()); } catch (ActionException e) { e.printStackTrace(); } if (operator.getAnagraphicalData() != null) { operator.getAnagraphicalData().setEmail(pageState.getEntry(AnagraphicalDataConstants.FLD_EMAIL).stringValueNullIfEmpty()); operator.getAnagraphicalData().setAddress(pageState.getEntry(AnagraphicalDataConstants.FLD_ADDRESS).stringValueNullIfEmpty()); operator.getAnagraphicalData().setCity(pageState.getEntry(AnagraphicalDataConstants.FLD_CITY).stringValueNullIfEmpty()); operator.getAnagraphicalData().setFax(pageState.getEntry(AnagraphicalDataConstants.FLD_FAX).stringValueNullIfEmpty()); operator.getAnagraphicalData().setMobile(pageState.getEntry(AnagraphicalDataConstants.FLD_MOBILE).stringValueNullIfEmpty()); operator.getAnagraphicalData().setState(pageState.getEntry(AnagraphicalDataConstants.FLD_STATE).stringValueNullIfEmpty()); operator.getAnagraphicalData().setTelephone(pageState.getEntry(AnagraphicalDataConstants.FLD_TELEPHONE).stringValueNullIfEmpty()); operator.getAnagraphicalData().setZip(pageState.getEntry(AnagraphicalDataConstants.FLD_ZIP).stringValueNullIfEmpty()); operator.getAnagraphicalData().setCountry(pageState.getEntry(AnagraphicalDataConstants.FLD_COUNTRY).stringValueNullIfEmpty()); } ClientEntry adminCE = pageState.getEntry(OperatorConstants.FLD_ADMINISTRATOR); String admin = adminCE.stringValueNullIfEmpty(); if (admin != null) operator.setAdministrator(adminCE.checkFieldValue()); ClientEntry enabCE = pageState.getEntry(OperatorConstants.FLD_IS_ENABLED); String enab = enabCE.stringValueNullIfEmpty(); if (enab != null) operator.setEnabled(enabCE.checkFieldValue()); if (invalidClientEntries) throw new ActionException(); //notice: operator must be stored before adding persistent relation objects if (operator.getAnagraphicalData() != null) operator.getAnagraphicalData().store(); operator.store(); { //remove unsel operator roles Set<String> selIds = Selector.chosen("roles", pageState).keySet(); Iterator<OperatorRole> i = operator.getOperatorRolesIterator(); while (i.hasNext()) { OperatorRole or = i.next(); if (!selIds.contains(or.getRole().getId().toString())) operator.removeRoleAndPersist(or); } for (String roleId : selIds) { Role ro = (Role) PersistenceHome.findByPrimaryKey(Role.class, roleId); operator.addRoleAndPersist(ro); } } { //remove unsel operator groups Set<String> selGrpIds = Selector.chosen("direct_groups", pageState).keySet(); Iterator<OperatorGroup> i = operator.getOperatorGroupsIterator(); while (i.hasNext()) { OperatorGroup or = i.next(); if (!selGrpIds.contains(or.getGroup().getId().toString())) operator.removeGroupAndPersist(or); } for (String grpId : selGrpIds) { Group gp = (Group) PersistenceHome.findByPrimaryKey(Group.class, grpId); operator.addGroupAndPersist(gp); } } } public void make(Operator user, PageState pageState) throws PersistenceException { boolean isNew = PersistenceHome.NEW_EMPTY_ID.equals(user.getId()); ClientEntries ces = new ClientEntries(); ces.addEntry(new ClientEntry(OperatorConstants.FLD_NAME, user.getName())); ces.addEntry(new ClientEntry(OperatorConstants.FLD_SURNAME, user.getSurname())); pageState.addClientEntry(OperatorConstants.FLD_IS_ENABLED,user.isEnabled()); ces.addEntry(new ClientEntry("LOGIN_NAME", user.getLoginName())); ces.addEntry(new ClientEntry("FLD_ID", user.getId() + "")); ces.addEntry(new ClientEntry("USER_PIA", user.getPersonalIdentificationAnswer())); ces.addEntry(new ClientEntry("USER_PIQ", user.getPersonalIdentificationQuestion())); if (!isNew) { ces.addEntry(new ClientEntry("PWD", OperatorConstants.PASSWORD_MASK)); ces.addEntry(new ClientEntry("PWD_RETYPE", OperatorConstants.PASSWORD_MASK)); if (user.getLocation() != null) ces.addEntry(new ClientEntry("LOCATION", user.getLocation().getId() + "")); } if (user.getAnagraphicalData() == null) user.setAnagraphicalData(new AnagraphicalData()); ces.addEntry(new ClientEntry(AnagraphicalDataConstants.FLD_EMAIL, user.getAnagraphicalData().getEmail())); ces.addEntry(new ClientEntry(AnagraphicalDataConstants.FLD_TELEPHONE, user.getAnagraphicalData().getTelephone())); ces.addEntry(new ClientEntry(AnagraphicalDataConstants.FLD_FAX, user.getAnagraphicalData().getFax())); ces.addEntry(new ClientEntry(AnagraphicalDataConstants.FLD_ADDRESS, user.getAnagraphicalData().getAddress())); ces.addEntry(new ClientEntry(AnagraphicalDataConstants.FLD_CITY, user.getAnagraphicalData().getCity())); ces.addEntry(new ClientEntry(AnagraphicalDataConstants.FLD_COUNTRY, user.getAnagraphicalData().getCountry())); ces.addEntry(new ClientEntry(AnagraphicalDataConstants.FLD_MOBILE, user.getAnagraphicalData().getMobile())); ces.addEntry(new ClientEntry(AnagraphicalDataConstants.FLD_STATE, user.getAnagraphicalData().getState())); ces.addEntry(new ClientEntry(AnagraphicalDataConstants.FLD_ZIP, user.getAnagraphicalData().getZip())); pageState.addClientEntry(OperatorConstants.FLD_ADMINISTRATOR,user.isAdministrator()); pageState.addClientEntries(ces); //direct roles Iterator<OperatorRole> chosen = user.getOperatorRolesIterator(); TreeMap<String, String> ctm = new TreeMap<String, String>(); while (chosen.hasNext()) { Role role = chosen.next().getRole(); ctm.put(role.getId().toString(), role.getName()); } OqlQuery oqlQuery = new OqlQuery("from " + Role.class.getName() +" rl order by rl.description "); // + " as rol where rol.class = :rc"); //oqlQuery.getQuery().setParameter("rc", Role.class); List<Role> cand = (List<Role>) oqlQuery.list(); TreeMap<String, String> candTm = new TreeMap<String, String>(); if (cand != null && cand.size() > 0) { for (Role role : cand) { if (chosen == null || !ctm.keySet().contains(role.getId().toString())) { candTm.put(role.getId().toString(), role.getName()); } } } Selector.make("roles", candTm, ctm, pageState); //direct groups Iterator<OperatorGroup> chosenGrp = user.getOperatorGroupsIterator(); TreeMap<String, String> ctmGrp = new TreeMap<String, String>(); while (chosenGrp.hasNext()) { OperatorGroup opgroup = chosenGrp.next(); ctmGrp.put(opgroup.getGroup().getId().toString(), opgroup.getGroup().getName()); } List<Group> candGrp = (List<Group>) new OqlQuery("from " + Group.class.getName()+" gp order by gp.description ").list(); TreeMap<String, String> candTmGrp = new TreeMap<String, String>(); if (candGrp != null && candGrp.size() > 0) { for (Group group : candGrp) { if (candGrp == null || !ctmGrp.keySet().contains(group.getId().toString())) candTmGrp.put(group.getId().toString(), group.getName()); } } Selector.make("direct_groups", candTmGrp, ctmGrp, pageState); } public void cmdVerifyAccount(PageState pageState) throws ActionException, PersistenceException, ApplicationException { boolean accountIsOk = false; try { ClientEntry ceFullName = pageState.getEntry(OperatorConstants.FLD_SURNAME); OqlQuery oq = new OqlQuery("from " + Operator.class.getName() + " user where user.surname = :surname"); oq.getQuery().setString("surname", ceFullName.stringValue()); List usr = oq.list(); if (usr != null && usr.size() > 0) { accountIsOk = true; pageState.setMainObjectId(((Operator) usr.get(0)).getId()); } } catch (ActionException e) { e.printStackTrace(); } if (!accountIsOk) { try { ClientEntry ceLoginName = pageState.getEntry(OperatorConstants.FLD_LOGIN_NAME); OqlQuery oq = new OqlQuery("from " + Operator.class.getName() + " user where user.loginName = :ln"); oq.getQuery().setString("ln", ceLoginName.stringValue()); List usr = oq.list(); if (usr != null && usr.size() > 0) { accountIsOk = true; pageState.setMainObjectId(((Operator) usr.get(0)).getId()); } } catch (ActionException e) { e.printStackTrace(); } } if (!accountIsOk) throw new ActionException(); Operator user = (Operator) PersistenceHome.findByPrimaryKey(Operator.class, pageState.getMainObjectId()); //gen new psw //String newPsw = generatePassword(Math.max(6,Integer.parseInt(ApplicationStateImpl.getApplicationSetting(SystemConstants.FLD_PASSWORD_MIN_LEN)))); //user.changePassword(newPsw); user.store(); //send mail if (user.getAnagraphicalData().getEmail() != null && user.getAnagraphicalData().getEmail().trim().length() > 0) MailHelper.sendPwdMail(user, user.getLoginName(), pageState); } }