/** * Copyright 2004-2016 Riccardo Solmi. All rights reserved. * This file is part of the Whole Platform. * * The Whole Platform is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The Whole Platform is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>. */ package org.whole.lang.visitors; import static org.whole.gen.lang.ClassNames.CompositeColumnPartName; import static org.whole.gen.lang.ClassNames.PlaceHolderPartName; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.jdt.core.dom.CompilationUnit; import org.whole.gen.lang.LanguageGenerator; import org.whole.gen.lang.model.AbstractEntityBuilder; import org.whole.gen.lang.model.SimpleEntityInterfaceBuilder; import org.whole.gen.lang.model.adapters.EntityAdapterBuilder; import org.whole.gen.lang.model.impl.SimpleEntityImplBuilder; import org.whole.lang.iterators.AbstractPatternFilterIterator; import org.whole.lang.iterators.IEntityIterator; import org.whole.lang.iterators.IteratorFactory; import org.whole.lang.matchers.Matcher; import org.whole.lang.model.AbstractBagCompositeEntity; import org.whole.lang.model.AbstractCollectionCompositeEntity; import org.whole.lang.model.AbstractListCompositeEntity; import org.whole.lang.model.AbstractSetCompositeEntity; import org.whole.lang.model.AbstractUniqueListCompositeEntity; import org.whole.lang.model.adapters.AbstractCollectionEntityAdapter; import org.whole.lang.model.adapters.AbstractListEntityAdapter; import org.whole.lang.model.adapters.AbstractSetEntityAdapter; import org.whole.lang.models.model.ComponentModifier; import org.whole.lang.models.model.ComponentModifierEnum; import org.whole.lang.models.model.ComponentModifiers; import org.whole.lang.models.model.CompositeEntity; import org.whole.lang.models.model.DataEntity; import org.whole.lang.models.model.EntityModifier; import org.whole.lang.models.model.EntityModifierEnum; import org.whole.lang.models.model.EntityModifiers; import org.whole.lang.models.model.EnumEntity; import org.whole.lang.models.model.EnumValues; import org.whole.lang.models.model.Feature; import org.whole.lang.models.model.FeatureModifier; import org.whole.lang.models.model.FeatureModifierEnum; import org.whole.lang.models.model.FeatureModifiers; import org.whole.lang.models.model.Features; import org.whole.lang.models.model.ForeignType; import org.whole.lang.models.model.IModelsEntity; import org.whole.lang.models.model.MapEntity; import org.whole.lang.models.model.Model; import org.whole.lang.models.model.ModelDeclaration; import org.whole.lang.models.model.ModelDeclarations; import org.whole.lang.models.model.SimpleEntity; import org.whole.lang.models.model.SimpleName; import org.whole.lang.models.model.SubtypesOf; import org.whole.lang.models.model.SupertypesOf; import org.whole.lang.models.model.TypeAliasOf; import org.whole.lang.models.model.TypeRelations; import org.whole.lang.models.model.Types; import org.whole.lang.models.reflect.ModelsEntityDescriptorEnum; import org.whole.lang.models.util.ModelInfo; import org.whole.lang.models.visitors.ModelsIdentityVisitor; import org.whole.lang.operations.IOperationProgressMonitor; import org.whole.lang.operations.JavaCompilerOperation; import org.whole.lang.util.DataTypeUtils; import org.whole.lang.util.EntityUtils; import org.whole.lang.util.FreshNameGenerator; import org.whole.lang.util.StringUtils; /** * @author Riccardo Solmi */ public class ModelsJavaModelGeneratorVisitor extends ModelsIdentityVisitor { private LanguageGenerator modelsGen; private ModelInfo modelInfo; private AbstractEntityBuilder anyEntityBuilder; private EntityAdapterBuilder entityAdapterBuilder; private SimpleEntityImplBuilder simpleEntityBuilder; private SimpleEntityInterfaceBuilder simpleEntityInterfaceBuilder; private Set<String> entityModifiers = new HashSet<String>(); private Set<String> featureModifiers = new HashSet<String>(); private Set<String> compositeModifiers = new HashSet<String>(); private String metaName; private String entityName; private String qEntityName; private boolean isConcrete; private boolean hasUI = false; public void setTestCU(CompilationUnit cu) { modelsGen.cuList.remove(cu); modelsGen.cuList.add(0, cu); } private String findFirstConcreteEntity(ModelDeclarations declarations) { IEntityIterator<ModelDeclaration> i = IteratorFactory.<ModelDeclaration>childIterator(); i.reset(declarations); for (ModelDeclaration declaration : i) { String name = declaration.getName().wStringValue(); if (!modelInfo.abstractTypes.contains(name)) return name; } ModelDeclaration firstModelDeclaration = (ModelDeclaration) declarations.wGet(0); return firstModelDeclaration.getName().wStringValue(); } private void beforeModel(Model model) { String modelName = model.getName().wStringValue(); String rootEntityName = findFirstConcreteEntity(model.getDeclarations()); modelsGen = (LanguageGenerator) ((JavaCompilerOperation) getOperation()).getGenerator(); if (!EntityUtils.isResolver(model.getUri())) modelsGen.setURI(model.getUri().getValue()); if (!EntityUtils.isResolver(model.getVersion())) modelsGen.setVersion(model.getVersion().getValue()); String packagePrefix = EntityUtils.isResolver(model.getNamespace()) ? modelsGen.getBasePackagePrefix()+"."+modelName.toLowerCase() : model.getNamespace().getValue(); modelsGen.setPackagePrefix(packagePrefix); modelsGen.setModelName(modelName); modelsGen.setTopEntityName(rootEntityName, modelInfo.entityImplName(rootEntityName)); modelsGen.languageDeployerBuilder(); modelsGen.languageKitBuilder(); if (hasUI) modelsGen.editorKitBuilder(); } private void afterModel() { modelsGen.strictImplRegistryBuilder();//FIXME workaround modelsGen.featureDescriptorEnumBuilder(); // modelsGen.prototypeManagerBuilder().addPrototypesUsingLanguageFactory(); modelsGen.templateManagerBuilder(); if (hasUI) { modelsGen.actionFactoryBuilder(); modelsGen.commandFactoryBuilder(); Set<String> allTypes = new HashSet<String>(modelsGen.getAllTypes()); for (String type : allTypes) { Set<String> implementations = modelInfo.allConcreteSubTypes(type); for (String concreteType : implementations) modelsGen.commandFactoryBuilder().addOverSimpleConstraint(concreteType, type); } Set<String> componentTypes = new HashSet<String>(); for (Map.Entry<String, String> e : modelsGen.getCompositesEntrySet()) { String compositeType = e.getKey(); Set<String> implementations = modelInfo.allConcreteSubTypes(e.getValue()); for (String componentType : implementations) { if (componentTypes.add(componentType)) modelsGen.actionFactoryBuilder().addAction(componentType); modelsGen.commandFactoryBuilder().addOverCompositeConstraint(componentType, compositeType); } } modelsGen.actionFactoryBuilder().assertAllEntities(); } } public void visit(Model modelOrig) { Model model = EntityUtils.clone(modelOrig); modelInfo = new ModelInfo(model); modelInfo.addInheritedFeatures(model); modelInfo.addUndeclaredTypes(model); modelInfo.sortFeatures(model); beforeModel(model); modelsGen.visitorsBuilder(); modelsGen.entityInterfaceBuilder(); modelsGen.entityFactoryBuilder(); if (hasUI) modelsGen.partFactoryVisitorBuilder(); model.getDeclarations().accept(this); model.getTypeRelations().accept(this); // modelsGen.applyTypeDeclarations(); afterModel(); } public void visit(ModelDeclarations modelBody) { IOperationProgressMonitor progressMonitor = getOperation().getProgressMonitor(); progressMonitor.beginTask("Building entities", IOperationProgressMonitor.TOTAL_WORK, modelBody.wSize()); for (int i=0, size=modelBody.wSize(); i<size; i++) { ((IModelsEntity) modelBody.wGet(i)).accept(this); progressMonitor.worked(1); handleCancelRequest(); } progressMonitor.endTask(); } public void visit(EntityModifiers entity) { for (int i = 0; i < entity.wSize(); i++) ((EntityModifier) entity.wGet(i)).accept(this); } public void visit(EntityModifier entity) { entityModifiers.add(entity.getValue().getName().toUpperCase()); if (EntityModifierEnum._abstract.equals(entity.getValue())) isConcrete = false; } public void visit(FeatureModifiers entity) { for (int i = 0; i < entity.wSize(); i++) ((FeatureModifier) entity.wGet(i)).accept(this); } public void visit(FeatureModifier entity) { featureModifiers.add(entity.getValue().getName().toUpperCase()); } public void visit(ComponentModifiers entity) { for (int i = 0; i < entity.wSize(); i++) ((ComponentModifier) entity.wGet(i)).accept(this); } public void visit(ComponentModifier entity) { compositeModifiers.add(entity.getValue().getName().toUpperCase()); } public void visit(Types types) { AbstractPatternFilterIterator<SimpleName> i = IteratorFactory.<SimpleName>childMatcherIterator() .withPattern(ModelsEntityDescriptorEnum.SimpleName); i.reset(types); for (SimpleName name : i) { String typeName = name.wStringValue(); anyEntityBuilder.addTypeDeclaration(typeName); modelsGen.visitorsBuilder().addType(entityName, typeName); } } public void visit(SimpleEntity entity) { entityModifiers.clear(); isConcrete = true; entity.getModifiers().accept(this); metaName = entity.getName().wStringValue(); entityName = modelInfo.entityImplName(metaName);//was entity.getName().wStringValue(); qEntityName = modelsGen.entityInterfaceQName(entityName); if (isConcrete) simpleEntityBuilder = modelsGen.simpleEntityBuilder(entityName); anyEntityBuilder = simpleEntityInterfaceBuilder = modelsGen.simpleEntityInterfaceBuilder(entityName); //before factoryBuilder if (!entityName.equals(modelsGen.entityVariableName())) { entityAdapterBuilder = modelsGen.entityAdapterBuilder(entityName); modelsGen.adapterRegistryBuilder().addFactoryProduct(entityName); if (isConcrete) modelsGen.implRegistryBuilder().addFactoryProduct(entityName); } Features features = entity.getFeatures(); if (isConcrete) modelsGen.entityFactoryBuilder().addFactoryMethodWithBuild(entityName, features.wIsEmpty() ? 0 : features.wSize()); modelsGen.entityDescriptorEnumBuilder().addSimpleEntity( entityName, metaName, qEntityName, entityModifiers, modelInfo.entityImplNames(modelInfo.allSubTypes(metaName))); // modelsGen.entityDescriptorEnumBuilder().addSupertypes(qEntityName, metaName, modelInfo.allSuperTypes(metaName)); entity.getTypes().accept(this); features.accept(this); if (isConcrete) { simpleEntityBuilder.endBody(); modelsGen.visitorsBuilder().addSimpleEntity(entityName); if (hasUI) modelsGen.partFactoryVisitorBuilder().addPartFactoryVisitMethod(entityName, features.wSize()); } } public void visit(Features entity) { for (int i = 0; i < entity.wSize(); i++) ((Feature) entity.wGet(i)).accept(this); } public void visit(Feature feature) { String name = feature.getName().wStringValue(); String fName = modelInfo.featureImplName(name);//was StringUtils.javaKeywordFilter(name); String type = feature.getType().wStringValue(); String fType = modelInfo.entityImplName(type); String fQType = modelsGen.entityInterfaceQName(fType); String oName = null; String ofName = null; SimpleName oppositeName = feature.getOppositeName(); if (DataTypeUtils.getDataKind(oppositeName).isString()) { oName = oppositeName.getValue(); ofName = modelInfo.featureImplName(oName);//was StringUtils.javaKeywordFilter(oName); } FeatureModifiers mods = feature.getModifiers(); featureModifiers.clear(); mods.accept(this); boolean isByReference = mods.wContainsValue(FeatureModifierEnum.reference); if (isConcrete) simpleEntityBuilder.addField(fType, fName, name, mods.wContainsValue(FeatureModifierEnum.id), mods.wContainsValue(FeatureModifierEnum.optional), isByReference, mods.wContainsValue(FeatureModifierEnum.shared), mods.wContainsValue(FeatureModifierEnum.derived)); if (modelInfo.isNotInherited(metaName, name)) simpleEntityInterfaceBuilder.addField(fType, fName, name); modelsGen.modelContextBuilder().addFeature(fType, fName); modelsGen.visitorsBuilder().addFeature(entityName, fType, fName, name, isByReference); modelsGen.entityDescriptorEnumBuilder().addFeature(qEntityName, fType, fName, ofName, featureModifiers); modelsGen.featureDescriptorEnumBuilder().addFeature(fType, fName, name); if (oName != null) modelsGen.featureDescriptorEnumBuilder().addFeature(entityName, ofName, oName); if (isConcrete) modelsGen.entityFactoryBuilder().addFactoryMethodCase(fQType, fName); entityAdapterBuilder.addFeature(fType, fName, name); } public void visit(CompositeEntity entity) { entityModifiers.clear(); isConcrete = true; entity.getModifiers().accept(this); metaName = entity.getName().wStringValue(); entityName = modelInfo.entityImplName(metaName);//was entity.getName().wStringValue(); qEntityName = modelsGen.entityInterfaceQName(entityName); String specificComponentType = entity.getComponentType().wStringValue(); String componentType = specificComponentType; String componentQType = modelsGen.entityInterfaceQName(componentType); // if (singleFeature.getCardinality().isOptional()) modelsGen.putOptionalEntity(componentType); String compositeType, javaCompositeType, abstractAdapterType; ComponentModifiers modifiers = entity.getComponentModifiers(); compositeModifiers.clear(); modifiers.accept(this); modelsGen.putComposite(entityName, componentType); simpleEntityBuilder = null; boolean isByReference = modifiers.wContainsValue(ComponentModifierEnum.reference); boolean isUnique = modifiers.wContainsValue(ComponentModifierEnum.unique); boolean isOrdered = modifiers.wContainsValue(ComponentModifierEnum.ordered); boolean hasStrict = isUnique || !isOrdered; if (hasStrict) { if (isUnique) { if (isOrdered) { compositeType = AbstractUniqueListCompositeEntity.class.getName(); javaCompositeType = List.class.getName(); abstractAdapterType = AbstractListEntityAdapter.class.getName(); } else { compositeType = AbstractSetCompositeEntity.class.getName(); javaCompositeType = Set.class.getName(); abstractAdapterType = AbstractSetEntityAdapter.class.getName(); } } else { compositeType = AbstractBagCompositeEntity.class.getName(); javaCompositeType = Collection.class.getName(); abstractAdapterType = AbstractCollectionEntityAdapter.class.getName(); } modelsGen.compositeEntityBuilder(entityName, componentType, compositeType, isByReference, true); compositeType = AbstractCollectionCompositeEntity.class.getName(); } else { compositeType = AbstractListCompositeEntity.class.getName(); javaCompositeType = List.class.getName(); abstractAdapterType = AbstractListEntityAdapter.class.getName(); } modelsGen.compositeEntityBuilder(entityName, componentType, compositeType, isByReference, false); anyEntityBuilder = modelsGen.compositeEntityInterfaceBuilder(entityName, componentType, javaCompositeType); entityAdapterBuilder = modelsGen.compositeEntityAdapterBuilder(entityName, abstractAdapterType, componentType); modelsGen.adapterRegistryBuilder().addFactoryProduct(entityName); modelsGen.implRegistryBuilder().addFactoryProduct(entityName); if (hasStrict) modelsGen.strictImplRegistryBuilder().addFactoryProduct(entityName); entity.getTypes().accept(this); modelsGen.visitorsBuilder().addCompositeEntity(entityName, componentType, isOrdered, isByReference); if (hasUI) modelsGen.partFactoryVisitorBuilder().addPartFactoryVisitMethod(entityName, CompositeColumnPartName); modelsGen.entityFactoryBuilder().addFactoryMethodWithVarArgsCase( entityName, componentQType, "entities"); modelsGen.entityDescriptorEnumBuilder().addCompositeEntity(entityName, metaName, qEntityName, entityModifiers, specificComponentType, compositeModifiers); // modelsGen.entityDescriptorEnumBuilder().addSupertypes(qEntityName, metaName, modelInfo.allSuperTypes(metaName)); } public void visit(MapEntity entity) { entityModifiers.clear(); isConcrete = true; entity.getModifiers().accept(this); metaName = entity.getName().wStringValue(); entityName = modelInfo.entityImplName(metaName);//was entity.getName().wStringValue(); qEntityName = modelsGen.entityInterfaceQName(entityName); String specificKeyType = entity.getKeyType().wStringValue(); String keyType = specificKeyType; String specificValueType = entity.getValueType().wStringValue(); String valueType = specificValueType; modelsGen.putOptionalEntity(keyType); modelsGen.putOptionalEntity(valueType); simpleEntityBuilder = null; modelsGen.mapEntityBuilder(entityName, keyType, valueType, true); anyEntityBuilder = modelsGen.mapEntityInterfaceBuilder(entityName, keyType, valueType); entityAdapterBuilder = modelsGen.mapEntityAdapterBuilder(entityName, keyType, valueType); modelsGen.adapterRegistryBuilder().addFactoryProduct(entityName); modelsGen.implRegistryBuilder().addFactoryProduct(entityName); entity.getTypes().accept(this); modelsGen.visitorsBuilder().addMapEntity(entityName, keyType, valueType); if (hasUI) modelsGen.partFactoryVisitorBuilder().addPartFactoryVisitMethod(entityName, CompositeColumnPartName); modelsGen.entityFactoryBuilder().addFactoryMethodWithMapCase(entityName, keyType, valueType); modelsGen.entityDescriptorEnumBuilder().addMapEntity(entityName, metaName, entityModifiers, specificKeyType, specificValueType); // modelsGen.entityDescriptorEnumBuilder().addSupertypes(qEntityName, metaName, modelInfo.allSuperTypes(metaName)); } public void visit(DataEntity entity) { entityModifiers.clear(); isConcrete = true; entity.getModifiers().accept(this); metaName = entity.getName().wStringValue(); entityName = modelInfo.entityImplName(metaName);//was entity.getName().wStringValue(); qEntityName = modelsGen.entityInterfaceQName(entityName); String valueType = entity.getDataType().wStringValue(); String valueName = "value"; simpleEntityBuilder = null; modelsGen.primitiveEntityBuilder(entityName, valueType, valueName); anyEntityBuilder = modelsGen.primitiveEntityInterfaceBuilder(entityName, valueType, valueName); modelsGen.entityDescriptorEnumBuilder().addDataEntity( entityName, metaName, qEntityName, entityModifiers, valueType, valueName); // modelsGen.entityDescriptorEnumBuilder().addSupertypes(qEntityName, metaName, modelInfo.allSuperTypes(metaName)); // modelsGen.featureDescriptorEnumBuilder().addFeature(entityName, valueType, valueName); entityAdapterBuilder = modelsGen.entityAdapterBuilder(entityName); entityAdapterBuilder.addDataFeature(valueType, "value"); modelsGen.adapterRegistryBuilder().addFactoryProduct(entityName); modelsGen.implRegistryBuilder().addFactoryProduct(entityName); entity.getTypes().accept(this); modelsGen.visitorsBuilder().addPrimitiveEntity(entityName); modelsGen.visitorsBuilder().addPrimitiveFeature(entityName, valueType, valueName); modelsGen.entityFactoryBuilder().addFactoryMethodWithCase( entityName, valueType, valueName, true); if (hasUI) { modelsGen.newDataCommandBuilder(entityName, valueType, valueName); if (StringUtils.isPrimitiveOrString(valueType)) { modelsGen.partFactoryVisitorBuilder().addPartFactoryVisitMethod(entityName); modelsGen.newDataDirectEditPolicyBuilder(entityName, valueType, valueName); modelsGen.newDataPartBuilder(entityName, valueType, valueName); } else { modelsGen.partFactoryVisitorBuilder().addPartFactoryVisitMethod(entityName, PlaceHolderPartName); } } } public void visit(EnumEntity entity) { entityModifiers.clear(); isConcrete = true; entity.getModifiers().accept(this); metaName = entity.getName().wStringValue(); entityName = modelInfo.entityImplName(metaName);//was entity.getName().wStringValue(); qEntityName = modelsGen.entityInterfaceQName(entityName); String enumTypeName = entityName+"Enum"; String valueDataType = enumTypeName+".Value"; String valueQDataType = modelsGen.modelPackage()+"."+valueDataType; org.whole.gen.lang.model.EnumTypeBuilder enumBuilder = modelsGen.enumTypeBuilder(enumTypeName, valueQDataType); EnumValues values = entity.getValues(); FreshNameGenerator enumValueGen = new FreshNameGenerator(); for (int i=0, size=values.wSize(); i<size; i++) { String value = values.wGet(i).wStringValue(); if (StringUtils.isValidEnumLiteralName(value)) enumValueGen.putBoundName(value); } for (int i=0, size=values.wSize(); i<size; i++) { if (EntityUtils.isData(values.wGet(i))) { String value = values.wGet(i).wStringValue(); enumBuilder.addValue(value, enumValueGen.isBoundOnlyName(value) ? value : enumValueGen.nextFreshName(StringUtils.toEnumLiteralName(value))); } } entityAdapterBuilder = modelsGen.entityAdapterBuilder(entityName); entityAdapterBuilder.addDataFeature(valueQDataType, "value"); modelsGen.adapterRegistryBuilder().addFactoryProduct(entityName); modelsGen.implRegistryBuilder().addFactoryProduct(entityName); buildEnumEntity(entityName, metaName, valueQDataType, valueDataType); entity.getTypes().accept(this); } private void buildEnumEntity(String entityName, String metaName, String valueQDataType, String valueDataType) { qEntityName = modelsGen.entityInterfaceQName(entityName); simpleEntityBuilder = null; String valueName = "value"; modelsGen.primitiveEntityBuilder(entityName, valueQDataType, valueName); anyEntityBuilder = modelsGen.primitiveEntityInterfaceBuilder(entityName, valueQDataType, valueName); modelsGen.entityDescriptorEnumBuilder().addDataEntity(entityName, metaName, qEntityName, entityModifiers, valueDataType, valueName); // modelsGen.entityDescriptorEnumBuilder().addSupertypes(qEntityName, metaName, modelInfo.allSuperTypes(metaName)); // modelsGen.featureDescriptorEnumBuilder().addFeature(qEntityName, valueQDataType, valueName); modelsGen.visitorsBuilder().addEnumEntity(entityName, valueQDataType, valueName); modelsGen.entityFactoryBuilder().addFactoryMethodWithCase( entityName, valueQDataType, valueName); if (hasUI) { modelsGen.newDataCommandBuilder(entityName, valueQDataType, valueName); modelsGen.partFactoryVisitorBuilder().addPartFactoryVisitMethod(entityName); modelsGen.newDataPartBuilder(entityName, valueQDataType, valueName); modelsGen.newEnumDirectEditPolicyBuilder(entityName, valueQDataType, valueName); } } public void visit(TypeRelations entity) { for (int i = 0; i < entity.size(); i++) entity.get(i).accept(this); } public void visit(SupertypesOf entity) { List<String> types = new ArrayList<String>(); AbstractPatternFilterIterator<SimpleName> i = IteratorFactory.<SimpleName>childMatcherIterator() .withPattern(ModelsEntityDescriptorEnum.SimpleName); i.reset(entity.getTypes()); for (SimpleName name : i) types.add(name.wStringValue()); ForeignType foreignType = entity.getForeignType(); if (Matcher.matchImpl(ModelsEntityDescriptorEnum.AnyType, foreignType)) modelsGen.entityDescriptorEnumBuilder().addSetAssignableFromAll(types.toArray(new String[types.size()])); else modelsGen.entityDescriptorEnumBuilder().addSetAssignableFromForeignType(foreignType.wStringValue(), types.toArray(new String[types.size()])); }; public void visit(SubtypesOf entity) { List<String> types = new ArrayList<String>(); AbstractPatternFilterIterator<SimpleName> i = IteratorFactory.<SimpleName>childMatcherIterator() .withPattern(ModelsEntityDescriptorEnum.SimpleName); i.reset(entity.getTypes()); for (SimpleName name : i) types.add(name.wStringValue()); ForeignType foreignType = entity.getForeignType(); if (Matcher.matchImpl(ModelsEntityDescriptorEnum.AnyType, foreignType)) modelsGen.entityDescriptorEnumBuilder().addSetAssignableToAll(types.toArray(new String[types.size()])); else modelsGen.entityDescriptorEnumBuilder().addSetAssignableToForeignType(foreignType.wStringValue(), types.toArray(new String[types.size()])); }; @Override public void visit(TypeAliasOf entity) { modelsGen.entityDescriptorEnumBuilder().addSetAliasOf(entity.getForeignType().getValue(), entity.getType().wStringValue()); } }