Skip to content

Commit 4bf1f85

Browse files
tsp arm, generate empty class for emptymodel (#2859)
* test case * fix * re-generate test code * refactor, subclass mappers * fix listByParent rename * remove unnecessary DPG mappers * fix empty model package-info * revert unnecessary change * re-generate test code * re-generate test code * format * make ModelPropertyMapper constructor protected --------- Co-authored-by: actions-user <[email protected]>
1 parent 092420c commit 4bf1f85

32 files changed

+726
-322
lines changed

fluent-tests/Initialize-Tests.ps1

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ $job = @(
138138
# stream-style-serialization
139139
"--version=$AUTOREST_CORE_VERSION $FLUENTLITE_ARGUMENTS --regenerate-pom=false --input-file=./swagger/stream-style-serialization.json --java.namespace=com.azure.mgmtlitetest.streamstyleserialization --stream-style-serialization=true"
140140

141+
# empty-model
142+
"--version=$AUTOREST_CORE_VERSION $FLUENTLITE_ARGUMENTS --regenerate-pom=false --input-file=./swagger/empty-model.json --java.namespace=com.azure.mgmtlitetest.emptymodel"
143+
141144
# "--version=$AUTOREST_CORE_VERSION $FLUENTLITE_ARGUMENTS --regenerate-pom=false https://raw.githubusercontent.com/Azure/azure-rest-api-specs/main/specification/network/resource-manager/readme.md --tag=package-2020-06 --java.namespace=com.azure.mgmtlitetest.network"
142145
# "--version=$AUTOREST_CORE_VERSION $FLUENTLITE_ARGUMENTS --regenerate-pom=false https://raw.githubusercontent.com/Azure/azure-rest-api-specs/main/specification/compute/resource-manager/readme.md --tag=package-2020-06-30 --java.namespace=com.azure.mgmtlitetest.compute"
143146
) | ForEach-Object -Parallel $generateScript -ThrottleLimit $Parallelization -AsJob
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
{
2+
"swagger": "2.0",
3+
"info": {
4+
"version": "2020-12-01",
5+
"title": "EmptyModel"
6+
},
7+
"schemes": ["https"],
8+
"consumes": ["application/json"],
9+
"produces": ["application/json"],
10+
"paths": {
11+
"/emptymodels": {
12+
"get": {
13+
"summary": "List emptymodels",
14+
"operationId": "emptymodels_List",
15+
"parameters": [],
16+
"responses": {
17+
"200": {
18+
"description": "Retrieved empty models",
19+
"schema": {
20+
"$ref": "#/definitions/EmptyModel"
21+
}
22+
}
23+
}
24+
},
25+
"put": {
26+
"summary": "Create emptymodel",
27+
"operationId": "emptymodels_Create",
28+
"parameters": [{
29+
"name": "emptymodel",
30+
"in": "body",
31+
"schema": {
32+
"$ref": "#/definitions/EmptyModel"
33+
},
34+
"required": true,
35+
"description": "The empty model."
36+
}],
37+
"responses": {
38+
"200": {
39+
"description": "Create empty models response",
40+
"schema": {
41+
"$ref": "#/definitions/EmptyModelResponse"
42+
}
43+
}
44+
}
45+
}
46+
}
47+
},
48+
"definitions": {
49+
"EmptyModel": {
50+
"description": "Empty model.",
51+
"type": "object"
52+
},
53+
"EmptyModelResponse": {
54+
"properties": {
55+
"emptyModel": {
56+
"$ref": "#/definitions/EmptyModel"
57+
}
58+
}
59+
}
60+
}
61+
}

fluentgen/src/main/java/com/azure/autorest/fluent/FluentGen.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262

6363
import java.util.ArrayList;
6464
import java.util.List;
65+
import java.util.Set;
6566
import java.util.stream.Collectors;
6667

6768
public class FluentGen extends Javagen {
@@ -321,6 +322,9 @@ protected FluentClient handleFluentLite(CodeModel codeModel, Client client, Flue
321322
// module-info
322323
javaPackage.addModuleInfo(fluentClient.getModuleInfo());
323324

325+
// package-info
326+
ensureModelsPackageInfos(javaPackage, fluentClient);
327+
324328
// POM
325329
if (javaSettings.isRegeneratePom()) {
326330
Pom pom = new FluentPomMapper().map(project);
@@ -359,6 +363,29 @@ protected FluentClient handleFluentLite(CodeModel codeModel, Client client, Flue
359363
return fluentClient;
360364
}
361365

366+
// Fix the case where there are no models but only resource collections.
367+
private void ensureModelsPackageInfos(FluentJavaPackage javaPackage, FluentClient fluentClient) {
368+
Set<String> packageInfos = fluentClient
369+
.getInnerClient().getPackageInfos()
370+
.stream()
371+
.map(PackageInfo::getPackage)
372+
.collect(Collectors.toSet());
373+
374+
for (FluentResourceCollection resourceCollection : fluentClient.getResourceCollections()) {
375+
String packageName = resourceCollection.getInterfaceType().getPackage();
376+
if (!packageInfos.contains(packageName)) {
377+
javaPackage.addPackageInfo(
378+
packageName,
379+
"package-info",
380+
new PackageInfo(
381+
packageName,
382+
String.format("Package containing the data models for %s.\n%s", fluentClient.getInnerClient().getClientName(),
383+
fluentClient.getInnerClient().getClientDescription())));
384+
packageInfos.add(packageName);
385+
}
386+
}
387+
}
388+
362389
void clear() {
363390
FluentStatic.setClient(null);
364391
FluentStatic.setFluentClient(null);

javagen/src/main/java/com/azure/autorest/mapper/ModelMapper.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
import java.util.stream.Collectors;
3939
import java.util.stream.Stream;
4040

41-
public class ModelMapper implements IMapper<ObjectSchema, ClientModel> {
41+
public class ModelMapper implements IMapper<ObjectSchema, ClientModel>, NeedsPlainObjectCheck {
4242
private static final ModelMapper INSTANCE = new ModelMapper();
4343
private final ClientModels serviceModels = ClientModels.getInstance();
4444

@@ -59,7 +59,7 @@ public ClientModel map(ObjectSchema compositeType) {
5959
ClassType modelType = objectMapper.map(compositeType);
6060
String modelName = modelType.getName();
6161
ClientModel result = serviceModels.getModel(modelType.getName());
62-
if (result == null && !ObjectMapper.isPlainObject(compositeType)) {
62+
if (result == null && !isPlainObject(compositeType)) {
6363
Set<ImplementationDetails.Usage> usages = SchemaUtil.mapSchemaContext(compositeType.getUsage());
6464
if (isPredefinedModel(modelType)) {
6565
// TODO (weidxu): a more consistent handling of external model for all data-plane
@@ -603,7 +603,7 @@ private List<ClientModelPropertyReference> collectPropertiesFromFlattenedModel(
603603
}
604604
} else {
605605
// nested flattened model
606-
if (property1.getSchema() instanceof ObjectSchema && !ObjectMapper.isPlainObject((ObjectSchema) property.getSchema())) {
606+
if (property1.getSchema() instanceof ObjectSchema && !isPlainObject((ObjectSchema) property.getSchema())) {
607607
ClientModelProperty modelProperty1 = Mappers.getModelPropertyMapper().map(property1);
608608
List<ClientModelPropertyReference> nestedReferences = collectPropertiesFromFlattenedModel(
609609
objectSchema1, property1, modelProperty1, existingPropertyReferences);

javagen/src/main/java/com/azure/autorest/mapper/ModelPropertyMapper.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,16 @@
2424
import java.util.Locale;
2525
import java.util.stream.Collectors;
2626

27-
public class ModelPropertyMapper implements IMapper<Property, ClientModelProperty> {
27+
public class ModelPropertyMapper implements IMapper<Property, ClientModelProperty>, NeedsPlainObjectCheck {
2828
private static final ModelPropertyMapper INSTANCE = new ModelPropertyMapper();
2929

30-
private ModelPropertyMapper() {
31-
}
32-
3330
public static ModelPropertyMapper getInstance() {
3431
return INSTANCE;
3532
}
3633

34+
protected ModelPropertyMapper() {
35+
}
36+
3737
@Override
3838
public ClientModelProperty map(Property property) {
3939
return map(property, false);
@@ -90,7 +90,7 @@ public ClientModelProperty map(Property property, boolean mutableAsOptional) {
9090

9191
if (property.getExtensions() != null && property.getExtensions().isXmsClientFlatten()
9292
// avoid non-object schema or a plain object schema without any properties
93-
&& property.getSchema() instanceof ObjectSchema && !ObjectMapper.isPlainObject((ObjectSchema) property.getSchema())
93+
&& property.getSchema() instanceof ObjectSchema && !isPlainObject((ObjectSchema) property.getSchema())
9494
&& settings.getClientFlattenAnnotationTarget() == JavaSettings.ClientFlattenAnnotationTarget.NONE) {
9595
// avoid naming conflict
9696
builder.name("inner" + CodeNamer.toPascalCase(property.getLanguage().getJava().getName()));
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
package com.azure.autorest.mapper;
5+
6+
import com.azure.autorest.extension.base.model.codemodel.ObjectSchema;
7+
import com.azure.autorest.extension.base.plugin.JavaSettings;
8+
9+
public interface NeedsPlainObjectCheck {
10+
/**
11+
* Check that the type can be regarded as a plain java.lang.Object.
12+
*
13+
* @param compositeType The type to check.
14+
*/
15+
default boolean isPlainObject(ObjectSchema compositeType) {
16+
return !JavaSettings.getInstance().isDataPlaneClient()
17+
&& compositeType.getProperties().isEmpty() && compositeType.getDiscriminator() == null
18+
&& compositeType.getParents() == null && compositeType.getChildren() == null
19+
&& (compositeType.getExtensions() == null || compositeType.getExtensions().getXmsEnum() == null);
20+
}
21+
}

javagen/src/main/java/com/azure/autorest/mapper/ObjectMapper.java

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import java.util.Map;
1414
import java.util.concurrent.ConcurrentHashMap;
1515

16-
public class ObjectMapper implements IMapper<ObjectSchema, IType> {
16+
public class ObjectMapper implements IMapper<ObjectSchema, IType>, NeedsPlainObjectCheck {
1717
private static final ObjectMapper INSTANCE = new ObjectMapper();
1818
Map<ObjectSchema, ClassType> parsed = new ConcurrentHashMap<>();
1919

@@ -77,18 +77,6 @@ private ClassType createClassType(ObjectSchema compositeType) {
7777
.build();
7878
}
7979

80-
/**
81-
* Check that the type can be regarded as a plain java.lang.Object.
82-
*
83-
* @param compositeType The type to check.
84-
*/
85-
public static boolean isPlainObject(ObjectSchema compositeType) {
86-
return !JavaSettings.getInstance().isDataPlaneClient()
87-
&& compositeType.getProperties().isEmpty() && compositeType.getDiscriminator() == null
88-
&& compositeType.getParents() == null && compositeType.getChildren() == null
89-
&& (compositeType.getExtensions() == null || compositeType.getExtensions().getXmsEnum() == null);
90-
}
91-
9280
/**
9381
* Extension for predefined types in azure-core.
9482
*

typespec-extension/src/main/java/com/azure/autorest/TypeSpecPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
import com.azure.autorest.mapper.Mappers;
1111
import com.azure.autorest.model.clientmodel.AsyncSyncClient;
1212
import com.azure.autorest.model.clientmodel.Client;
13-
import com.azure.autorest.model.clientmodel.ConvenienceMethod;
1413
import com.azure.autorest.model.clientmodel.ClientModel;
14+
import com.azure.autorest.model.clientmodel.ConvenienceMethod;
1515
import com.azure.autorest.model.javamodel.JavaPackage;
1616
import com.azure.autorest.preprocessor.Preprocessor;
1717
import com.azure.autorest.preprocessor.tranformer.Transformer;

typespec-extension/src/main/java/com/azure/autorest/fluent/TypeSpecFluentMapperFactory.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55

66
import com.azure.autorest.fluent.mapper.FluentMapperFactory;
77
import com.azure.autorest.mapper.ClientMapper;
8+
import com.azure.autorest.mapper.ModelMapper;
9+
import com.azure.autorest.mapper.ModelPropertyMapper;
10+
import com.azure.autorest.mapper.ObjectMapper;
811
import com.azure.autorest.mapper.PrimitiveMapper;
912
import com.azure.typespec.mapper.TypeSpecClientMapper;
1013
import com.azure.typespec.mapper.TypeSpecPrimitiveMapper;
@@ -19,4 +22,19 @@ public ClientMapper getClientMapper() {
1922
public PrimitiveMapper getPrimitiveMapper() {
2023
return TypeSpecPrimitiveMapper.getInstance();
2124
}
25+
26+
@Override
27+
public ObjectMapper getObjectMapper() {
28+
return TypeSpecFluentObjectMapper.getInstance();
29+
}
30+
31+
@Override
32+
public ModelMapper getModelMapper() {
33+
return TypeSpecFluentModelMapper.getInstance();
34+
}
35+
36+
@Override
37+
public ModelPropertyMapper getModelPropertyMapper() {
38+
return TypeSpecFluentModelPropertyMapper.getInstance();
39+
}
2240
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
package com.azure.autorest.fluent;
5+
6+
import com.azure.autorest.extension.base.model.codemodel.ObjectSchema;
7+
import com.azure.autorest.fluent.mapper.FluentModelMapper;
8+
9+
public class TypeSpecFluentModelMapper extends FluentModelMapper {
10+
private static final TypeSpecFluentModelMapper INSTANCE = new TypeSpecFluentModelMapper();
11+
12+
public static TypeSpecFluentModelMapper getInstance() {
13+
return INSTANCE;
14+
}
15+
16+
@Override
17+
public boolean isPlainObject(ObjectSchema compositeType) {
18+
return false;
19+
}
20+
}

0 commit comments

Comments
 (0)