package org.fusesource.restygwt.server.complex;
import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JParameterizedType;
import org.fusesource.restygwt.client.Json;
import org.fusesource.restygwt.rebind.EncoderDecoderLocatorFactory;
import org.fusesource.restygwt.rebind.JsonEncoderDecoderClassCreator;
import org.fusesource.restygwt.rebind.JsonEncoderDecoderInstanceLocator;
public class OptionalSerializerGenerator extends JsonEncoderDecoderClassCreator {
private JClassType typeArg;
public OptionalSerializerGenerator(TreeLogger logger, GeneratorContext context, JClassType source)
throws UnableToCompleteException {
super(logger, context, source);
}
private JClassType getTypeArg() throws UnableToCompleteException {
JParameterizedType parameterizedType = source.isParameterized();
if (parameterizedType == null || parameterizedType.getTypeArgs() == null || parameterizedType.getTypeArgs().length == 0) {
getLogger().log(ERROR, "Optional types must be parameterized.");
throw new UnableToCompleteException();
}
return parameterizedType.getTypeArgs()[0];
}
@Override
public void generate() throws UnableToCompleteException {
locator = EncoderDecoderLocatorFactory.getEncoderDecoderInstanceLocator(context, getLogger());
generateSingleton(shortName);
typeArg = getTypeArg();
generateEncodeMethod();
generateDecodeMethod();
}
private void generateEncodeMethod() throws UnableToCompleteException {
p("public " + JSON_VALUE_CLASS + " encode(" + source.getParameterizedQualifiedSourceName() + " value) {").i(1);
p("if (value == null) {").i(1);
p("return null;").i(-1);
p("}");
p("if (!value.isPresent()) {").i(1);
p("return null;").i(-1);
p("}");
p("return " + locator.encodeExpression(typeArg, "value.get()", Json.Style.DEFAULT) + ";").i(-1);
p("}");
p();
}
private void generateDecodeMethod() throws UnableToCompleteException {
p("public " + source.getName() + " decode(" + JSON_VALUE_CLASS + " value) {").i(1);
p("if (value == null || value.isNull() != null ) {").i(1);
p("return Optional.absent();").i(-1);
p("}");
p("return Optional.of(" + locator.decodeExpression(typeArg, "value", Json.Style.DEFAULT) + ");").i(-1);
p("}");
p();
}
}