package org.exoplatform.social.core.storage.impl; import org.exoplatform.social.core.chromattic.entity.ProfileEntity; import org.exoplatform.social.core.identity.model.Identity; import org.exoplatform.social.core.profile.ProfileFilter; import org.exoplatform.social.core.storage.query.JCRProperties; import org.exoplatform.social.core.storage.query.QueryFunction; import org.exoplatform.social.core.storage.query.WhereExpression; import java.util.List; import java.util.regex.Pattern; /** * @author <a href="mailto:alain.defrance@exoplatform.com">Alain Defrance</a> * @version $Revision$ */ public class StorageUtils { // public static final String ASTERISK_STR = "*"; public static final String PERCENT_STR = "%"; public static final char ASTERISK_CHAR = '*'; public static final String SPACE_STR = " "; public static final String EMPTY_STR = ""; public static final String SLASH_STR = "/"; public static void applyFilter(final WhereExpression whereExpression, final ProfileFilter profileFilter) { // String inputName = profileFilter.getName().replace(ASTERISK_STR, PERCENT_STR); processUsernameSearchPattern(inputName.trim()); String position = addPositionSearchPattern(profileFilter.getPosition().trim()).replace(ASTERISK_STR, PERCENT_STR); String gender = profileFilter.getGender().trim(); inputName = inputName.isEmpty() ? ASTERISK_STR : inputName; String nameForSearch = inputName.replace(ASTERISK_STR, SPACE_STR); char firstChar = profileFilter.getFirstCharacterOfName(); // if (firstChar != '\u0000') { whereExpression.and().like( whereExpression.callFunction(QueryFunction.LOWER, ProfileEntity.fullName), nameForSearch.toLowerCase() + PERCENT_STR ); } else if (nameForSearch.trim().length() != 0) { whereExpression.and().like( whereExpression.callFunction(QueryFunction.LOWER, ProfileEntity.fullName), PERCENT_STR + nameForSearch.toLowerCase() + PERCENT_STR ); } if (position.length() != 0) { whereExpression.and().like( whereExpression.callFunction(QueryFunction.LOWER, ProfileEntity.position), PERCENT_STR + position.toLowerCase() + PERCENT_STR ); } if (gender.length() != 0) { whereExpression.and().equals(ProfileEntity.gender, gender); } } public static void applyExcludes(final WhereExpression whereExpression, final List<Identity> excludedIdentityList) { if (excludedIdentityList != null & excludedIdentityList.size() > 0) { for (Identity identity : excludedIdentityList) { whereExpression.and().not().equals(ProfileEntity.parentId, identity.getId()); } } } public static void applyWhereFromIdentity(final WhereExpression whereExpression, final List<Identity> identities) { // whereExpression.startGroup(); for (int i = 0; identities.size() > i; ++i) { Identity current = identities.get(i); whereExpression.equals(JCRProperties.id, current.getProfile().getId()); if (i + 1 < identities.size()) { whereExpression.or(); } } whereExpression.endGroup(); } public static String processUsernameSearchPattern(final String userName) { String modifiedUserName = userName; if (modifiedUserName.length() > 0) { modifiedUserName = ((EMPTY_STR.equals(modifiedUserName)) || (modifiedUserName.length() == 0)) ? ASTERISK_STR : modifiedUserName; modifiedUserName = (modifiedUserName.charAt(0) != ASTERISK_CHAR) ? ASTERISK_STR + modifiedUserName : modifiedUserName; modifiedUserName = (modifiedUserName.charAt(modifiedUserName.length() - 1) != ASTERISK_CHAR) ? modifiedUserName += ASTERISK_STR : modifiedUserName; modifiedUserName = (modifiedUserName.indexOf(ASTERISK_STR) >= 0) ? modifiedUserName.replace(ASTERISK_STR, "." + ASTERISK_STR) : modifiedUserName; modifiedUserName = (modifiedUserName.indexOf(PERCENT_STR) >= 0) ? modifiedUserName.replace(PERCENT_STR, "." + ASTERISK_STR) : modifiedUserName; Pattern.compile(modifiedUserName); } return userName; } public static String addPositionSearchPattern(final String position) { if (position.length() != 0) { if (position.indexOf(ASTERISK_STR) == -1) { return ASTERISK_STR + position + ASTERISK_STR; } return position; } return EMPTY_STR; } }