com.google.api.codegen.discovery.transformer.py.PythonSampleMethodToViewTransformer.java Source code

Java tutorial

Introduction

Here is the source code for com.google.api.codegen.discovery.transformer.py.PythonSampleMethodToViewTransformer.java

Source

/* Copyright 2016 Google Inc
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.google.api.codegen.discovery.transformer.py;

import com.google.api.codegen.discovery.config.AuthType;
import com.google.api.codegen.discovery.config.FieldInfo;
import com.google.api.codegen.discovery.config.MethodInfo;
import com.google.api.codegen.discovery.config.SampleConfig;
import com.google.api.codegen.discovery.transformer.SampleMethodToViewTransformer;
import com.google.api.codegen.discovery.transformer.SampleNamer;
import com.google.api.codegen.discovery.transformer.SampleTransformerContext;
import com.google.api.codegen.discovery.transformer.SampleTypeTable;
import com.google.api.codegen.discovery.viewmodel.SampleAuthView;
import com.google.api.codegen.discovery.viewmodel.SampleFieldView;
import com.google.api.codegen.discovery.viewmodel.SamplePageStreamingView;
import com.google.api.codegen.discovery.viewmodel.SampleView;
import com.google.api.codegen.util.Name;
import com.google.api.codegen.util.SymbolTable;
import com.google.api.codegen.util.py.PythonTypeTable;
import com.google.api.codegen.viewmodel.ViewModel;
import com.google.common.collect.Iterables;
import com.google.protobuf.Field.Cardinality;
import com.google.protobuf.Method;
import java.util.ArrayList;
import java.util.List;

public class PythonSampleMethodToViewTransformer implements SampleMethodToViewTransformer {

    private static final String TEMPLATE_FILENAME = "py/sample.snip";

    public PythonSampleMethodToViewTransformer() {
    }

    @Override
    public ViewModel transform(Method method, SampleConfig config) {
        SampleTypeTable typeTable = new SampleTypeTable(new PythonTypeTable(""),
                new PythonSampleTypeNameConverter());
        SampleNamer namer = new PythonSampleNamer();
        SampleTransformerContext context = SampleTransformerContext.create(config, typeTable, namer,
                method.getName());
        return createSampleView(context);
    }

    private SampleView createSampleView(SampleTransformerContext context) {
        SampleConfig config = context.getSampleConfig();
        MethodInfo methodInfo = config.methods().get(context.getMethodName());
        SampleNamer namer = context.getSampleNamer();
        SampleTypeTable typeTable = context.getSampleTypeTable();
        SymbolTable symbolTable = SymbolTable.fromSeed(PythonTypeTable.RESERVED_IDENTIFIER_SET);

        SampleView.Builder builder = SampleView.newBuilder();

        String serviceVarName = symbolTable.getNewSymbol(namer.getServiceVarName(config.apiTypeName()));

        if (methodInfo.isPageStreaming()) {
            builder.pageStreaming(createSamplePageStreamingView(context, symbolTable));
        }

        // Created before the fields in case there are naming conflicts in the symbol table.
        SampleAuthView sampleAuthView = createSampleAuthView(context);

        List<SampleFieldView> requiredFields = new ArrayList<>();
        List<String> methodParamAssignments = new ArrayList<>();
        for (FieldInfo field : methodInfo.fields().values()) {
            String name = namer.localVarName(Name.lowerCamel(field.name()));
            SampleFieldView sampleFieldView = SampleFieldView.newBuilder().name(name)
                    .defaultValue(typeTable.getZeroValueAndSaveNicknameFor(field.type())).example(field.example())
                    .description(field.description()).build();
            requiredFields.add(sampleFieldView);
            // Ex: "fooBar=foo_bar"
            methodParamAssignments.add(field.name() + "=" + name);
        }

        boolean hasRequestBody = methodInfo.requestBodyType() != null;
        if (hasRequestBody) {
            String requestBodyVarName = symbolTable
                    .getNewSymbol(namer.getRequestBodyVarName(methodInfo.requestBodyType().message().typeName()));
            builder.requestBodyVarName(requestBodyVarName);
            methodParamAssignments.add("body=" + requestBodyVarName);
        }

        boolean hasResponse = methodInfo.responseType() != null;
        if (hasResponse) {
            builder.responseVarName(symbolTable.getNewSymbol(namer.getResponseVarName()));
        }

        String credentialsVarName = config.authType() == AuthType.API_KEY ? "developerKey" : "credentials";

        return builder.templateFileName(TEMPLATE_FILENAME).outputPath(context.getMethodName() + ".frag.py")
                .apiTitle(config.apiTitle()).apiName(config.apiName()).apiVersion(config.apiVersion())
                .auth(sampleAuthView).serviceVarName(serviceVarName).methodVerb(methodInfo.verb())
                .methodNameComponents(methodInfo.nameComponents()).requestVarName(namer.getRequestVarName())
                .hasRequestBody(hasRequestBody).hasResponse(hasResponse).requiredFields(requiredFields)
                .isPageStreaming(methodInfo.isPageStreaming()).hasMediaUpload(methodInfo.hasMediaUpload())
                .hasMediaDownload(methodInfo.hasMediaDownload()).credentialsVarName(credentialsVarName)
                .lastMethodNameComponent(Iterables.getLast(methodInfo.nameComponents()))
                .methodParamAssigments(methodParamAssignments).build();
    }

    private SampleAuthView createSampleAuthView(SampleTransformerContext context) {
        SampleConfig config = context.getSampleConfig();
        MethodInfo methodInfo = config.methods().get(context.getMethodName());

        return SampleAuthView.newBuilder().type(config.authType()).instructionsUrl(config.authInstructionsUrl())
                .scopes(methodInfo.authScopes()).isScopesSingular(methodInfo.authScopes().size() == 1).build();
    }

    private SamplePageStreamingView createSamplePageStreamingView(SampleTransformerContext context,
            SymbolTable symbolTable) {
        MethodInfo methodInfo = context.getSampleConfig().methods().get(context.getMethodName());
        FieldInfo fieldInfo = methodInfo.pageStreamingResourceField();
        SampleNamer namer = context.getSampleNamer();

        SamplePageStreamingView.Builder builder = SamplePageStreamingView.newBuilder();

        builder.resourceFieldName(fieldInfo.name());
        if (fieldInfo.type().isMap()) {
            // Assume that the value in the map is a message.
            if (!fieldInfo.type().mapValue().isMessage()) {
                throw new IllegalArgumentException("expected map value to be a message");
            }
            builder.resourceKeyVarName(symbolTable.getNewSymbol("name"));
            String resourceValueVarName = namer
                    .localVarName(Name.upperCamel(fieldInfo.type().mapValue().message().typeName()));
            builder.resourceValueVarName(symbolTable.getNewSymbol(resourceValueVarName));
        } else {
            String resourceVarName = namer
                    .getResourceVarName(fieldInfo.type().isMessage() ? fieldInfo.type().message().typeName() : "");
            builder.resourceVarName(symbolTable.getNewSymbol(resourceVarName));
        }
        builder.isResourceRepeated(fieldInfo.cardinality() == Cardinality.CARDINALITY_REPEATED);
        builder.isResourceMap(fieldInfo.type().isMap());
        builder.pageVarName(symbolTable.getNewSymbol(fieldInfo.name()));
        builder.isResourceSetterInRequestBody(methodInfo.isPageStreamingResourceSetterInRequestBody());
        builder.pageTokenName(methodInfo.requestPageTokenName());
        builder.nextPageTokenName(methodInfo.responsePageTokenName());
        return builder.build();
    }
}