package org.exoplatform.forum.service;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import org.exoplatform.commons.utils.ISO8601;
public class ForumEventQuery {
long userPermission = 0;
List<String> listOfUser = null;
private String type;
private String keyValue;
private String valueIn;
private String topicType;
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 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 getTopicType() {
return topicType;
}
public void setTopicType(String topicType) {
this.topicType = topicType;
}
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 getIsEmpty() {
return this.isEmpty;
}
public String getPathQuery(List<String> listIds) {
isAnd = false;
isEmpty = true;
StringBuffer queryString = new StringBuffer();
if (path != null && path.length() > 0)
queryString.append("/jcr:root").append(path).append("//element(*,exo:").append(type).append(")");
else
queryString.append("//element(*,exo:").append(type).append(")");
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("[");
if (keyValue != null && keyValue.length() > 0) {
if (valueIn.equals("title")) {
stringBuffer.append("(jcr:contains(@exo:name, '").append(keyValue).append("'))");
} else {
stringBuffer.append("(jcr:contains(., '").append(keyValue).append("'))");
}
isAnd = true;
}
if (byUser != null && byUser.length() > 0) {
String temp = setArrays(byUser, "owner");
if (temp != null && temp.length() > 0) {
stringBuffer.append(temp);
}
}
if (type.equals("topic")) {
if (topicType != null && topicType.length() > 0 && !topicType.equals("all")) {
if (isAnd)
stringBuffer.append(" and ");
stringBuffer.append("(@exo:topicType='").append(topicType).append("')");
isAnd = true;
}
}
if (isAnd)
isEmpty = false;
if (isClosed != null && isClosed.length() > 0) {
if (userPermission == 1) {
if (type.equals("forum")) {
if (isAnd)
stringBuffer.append(" and ");
if (isClosed.equals("all")) {
stringBuffer.append("(@exo:isClosed='false'");
for (String str : listOfUser) {
stringBuffer.append(" or @exo:moderators='").append(str).append("'");
}
stringBuffer.append(")");
} else if (isClosed.equals("false")) {
stringBuffer.append("(@exo:isClosed='").append(isClosed).append("')");
isEmpty = false;
} else if (isClosed.equals("true")) {
stringBuffer.append("(@exo:isClosed='").append(isClosed).append("' and (@exo:moderators='").append(listOfUser.get(0)).append("'");
for (String str : listOfUser) {
stringBuffer.append(" or @exo:moderators='").append(str).append("'");
}
stringBuffer.append("))");
isEmpty = false;
}
isAnd = true;
} else {
if (!isClosed.equals("all")) {
if (isAnd)
stringBuffer.append(" and ");
stringBuffer.append("(@exo:isClosed='").append(isClosed).append("')");
isAnd = true;
isEmpty = false;
}
}
} else {
if (!isClosed.equals("all")) {
if (isAnd)
stringBuffer.append(" and ");
stringBuffer.append("(@exo:isClosed='").append(isClosed).append("')");
isAnd = true;
isEmpty = false;
}
}
}
if (isLock != null && isLock.length() > 0) {
if (!isLock.equals("all")) {
if (isAnd)
stringBuffer.append(" and ");
stringBuffer.append("(@exo:isLock='").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) {
String temp = setArrays(moderator, "moderators");
if (temp != null && temp.length() > 0) {
stringBuffer.append(temp);
isEmpty = false;
}
}
String temp = setValueMin(topicCountMin, "topicCount");
if (temp != null && temp.length() > 0) {
stringBuffer.append(temp);
}
temp = setValueMin(postCountMin, "postCount");
if (temp != null && temp.length() > 0) {
stringBuffer.append(temp);
}
temp = setValueMin(viewCountMin, "viewCount");
if (temp != null && temp.length() > 0) {
stringBuffer.append(temp);
}
temp = setDateFromTo(fromDateCreated, toDateCreated, "createdDate");
if (temp != null && temp.length() > 0) {
stringBuffer.append(temp);
}
temp = setDateFromTo(fromDateCreatedLastPost, toDateCreatedLastPost, "lastPostDate");
if (temp != null && temp.length() > 0) {
stringBuffer.append(temp);
}
// add to search for user and moderator:
if (type.equals("topic") && userPermission > 1) {
if (isAnd)
stringBuffer.append(" and ");
stringBuffer.append("(@exo:isApproved='true' and @exo:isActive='true' and @exo:isWaiting='false' and @exo:isActiveByForum='true')");
List<String> tempL = new ArrayList<String>();
tempL.addAll(listOfUser);
tempL.add(" ");
String s = Utils.propertyMatchAny("@exo:canView", tempL);
if (s != null && s.length() > 0) {
if (isAnd)
stringBuffer.append(" and ");
stringBuffer.append(s);
}
} else if (type.equals("post")) {
if (isAnd)
stringBuffer.append(" and ");
stringBuffer.append("(@exo:userPrivate='exoUserPri'");
for (String currentUser : listOfUser) {
stringBuffer.append(" or @exo:userPrivate='").append(currentUser).append("'");
}
stringBuffer.append(") and (@exo:isFirstPost='false')");
if (userPermission > 1) {
stringBuffer.append(" and (@exo:isApproved='true' and @exo:isActiveByTopic='true' and @exo:isHidden='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(";", ",");
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("(@exo:").append(property).append("='").append(string).append("')");
++i;
}
}
} else if (values.trim().length() > 0) {
builder.append("@exo:").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("(@exo:").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("((@exo:").append(property).append(" >= xs:dateTime('").append(ISO8601.format(fromDate)).append("')) and ");
queryString.append("(@exo:").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("(@exo:").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("(@exo:").append(property).append(" <= xs:dateTime('").append(ISO8601.format(toDate)).append("'))");
isAnd = true;
isEmpty = false;
}
return queryString.toString();
}
}