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;
}
}