Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
weidongxu-microsoft committed Sep 5, 2024
1 parent ad635d9 commit 21863a4
Show file tree
Hide file tree
Showing 33 changed files with 1,920 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.microsoft.typespec.http.client.generator.core.extension.plugin.PluginLogger;
import com.microsoft.typespec.http.client.generator.core.mapper.Mappers;
import com.microsoft.typespec.http.client.generator.core.mapper.PomMapper;
import com.microsoft.typespec.http.client.generator.core.mapper.android.AndroidMapperFactory;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.AsyncSyncClient;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.Client;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientBuilder;
Expand All @@ -36,6 +37,8 @@
import com.microsoft.typespec.http.client.generator.core.model.xmlmodel.XmlFile;
import com.microsoft.typespec.http.client.generator.core.postprocessor.Postprocessor;
import com.microsoft.typespec.http.client.generator.core.preprocessor.Preprocessor;
import com.microsoft.typespec.http.client.generator.core.template.Templates;
import com.microsoft.typespec.http.client.generator.core.template.android.AndroidTemplateFactory;
import com.microsoft.typespec.http.client.generator.core.util.ClientModelUtil;
import com.microsoft.typespec.http.client.generator.core.util.SchemaUtil;
import com.azure.core.util.CoreUtils;
Expand Down Expand Up @@ -73,7 +76,10 @@ public boolean processInternal() {
this.clear();

JavaSettings settings = JavaSettings.getInstance();
return settings.isAndroid() ? generateAndroid(settings) : generateJava(settings);
}

