Package org.rest.common.util

Source Code of org.rest.common.util.SearchCommonUtil

package org.rest.common.util;

import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang3.tuple.ImmutableTriple;
import org.apache.commons.lang3.tuple.Triple;
import org.rest.common.search.ClientOperation;

import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;

public final class SearchCommonUtil {

    private SearchCommonUtil() {
        throw new UnsupportedOperationException();
    }

    // API

    public static List<Triple<String, ClientOperation, String>> parseQueryString(final String queryString) {
        Preconditions.checkNotNull(queryString);
        Preconditions.checkState(queryString.matches("((id~?=[0-9]+)?,?)*((name~?=[0-9a-zA-Z\\-_/*]+),?)*"));

        final List<Triple<String, ClientOperation, String>> tuplesList = Lists.newArrayList();
        final String[] tuples = queryString.split(QueryConstants.SEPARATOR);
        for (final String tuple : tuples) {
            final String[] keyAndValue = tuple.split(QueryConstants.OP);
            Preconditions.checkState(keyAndValue.length == 2);
            tuplesList.add(createConstraintFromUriParam(keyAndValue[0], keyAndValue[1]));
        }

        return tuplesList;
    }

    public static List<ImmutableTriple<String, ClientOperation, ?>> uriParamsToConstraints(final Map<String, String[]> validParameters) {
        final List<ImmutableTriple<String, ClientOperation, ?>> tuplesList = Lists.newArrayList();
        for (final Map.Entry<String, String[]> mapKeyValue : validParameters.entrySet()) {
            tuplesList.add(createConstraintFromUriParam(mapKeyValue.getKey(), mapKeyValue.getValue()[0]));
        }
        return tuplesList;
    }

    public static boolean validateParameters(final Set<String> paramKeys) {
        if (paramKeys.retainAll(Lists.newArrayList(// @formatter:off
                SearchField.name.toString(), QueryConstants.NAME_NEG,

                SearchField.loginName.toString(), QueryConstants.LOGIN_NAME_NEG,

                SearchField.id.toString(), QueryConstants.ID_NEG,

                SearchField.email.toString(), QueryConstants.EMAIL_NEG,

                SearchField.tenant.toString(), QueryConstants.TENANT_NEG,

                SearchField.locked.toString(), QueryConstants.LOCKED_NEG,

                SearchField.description.toString(), QueryConstants.DESCRIPTION_NEG))) { // @formatter:on
            return false;
        }
        return true;
    }

    // util

    static ImmutableTriple<String, ClientOperation, String> createConstraintFromUriParam(final String key, final String value) {
        boolean negated = false;
        if (key.endsWith(QueryConstants.NEGATION)) {
            negated = true;
        }

        final ClientOperation op = determineOperation(negated, value);
        final String theKey = determineKey(negated, key);
        final String theValue = determineValue(value);
        return new ImmutableTriple<String, ClientOperation, String>(theKey, op, theValue);
    }

    static String determineValue(final String value) {
        return value.replaceAll("\\*", QueryConstants.ANY_SERVER);
    }

    static String determineKey(final boolean negated, final String key) {
        if (negated) {
            return key.substring(0, key.length() - 1);
        }
        return key;
    }

    static ClientOperation determineOperation(final boolean negated, final String value) {
        ClientOperation op = null;
        if (value.startsWith(QueryConstants.ANY_CLIENT)) {
            if (value.endsWith(QueryConstants.ANY_CLIENT)) {
                op = negated ? ClientOperation.NEG_CONTAINS : ClientOperation.CONTAINS;
            } else {
                op = negated ? ClientOperation.NEG_ENDS_WITH : ClientOperation.ENDS_WITH;
            }
        } else if (value.endsWith(QueryConstants.ANY_CLIENT)) {
            op = negated ? ClientOperation.NEG_STARTS_WITH : ClientOperation.STARTS_WITH;
        } else {
            op = negated ? ClientOperation.NEG_EQ : ClientOperation.EQ;
        }
        return op;
    }

}
TOP

Related Classes of org.rest.common.util.SearchCommonUtil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.