package com.robotoworks.mechanoid.net.generator;
import com.google.common.base.Objects;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;
import com.robotoworks.mechanoid.net.generator.ImportHelper;
import com.robotoworks.mechanoid.net.generator.ModelExtensions;
import com.robotoworks.mechanoid.net.netModel.Client;
import com.robotoworks.mechanoid.net.netModel.ClientBlock;
import com.robotoworks.mechanoid.net.netModel.Header;
import com.robotoworks.mechanoid.net.netModel.HeaderBlock;
import com.robotoworks.mechanoid.net.netModel.HttpMethod;
import com.robotoworks.mechanoid.net.netModel.HttpMethodType;
import com.robotoworks.mechanoid.net.netModel.IntrinsicType;
import com.robotoworks.mechanoid.net.netModel.Literal;
import com.robotoworks.mechanoid.net.netModel.Model;
import com.robotoworks.mechanoid.net.netModel.ParamsBlock;
import com.robotoworks.mechanoid.net.netModel.Path;
import com.robotoworks.mechanoid.net.netModel.SimpleMember;
import com.robotoworks.mechanoid.net.netModel.SimpleMemberAssignment;
import com.robotoworks.mechanoid.text.Strings;
import org.eclipse.emf.common.util.EList;
import org.eclipse.xtend2.lib.StringConcatenation;
@SuppressWarnings("all")
public class ClientGenerator {
@Inject
private ImportHelper imports;
public CharSequence generate(final Client client, final Model module) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package ");
String _packageName = module.getPackageName();
_builder.append(_packageName, "");
_builder.append(";");
_builder.newLineIfNotEmpty();
_builder.newLine();
CharSequence classDecl = this.generateClientClass(client, module);
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("import com.robotoworks.mechanoid.net.Parser;");
_builder.newLine();
_builder.append("import java.io.IOException;");
_builder.newLine();
_builder.append("import com.robotoworks.mechanoid.net.Response;");
_builder.newLine();
_builder.append("import com.robotoworks.mechanoid.net.ServiceException;");
_builder.newLine();
_builder.append("import java.io.InputStream;");
_builder.newLine();
_builder.append("import com.robotoworks.mechanoid.net.ServiceClient;");
_builder.newLine();
_builder.append("import com.robotoworks.mechanoid.net.JsonEntityWriterProvider;");
_builder.newLine();
_builder.append("import com.robotoworks.mechanoid.net.JsonEntityReaderProvider;");
_builder.newLine();
StringConcatenation _printAndClear = this.imports.printAndClear();
_builder.append(_printAndClear, "");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append(classDecl, "");
_builder.newLineIfNotEmpty();
return _builder;
}
public CharSequence generateClientClass(final Client client, final Model module) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("public abstract class Abstract");
String _name = client.getName();
_builder.append(_name, "");
_builder.append(" extends ServiceClient {");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("private static final String LOG_TAG = \"");
String _name_1 = client.getName();
_builder.append(_name_1, "\t");
_builder.append("\";");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.newLine();
{
String _baseUrl = client.getBaseUrl();
boolean _notEquals = (!Objects.equal(_baseUrl, null));
if (_notEquals) {
_builder.append("\t");
_builder.append("protected static final String DEFAULT_BASE_URL = \"");
String _baseUrl_1 = client.getBaseUrl();
_builder.append(_baseUrl_1, "\t");
_builder.append("\";");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.newLine();
}
}
_builder.append("\t");
ParamsBlock params = ModelExtensions.getParamsBlock(client);
_builder.newLineIfNotEmpty();
{
boolean _notEquals_1 = (!Objects.equal(params, null));
if (_notEquals_1) {
{
EList<SimpleMemberAssignment> _params = params.getParams();
for(final SimpleMemberAssignment param : _params) {
_builder.append("\t");
_builder.append("private ");
SimpleMember _member = param.getMember();
IntrinsicType _type = _member.getType();
String _signature = ModelExtensions.signature(_type);
_builder.append(_signature, "\t");
_builder.append(" ");
SimpleMember _member_1 = param.getMember();
String _name_2 = _member_1.getName();
String _camelize = Strings.camelize(_name_2);
_builder.append(_camelize, "\t");
_builder.append("Param");
{
Literal _defaultValue = param.getDefaultValue();
boolean _notEquals_2 = (!Objects.equal(_defaultValue, null));
if (_notEquals_2) {
_builder.append(" = ");
Literal _defaultValue_1 = param.getDefaultValue();
String _convertToJavaLiteral = ModelExtensions.convertToJavaLiteral(_defaultValue_1);
_builder.append(_convertToJavaLiteral, "\t");
}
}
_builder.append(";");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("private boolean ");
SimpleMember _member_2 = param.getMember();
String _name_3 = _member_2.getName();
String _camelize_1 = Strings.camelize(_name_3);
_builder.append(_camelize_1, "\t");
_builder.append("ParamSet");
{
Literal _defaultValue_2 = param.getDefaultValue();
boolean _notEquals_3 = (!Objects.equal(_defaultValue_2, null));
if (_notEquals_3) {
_builder.append(" = true");
}
}
_builder.append(";");
_builder.newLineIfNotEmpty();
}
}
_builder.append("\t");
_builder.newLine();
}
}
{
boolean _notEquals_4 = (!Objects.equal(params, null));
if (_notEquals_4) {
{
EList<SimpleMemberAssignment> _params_1 = params.getParams();
for(final SimpleMemberAssignment param_1 : _params_1) {
_builder.append("\t");
_builder.append("public void set");
SimpleMember _member_3 = param_1.getMember();
String _name_4 = _member_3.getName();
String _pascalize = Strings.pascalize(_name_4);
_builder.append(_pascalize, "\t");
_builder.append("Param(");
SimpleMember _member_4 = param_1.getMember();
IntrinsicType _type_1 = _member_4.getType();
String _signature_1 = ModelExtensions.signature(_type_1);
_builder.append(_signature_1, "\t");
_builder.append(" value) {");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("\t");
_builder.append("this.");
SimpleMember _member_5 = param_1.getMember();
String _name_5 = _member_5.getName();
String _camelize_2 = Strings.camelize(_name_5);
_builder.append(_camelize_2, "\t\t");
_builder.append("Param = value;");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("\t");
_builder.append("this.");
SimpleMember _member_6 = param_1.getMember();
String _name_6 = _member_6.getName();
String _camelize_3 = Strings.camelize(_name_6);
_builder.append(_camelize_3, "\t\t");
_builder.append("ParamSet = true;");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
}
}
_builder.append("\t");
_builder.newLine();
}
}
_builder.append("\t");
_builder.append("@Override");
_builder.newLine();
_builder.append("\t");
_builder.append("protected String getLogTag() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return LOG_TAG;");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.newLine();
_builder.append("\t");
_builder.append("@Override");
_builder.newLine();
_builder.append("\t");
_builder.append("protected JsonEntityWriterProvider createWriterProvider() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return new Default");
String _name_7 = client.getName();
_builder.append(_name_7, "\t\t");
_builder.append("WriterProvider();");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.newLine();
_builder.append("\t");
_builder.append("@Override");
_builder.newLine();
_builder.append("\t");
_builder.append("protected JsonEntityReaderProvider createReaderProvider() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return new Default");
String _name_8 = client.getName();
_builder.append(_name_8, "\t\t");
_builder.append("ReaderProvider();");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.newLine();
_builder.append("\t");
_builder.append("public Abstract");
String _name_9 = client.getName();
_builder.append(_name_9, "\t");
_builder.append("(String baseUrl, boolean debug){");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("super(baseUrl, debug);");
_builder.newLine();
_builder.append("\t\t");
_builder.newLine();
_builder.append("\t\t");
HeaderBlock headers = ModelExtensions.getHeaderBlock(client);
_builder.newLineIfNotEmpty();
{
boolean _notEquals_5 = (!Objects.equal(headers, null));
if (_notEquals_5) {
{
EList<Header> _headers = headers.getHeaders();
for(final Header header : _headers) {
_builder.append("\t\t");
_builder.append("setHeader(\"");
String _name_10 = header.getName();
_builder.append(_name_10, "\t\t");
_builder.append("\",\"");
String _value = header.getValue();
_builder.append(_value, "\t\t");
_builder.append("\");");
_builder.newLineIfNotEmpty();
}
}
}
}
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.newLine();
_builder.append("\t");
CharSequence _generateClientMethods = this.generateClientMethods(client, module);
_builder.append(_generateClientMethods, "\t");
_builder.newLineIfNotEmpty();
_builder.append("}");
_builder.newLine();
return _builder;
}
public CharSequence generateClientMethods(final Client client, final Model model) {
StringConcatenation _builder = new StringConcatenation();
{
EList<ClientBlock> _blocks = client.getBlocks();
Iterable<HttpMethod> _filter = Iterables.<HttpMethod>filter(_blocks, HttpMethod.class);
for(final HttpMethod method : _filter) {
{
boolean _and = false;
boolean _hasBody = ModelExtensions.hasBody(method);
boolean _not = (!_hasBody);
if (!_not) {
_and = false;
} else {
boolean _or = false;
Path _path = method.getPath();
boolean _equals = Objects.equal(_path, null);
if (_equals) {
_or = true;
} else {
Path _path_1 = method.getPath();
EList<SimpleMemberAssignment> _params = _path_1.getParams();
int _size = _params.size();
boolean _equals_1 = (_size == 0);
_or = _equals_1;
}
_and = _or;
}
if (_and) {
_builder.append("public Response<");
String _name = method.getName();
String _pascalize = Strings.pascalize(_name);
_builder.append(_pascalize, "");
_builder.append("Result> ");
String _name_1 = method.getName();
String _camelize = Strings.camelize(_name_1);
_builder.append(_camelize, "");
_builder.append("()");
_builder.newLineIfNotEmpty();
_builder.append(" ");
_builder.append("throws ServiceException {");
_builder.newLine();
_builder.append(" \t");
_builder.append("return ");
String _name_2 = method.getName();
String _camelize_1 = Strings.camelize(_name_2);
_builder.append(_camelize_1, " \t");
_builder.append("(new ");
String _name_3 = method.getName();
String _pascalize_1 = Strings.pascalize(_name_3);
_builder.append(_pascalize_1, " \t");
_builder.append("Request());");
_builder.newLineIfNotEmpty();
_builder.append("}");
_builder.newLine();
_builder.newLine();
}
}
_builder.append("public Response<");
String _name_4 = method.getName();
String _pascalize_2 = Strings.pascalize(_name_4);
_builder.append(_pascalize_2, "");
_builder.append("Result> ");
String _name_5 = method.getName();
String _camelize_2 = Strings.camelize(_name_5);
_builder.append(_camelize_2, "");
_builder.append("(");
String _name_6 = method.getName();
String _pascalize_3 = Strings.pascalize(_name_6);
_builder.append(_pascalize_3, "");
_builder.append("Request request)");
_builder.newLineIfNotEmpty();
_builder.append(" ");
_builder.append("throws ServiceException {");
_builder.newLine();
_builder.append(" \t");
ParamsBlock params = ModelExtensions.getParamsBlock(client);
_builder.newLineIfNotEmpty();
{
boolean _notEquals = (!Objects.equal(params, null));
if (_notEquals) {
{
EList<SimpleMemberAssignment> _params_1 = params.getParams();
for(final SimpleMemberAssignment param : _params_1) {
_builder.append("\t");
_builder.append("if(this.");
SimpleMember _member = param.getMember();
String _name_7 = _member.getName();
String _camelize_3 = Strings.camelize(_name_7);
_builder.append(_camelize_3, "\t");
_builder.append("ParamSet && !request.is");
SimpleMember _member_1 = param.getMember();
String _name_8 = _member_1.getName();
String _pascalize_4 = Strings.pascalize(_name_8);
_builder.append(_pascalize_4, "\t");
_builder.append("ParamSet()){");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("\t");
_builder.append("request.set");
SimpleMember _member_2 = param.getMember();
String _name_9 = _member_2.getName();
String _pascalize_5 = Strings.pascalize(_name_9);
_builder.append(_pascalize_5, "\t\t");
_builder.append("Param(this.");
SimpleMember _member_3 = param.getMember();
String _name_10 = _member_3.getName();
String _camelize_4 = Strings.camelize(_name_10);
_builder.append(_camelize_4, "\t\t");
_builder.append("Param);");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
}
}
_builder.append("\t");
_builder.newLine();
}
}
_builder.append("\t");
_builder.newLine();
_builder.append("\t");
_builder.append("Parser<");
String _name_11 = method.getName();
String _pascalize_6 = Strings.pascalize(_name_11);
_builder.append(_pascalize_6, "\t");
_builder.append("Result> parser = new Parser<");
String _name_12 = method.getName();
String _pascalize_7 = Strings.pascalize(_name_12);
_builder.append(_pascalize_7, "\t");
_builder.append("Result>() {");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("public ");
String _name_13 = method.getName();
String _pascalize_8 = Strings.pascalize(_name_13);
_builder.append(_pascalize_8, "\t\t");
_builder.append("Result parse(InputStream inStream) throws IOException {");
_builder.newLineIfNotEmpty();
_builder.append("\t\t\t");
_builder.append("return new ");
String _name_14 = method.getName();
String _pascalize_9 = Strings.pascalize(_name_14);
_builder.append(_pascalize_9, "\t\t\t");
_builder.append("Result(getReaderProvider(), inStream);");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.append("};");
_builder.newLine();
_builder.append("\t");
_builder.newLine();
_builder.append("\t");
CharSequence _generateServiceMethod = this.generateServiceMethod(method);
_builder.append(_generateServiceMethod, "\t");
_builder.newLineIfNotEmpty();
_builder.append("}");
_builder.newLine();
_builder.newLine();
}
}
return _builder;
}
public CharSequence generateServiceMethod(final HttpMethod method) {
CharSequence _switchResult = null;
HttpMethodType _type = method.getType();
if (_type != null) {
switch (_type) {
case GET:
_switchResult = this.generateServiceGetMethod(method);
break;
case PUT:
_switchResult = this.generateServicePutMethod(method);
break;
case POST:
_switchResult = this.generateServicePostMethod(method);
break;
case DELETE:
_switchResult = this.generateServiceDeleteMethod(method);
break;
case PATCH:
_switchResult = this.generateServicePatchMethod(method);
break;
default:
break;
}
}
return _switchResult;
}
public CharSequence generateServiceGetMethod(final HttpMethod method) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("return get(request, parser);");
_builder.newLine();
return _builder;
}
public CharSequence printSetHeadersStatements() {
StringConcatenation _builder = new StringConcatenation();
_builder.append("for(String key : headers.keySet()) {");
_builder.newLine();
_builder.append("\t");
_builder.append("conn.setRequestProperty(key, headers.get(key));");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("for(String key : request.getHeaderKeys()) {");
_builder.newLine();
_builder.append("\t");
_builder.append("conn.setRequestProperty(key, request.getHeaderValue(key));");
_builder.newLine();
_builder.append("}");
_builder.newLine();
return _builder;
}
public CharSequence generateServicePutMethod(final HttpMethod method) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("return put(request, parser);");
_builder.newLine();
return _builder;
}
public CharSequence generateServicePostMethod(final HttpMethod method) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("return post(request, parser);");
_builder.newLine();
return _builder;
}
public CharSequence generateServiceDeleteMethod(final HttpMethod method) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("return delete(request, parser);");
_builder.newLine();
return _builder;
}
public CharSequence generateServicePatchMethod(final HttpMethod method) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("return patch(request, parser);");
_builder.newLine();
return _builder;
}
public CharSequence generateStub(final Client client, final Model module) {
StringConcatenation _builder = new StringConcatenation();
_builder.append("package ");
String _packageName = module.getPackageName();
_builder.append(_packageName, "");
_builder.append(";");
_builder.newLineIfNotEmpty();
_builder.newLine();
_builder.append("public class ");
String _name = client.getName();
_builder.append(_name, "");
_builder.append(" extends Abstract");
String _name_1 = client.getName();
_builder.append(_name_1, "");
_builder.append(" {");
_builder.newLineIfNotEmpty();
{
String _baseUrl = client.getBaseUrl();
boolean _notEquals = (!Objects.equal(_baseUrl, null));
if (_notEquals) {
_builder.append("\t");
_builder.append("public ");
String _name_2 = client.getName();
_builder.append(_name_2, "\t");
_builder.append("(){");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("\t");
_builder.append("super(DEFAULT_BASE_URL, false);");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("\t");
_builder.append("public ");
String _name_3 = client.getName();
_builder.append(_name_3, "\t");
_builder.append("(boolean debug){");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("\t");
_builder.append("super(DEFAULT_BASE_URL, debug);");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
}
}
_builder.append("\t");
_builder.newLine();
_builder.append("\t");
_builder.append("public ");
String _name_4 = client.getName();
_builder.append(_name_4, "\t");
_builder.append("(String baseUrl){");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("super(baseUrl, false);");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.newLine();
_builder.append("\t");
_builder.append("public ");
String _name_5 = client.getName();
_builder.append(_name_5, "\t");
_builder.append("(String baseUrl, boolean debug){");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("super(baseUrl, debug);");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
return _builder;
}
}