package ameba.message.filtering;
import ameba.core.Requests;
import ameba.message.internal.BeanPathProperties;
import ameba.util.bean.BeanMap;
import org.apache.commons.lang3.StringUtils;
import javax.ws.rs.core.UriInfo;
import java.util.Collection;
import java.util.List;
/**
* <p>EntityFieldsUtils class.</p>
*
* @author icode
*
*/
public class EntityFieldsUtils {
/**
* Constant <code>PATH_PROPS_PARSED="EntityFieldsUtils.class + .BeanPathProp"{trunked}</code>
*/
public static final String PATH_PROPS_PARSED = EntityFieldsUtils.class + ".BeanPathProperties";
private EntityFieldsUtils() {
}
/**
* Parse and return a BeanPathProperties format from UriInfo
*
* @param uriInfo uri info
* @return query fields
*/
public static String parseQueryFields(UriInfo uriInfo) {
List<String> selectables = uriInfo.getQueryParameters()
.get(EntityFieldsScopeResolver.FIELDS_PARAM_NAME);
StringBuilder builder = new StringBuilder();
if (selectables != null) {
for (int i = 0; i < selectables.size(); i++) {
String s = selectables.get(i);
if (StringUtils.isNotBlank(s)) {
if (!s.startsWith("(")) {
builder.append("(");
}
builder.append(s);
if (!s.endsWith(")")) {
builder.append(")");
}
if (i < selectables.size() - 1) {
builder.append(":");
}
}
}
}
return builder.length() == 0 ? null : builder.toString();
}
/**
* Parse and return a BeanPathProperties format from UriInfo
*
* @return query fields
*/
public static String parseQueryFields() {
return parseQueryFields(Requests.getUriInfo());
}
/**
* Parse and return a BeanPathProperties from nested string format like
* (a,b,c(d,e),f(g)) where "c" is a path containing "d" and "e" and "f" is a
* path containing "g" and the root path contains "a","b","c" and "f".
*
* @param uriInfo uri info
* @return path properties
*/
public static BeanPathProperties parsePathProperties(UriInfo uriInfo) {
return BeanPathProperties.parse(parseQueryFields(uriInfo));
}
/**
* Parse and return a BeanPathProperties from nested string format like
* (a,b,c(d,e),f(g)) where "c" is a path containing "d" and "e" and "f" is a
* path containing "g" and the root path contains "a","b","c" and "f".
*
* @return pah properties
*/
public static BeanPathProperties parsePathProperties() {
Object pathProperties = Requests.getProperty(PATH_PROPS_PARSED);
if (pathProperties == null) {
String fields = parseQueryFields();
if (fields != null) {
pathProperties = BeanPathProperties.parse(fields);
Requests.setProperty(PATH_PROPS_PARSED, pathProperties);
} else {
Requests.setProperty(PATH_PROPS_PARSED, false);
}
} else if (pathProperties.equals(false)) {
return null;
}
return (BeanPathProperties) pathProperties;
}
/**
* <p>filterBeanFields.</p>
*
* @param src a T object.
* @param pathProperties a {@link ameba.message.internal.BeanPathProperties} object.
* @param <T> a T object.
* @return a {@link ameba.util.bean.BeanMap} object.
*/
@SuppressWarnings("unchecked")
public static <T> BeanMap<T> filterBeanFields(T src, BeanPathProperties pathProperties) {
return (BeanMap<T>) FilteringBeanMap.from(src, pathProperties);
}
/**
* <p>filterBeanFields.</p>
*
* @param src an array of T objects.
* @param pathProperties a {@link ameba.message.internal.BeanPathProperties} object.
* @param <T> a T object.
* @return an array of {@link ameba.util.bean.BeanMap} objects.
*/
@SuppressWarnings("unchecked")
public static <T> BeanMap[] filterBeanFields(T[] src, BeanPathProperties pathProperties) {
return (BeanMap[]) FilteringBeanMap.from(src, pathProperties);
}
/**
* <p>filterBeanFields.</p>
*
* @param src a {@link java.util.Collection} object.
* @param pathProperties a {@link ameba.message.internal.BeanPathProperties} object.
* @param <T> a T object.
* @return a {@link java.util.Collection} object.
*/
@SuppressWarnings("unchecked")
public static <T> Collection<BeanMap<T>> filterBeanFields(Collection<T> src, BeanPathProperties pathProperties) {
return (Collection<BeanMap<T>>) FilteringBeanMap.from(src, pathProperties);
}
/**
* <p>filterRequestFields.</p>
*
* @param src a T object.
* @param <T> a T object.
* @return a {@link ameba.util.bean.BeanMap} object.
*/
@SuppressWarnings("unchecked")
public static <T> BeanMap<T> filterRequestFields(T src) {
return (BeanMap<T>) FilteringBeanMap.from(src, parsePathProperties());
}
/**
* <p>filterRequestFields.</p>
*
* @param src an array of T objects.
* @param <T> a T object.
* @return an array of {@link ameba.util.bean.BeanMap} objects.
*/
@SuppressWarnings("unchecked")
public static <T> BeanMap[] filterRequestFields(T[] src) {
return (BeanMap[]) FilteringBeanMap.from(src, parsePathProperties());
}
/**
* <p>filterRequestFields.</p>
*
* @param src a {@link java.util.Collection} object.
* @param <T> a T object.
* @return a {@link java.util.Collection} object.
*/
@SuppressWarnings("unchecked")
public static <T> Collection<BeanMap<T>> filterRequestFields(Collection<T> src) {
return (Collection<BeanMap<T>>) FilteringBeanMap.from(src, parsePathProperties());
}
}