package org.odata4j.format.json;
import java.io.Writer;
import javax.ws.rs.core.UriInfo;
import org.odata4j.core.OCollection;
import org.odata4j.core.OCollections;
import org.odata4j.core.OComplexObject;
import org.odata4j.core.ODataConstants;
import org.odata4j.core.OFunctionParameter;
import org.odata4j.core.OObject;
import org.odata4j.core.OSimpleObject;
import org.odata4j.edm.EdmCollectionType;
import org.odata4j.edm.EdmProperty.CollectionKind;
import org.odata4j.format.Parameters;
public class JsonParametersFormatWriter extends JsonFormatWriter<Parameters> {
public JsonParametersFormatWriter(String jsonpCallback) {
super(jsonpCallback);
}
@Override
protected void writeContent(UriInfo uriInfo, JsonWriter jw, Parameters parameters) {
boolean isFirst = true;
jw.startObject();
for (OFunctionParameter param : parameters.getParameters()) {
if (isFirst) {
isFirst = false;
} else {
jw.writeSeparator();
}
OObject oo = param.getValue();
jw.writeName(param.getName());
if (oo instanceof OCollection) {
EdmCollectionType colType = new EdmCollectionType(CollectionKind.Collection, param.getType());
writeValue(jw, colType, oo);
}
else if (param.getType().isSimple()){
writeValue(jw, param.getType(), ((OSimpleObject<?>)oo).getValue());
} else if (oo instanceof OCollection) {
EdmCollectionType colType = new EdmCollectionType(CollectionKind.Collection, param.getType());
writeValue(jw, colType, oo);
}
else{
writeValue(jw, param.getType(), oo);
}
}
jw.endObject();
}
@Override
public void write(UriInfo uriInfo, Writer w, Parameters target) {
JsonWriter jw = new JsonWriter(w);
if (getJsonpCallback() != null) {
jw.startCallback(getJsonpCallback());
}
writeContent(uriInfo, jw, target);
}
/**
* Returns the content-type. According to OData specification,
* function parameters must be send in a verbose-json mode.
*
*/
@Override
public String getContentType() {
return getJsonpCallback() == null
? ODataConstants.APPLICATION_JAVASCRIPT_VERBOSE_CHARSET_UTF8
: ODataConstants.TEXT_JAVASCRIPT_CHARSET_UTF8;
}
}