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}