/***************************************************************************
* Copyright (C) 2003-2008 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
***************************************************************************/
package org.exoplatform.forum.service;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.jcr.Value;
import org.exoplatform.services.organization.User;
/**
* Created by The eXo Platform SAS
* Author : Vu Duy Tu
* tu.duy@exoplatform.com
* Jun 2, 2008 - 3:33:33 AM
*/
public class Utils {
public final static String TYPE_CATEGORY = "exo:forumCategory".intern();
public final static String TYPE_FORUM = "exo:forum".intern();
public final static String TYPE_TOPIC = "exo:topic".intern();
public final static String USER_PROFILES_TYPE = "exo:forumUserProfile".intern();
public final static String FORUM_SERVICE = "ForumService".intern();
public final static String USER_PROFILES = "UserProfile".intern();
public final static String FORUM_SUBSCRIOTION = "forumSubscription".intern();
public final static String NT_UNSTRUCTURED = "nt:unstructured".intern();
public final static String FORUMADMINISTRATION = "forumAdministration".intern();
public static final String USER_PROFILE_DELETED = "userProfileDeleted".intern();
public final static String CATEGORY = "forumCategory".intern();
public final static String FORUM = "forum".intern();
public final static String TOPIC = "topic".intern();
public final static String POST = "post".intern();
public final static String POLL = "poll".intern();
public final static String TAG = "tag".intern();
public final static String TOPICTYPE = "topicType".intern();
public final static String PRUNESETTING = "pruneSetting".intern();
public final static String RECEIVE_MESSAGE = "receive".intern();
public final static String SEND_MESSAGE = "send".intern();
public static final String ADMIN = "Administrator".intern();
public static final String MODERATOR = "Moderator".intern();
public static final String USER = "User".intern();
public static final String GUEST = "Guest".intern();
public static final String DELETED = "_deleted".intern();
// Type Modify
public static final int CLOSE = 1;
public static final int LOCK = 2;
public static final int APPROVE = 3;
public static final int STICKY = 4;
public static final int WAITING = 5;
public static final int ACTIVE = 6;
public static final int CHANGE_NAME = 7;
public static final int VOTE_RATING = 8;
public static final int HIDDEN = 9;
public static final String SPACE = " ".intern();
/**
* start with forum prefix.
*/
public static final String FORUM_SPACE_ID_PREFIX = (FORUM + "Space").intern();
public static final String ADMIN_ROLE = "ADMIN".intern();
public static final String DEFAULT_EMAIL_CONTENT = "Hi,</br> You receive this email because you registered for eXo Forum and Topic Watching notification." + "<br/>We would like to inform you that there is a new $ADD_TYPE in the $OBJECT_WATCH_TYPE <b>$OBJECT_NAME</b> with the following content: "
+ "<div>_______________<br/>$POST_CONTENT<br/>_______________</div><div>At $TIME on $DATE, posted by <b>$POSTER</b> .</div><div>Go directly to the post: " + "<a target=\"_blank\" href=\"$VIEWPOST_LINK\">Click here.</a> <br/>Or go to reply to the post: <a target=\"_blank\" href=\"$REPLYPOST_LINK\">Click here." + "</a></div>".intern();
/**
* Clear characters that have a codepoint < 31 (non printable) from a string
* @param s string input
* @return the string with all character whose codepoint<31 removed
*/
public static String removeCharterStrange(String s) {
if (s == null || s.length() <= 0)
return "";
int i = 0;
StringBuilder builder = new StringBuilder();
while (i < s.length()) {
if (s.codePointAt(i) > 31) {
builder.append(s.charAt(i));
}
++i;
}
return builder.toString();
}
static public class DatetimeComparatorDESC implements Comparator<Object> {
public int compare(Object o1, Object o2) throws ClassCastException {
Date date1 = ((User) o1).getCreatedDate();
Date date2 = ((User) o2).getCreatedDate();
return date2.compareTo(date1);
}
}
static public class DatetimeComparatorPostDESC implements Comparator<Post> {
public int compare(Post o1, Post o2) throws ClassCastException {
Date date1 = o2.getCreatedDate();
Date date2 = o1.getCreatedDate();
return date2.compareTo(date1);
}
}
/**
* Compare two arrays and to verify there is a difference in content between two string arrays. The elements may not appear in the same order in both arrays.
* @param a first string array to compare
* @param b second string array to compare
* @return true if there is a difference in content or size between the two arrays, false otherwise.
*/
public static boolean arraysHaveDifferentContent(String[] a, String[] b) {
if (a.length == b.length) {
List<String> list = Arrays.asList(b);
for (int i = 0; i < a.length; i++) {
if (!list.contains(a[i])) {
return true;
}
}
} else {
return true;
}
return false;
}
/**
* Compare two lists and to verify there is a difference in content between two string lists. The elements may not appear in the same order in both lists.
* @param a first string list to compare
* @param b second string list to compare
* @return true if there is a difference in content or size between the two lists, false otherwise.
* @see #arraysHaveDifferentContent(String[], String[])
*/
public static boolean listsHaveDifferentContent(List<String> a, List<String> b) {
if (a.size() == b.size()) {
for (String s : b) {
if (!a.contains(s)) {
return true;
}
}
} else {
return true;
}
return false;
}
/**
* Converts a map to a string array representation. Each map entry is converted into a string item. String items will be of the form "key,value".
* This is the reverse operation of {@link #arrayToMap(String[])}
* @param map map to convert
* @return converted list of string
*/
public static String[] mapToArray(Map<String, String> map) {
if (map.isEmpty())
return new String[] { " " };
String str = map.toString().replace(" ", "").replace("{", "").replace("}", "");
str = str.replace(",", ";").replace("=", ",");
return str.split(";");
}
/**
* Convert a String array to a map. key and values must be comma separated. For example : "color,blue" will create an entry "blue" with key "color" in the map.
* A string not conforming to the pattern "key,value" is ignored
* @param strs List of string to scan
* @return map representation
*/
public static Map<String, String> arrayToMap(String[] strs) {
Map<String, String> map = new HashMap<String, String>();
String[] arr;
for (int i = 0; i < strs.length; i++) {
arr = strs[i].split(",");
if (arr.length == 2)
map.put(arr[0], arr[1]);
}
return map;
}
/**
* Create a JCR xpath condition that match a property against a list of values with an or condition.
* Note that if the property does not exist, the condition is matched too (means : values are combined with not(property))
* @param property property to match
* @param list list of possible values
* @return the JCR xpath predicate condition to match the property against values.
*/
public static String propertyMatchAny(String property, List<String> list) {
StringBuilder builder = new StringBuilder();
if (!list.isEmpty()) {
int t = 0;
for (String string : list) {
if (t == 0)
builder.append("(not(").append(property).append(") or ").append(property).append("='' or ").append(property).append("='").append(string).append("'");
else
builder.append(" or ").append(property).append("='").append(string).append("'");
t = 1;
}
if (t == 1)
builder.append(")");
}
return builder.toString();
}
/**
* Note that
* @param list
* @param list1
* @return
*/
public static boolean isListContentItemList(List<String> list, List<String> list1) {
if (list1 == null || (list1.size() == 1 && isEmpty(list1.get(0))))
return false;
for (String string : list1) {
if (list.contains(string))
return true;
}
return false;
}
/**
* Transforms a List of strings into a string array and clear any blank entry.
* A blank entry is the 'space' value (aka " ").
* @param list List of Strings to transform
* @return String array cleared of blanks
* @throws Exception
*/
public static String[] getStringsInList(List<String> list) throws Exception {
if (list.size() > 1) {
while (list.contains(" ")) {
list.remove(" ");
}
}
return list.toArray(new String[list.size()]);
}
/**
* Extract the items two lists have in common.
* @param pList first list
* @param cList second list
* @return a new list containing only the common elements between the two lists in input
* @throws Exception
*/
public static List<String> extractSameItems(List<String> pList, List<String> cList) throws Exception {
List<String> list = new ArrayList<String>();
for (String string : pList) {
if (cList.contains(string))
list.add(string);
}
return list;
}
/**
* Transforms a jcr Value array into a string array .
* Calls {@link Value#getString()} on each item.
* @see javax.jcr.Value
* @param values array of values to transform
* @return string array for the Value array
* @throws Exception
*/
public static String[] valuesToArray(Value[] Val) throws Exception {
if (Val.length < 1)
return new String[] {};
List<String> list = new ArrayList<String>();
String s;
for (int i = 0; i < Val.length; ++i) {
s = Val[i].getString();
if (!isEmpty(s))
list.add(s);
}
return list.toArray(new String[list.size()]);
}
/**
* Transforms a jcr Value array into a string list .
* Calls {@link Value#getString()} on each item.
* @see javax.jcr.Value
* @param values array of values to transform
* @return string list for the Value array
* @throws Exception
*/
public static List<String> valuesToList(Value[] values) throws Exception {
List<String> list = new ArrayList<String>();
if (values.length < 1)
return list;
String s;
for (int i = 0; i < values.length; ++i) {
s = values[i].getString();
if (!isEmpty(s))
list.add(s);
}
return list;
}
@SuppressWarnings("unchecked")
public static <T> T[] arrayCopy(final T[] source) {
// null in, null out
if (source == null) {
return null;
}
// empty in, empty out
if (source.length == 0) {
try {
return (T[]) Array.newInstance(source.getClass().getComponentType(), 0);
} catch (Exception e) {
return null;
// should never occur;
}
}
// instanciate a new array based on first item
T[] dest = (T[]) Array.newInstance(source[0].getClass(), source.length);
System.arraycopy(source, 0, dest, 0, source.length);
return dest;
}
/**
* Check string is null or empty
* @param String s
* @return boolean
*/
public static boolean isEmpty(String s) {
return (s == null || s.trim().length() <= 0) ? true : false;
}
/**
* check string array is whether empty or not
* @param array
* @return false if at least one element of array is not empty, true in the opposite case.
*/
public static boolean isEmpty(String[] array) {
if (array != null && array.length > 0) {
for (String s : array) {
if (s != null && s.trim().length() > 0)
return false;
}
}
return true;
}
/**
* get Xpath query when get list post.
* @param String isApproved
* @param String isHidden
* @param String userLogin
* @return StringBuilder
*/
public static StringBuilder getPathQuery(String isApproved, String isHidden, String userLogin) throws Exception {
StringBuilder strBuilder = new StringBuilder();
boolean isAnd = false;
if (userLogin != null && userLogin.length() > 0) {
isAnd = true;
strBuilder.append("[((@exo:userPrivate='").append(userLogin).append("') or (@exo:userPrivate='exoUserPri'))");
}
if (isApproved != null && isApproved.length() > 0) {
if (isAnd) {
strBuilder.append(" and (@exo:isApproved='").append(isApproved).append("')");
} else {
strBuilder.append("[(@exo:isApproved='").append(isApproved).append("')");
}
if (isHidden.equals("false")) {
strBuilder.append(" and (@exo:isHidden='false')");
}
strBuilder.append("]");
} else {
if (!isEmpty(isHidden)) {
if (isAnd) {
strBuilder.append(" and (@exo:isHidden='" + isHidden + "')]");
} else {
strBuilder.append("[@exo:isHidden='" + isHidden + "']");
}
} else {
if (isAnd) {
strBuilder.append("]");
}
}
}
return strBuilder;
}
/**
* Checking a user who whether contained Users/MemberShip/Group ?
* @param listOfCanviewrs
* @param listOfBoundUsers
* @return boolean
*/
static public boolean hasPermission(List<String> listOfCanviewrs, List<String> listOfBoundUsers) {
if (listOfBoundUsers == null || listOfCanviewrs == null)
return false;
List<String> tem = new ArrayList<String>();
for (String str : listOfCanviewrs) {
if (str == null)
continue;
if (listOfBoundUsers.contains(str))
return true;
if (str.contains("*")) {
str = str.substring(str.indexOf("/"), str.length());
tem.add(str);
if (listOfBoundUsers.contains(str))
return true;
}
}
for (String s : listOfBoundUsers) {
if (tem.contains(s))
return true;
}
return false;
}
}