package org.exoplatform.forum.service; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import org.exoplatform.commons.utils.ISO8601; import org.exoplatform.forum.common.jcr.JCRQueryUtils; public class ForumEventQuery implements ForumNodeTypes { public static final String VALUE_IN_ENTIRE = "entire"; public static final String VALUE_IN_TITLE = "title"; long userPermission = 0; List<String> listOfUser = null; private String type; private String keyValue; private String valueIn; private String path; private String byUser; private String isLock; private String isClosed; private String topicCountMin = "0"; private String postCountMin = "0"; private String viewCountMin = "0"; private String moderator; private String remain; private Calendar fromDateCreated; private Calendar toDateCreated; private Calendar fromDateCreatedLastPost; private Calendar toDateCreatedLastPost; private boolean isStartWith = false; private boolean isAnd = false; private boolean isEmpty = true; public void setListOfUser(List<String> listOfUser) { this.listOfUser = new ArrayList<String>(); this.listOfUser.addAll(listOfUser); } public List<String> getListOfUser() { return listOfUser; } public long getUserPermission() { return userPermission; } public void setUserPermission(long userPermission) { this.userPermission = userPermission; } public ForumEventQuery() { } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getKeyValue() { return keyValue; } public void setKeyValue(String keyValue) { this.keyValue = keyValue; } public String getValueIn() { return valueIn; } public void setValueIn(String valueIn) { this.valueIn = valueIn; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public String getByUser() { return byUser; } public void setByUser(String byUser) { this.byUser = byUser; } public String getIsLock() { return isLock; } public void setIsLock(String isLock) { this.isLock = isLock; } public String getIsClose() { return isClosed; } public void setIsClose(String isClosed) { this.isClosed = isClosed; } public String getTopicCountMin() { return topicCountMin; } public void setTopicCountMin(String topicCountMin) { this.topicCountMin = topicCountMin; } public String getPostCountMin() { return postCountMin; } public void setPostCountMin(String postCountMin) { this.postCountMin = postCountMin; } public String getViewCountMin() { return viewCountMin; } public void setViewCountMin(String viewCountMin) { this.viewCountMin = viewCountMin; } public String getModerator() { return moderator; } public void setModerator(String moderator) { this.moderator = moderator; } public String getRemain() { return remain; } public void setRemain(String remain) { this.remain = remain; } public Calendar getFromDateCreated() { return fromDateCreated; } public void setFromDateCreated(Calendar fromDateCreated) { this.fromDateCreated = fromDateCreated; } public Calendar getToDateCreated() { return toDateCreated; } public void setToDateCreated(Calendar toDateCreated) { this.toDateCreated = toDateCreated; } public Calendar getFromDateCreatedLastPost() { return fromDateCreatedLastPost; } public void setFromDateCreatedLastPost(Calendar fromDateCreatedLastPost) { this.fromDateCreatedLastPost = fromDateCreatedLastPost; } public Calendar getToDateCreatedLastPost() { return toDateCreatedLastPost; } public void setToDateCreatedLastPost(Calendar toDateCreatedLastPost) { this.toDateCreatedLastPost = toDateCreatedLastPost; } public boolean isStartWith() { return isStartWith; } public void setStartWith(boolean isStartWith) { this.isStartWith = isStartWith; } public boolean getIsEmpty() { return this.isEmpty; } public String getPathQuery(List<String> listIds) { isAnd = false; isEmpty = true; String nodeType = (Utils.CATEGORY.equals(type)) ? EXO_FORUM_CATEGORY : (Utils.FORUM.equals(type)) ? EXO_FORUM : (Utils.TOPIC.equals(type)) ? EXO_TOPIC : EXO_POST; StringBuffer queryString = new StringBuffer(); if (path != null && path.length() > 0) queryString.append(JCR_ROOT).append(path).append("//element(*,").append(nodeType).append(")"); else queryString.append("//element(*,").append(nodeType).append(")"); StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("["); if (keyValue != null && keyValue.length() > 0) { String xpath = "jcr:contains"; if(isStartWith) { //jcr:like(@jcr:title, 'P%')"; xpath = "jcr:like"; keyValue += "%"; } if (VALUE_IN_TITLE.equals(valueIn)) { stringBuffer.append("(").append(xpath).append("(@").append(EXO_NAME).append(", '").append(keyValue).append("'))"); } else { stringBuffer.append("(").append(xpath).append("(., '").append(keyValue).append("'))"); } isAnd = true; } if (byUser != null && byUser.length() > 0) { String temp = setArrays(byUser, EXO_OWNER); if (temp != null && temp.length() > 0) { stringBuffer.append(temp); } } if (isAnd){ isEmpty = false; } if(type.equals(Utils.FORUM) || type.equals(Utils.TOPIC)) { if (isClosed != null && isClosed.length() > 0) { if (userPermission == 1) { if (type.equals(Utils.FORUM)) { if (isAnd) stringBuffer.append(" and "); if (isClosed.equals("all")) { stringBuffer.append("(@").append(EXO_IS_CLOSED).append("='false' or (") .append(Utils.buildXpathByUserInfo(EXO_MODERATORS, listOfUser)) .append("))"); } else if (isClosed.equals("false")) { stringBuffer.append("(@").append(EXO_IS_CLOSED).append("='").append(isClosed).append("')"); isEmpty = false; } else if (isClosed.equals("true")) { stringBuffer.append("(@").append(EXO_IS_CLOSED).append("='").append(isClosed).append("' and (") .append(Utils.buildXpathByUserInfo(EXO_MODERATORS, listOfUser)); stringBuffer.append("))"); isEmpty = false; } isAnd = true; } else { if (!isClosed.equals("all")) { if (isAnd) stringBuffer.append(" and "); stringBuffer.append("(@").append(EXO_IS_CLOSED).append("='").append(isClosed).append("')"); isAnd = true; isEmpty = false; } } } else { if (!isClosed.equals("all")) { if (isAnd) stringBuffer.append(" and "); stringBuffer.append("(@").append(EXO_IS_CLOSED).append("='").append(isClosed).append("')"); isAnd = true; isEmpty = false; } } } if (isLock != null && isLock.length() > 0) { if (!isLock.equals("all")) { if (isAnd) stringBuffer.append(" and "); stringBuffer.append("(@").append(EXO_IS_LOCK).append("='").append(isLock).append("')"); isAnd = true; isEmpty = false; } } } if (remain != null && remain.length() > 0) { if (isAnd) stringBuffer.append(" and "); stringBuffer.append("(").append(remain).append(")"); isAnd = true; } if (moderator != null && moderator.length() > 0 && (Utils.FORUM.equals(type) || Utils.CATEGORY.equals(type))) { String temp = setArrays(moderator, EXO_MODERATORS); if (temp != null && temp.length() > 0) { stringBuffer.append(temp); isEmpty = false; } } String temp; if(Utils.FORUM.equals(type) || Utils.TOPIC.equals(type)) { temp = setValueMin(topicCountMin, EXO_TOPIC_COUNT); if (temp != null && temp.length() > 0) { stringBuffer.append(temp); } temp = setValueMin(postCountMin, EXO_POST_COUNT); if (temp != null && temp.length() > 0) { stringBuffer.append(temp); } if(Utils.TOPIC.equals(type)) { temp = setValueMin(viewCountMin, EXO_VIEW_COUNT); if (temp != null && temp.length() > 0) { stringBuffer.append(temp); } temp = setDateFromTo(fromDateCreatedLastPost, toDateCreatedLastPost, EXO_LAST_POST_DATE); if (temp != null && temp.length() > 0) { stringBuffer.append(temp); } } } temp = setDateFromTo(fromDateCreated, toDateCreated, EXO_CREATED_DATE); if (temp != null && temp.length() > 0) { stringBuffer.append(temp); } // add to search for user and moderator: if (type.equals(Utils.TOPIC) && userPermission > 1) { if (isAnd) { stringBuffer.append(" and "); } stringBuffer.append("(@").append(EXO_IS_APPROVED).append("='true' and @").append(EXO_IS_ACTIVE).append("='true' and @") .append(EXO_IS_WAITING).append("='false' and @").append(EXO_IS_ACTIVE_BY_FORUM).append("='true')"); String str = Utils.buildXpathByUserInfo(EXO_CAN_VIEW, listOfUser); if(!Utils.isEmpty(str)) { if (isAnd) { stringBuffer.append(" and "); } stringBuffer.append("(").append(Utils.buildXpathHasProperty(EXO_CAN_VIEW)).append(" or ") .append(str).append(" or @").append(EXO_OWNER).append("='").append(listOfUser.get(0)).append("'").append(")"); } } if (type.equals(Utils.POST)) { if (isAnd) stringBuffer.append(" and "); stringBuffer.append("(@").append(EXO_USER_PRIVATE).append("='").append(EXO_USER_PRI).append("'"); for (String currentUser : listOfUser) { stringBuffer.append(" or @").append(EXO_USER_PRIVATE).append("='").append(currentUser).append("'"); } stringBuffer.append(") and (@").append(EXO_IS_FIRST_POST).append("='false')"); if (userPermission > 1) { stringBuffer.append(" and (@").append(EXO_IS_APPROVED).append("='true' and @").append(EXO_IS_ACTIVE_BY_TOPIC) .append("='true' and @").append(EXO_IS_HIDDEN).append("='false')"); } } if (listIds != null && listIds.size() > 0) { stringBuffer.append(" and ("); int size = listIds.size(); String searchBy = null; if (type.equals(Utils.CATEGORY) || type.equals(Utils.FORUM)) searchBy = "fn:name()"; else searchBy = "@" + EXO_PATH; for (int i = 0; i < size; i++) { if (i > 0) stringBuffer.append(" or "); stringBuffer.append(searchBy).append("='").append(listIds.get(i)).append("'"); } stringBuffer.append(")"); } stringBuffer.append("]"); if (isAnd) queryString.append(stringBuffer.toString()); return queryString.toString(); } private String setArrays(String values, String property) { StringBuffer stringBuffer = new StringBuffer(); StringBuilder builder = new StringBuilder(); values = values.replaceAll(";", ","); values = JCRQueryUtils.escapeSimpleQuoteCharacter(values); if (values.indexOf(",") > 0) { String[] vls = values.split(","); int i = 0; for (String string : vls) { string = string.trim(); if (string.length() > 0) { if (i > 0) builder.append(" or "); builder.append("(@").append(property).append("='").append(string).append("')"); ++i; } } } else if (values.trim().length() > 0) { builder.append("@").append(property).append("='").append(values).append("'"); } if (builder.length() > 0) { if (isAnd) stringBuffer.append(" and "); stringBuffer.append("(").append(builder).append(")"); isAnd = true; } return stringBuffer.toString(); } private String setValueMin(String min, String property) { StringBuffer queryString = new StringBuffer(); if (Integer.parseInt(min) > 0) { if (isAnd) queryString.append(" and "); queryString.append("(@").append(property).append(">=").append(min).append(")"); isAnd = true; isEmpty = false; } return queryString.toString(); } private String setDateFromTo(Calendar fromDate, Calendar toDate, String property) { StringBuffer queryString = new StringBuffer(); if (fromDate != null && toDate != null) { if (isAnd) queryString.append(" and "); queryString.append("((@").append(property).append(" >= xs:dateTime('").append(ISO8601.format(fromDate)).append("')) and "); queryString.append("(@").append(property).append(" <= xs:dateTime('").append(ISO8601.format(toDate)).append("'))) "); isAnd = true; isEmpty = false; } else if (fromDate != null) { if (isAnd) queryString.append(" and "); queryString.append("(@").append(property).append(" >= xs:dateTime('").append(ISO8601.format(fromDate)).append("'))"); isAnd = true; isEmpty = false; } else if (toDate != null) { if (isAnd) queryString.append(" and "); queryString.append("(@").append(property).append(" <= xs:dateTime('").append(ISO8601.format(toDate)).append("'))"); isAnd = true; isEmpty = false; } return queryString.toString(); } }