package com.robotoworks.mechanoid.net.generator; import com.robotoworks.mechanoid.net.generator.ImportHelper; import com.robotoworks.mechanoid.net.generator.ModelExtensions; import com.robotoworks.mechanoid.net.netModel.BooleanType; import com.robotoworks.mechanoid.net.netModel.ComplexTypeDeclaration; import com.robotoworks.mechanoid.net.netModel.ComplexTypeLiteral; import com.robotoworks.mechanoid.net.netModel.EnumTypeDeclaration; import com.robotoworks.mechanoid.net.netModel.GenericListType; import com.robotoworks.mechanoid.net.netModel.IntrinsicType; import com.robotoworks.mechanoid.net.netModel.Member; import com.robotoworks.mechanoid.net.netModel.SkipMember; import com.robotoworks.mechanoid.net.netModel.Type; import com.robotoworks.mechanoid.net.netModel.TypedMember; import com.robotoworks.mechanoid.net.netModel.UserType; import com.robotoworks.mechanoid.net.netModel.UserTypeDeclaration; import com.robotoworks.mechanoid.text.Strings; import java.util.Arrays; import org.eclipse.emf.common.util.EList; import org.eclipse.xtend.lib.Property; import org.eclipse.xtend2.lib.StringConcatenation; import org.eclipse.xtext.xbase.lib.Pure; @SuppressWarnings("all") public class JsonReaderStatementGenerator { @Property private ImportHelper _imports; /** * The identifier of the JSONReader instance */ @Property private String _readerIdentifier = "source"; /** * The identifier of the reader subject (the entity the reader is * setting data to) */ @Property private String _subjectIdentifier = "entity"; @Property private String _providerIdentifier = "provider"; public CharSequence genReadComplexType(final ComplexTypeDeclaration decl) { ComplexTypeLiteral _literal = decl.getLiteral(); return this.genReadComplexTypeLiteral(_literal); } public CharSequence genReadComplexTypeLiteral(final ComplexTypeLiteral literal) { StringConcatenation _builder = new StringConcatenation(); ImportHelper _imports = this.getImports(); _imports.addImport("com.robotoworks.mechanoid.internal.util.JsonToken"); _builder.newLineIfNotEmpty(); String _readerIdentifier = this.getReaderIdentifier(); _builder.append(_readerIdentifier, ""); _builder.append(".beginObject();"); _builder.newLineIfNotEmpty(); _builder.newLine(); _builder.append("while("); String _readerIdentifier_1 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_1, ""); _builder.append(".hasNext()) {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("String name = "); String _readerIdentifier_2 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_2, "\t"); _builder.append(".nextName();"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.newLine(); _builder.append("\t"); _builder.append("if("); String _readerIdentifier_3 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_3, "\t"); _builder.append(".peek() == JsonToken.NULL) {"); _builder.newLineIfNotEmpty(); _builder.append("\t\t"); String _readerIdentifier_4 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_4, "\t\t"); _builder.append(".skipValue();"); _builder.newLineIfNotEmpty(); _builder.append("\t\t"); _builder.append("continue;"); _builder.newLine(); _builder.append("\t"); _builder.append("}"); _builder.newLine(); _builder.append("\t"); _builder.newLine(); _builder.append("\t"); int COUNTER = 0; _builder.newLineIfNotEmpty(); { EList<Member> _members = literal.getMembers(); for(final Member member : _members) { _builder.append("\t"); CharSequence _genBlock = this.genBlock(member, COUNTER = (COUNTER + 1)); _builder.append(_genBlock, "\t"); _builder.newLineIfNotEmpty(); } } { if ((COUNTER > 0)) { _builder.append("\t"); _builder.append("else {"); _builder.newLine(); _builder.append("\t"); _builder.append("\t"); String _readerIdentifier_5 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_5, "\t\t"); _builder.append(".skipValue();"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("}"); _builder.newLine(); } } _builder.append("}"); _builder.newLine(); _builder.newLine(); String _readerIdentifier_6 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_6, ""); _builder.append(".endObject();"); _builder.newLineIfNotEmpty(); return _builder; } public CharSequence genReadComplexTypeLiteralForMembers(final EList<Member> members) { StringConcatenation _builder = new StringConcatenation(); ImportHelper _imports = this.getImports(); _imports.addImport("com.robotoworks.mechanoid.internal.util.JsonToken"); _builder.newLineIfNotEmpty(); String _readerIdentifier = this.getReaderIdentifier(); _builder.append(_readerIdentifier, ""); _builder.append(".beginObject();"); _builder.newLineIfNotEmpty(); _builder.newLine(); _builder.append("while("); String _readerIdentifier_1 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_1, ""); _builder.append(".hasNext()) {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("String name = "); String _readerIdentifier_2 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_2, "\t"); _builder.append(".nextName();"); _builder.newLineIfNotEmpty(); _builder.newLine(); _builder.append("\t"); _builder.append("if("); String _readerIdentifier_3 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_3, "\t"); _builder.append(".peek() == JsonToken.NULL) {"); _builder.newLineIfNotEmpty(); _builder.append("\t\t"); String _readerIdentifier_4 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_4, "\t\t"); _builder.append(".skipValue();"); _builder.newLineIfNotEmpty(); _builder.append("\t\t"); _builder.append("continue;"); _builder.newLine(); _builder.append("\t"); _builder.append("}"); _builder.newLine(); _builder.append("\t\t\t\t"); _builder.newLine(); _builder.append("\t"); int COUNTER = 0; _builder.newLineIfNotEmpty(); { for(final Member member : members) { _builder.append("\t"); CharSequence _genBlock = this.genBlock(member, COUNTER = (COUNTER + 1)); _builder.append(_genBlock, "\t"); _builder.newLineIfNotEmpty(); } } { if ((COUNTER > 0)) { _builder.append("\t"); _builder.append("else {"); _builder.newLine(); _builder.append("\t"); _builder.append("\t"); String _readerIdentifier_5 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_5, "\t\t"); _builder.append(".skipValue();"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("}"); _builder.newLine(); } } _builder.append("}"); _builder.newLine(); _builder.newLine(); String _readerIdentifier_6 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_6, ""); _builder.append(".endObject();"); _builder.newLineIfNotEmpty(); return _builder; } public CharSequence genBlock(final Member member, final int blockNumber) { StringConcatenation _builder = new StringConcatenation(); { if ((blockNumber > 1)) { _builder.append("else "); } } _builder.append("if(name.equals(\""); String _name = member.getName(); _builder.append(_name, ""); _builder.append("\")) {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); CharSequence _genStatement = this.genStatement(member); _builder.append(_genStatement, "\t"); _builder.newLineIfNotEmpty(); _builder.append("}"); _builder.newLine(); return _builder; } protected CharSequence _genStatement(final TypedMember member) { Type _type = member.getType(); return this.genStatementForType(member, _type); } protected CharSequence _genStatement(final SkipMember skipMember) { StringConcatenation _builder = new StringConcatenation(); ImportHelper _imports = this.getImports(); _imports.addImport("com.robotoworks.mechanoid.internal.util.JsonToken"); _builder.newLineIfNotEmpty(); String _readerIdentifier = this.getReaderIdentifier(); _builder.append(_readerIdentifier, ""); _builder.append(".beginObject();"); _builder.newLineIfNotEmpty(); _builder.newLine(); _builder.append("while("); String _readerIdentifier_1 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_1, ""); _builder.append(".hasNext()) {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("name = "); String _readerIdentifier_2 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_2, "\t"); _builder.append(".nextName();"); _builder.newLineIfNotEmpty(); _builder.newLine(); _builder.append("\t"); _builder.append("if("); String _readerIdentifier_3 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_3, "\t"); _builder.append(".peek() == JsonToken.NULL) {"); _builder.newLineIfNotEmpty(); _builder.append("\t\t"); String _readerIdentifier_4 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_4, "\t\t"); _builder.append(".skipValue();"); _builder.newLineIfNotEmpty(); _builder.append("\t\t"); _builder.append("continue;"); _builder.newLine(); _builder.append("\t"); _builder.append("}"); _builder.newLine(); _builder.append("\t"); _builder.newLine(); _builder.append("\t"); int COUNTER = 0; _builder.newLineIfNotEmpty(); { ComplexTypeLiteral _literal = skipMember.getLiteral(); EList<Member> _members = _literal.getMembers(); for(final Member member : _members) { _builder.append("\t"); Object _genBlock = this.genBlock(member, COUNTER = (COUNTER + 1)); _builder.append(_genBlock, "\t"); _builder.newLineIfNotEmpty(); } } { if ((COUNTER > 0)) { _builder.append("\t"); _builder.append("else {"); _builder.newLine(); _builder.append("\t"); _builder.append("\t"); String _readerIdentifier_5 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_5, "\t\t"); _builder.append(".skipValue();"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("}"); _builder.newLine(); } } _builder.append("}"); _builder.newLine(); _builder.newLine(); String _readerIdentifier_6 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_6, ""); _builder.append(".endObject();"); _builder.newLineIfNotEmpty(); return _builder; } protected CharSequence _genStatementForType(final TypedMember member, final IntrinsicType type) { StringConcatenation _builder = new StringConcatenation(); { if ((type instanceof BooleanType)) { ImportHelper _imports = this.getImports(); _imports.addImport("com.robotoworks.mechanoid.net.JsonReaderUtil"); _builder.newLineIfNotEmpty(); String _setMethodName = ModelExtensions.toSetMethodName(member); String _subjectIdentifier = this.getSubjectIdentifier(); String _memberize = ModelExtensions.memberize(_setMethodName, _subjectIdentifier); _builder.append(_memberize, ""); _builder.append("(JsonReaderUtil.coerceNextBoolean("); String _readerIdentifier = this.getReaderIdentifier(); _builder.append(_readerIdentifier, ""); _builder.append("));"); _builder.newLineIfNotEmpty(); } else { String _setMethodName_1 = ModelExtensions.toSetMethodName(member); String _subjectIdentifier_1 = this.getSubjectIdentifier(); String _memberize_1 = ModelExtensions.memberize(_setMethodName_1, _subjectIdentifier_1); _builder.append(_memberize_1, ""); _builder.append("("); String _readerIdentifier_1 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_1, ""); _builder.append(".next"); String _signature = ModelExtensions.signature(type); String _pascalize = Strings.pascalize(_signature); _builder.append(_pascalize, ""); _builder.append("());"); _builder.newLineIfNotEmpty(); } } return _builder; } protected CharSequence _genStatementForType(final TypedMember member, final UserType type) { UserTypeDeclaration _declaration = type.getDeclaration(); return this.genStatementForType(member, type, _declaration); } protected CharSequence _genStatementForType(final TypedMember member, final UserType type, final ComplexTypeDeclaration decl) { StringConcatenation _builder = new StringConcatenation(); String _signature = ModelExtensions.signature(type); _builder.append(_signature, ""); _builder.append(" entityMember = new "); String _signature_1 = ModelExtensions.signature(type); _builder.append(_signature_1, ""); _builder.append("();"); _builder.newLineIfNotEmpty(); String _providerIdentifier = this.getProviderIdentifier(); _builder.append(_providerIdentifier, ""); _builder.append(".get("); String _innerSignature = ModelExtensions.innerSignature(type); _builder.append(_innerSignature, ""); _builder.append(".class).read("); String _readerIdentifier = this.getReaderIdentifier(); _builder.append(_readerIdentifier, ""); _builder.append(", entityMember);"); _builder.newLineIfNotEmpty(); String _setMethodName = ModelExtensions.toSetMethodName(member); String _subjectIdentifier = this.getSubjectIdentifier(); String _memberize = ModelExtensions.memberize(_setMethodName, _subjectIdentifier); _builder.append(_memberize, ""); _builder.append("(entityMember);"); _builder.newLineIfNotEmpty(); return _builder; } protected CharSequence _genStatementForType(final TypedMember member, final UserType type, final EnumTypeDeclaration decl) { StringConcatenation _builder = new StringConcatenation(); String _signature = ModelExtensions.signature(type); _builder.append(_signature, ""); _builder.append(" entityMember = "); String _signature_1 = ModelExtensions.signature(type); _builder.append(_signature_1, ""); _builder.append(".fromValue("); String _readerIdentifier = this.getReaderIdentifier(); _builder.append(_readerIdentifier, ""); _builder.append("."); String _resolveJsonReaderMethodName = ModelExtensions.resolveJsonReaderMethodName(decl); _builder.append(_resolveJsonReaderMethodName, ""); _builder.append("());"); _builder.newLineIfNotEmpty(); String _setMethodName = ModelExtensions.toSetMethodName(member); String _subjectIdentifier = this.getSubjectIdentifier(); String _memberize = ModelExtensions.memberize(_setMethodName, _subjectIdentifier); _builder.append(_memberize, ""); _builder.append("(entityMember);"); _builder.newLineIfNotEmpty(); return _builder; } protected CharSequence _genStatementForType(final TypedMember member, final GenericListType type) { Type _elementType = type.getElementType(); return this.genStatementForGenericListType(member, type, _elementType); } protected CharSequence _genStatementForGenericListType(final TypedMember member, final GenericListType type, final IntrinsicType itemType) { StringConcatenation _builder = new StringConcatenation(); ImportHelper _imports = this.getImports(); _imports.addImport("java.util.List"); _builder.newLineIfNotEmpty(); ImportHelper _imports_1 = this.getImports(); _imports_1.addImport("com.robotoworks.mechanoid.internal.util.JsonUtil"); _builder.newLineIfNotEmpty(); _builder.append("List<"); String _boxedTypeSignature = ModelExtensions.getBoxedTypeSignature(itemType); _builder.append(_boxedTypeSignature, ""); _builder.append("> entityMember = JsonUtil.read"); String _boxedTypeSignature_1 = ModelExtensions.getBoxedTypeSignature(itemType); _builder.append(_boxedTypeSignature_1, ""); _builder.append("List("); String _readerIdentifier = this.getReaderIdentifier(); _builder.append(_readerIdentifier, ""); _builder.append(");"); _builder.newLineIfNotEmpty(); String _setMethodName = ModelExtensions.toSetMethodName(member); String _subjectIdentifier = this.getSubjectIdentifier(); String _memberize = ModelExtensions.memberize(_setMethodName, _subjectIdentifier); _builder.append(_memberize, ""); _builder.append("(entityMember);"); _builder.newLineIfNotEmpty(); return _builder; } protected CharSequence _genStatementForGenericListType(final TypedMember member, final GenericListType type, final UserType itemType) { UserTypeDeclaration _declaration = itemType.getDeclaration(); return this.genStatementForUserTypeGenericList(member, type, itemType, _declaration); } protected CharSequence _genStatementForUserTypeGenericList(final TypedMember member, final GenericListType type, final UserType itemType, final ComplexTypeDeclaration decl) { StringConcatenation _builder = new StringConcatenation(); ImportHelper _imports = this.getImports(); _imports.addImport("java.util.List"); _builder.newLineIfNotEmpty(); ImportHelper _imports_1 = this.getImports(); _imports_1.addImport("java.util.ArrayList"); _builder.newLineIfNotEmpty(); String _signature = ModelExtensions.signature(type); _builder.append(_signature, ""); _builder.append(" entityMember = new ArrayList<"); String _innerSignature = ModelExtensions.innerSignature(type); _builder.append(_innerSignature, ""); _builder.append(">();"); _builder.newLineIfNotEmpty(); String _providerIdentifier = this.getProviderIdentifier(); _builder.append(_providerIdentifier, ""); _builder.append(".get("); String _innerSignature_1 = ModelExtensions.innerSignature(type); _builder.append(_innerSignature_1, ""); _builder.append(".class).readList("); String _readerIdentifier = this.getReaderIdentifier(); _builder.append(_readerIdentifier, ""); _builder.append(", entityMember);"); _builder.newLineIfNotEmpty(); String _setMethodName = ModelExtensions.toSetMethodName(member); String _subjectIdentifier = this.getSubjectIdentifier(); String _memberize = ModelExtensions.memberize(_setMethodName, _subjectIdentifier); _builder.append(_memberize, ""); _builder.append("(entityMember);"); _builder.newLineIfNotEmpty(); return _builder; } protected CharSequence _genStatementForUserTypeGenericList(final TypedMember member, final GenericListType type, final UserType itemType, final EnumTypeDeclaration decl) { StringConcatenation _builder = new StringConcatenation(); ImportHelper _imports = this.getImports(); _imports.addImport("java.util.List"); _builder.newLineIfNotEmpty(); ImportHelper _imports_1 = this.getImports(); _imports_1.addImport("java.util.ArrayList"); _builder.newLineIfNotEmpty(); ImportHelper _imports_2 = this.getImports(); _imports_2.addImport("com.robotoworks.mechanoid.internal.util.JsonToken"); _builder.newLineIfNotEmpty(); String _signature = ModelExtensions.signature(type); _builder.append(_signature, ""); _builder.append(" entityMember = new ArrayList"); String _signature_1 = ModelExtensions.signature(type); _builder.append(_signature_1, ""); _builder.append("();"); _builder.newLineIfNotEmpty(); _builder.newLine(); String _readerIdentifier = this.getReaderIdentifier(); _builder.append(_readerIdentifier, ""); _builder.append(".beginArray();"); _builder.newLineIfNotEmpty(); _builder.newLine(); _builder.append("while("); String _readerIdentifier_1 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_1, ""); _builder.append(".hasNext()) {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); String _innerSignature = ModelExtensions.innerSignature(type); _builder.append(_innerSignature, "\t"); _builder.append(" element = "); String _innerSignature_1 = ModelExtensions.innerSignature(type); _builder.append(_innerSignature_1, "\t"); _builder.append(".fromValue("); String _readerIdentifier_2 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_2, "\t"); _builder.append("."); String _resolveJsonReaderMethodName = ModelExtensions.resolveJsonReaderMethodName(decl); _builder.append(_resolveJsonReaderMethodName, "\t"); _builder.append("());"); _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("targetMember.add(element);"); _builder.newLine(); _builder.append("}"); _builder.newLine(); _builder.newLine(); String _readerIdentifier_3 = this.getReaderIdentifier(); _builder.append(_readerIdentifier_3, ""); _builder.append(".endArray();"); _builder.newLineIfNotEmpty(); _builder.newLine(); String _setMethodName = ModelExtensions.toSetMethodName(member); String _subjectIdentifier = this.getSubjectIdentifier(); String _memberize = ModelExtensions.memberize(_setMethodName, _subjectIdentifier); _builder.append(_memberize, ""); _builder.append("(entityMember);"); _builder.newLineIfNotEmpty(); return _builder; } public CharSequence genStatement(final Member skipMember) { if (skipMember instanceof SkipMember) { return _genStatement((SkipMember)skipMember); } else if (skipMember instanceof TypedMember) { return _genStatement((TypedMember)skipMember); } else { throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(skipMember).toString()); } } public CharSequence genStatementForType(final TypedMember member, final Type type) { if (type instanceof GenericListType) { return _genStatementForType(member, (GenericListType)type); } else if (type instanceof IntrinsicType) { return _genStatementForType(member, (IntrinsicType)type); } else if (type instanceof UserType) { return _genStatementForType(member, (UserType)type); } else { throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(member, type).toString()); } } public CharSequence genStatementForType(final TypedMember member, final UserType type, final UserTypeDeclaration decl) { if (decl instanceof ComplexTypeDeclaration) { return _genStatementForType(member, type, (ComplexTypeDeclaration)decl); } else if (decl instanceof EnumTypeDeclaration) { return _genStatementForType(member, type, (EnumTypeDeclaration)decl); } else { throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(member, type, decl).toString()); } } public CharSequence genStatementForGenericListType(final TypedMember member, final GenericListType type, final Type itemType) { if (itemType instanceof IntrinsicType) { return _genStatementForGenericListType(member, type, (IntrinsicType)itemType); } else if (itemType instanceof UserType) { return _genStatementForGenericListType(member, type, (UserType)itemType); } else { throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(member, type, itemType).toString()); } } public CharSequence genStatementForUserTypeGenericList(final TypedMember member, final GenericListType type, final UserType itemType, final UserTypeDeclaration decl) { if (decl instanceof ComplexTypeDeclaration) { return _genStatementForUserTypeGenericList(member, type, itemType, (ComplexTypeDeclaration)decl); } else if (decl instanceof EnumTypeDeclaration) { return _genStatementForUserTypeGenericList(member, type, itemType, (EnumTypeDeclaration)decl); } else { throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(member, type, itemType, decl).toString()); } } @Pure public ImportHelper getImports() { return this._imports; } public void setImports(final ImportHelper imports) { this._imports = imports; } @Pure public String getReaderIdentifier() { return this._readerIdentifier; } public void setReaderIdentifier(final String readerIdentifier) { this._readerIdentifier = readerIdentifier; } @Pure public String getSubjectIdentifier() { return this._subjectIdentifier; } public void setSubjectIdentifier(final String subjectIdentifier) { this._subjectIdentifier = subjectIdentifier; } @Pure public String getProviderIdentifier() { return this._providerIdentifier; } public void setProviderIdentifier(final String providerIdentifier) { this._providerIdentifier = providerIdentifier; } }