package testapp.endpoint;
import org.osgl.$;
import org.osgl.Osgl;
import org.osgl.util.C;
import org.osgl.util.E;
import org.osgl.util.S;
import java.util.List;
import java.util.Map;
/**
* There are two ways to pass array/list element in GET request. For detail refers to
* http://stackoverflow.com/questions/11889997/how-to-send-a-array-in-url-request.
*
* **Note** the comma separated style (first style in the accepted answer post) cannot
* be supported correctly
*/
public enum ParamEncoding {
/**
* Encode for JSON body post
*/
JSON() {
@Override
public List<$.T2<String, Object>> encode(String paramName, List<?> elements) {
return C.list($.T2(paramName, (Object)elements));
}
@Override
public List<$.T2<String, Object>> encode(String paramName, Map<?, ?> elements) {
return C.list($.T2(paramName, (Object)elements));
}
},
/**
* The first style:
* List: `name=Actor1&name=Actor2&name=Actor3`
* Map: not supported
*/
ONE() {
@Override
public List<$.T2<String, Object>> encode(final String paramName, final List<?> elements) {
return C.list(elements).map(new $.Transformer<Object, $.T2<String, Object>>() {
@Override
public $.T2<String, Object> transform(Object o) {
return $.T2(paramName, o);
}
});
}
@Override
public List<$.T2<String, Object>> encode(String paramName, Map<?, ?> elements) {
throw E.unsupport();
}
},
/**
* The second style:
* List: `name[0]=Actor1&name[1]=Actor2&name[2]=Actor3`
* Map: `name[k1]=v1&name[k2]=v2`
*/
TWO() {
@Override
public List<$.T2<String, Object>> encode(String paramName, List<?> elements) {
List<$.T2<String, Object>> retList = C.newSizedList(elements.size());
for (int i = 0; i < elements.size(); ++i) {
retList.add($.T2(S.fmt("%s[%d]", paramName, i), elements.get(i)));
}
return retList;
}
@Override
public List<$.T2<String, Object>> encode(String paramName, Map<?, ?> elements) {
List<$.T2<String, Object>> retList = C.newList();
if (null != elements) {
for (Map.Entry<?, ?> entry : elements.entrySet()) {
retList.add($.T2(S.fmt("%s[%s]", paramName, entry.getKey().toString()), entry.getValue()));
}
}
return retList;
}
},
/**
* The third style:
* List: `name[]=Actor&name[]=Actor2&name[]=Actor3`
* Map: not supported
*/
THREE() {
@Override
public List<$.T2<String, Object>> encode(String paramName, List<?> elements) {
List<$.T2<String, Object>> retList = C.newSizedList(elements.size());
for (int i = 0; i < elements.size(); ++i) {
retList.add($.T2(S.fmt("%s[]", paramName, i), elements.get(i)));
}
return retList;
}
@Override
public List<$.T2<String, Object>> encode(String paramName, Map<?, ?> elements) {
throw E.unsupport();
}
},
/**
* The fourth style:
*
* List: `name.1=Actor&name.2=Actor2&name.3=Actor3`
* Map: `name.k1=v1&name.k2=v2`
*/
FOUR() {
@Override
public List<$.T2<String, Object>> encode(String paramName, List<?> elements) {
E.illegalStateIf(paramName.contains("."), "Param encoding four does not support param name with \".\" inside");
List<$.T2<String, Object>> retList = C.newList();
for (int i = 0; i < elements.size(); ++i) {
retList.add($.T2(S.fmt("%s.%d", paramName, i), elements.get(i)));
}
return retList;
}
@Override
public List<$.T2<String, Object>> encode(String paramName, Map<?, ?> elements) {
E.illegalStateIf(paramName.contains("."), "Param encoding four does not support param name with \".\" inside");
List<$.T2<String, Object>> retList = C.newList();
if (null != elements) {
for (Map.Entry<?, ?> entry : elements.entrySet()) {
retList.add($.T2(S.fmt("%s.%s", paramName, entry.getKey().toString()), entry.getValue()));
}
}
return retList;
}
}
;
/**
* Returns the list of (k,v) pairs to be fed into GET/POST request
*
* @param paramName the name of the parameter
* @param elements the list of values
* @return A list of (key,val) pairs to be feed into GET/POST request
*/
public abstract List<$.T2<String, Object>> encode(String paramName, List<?> elements);
public abstract List<$.T2<String, Object>> encode(String paramName, Map<?, ?> elements);
}