private boolean generateJava(JavaSettings settings) {
try {
// Step 1: Parse input yaml as CodeModel
CodeModel codeModel = new Preprocessor(this, connection, pluginName, sessionId)
Expand Down Expand Up @@ -110,6 +116,100 @@ public boolean processInternal() {
return true;
}

private boolean generateAndroid(JavaSettings settings) {
try {
// Step 1: Parse input yaml as CodeModel
CodeModel codeModel = new Preprocessor(this, connection, pluginName, sessionId)
.processCodeModel();

// Step 2: Map
Mappers.setFactory(new AndroidMapperFactory());
Client client = Mappers.getClientMapper().map(codeModel);

// Step 3: Write to templates
Templates.setFactory(new AndroidTemplateFactory());
JavaPackage javaPackage = new JavaPackage(this);
// Service client
javaPackage
.addServiceClient(client.getServiceClient().getPackage(), client.getServiceClient().getClassName(),
client.getServiceClient());

if (JavaSettings.getInstance().isGenerateClientInterfaces()) {
javaPackage
.addServiceClientInterface(client.getServiceClient().getInterfaceName(), client.getServiceClient());
}

// Async/sync service clients
for (AsyncSyncClient asyncClient : client.getAsyncClients()) {
javaPackage.addAsyncServiceClient(asyncClient.getPackageName(), asyncClient);
}

for (AsyncSyncClient syncClient : client.getSyncClients()) {
javaPackage.addSyncServiceClient(syncClient.getPackageName(), syncClient);
}

// Service client builder
for (ClientBuilder clientBuilder : client.getClientBuilders()) {
javaPackage.addServiceClientBuilder(clientBuilder);
}

// Method group
for (MethodGroupClient methodGroupClient : client.getServiceClient().getMethodGroupClients()) {
javaPackage.addMethodGroup(methodGroupClient.getPackage(), methodGroupClient.getClassName(),
methodGroupClient);
if (JavaSettings.getInstance().isGenerateClientInterfaces()) {
javaPackage.addMethodGroupInterface(methodGroupClient.getInterfaceName(), methodGroupClient);
}
}

// Response
for (ClientResponse response : client.getResponseModels()) {
javaPackage.addClientResponse(response.getPackage(), response.getName(), response);
}

// Client model
for (ClientModel model : client.getModels()) {
javaPackage.addModel(model.getPackage(), model.getName(), model);
}

// Enum
for (EnumType enumType : client.getEnums()) {
javaPackage.addEnum(enumType.getPackage(), enumType.getName(), enumType);
}

// Exception
for (ClientException exception : client.getExceptions()) {
javaPackage.addException(exception.getPackage(), exception.getName(), exception);
}

// XML sequence wrapper
for (XmlSequenceWrapper xmlSequenceWrapper : client.getXmlSequenceWrappers()) {
javaPackage.addXmlSequenceWrapper(xmlSequenceWrapper.getPackage(),
xmlSequenceWrapper.getWrapperClassName(), xmlSequenceWrapper);
}

// Package-info
for (PackageInfo packageInfo : client.getPackageInfos()) {
javaPackage.addPackageInfo(packageInfo.getPackage(), "package-info", packageInfo);
}

// TODO: POM, Manager
//Step 4: Print to files
new Postprocessor(this).postProcess(javaPackage.getJavaFiles().stream()
.collect(Collectors.toMap(JavaFile::getFilePath, file -> file.getContents().toString())));

String artifactId = JavaSettings.getInstance().getArtifactId();
if (!(artifactId == null || artifactId.isEmpty())) {
writeFile("src/main/resources/" + artifactId + ".properties",
"name=${project.artifactId}\nversion=${project.version}\n", null);
}
} catch (Exception ex) {
logger.error("Failed to generate code.", ex);
return false;
}
return true;
}

CodeModel parseCodeModel(String fileName) {
String file = readFile(fileName);
Representer representer = new Representer(new DumperOptions()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.microsoft.typespec.http.client.generator.core.mapper.android;

import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.Operation;
import com.microsoft.typespec.http.client.generator.core.extension.plugin.JavaSettings;
import com.microsoft.typespec.http.client.generator.core.mapper.ClientMethodMapper;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClassType;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientMethod;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientMethodParameter;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.GenericType;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.IType;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ReturnValue;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.android.AndroidClientMethod;

public class AndroidClientMethodMapper extends ClientMethodMapper {
private static final ClientMethodMapper INSTANCE = new AndroidClientMethodMapper();

private static final ClientMethodParameter ANDROID_CONTEXT_PARAM = new ClientMethodParameter.Builder()
.description("The context to associate with this operation.")
.wireType(ClassType.ANDROID_CONTEXT)
.name("context")
.annotations(new java.util.ArrayList<>())
.constant(false)
.defaultValue(null)
.fromClient(false)
.finalParameter(false)
.required(false)
.build();

protected AndroidClientMethodMapper() {
}

public static ClientMethodMapper getInstance() {
return INSTANCE;
}

@Override
protected ClientMethod.Builder getClientMethodBuilder() {
return new AndroidClientMethod.Builder();
}

@Override
protected ClientMethodParameter getContextParameter(boolean isProtocolMethod) {
return ANDROID_CONTEXT_PARAM;
}

@Override
protected IType getContextType() {
return ClassType.ANDROID_CONTEXT;
}

@Override
protected IType createPagedRestResponseReturnType(IType elementType) {
return GenericType.AndroidCompletableFuture(GenericType.AndroidPagedResponse(elementType));
}

@Override
protected IType createPagedAsyncReturnType(IType elementType) {
return GenericType.AndroidPagedResponse(elementType);
}

@Override
protected IType createPagedSyncReturnType(IType elementType) {
return GenericType.AndroidPagedResponse(elementType);
}

@Override
protected IType createAsyncBinaryReturnType() {
return null;
}

@Override
protected IType createAsyncBodyReturnType(IType restAPIMethodReturnBodyClientType) {
return GenericType.AndroidCompletableFuture(restAPIMethodReturnBodyClientType);
}

@Override
protected IType createAsyncVoidReturnType() {
return GenericType.AndroidCompletableFuture(ClassType.VOID);
}

@Override
protected IType createSyncReturnWithResponseType(IType syncReturnType, Operation operation, boolean isProtocolMethod, JavaSettings settings) {
return GenericType.AndroidResponse(syncReturnType);
}

@Override
protected boolean shouldGeneratePagingMethods() {
return true;
}

@Override
protected ReturnValue createSimpleSyncRestResponseReturnValue(Operation operation, IType syncReturnWithResponse, IType syncReturnType) {
return new ReturnValue(returnTypeDescription(operation, syncReturnWithResponse, syncReturnType), syncReturnWithResponse);
}

@Override
protected ReturnValue createSimpleAsyncRestResponseReturnValue(Operation operation, IType asyncRestResponseReturnType, IType syncReturnType) {
IType asyncWithResponseType = GenericType.AndroidCompletableFuture(GenericType.AndroidResponse(syncReturnType));
return new ReturnValue(returnTypeDescription(operation, asyncWithResponseType, syncReturnType),
asyncWithResponseType);
}

@Override
protected ReturnValue createSimpleSyncReturnValue(Operation operation, IType syncReturnType) {
return new ReturnValue(returnTypeDescription(operation, syncReturnType, syncReturnType), syncReturnType);
}

@Override
protected ReturnValue createSimpleAsyncReturnValue(Operation operation, IType asyncReturnType, IType syncReturnType) {
return new ReturnValue(returnTypeDescription(operation, asyncReturnType, syncReturnType), asyncReturnType);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.microsoft.typespec.http.client.generator.core.mapper.android;

import com.microsoft.typespec.http.client.generator.core.mapper.ExceptionMapper;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientException;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.android.AndroidClientException;

public class AndroidExceptionMapper extends ExceptionMapper {
private static final ExceptionMapper INSTANCE = new AndroidExceptionMapper();

protected AndroidExceptionMapper() {
}

public static ExceptionMapper getInstance() {
return INSTANCE;
}

@Override
protected ClientException.Builder createClientExceptionBuilder() {
return new AndroidClientException.Builder();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.microsoft.typespec.http.client.generator.core.mapper.android;

import com.microsoft.typespec.http.client.generator.core.mapper.ClientMethodMapper;
import com.microsoft.typespec.http.client.generator.core.mapper.DefaultMapperFactory;
import com.microsoft.typespec.http.client.generator.core.mapper.ExceptionMapper;
import com.microsoft.typespec.http.client.generator.core.mapper.MethodGroupMapper;
import com.microsoft.typespec.http.client.generator.core.mapper.ModelMapper;
import com.microsoft.typespec.http.client.generator.core.mapper.PrimitiveMapper;
import com.microsoft.typespec.http.client.generator.core.mapper.ProxyMethodMapper;
import com.microsoft.typespec.http.client.generator.core.mapper.ProxyParameterMapper;
import com.microsoft.typespec.http.client.generator.core.mapper.ServiceClientMapper;

public class AndroidMapperFactory extends DefaultMapperFactory {

@Override
public PrimitiveMapper getPrimitiveMapper() { return AndroidPrimitiveMapper.getInstance(); }

@Override
public ClientMethodMapper getClientMethodMapper() {
return AndroidClientMethodMapper.getInstance();
}

@Override
public ProxyMethodMapper getProxyMethodMapper() {
return AndroidProxyMethodMapper.getInstance();
}

@Override
public ProxyParameterMapper getProxyParameterMapper() {
return AndroidProxyParameterMapper.getInstance();
}

@Override
public MethodGroupMapper getMethodGroupMapper() {
return AndroidMethodGroupMapper.getInstance();
}

@Override
public ServiceClientMapper getServiceClientMapper() {
return AndroidServiceClientMapper.getInstance();
}

@Override
public ModelMapper getModelMapper() {
return AndroidModelMapper.getInstance();
}

@Override
public ExceptionMapper getExceptionMapper() {
return AndroidExceptionMapper.getInstance();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.microsoft.typespec.http.client.generator.core.mapper.android;

import com.microsoft.typespec.http.client.generator.core.mapper.MethodGroupMapper;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.MethodGroupClient;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.Proxy;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.android.AndroidMethodGroupClient;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.android.AndroidProxy;

public class AndroidMethodGroupMapper extends MethodGroupMapper {
private static final MethodGroupMapper INSTANCE = new AndroidMethodGroupMapper();

protected AndroidMethodGroupMapper() {
}

public static MethodGroupMapper getInstance() {
return INSTANCE;
}

@Override
protected Proxy.Builder createProxyBuilder() {
return new AndroidProxy.Builder();
}

@Override
protected MethodGroupClient.Builder createMethodGroupClientBuilder() {
return new AndroidMethodGroupClient.Builder();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.microsoft.typespec.http.client.generator.core.mapper.android;

import com.microsoft.typespec.http.client.generator.core.mapper.ModelMapper;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientModel;
import com.microsoft.typespec.http.client.generator.core.model.clientmodel.android.AndroidClientModel;

public class AndroidModelMapper extends ModelMapper {
private static final ModelMapper INSTANCE = new AndroidModelMapper();

protected AndroidModelMapper() {
}

public static ModelMapper getInstance() {
return INSTANCE;
}

@Override
protected ClientModel.Builder createModelBuilder() {
return new AndroidClientModel.Builder();
}
}
Loading

0 comments on commit 21863a4

Please sign in to comment.