001package net.gdface.codegen.thrift; 002 003import java.util.List; 004import java.util.Map; 005 006import org.apache.commons.cli.Options; 007import org.apache.velocity.VelocityContext; 008 009import com.facebook.swift.codec.metadata.DecoratorThriftEnumMetadata; 010import com.facebook.swift.codec.metadata.DecoratorThriftFieldMetadata; 011import com.facebook.swift.codec.metadata.DecoratorThriftServiceMetadata; 012import com.facebook.swift.codec.metadata.DecoratorThriftStructMetadata; 013import com.facebook.swift.codec.metadata.ErpcNameTransformer; 014import com.facebook.swift.codec.metadata.FieldNameFilters; 015import com.google.common.collect.ImmutableMap; 016import com.google.common.collect.Lists; 017 018import gu.doc.JavadocReader; 019import net.gdface.cli.Context; 020import net.gdface.codegen.AbstractSchema; 021import net.gdface.codegen.generator.CodeWriter; 022import net.gdface.codegen.generator.Generator; 023import net.gdface.codegen.generator.GeneratorConfiguration; 024import net.gdface.codegen.thrift.ThriftServiceDecoratorConfiguration.TaskType; 025import net.gdface.codegen.thrift.javadoc.ClassCommentProviderFactoryImpl; 026import net.gdface.codegen.thrift.metadata.CodegenErpcPointerFilter; 027import net.gdface.codegen.thrift.metadata.CodegenPreAllocFilter; 028import net.gdface.codegen.thrift.metadata.CodegenPreAllocSizeGetter; 029import net.gdface.codegen.thrift.metadata.CodegenRequirednessFilter; 030import net.gdface.codegen.thrift.metadata.ErpcTypePrefixGetter; 031 032public class ThriftServiceDecoratorGenerator extends Generator implements ThriftConstants { 033 private final ThriftServiceDecoratorOptions options = ThriftServiceDecoratorOptions.getInstance(); 034 private final ThriftServiceDecoratorConfiguration config = ThriftServiceDecoratorConfiguration.INSTANCE; 035 private ThriftSchema thriftSchema; 036 public ThriftServiceDecoratorGenerator() { 037 } 038 039 @Override 040 protected Context createEngineContext() { 041 if(!config.getExcludeFields().isEmpty()){ 042 DecoratorThriftStructMetadata.fieldNameFilters = new FieldNameFilters(config.getExcludeFields()); 043 } 044 DecoratorThriftServiceMetadata.javadocCommentProviderFactory = new ClassCommentProviderFactoryImpl(); 045 if(config.getTaskType().equals(TaskType.ERPC_PROXY)){ 046 DecoratorThriftEnumMetadata.enumNameTransformer = ErpcNameTransformer.erpcTypeNameTransformer; 047 DecoratorThriftStructMetadata.structNameTransformer = ErpcNameTransformer.erpcTypeNameTransformer; 048 DecoratorThriftFieldMetadata.fieldNameTransformer = ErpcNameTransformer.erpcFieldNameTransformer; 049 DecoratorThriftFieldMetadata.parameterNameTransformer = ErpcNameTransformer.erpcParemeterNameTransformer; 050 DecoratorThriftFieldMetadata.requirednessFilter = CodegenRequirednessFilter.REQUIREDNESS_FILTER; 051 DecoratorThriftFieldMetadata.typePrefixGetter = ErpcTypePrefixGetter.TYPE_PREFIX_GETTER; 052 DecoratorThriftFieldMetadata.preAllocFilter = CodegenPreAllocFilter.PREALLOC_FILTER; 053 DecoratorThriftFieldMetadata.preAllocsizeGetter = CodegenPreAllocSizeGetter.PREALLOC_SIZE_GETTER; 054 DecoratorThriftFieldMetadata.pointerFilter = CodegenErpcPointerFilter.POINTER_FILTER; 055 } 056 thriftSchema = new ThriftSchema(config.getInterfaceClasses()); 057 if(TaskType.ERPC_PROXY.equals(config.getTaskType())){ 058 thriftSchema.setThriftServiceClasses(config.getThriftServiceClasses()).erpcProxyInit(); 059 } 060 Context context = super.createEngineContext(); 061 context.setProperty(SCHEMA_INFO, thriftSchema); 062 context.setProperty(CXX_HELPER, new CxxHelper()); 063 JavadocReader.setSourcepath(config.getSourcepath()); 064 JavadocReader.setClasspath(config.getClasspath()); 065 return context; 066 } 067 068 @Override 069 protected GeneratorConfiguration getGeneratorConfiguration() { 070 return config; 071 } 072 @Override 073 protected Options getOptions() { 074 return options.getOptions(); 075 } 076 @Override 077 protected Map<String, List<? extends AbstractSchema>> generateTask() { 078 Map<String,List<? extends AbstractSchema>> m = 079 ImmutableMap.<String,List<? extends AbstractSchema>>of( 080 DIR_SCHEMA,Lists.<AbstractSchema>newArrayList(), 081 DIR_PERSERVICE,thriftSchema.getThriftServiceDecorators(), 082 DIR_PERSTRUCT,thriftSchema.getAllStructDecorators() 083 ); 084 return m; 085 } 086 087 @Override 088 protected void beforeGenerateFile(VelocityContext context, String templateName) { 089 AbstractSchema sourceinfo = (AbstractSchema)context.get(SOURCE_INFO); 090 if(null !=sourceinfo){ 091 sourceinfo.backupImportedList(); 092 } 093 } 094 095 @Override 096 protected void afterGenerateFile(VelocityContext context, String templateName) { 097 AbstractSchema sourceinfo = (AbstractSchema)context.get(SOURCE_INFO); 098 if(null !=sourceinfo){ 099 sourceinfo.restoreImportedList(); 100 } 101 } 102 103 public static void main(String[] args) { 104 new ThriftServiceDecoratorGenerator().parseCommandLine(args).initEngine().multiGenerate(); 105 } 106 107 @Override 108 protected CodeWriter getCodeWriter(){ 109 return config.getCodeWriter(); 110 } 111}