package com.QA; import com.QA.messages.StickyNote; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.jblooming.ApplicationException; import org.jblooming.messaging.MailHelper; import org.jblooming.ontology.SerializedList; import org.jblooming.operator.Operator; import org.jblooming.oql.OqlQuery; import org.jblooming.persistence.PersistenceHome; import org.jblooming.persistence.exceptions.FindByPrimaryKeyException; import org.jblooming.persistence.exceptions.FindException; import org.jblooming.persistence.exceptions.StoreException; import org.jblooming.system.SystemConstants; import org.jblooming.utilities.JSP; import org.jblooming.utilities.StringUtilities; import org.jblooming.waf.constants.Fields; import org.jblooming.waf.settings.ApplicationState; import org.jblooming.waf.settings.I18n; import org.jblooming.waf.view.PageSeed; import org.jblooming.waf.view.PageState; import javax.persistence.Transient; import java.io.Serializable; import java.security.NoSuchAlgorithmException; import java.util.*; // mapped on file meltAPlot.hbm.xml public class QAOperator extends Operator { private String email; private String unverifiedEmail; private String website; private String phone; private String mobile; private String address; private String aboutMe; private Date expiryDate; private double karma; private SerializedList<String> badges = new SerializedList(); private Set<Upvote> votes = new HashSet(); // inverse private Set<Question> questions = new HashSet(); // inverse private Set<Answer> answers = new HashSet(); // inverse private JSONObject calderon = new JSONObject(); public double getKarma() { return karma; } public void setKarma(double karma) { this.karma = karma; } public SerializedList<String> getBadges() { return badges; } public void setBadges(SerializedList<String> badges) { this.badges = badges; } public Date getExpiryDate() { return expiryDate; } public void setExpiryDate(Date expiryDate) { this.expiryDate = expiryDate; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Transient public void setConfirmedEmail(String email) { setEmail(email); getOptions().put("SEND_NOTIF_BY_EMAIL", Fields.TRUE); } public String getWebsite() { return website; } public void setWebsite(String website) { this.website = website; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getAboutMe() { return aboutMe; } public void setAboutMe(String aboutMe) { this.aboutMe = aboutMe; } public String getUnverifiedEmail() { return unverifiedEmail; } public void setUnverifiedEmail(String unverifiedEmail) { this.unverifiedEmail = unverifiedEmail; } public boolean upvotesContain(Answer answer) { Set<Upvote> votes = this.getVotes(); for (Upvote u : votes) { if (u.getAnswer().getId().equals(answer.getId())) return true; } return false; } public JSONObject getCalderon() { return calderon; } public void setCalderon(JSONObject calderon) { this.calderon = calderon; } public Set<Upvote> getVotes() { return votes; } private void setVotes(Set<Upvote> ups) { this.votes = ups; } private Set<Question> getQuestions() { return questions; } @Transient public List<Question> getQuestionsNotDeleted(int maxResults) { String hql = "from " + Question.class.getName() + " as qst where qst.owner=:op and qst.deleted = false order by qst.lastModified desc"; org.hibernate.Query query = new OqlQuery(hql).getQuery(); query.setEntity("op", this); query.setMaxResults(maxResults); return query.list(); } @Transient public int getQuestionsNotDeletedSize() { String hql = "select count(qst.id) from " + Question.class.getName() + " as qst where qst.owner=:op and qst.deleted = false"; org.hibernate.Query query = new OqlQuery(hql).getQuery(); query.setEntity("op", this); return ((Long)query.uniqueResult()).intValue(); } @Transient public List<Question> getQuestionsByRelevance(int maxResults) { String hql= "select q from "+ Question.class.getName()+" as q where q.deleted=false and q.owner=:own"; hql += " order by q.totUpvotesFromQandA desc, q.lastModified desc"; org.hibernate.Query query = new OqlQuery(hql).getQuery(); query.setEntity("own",this); query.setMaxResults(maxResults); return query.list(); } public void setQuestions(Set<Question> manifests) { this.questions = manifests; } private Set<Answer> getAnswers() { return answers; } @Transient public List<Answer> getAnswersNotDeleted() { String hql = "from " + Answer.class.getName() + " as ans where ans.owner=:op and ans.deleted = false"; OqlQuery oql = new OqlQuery(hql); oql.getQuery().setEntity("op", this); return oql.getQuery().list(); } @Transient public List<Answer> getAnswersByRelevance(int maxResults) { String hql= "select answ from "+ Answer.class.getName()+" as answ where answ.deleted=false and answ.question.deleted=false and answ.owner=:mop order by answ.totUpvotesAndAcceptance desc, answ.lastModified desc"; org.hibernate.Query query = new OqlQuery(hql).getQuery(); query.setEntity("mop",this); query.setMaxResults(maxResults); return query.list(); } @Transient public List<Answer> getAnswersByDate(int maxResults) { String hql= "select answ from "+ Answer.class.getName()+" as answ where answ.deleted=false and answ.question.deleted=false and answ.owner=:mop order by answ.creationDate desc, answ.lastModified desc"; org.hibernate.Query query = new OqlQuery(hql).getQuery(); query.setEntity("mop",this); query.setMaxResults(maxResults); return query.list(); } public void setAnswers(Set<Answer> answers) { this.answers = answers; } public String getDisplayName() { return getFullname(); } public String getFullname() { if (JSP.ex(getName())) return JSP.w(getName()); return getLoginName(); } public JSONObject jsonify() { JSONObject jsResponse = new JSONObject(); jsResponse.element("id", getId()); jsResponse.element("userName", getDisplayName()); jsResponse.element("loginName", getLoginName()); jsResponse.element("gravatar", getGravatarUrl(80)); jsResponse.element("publicUrl", getPublicProfileURL()); jsResponse.element("email", getEmail()); String SKYPE_NAME = getOption("SKYPE_NAME"); if (JSP.ex(SKYPE_NAME)) jsResponse.element("skype", SKYPE_NAME); return jsResponse; } @Transient public List<Answer> getAcceptedAnswers() throws FindException { String hql = "from " + Answer.class.getName() + " as ans where ans.accepted=true and ans.owner=:op and ans.deleted = false order by ans.lastModified desc"; OqlQuery oql = new OqlQuery(hql); oql.getQuery().setEntity("op", this); return oql.list(); } @Transient public int getTimeZoneOffset(PageState pageState) { int ret = 0; try { ret = Integer.parseInt(pageState.sessionState.getAttribute("TIME_OFFSET_CLIENT") + ""); } catch (Throwable t) { } return ret; } public TimeZone getTimeZone(PageState pageState) { return new SimpleTimeZone(getTimeZoneOffset(pageState), "LICTZ"); } @Transient public static QAOperator load(Serializable id) throws FindByPrimaryKeyException { return (QAOperator) PersistenceHome.findByPrimaryKey(QAOperator.class, id); } public static QAOperator loadByLoginName(String loginName) throws FindByPrimaryKeyException { return (QAOperator) PersistenceHome.findUniqueNullIfEmpty(QAOperator.class, "loginName", loginName); } // SPAZZATURA ---------------------------------------------------------------------------------------------------------------------------- @Transient public String getAPIKey() throws NoSuchAlgorithmException { return getId() + "x" + StringUtilities.md5Encode(getId() + "fdwqaddagy65'#[3cfsd]"); } public static QAOperator loadByEmail(String email) throws FindByPrimaryKeyException { return (QAOperator) PersistenceHome.findUniqueNullIfEmpty(QAOperator.class, "email", email); } public static QAOperator loadByFullname(String fullname) throws FindByPrimaryKeyException { return (QAOperator) PersistenceHome.findUniqueNullIfEmpty(QAOperator.class, "name", fullname); } @Transient public static QAOperator findByToken(String serviceToken) { return (QAOperator) PersistenceHome.findUniqueNullIfEmpty(QAOperator.class, "website", serviceToken); } @Transient public String getDefaultEmail() { return getEmail(); } @Transient public void changePassword(String password) throws ApplicationException { try { setLastPasswordChangeDate(new Date()); String prefixedPassword = computePassword(password); this.setPassword(prefixedPassword); getLastPasswordList().add(prefixedPassword); } catch (NoSuchAlgorithmException e) { throw new ApplicationException(e); } } @Transient public String getGravatarUrl(int size) { //first check on calderon String pictureUrl; if (getCalderon() != null && getCalderon().get("gravatarUrl") != null) pictureUrl = getCalderon().getString("gravatarUrl"); else { pictureUrl = JSP.ex(getEmail()) ? getEmail() : (JSP.ex(getUnverifiedEmail()) ? getUnverifiedEmail() : getLoginName() + "@"+ApplicationState.getApplicationSetting(SystemConstants.PUBLIC_SERVER_NAME)); pictureUrl = "http://www.gravatar.com/avatar/" + StringUtilities.md5Encode(pictureUrl, "") + "?s=" + size + "&d=identicon"; } return pictureUrl; } public void setGravatarUrl(String pictureUrl) { if (getCalderon() == null) setCalderon(new JSONObject()); getCalderon().element("gravatarUrl", pictureUrl); } public String computePassword(String password) throws NoSuchAlgorithmException { return StringUtilities.md5Encode("qw27&5%" + password + " '.y89$=bb"); } public void sendEnrollEmailMesssage(PageState pageState) throws NoSuchAlgorithmException, ApplicationException { if (JSP.ex(getUnverifiedEmail())) { PageSeed ps = new PageSeed(ApplicationState.serverURL + "/applications/QA/site/access/confirm.jsp"); ps.command = "CF"; ps.addClientEntry("UID", getId()); ps.addClientEntry("CK", StringUtilities.md5Encode(getId() + getUnverifiedEmail() + "vivazoe")); String header = I18n.get("QA_CONFIRM_EMAIL_HEADER"); String subject = I18n.get("QA_EMAIL_DO_CONFIRM"); String footer = I18n.get("QA_CONFIRM_EMAIL_FOOTER"); String message = header + "<div style='background-color:#eeeeee; font-size:1.15em; line-height:1.4em; max-width: 570px; margin: 0 auto; padding:20px 40px 40px; border-radius:5px; -webkit-border-radius:5px; -moz-border-radius:5px; color:#555'>" + I18n.get("QA_ENROLL_MAIL" , getDisplayName(), "<a href='"+ps.toLinkToHref()+"'>"+ps.toLinkToHref()+"</a>") + "</div>" + footer; String fromEmail = ApplicationState.getApplicationSetting(SystemConstants.FLD_MAIL_FROM); String from = I18n.g("QA_APP_NAME")+" Support <"+fromEmail+">;"; if (ApplicationState.platformConfiguration.development) from = I18n.g("QA_APP_NAME")+" Support DEV <ppolsinelli@gmail.com>;"; MailHelper.sendHtmlMail(from, getUnverifiedEmail(), subject, message); pageState.addMessageOK("The activation e-mail has been sent correctly. Please check your inbox."); } } public void sendWelcomeEmailMesssage(PageState pageState) throws NoSuchAlgorithmException, ApplicationException { if (JSP.ex(getEmail())) { String header = I18n.get("QA_CONFIRM_EMAIL_HEADER"); String subject = I18n.get("QA_EMAIL_WELCOME"); String footer = I18n.get("QA_CONFIRM_EMAIL_FOOTER"); String message = header + "<div style='background-color:#eeeeee; font-size:1.15em; line-height:1.4em; max-width: 570px; margin: 0 auto; padding:20px 40px 40px; border-radius:5px; -webkit-border-radius:5px; -moz-border-radius:5px; color:#555'>" + I18n.get("QA_EMAIL_WELCOME_BODY" , getDisplayName()) + "</div>" + footer; String fromEmail = ApplicationState.getApplicationSetting(SystemConstants.FLD_MAIL_FROM); String from = I18n.g("QA_APP_NAME")+" Support <"+fromEmail+">;"; if (ApplicationState.platformConfiguration.development) from = I18n.g("QA_APP_NAME")+" Support DEV <ppolsinelli@open-lab.com>;"; MailHelper.sendHtmlMail(from, getEmail(), subject, message); pageState.addMessageOK("The activation e-mail has been sent correctly. Please check your inbox."); } } public void sendNote(String subject, String message) throws StoreException { sendNote(subject, message, null); } public void sendNote(String subject, String message, String type) throws StoreException { StickyNote stik = new StickyNote(); stik.setReceiver(this); stik.setMessage(message); stik.setType(type); stik.store(); if (Fields.TRUE.equals(this.getOption("SEND_NOTIF_BY_EMAIL"))) { PageSeed ps = new PageSeed(ApplicationState.serverURL + "/applications/QA/site/access/confirm.jsp"); ps.command = "UNSCRIBE"; ps.addClientEntry("UID", getId()); ps.addClientEntry("CK", StringUtilities.md5Encode(getId() + getDefaultEmail() + "vivazoe")); message = message + "<br><br><br>"+I18n.get("QA_UNSUBSCRIBE_%%", ps.toLinkToHref()); String fromEmail = ApplicationState.getApplicationSetting(SystemConstants.FLD_MAIL_FROM); String from = I18n.g("QA_APP_NAME")+" Notification <"+fromEmail+">"; if (ApplicationState.platformConfiguration.development) { from = I18n.g("QA_APP_NAME")+" Notification DEV <ppolsinelli@open-lab.com>;"; } MailHelper.sendHtmlMailInSeparateThread(from, getDefaultEmail(), subject, message); } } @Transient public String getPublicProfileURL() { return ApplicationState.serverURL + "/user/" + getLoginName(); } public static List<QAOperator> getModerators() throws FindException { String hql = "select mop from " + QAOperator.class.getName() + " as mop where mop.enabled=true and (mop.administrator=true or mop.calderon like '%moderator%' " + "or mop.karma > " + QAPermission.MODERATOR.reputationRequired + ")"; OqlQuery oql = new OqlQuery(hql); List<QAOperator> os = oql.list(); List<QAOperator> osmod = new ArrayList(); for (QAOperator op : os) if (op.isModerator()) osmod.add(op); return osmod; } @Transient public boolean isModerator() { //return hasPermissionAsAdmin() || getKarma() > MpPermission.MODERATOR.reputationRequired; boolean moderator = getCalderon().get("moderator")!=null && getCalderon().getBoolean("moderator"); return hasPermissionAsAdmin() || moderator || getKarma()> QAPermission.MODERATOR.reputationRequired; } @Transient public int getLevel() { /*1) runner 2) junior writer 3) senior writer 4) script supervisor 5) author*/ if (isModerator()) return 999; int level = 1; if (getKarma() > 3000) { level = 5; } else if (getKarma() > 1000) { level = 4; } else if (getKarma() > 100) { level = 3; } else if (getKarma() > 10) { level = 2; } return level; } @Transient public Long getUnreadMessagesTotal() { String hql = "select count(sn) from " + StickyNote.class.getName() + " as sn where sn.read is null and sn.receiver=:op order by sn.created desc"; OqlQuery oql = new OqlQuery(hql); oql.getQuery().setEntity("op", this); return (Long) oql.uniqueResultNullIfEmpty(); } @Transient public JSONArray getMySubscribersIds() { JSONArray subsA = new JSONArray(); Object subs = getCalderon().get("subscribed"); if (subs!=null) { subsA = getCalderon().getJSONArray("subscribed"); } return subsA; } @Transient public JSONArray getIAmSubscribedToIds() { JSONArray subsA = new JSONArray(); Object subs = getCalderon().get("subscribingTo"); if (subs!=null) { subsA = getCalderon().getJSONArray("subscribingTo"); } return subsA; } @Transient public boolean isMySubscriber(QAOperator mop) { JSONArray subsA = getMySubscribersIds(); boolean ret = false; for (int i = 0; i < subsA.size(); i++) { String id = subsA.get(i)+""; if ((mop.getId()+"").equals(id)) { ret = true; break; } } return ret; } @Transient public static List<QAOperator> getTopOperators(int maxResults) throws FindException { String hql = "select mop from " + QAOperator.class.getName() + " as mop where mop.enabled=true order by mop.karma desc"; OqlQuery oql = new OqlQuery(hql); oql.getQuery().setMaxResults(maxResults); return (List<QAOperator>)oql.list(); } // @Transient // public List<Question> getContributions() throws FindException { // List<Question> list = new ArrayList<Question>(); // List<Question> manifestoList = getOwnedManifests(); // list.addAll(manifestoList); /*OqlQuery oqlQuery = new OqlQuery("select distinct prop.manifesto from " + Answer.class.getName() + " as prop where prop.owner=:own " + (list.size() > 0 ? " and prop.manifesto not in (:createdMans)" : "") + " and prop.manifesto.deleted=false order by prop.manifesto.finalMeeting desc"); oqlQuery.getQuery().setEntity("own", this); if (list.size() > 0) oqlQuery.getQuery().setParameterList("createdMans", manifestoList); List<Question> listProp = oqlQuery.list(); list.addAll(listProp); //comments oqlQuery = new OqlQuery("select distinct comm.proposal.manifesto from " + Comment.class.getName() + " as comm where comm.owner=:own " + (list.size() > 0 ? " and comm.proposal.manifesto not in (:createdMans)" : "") + " and comm.proposal.manifesto.deleted=false order by comm.proposal.manifesto.finalMeeting desc"); oqlQuery.getQuery().setEntity("own", this); if (list.size() > 0) oqlQuery.getQuery().setParameterList("createdMans", list); List<Question> listComm = oqlQuery.list(); list.addAll(listComm); //votes? oqlQuery = new OqlQuery("select distinct upv.proposal.manifesto from " + Upvote.class.getName() + " as upv where upv.operator=:own " + (list.size() > 0 ? " and upv.proposal.manifesto not in (:createdMans)" : "") + " and upv.proposal.manifesto.deleted=false order by upv.proposal.manifesto.finalMeeting desc"); oqlQuery.getQuery().setEntity("own", this); if (list.size() > 0) oqlQuery.getQuery().setParameterList("createdMans", list); List<Question> listVotes = oqlQuery.list(); list.addAll(listVotes); */ // return list; // } }