thrift/compiler/generate/templates/java2/RpcServerHandler.mustache (271 lines of code) (raw):

{{! Copyright (c) Facebook, Inc. and its affiliates. 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. }} {{> AutoGenerated}} package {{service:javaPackage}}; import java.util.*; import org.apache.thrift.protocol.*; import com.facebook.thrift.util.Readers; public class {{service:javaCapitalName}}RpcServerHandler {{#service:extends}} extends {{service:javaPackage}}.{{service:javaCapitalName}}RpcServerHandler{{/service:extends}} implements com.facebook.thrift.server.RpcServerHandler { private final java.util.Map<String, com.facebook.thrift.server.RpcServerHandler> _methodMap; private final {{service:javaCapitalName}}.Reactive _delegate; {{#service:singleRequestFunctions}} private final java.util.List<com.facebook.thrift.payload.Reader> _{{function:javaName}}Readers; {{/service:singleRequestFunctions}} private final java.util.List<com.facebook.swift.service.ThriftEventHandler> _eventHandlers; public {{service:javaCapitalName}}RpcServerHandler({{service:javaCapitalName}} _delegate, java.util.List<com.facebook.swift.service.ThriftEventHandler> _eventHandlers) { this(new {{service:javaCapitalName}}BlockingReactiveWrapper(_delegate), _eventHandlers); } public {{service:javaCapitalName}}RpcServerHandler({{service:javaCapitalName}}.Async _delegate, java.util.List<com.facebook.swift.service.ThriftEventHandler> _eventHandlers) { this(new {{service:javaCapitalName}}AsyncReactiveWrapper(_delegate), _eventHandlers); } public {{service:javaCapitalName}}RpcServerHandler({{service:javaCapitalName}}.Reactive _delegate, java.util.List<com.facebook.swift.service.ThriftEventHandler> _eventHandlers) { {{#service:extends}}super(_delegate, _eventHandlers);{{/service:extends}} this._methodMap = new java.util.HashMap<>(); this._delegate = _delegate; this._eventHandlers = _eventHandlers; {{#service:singleRequestFunctions}} _methodMap.put("{{function:javaName}}", this); _{{function:javaName}}Readers = _create_{{function:javaName}}_request_readers(); {{/service:singleRequestFunctions}} } {{#service:requestResponseFunctions}} private static java.util.List<com.facebook.thrift.payload.Reader> _create_{{function:javaName}}_request_readers() { java.util.List<com.facebook.thrift.payload.Reader> _readerList = new java.util.ArrayList<>(); {{#function:args}} {{function:unsetIsNested}} _readerList.add({{#field:type}}{{> TypeReader }}{{/field:type}}); {{/function:args}} return _readerList; } private static com.facebook.thrift.payload.Writer _create_{{function:javaName}}_response_writer( final Object _r, final com.facebook.swift.service.ContextChain _chain, final int _seqId) { return oprot -> { try { oprot.writeStructBegin(com.facebook.thrift.util.RpcPayloadUtil.TSTRUCT); {{function:unsetIsNested}} {{^function:voidType}} {{#function:return_type}} {{> Type}} _iter0 = ({{> Type}})_r; {{function:nestedDepth++}}{{> WriteResponseType}}{{function:nestedDepth--}} oprot.writeFieldEnd(); {{/function:return_type}} {{/function:voidType}} oprot.writeFieldStop(); oprot.writeStructEnd(); _chain.postWrite(_r); } catch (Throwable _e) { throw reactor.core.Exceptions.propagate(_e); } }; } {{#function:exceptions?}} private static com.facebook.thrift.payload.Writer _create_{{function:javaName}}_exception_writer( final Throwable _t, final com.facebook.swift.service.ContextChain _chain, final int _seqId, final short _fieldId) { return oprot -> { try { _chain.declaredUserException(_t); oprot.writeStructBegin(com.facebook.thrift.util.RpcPayloadUtil.TSTRUCT); oprot.writeFieldBegin( new TField("responseField", TType.STRUCT, _fieldId)); com.facebook.thrift.payload.ThriftSerializable _iter0 = (com.facebook.thrift.payload.ThriftSerializable)_t; _iter0.write0(oprot); oprot.writeFieldEnd(); oprot.writeFieldStop(); oprot.writeStructEnd(); _chain.postWriteException(_t); } catch (Throwable _e) { throw reactor.core.Exceptions.propagate(_e); } }; } {{/function:exceptions?}} private static reactor.core.publisher.Mono<com.facebook.thrift.payload.ServerResponsePayload> _do{{function:javaName}}( {{service:javaCapitalName}}.Reactive _delegate, String _name, com.facebook.thrift.payload.ServerRequestPayload _payload, java.util.List<com.facebook.thrift.payload.Reader> _readers, java.util.List<com.facebook.swift.service.ThriftEventHandler> _eventHandlers) { final com.facebook.swift.service.ContextChain _chain = new com.facebook.swift.service.ContextChain(_eventHandlers, _name, _payload.getRequestContext()); _chain.preRead(); java.util.List<Object>_data = _payload.getData(_readers); java.util.Iterator<Object> _iterator = _data.iterator(); {{#function:args}} {{#field:type}}{{> Type}}{{/field:type}} {{field:javaName}} = ({{#field:type}}{{> Type}}{{/field:type}}) _iterator.next(); {{/function:args}} _chain.postRead(_data); reactor.core.publisher.Mono<com.facebook.thrift.payload.ServerResponsePayload> _internalResponse = _delegate .{{function:javaName}}({{#function:args}}{{field:javaName}}{{^last?}}, {{/last?}}{{/function:args}}) .map(_response -> { _chain.preWrite(_response); com.facebook.thrift.payload.ServerResponsePayload _serverResponsePayload = com.facebook.thrift.util.RpcPayloadUtil.createServerResponsePayload( _payload, _create_{{function:javaName}}_response_writer(_response, _chain, _payload.getMessageSeqId())); return _serverResponsePayload; }) .switchIfEmpty( reactor.core.publisher.Mono.fromSupplier( () -> { {{^function:voidType}} org.apache.thrift.TApplicationException _tApplicationException = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "method {{function:javaName}} returned null"); return com.facebook.thrift.util.RpcPayloadUtil.fromTApplicationException(_tApplicationException, _payload.getRequestRpcMetadata(), _chain); {{/function:voidType}} {{#function:voidType}} _chain.preWrite(null); return com.facebook.thrift.util.RpcPayloadUtil.createServerResponsePayload( _payload, _create_{{function:javaName}}_response_writer(null, _chain, _payload.getMessageSeqId())); {{/function:voidType}} } ) ) .<com.facebook.thrift.payload.ServerResponsePayload>onErrorResume(_t -> { _chain.preWriteException(_t); {{#function:exceptions}} if (_t instanceof {{#field:type}}{{> Type}}{{/field:type}}) { com.facebook.thrift.payload.Writer _exceptionWriter = _create_{{function:javaName}}_exception_writer(_t, _chain, _payload.getMessageSeqId(), (short) {{field:key}}); com.facebook.thrift.payload.ServerResponsePayload _serverResponsePayload = com.facebook.thrift.util.RpcPayloadUtil.createServerResponsePayload( _payload, _exceptionWriter); return reactor.core.publisher.Mono.just(_serverResponsePayload); } {{/function:exceptions}} {{#function:exceptions?}} else { {{/function:exceptions?}} // exception is not of user declared type String _errorMessage = String.format("Internal error processing {{function:javaName}}: %s", _t.getMessage() == null ? "<null>" : _t.getMessage()); org.apache.thrift.TApplicationException _tApplicationException = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, _errorMessage); _tApplicationException.initCause(_t); com.facebook.thrift.payload.ServerResponsePayload _serverResponsePayload = com.facebook.thrift.util.RpcPayloadUtil.fromTApplicationException(_tApplicationException, _payload.getRequestRpcMetadata(), _chain); return reactor.core.publisher.Mono.just(_serverResponsePayload); {{#function:exceptions?}} } {{/function:exceptions?}} }); if (com.facebook.thrift.util.resources.RpcResources.isForceExecutionOffEventLoop()) { _internalResponse = _internalResponse.publishOn(com.facebook.thrift.util.resources.RpcResources.getOffLoopScheduler()); } return _internalResponse; } {{/service:requestResponseFunctions}} {{#service:onewayFunctions}} private static java.util.List<com.facebook.thrift.payload.Reader> _create_{{function:javaName}}_request_readers() { java.util.List<com.facebook.thrift.payload.Reader> _readerList = new java.util.ArrayList<>(); {{#function:args}} {{function:unsetIsNested}} _readerList.add({{#field:type}}{{> TypeReader }}{{/field:type}}); {{/function:args}} return _readerList; } private static reactor.core.publisher.Mono<Void> _do{{function:javaName}}( {{service:javaCapitalName}}.Reactive _delegate, String _name, com.facebook.thrift.payload.ServerRequestPayload _payload, java.util.List<com.facebook.thrift.payload.Reader> _readers, java.util.List<com.facebook.swift.service.ThriftEventHandler> _eventHandlers) { final com.facebook.swift.service.ContextChain _chain = new com.facebook.swift.service.ContextChain(_eventHandlers, _name, _payload.getRequestContext()); _chain.preRead(); java.util.List<Object>_data = _payload.getData(_readers); java.util.Iterator<Object> _iterator = _data.iterator(); {{#function:args}} {{#field:type}}{{> Type}}{{/field:type}} {{field:javaName}} = ({{#field:type}}{{> Type}}{{/field:type}}) _iterator.next(); {{/function:args}} _chain.postRead(_data); reactor.core.publisher.Mono<Void> _internalResponse = _delegate .{{function:javaName}}({{#function:args}}{{field:javaName}}{{^last?}}, {{/last?}}{{/function:args}}); if (com.facebook.thrift.util.resources.RpcResources.isForceExecutionOffEventLoop()) { _internalResponse = _internalResponse.publishOn(com.facebook.thrift.util.resources.RpcResources.getOffLoopScheduler()); } return _internalResponse; } {{/service:onewayFunctions}} @Override public reactor.core.publisher.Mono<com.facebook.thrift.payload.ServerResponsePayload> singleRequestSingleResponse(com.facebook.thrift.payload.ServerRequestPayload _payload) { final String _name = _payload.getRequestRpcMetadata().getName(); reactor.core.publisher.Mono<com.facebook.thrift.payload.ServerResponsePayload> _result; try { switch (_name) { {{#service:requestResponseFunctions}} case "{{function:javaName}}": _result = _do{{function:javaName}}(_delegate, _name, _payload, _{{function:javaName}}Readers, _eventHandlers); break; {{/service:requestResponseFunctions}} default: { {{#service:extends}} _result = super.singleRequestSingleResponse(_payload); {{/service:extends}} {{^service:extends}} _result = reactor.core.publisher.Mono.error(new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.UNKNOWN_METHOD, "no method found with name " + _name)); {{/service:extends}} } } } catch (Throwable _t) { _result = reactor.core.publisher.Mono.error(_t); } return _result; } @Override public reactor.core.publisher.Mono<Void> singleRequestNoResponse(com.facebook.thrift.payload.ServerRequestPayload _payload) { final String _name = _payload.getRequestRpcMetadata().getName(); reactor.core.publisher.Mono<Void> _result; try { switch (_name) { {{#service:onewayFunctions}} case "{{function:javaName}}": _result = _do{{function:javaName}}(_delegate, _name, _payload, _{{function:javaName}}Readers, _eventHandlers); break; {{/service:onewayFunctions}} default: { {{#service:extends}} _result = super.singleRequestNoResponse(_payload); {{/service:extends}} {{^service:extends}} _result = reactor.core.publisher.Mono.error(new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.UNKNOWN_METHOD, "no method found with name " + _name)); {{/service:extends}} } } } catch (Throwable _t) { _result = reactor.core.publisher.Mono.error(_t); } return _result; } public java.util.Map<String, com.facebook.thrift.server.RpcServerHandler> getMethodMap() { {{#service:extends}} java.util.Map<String, com.facebook.thrift.server.RpcServerHandler> _combined = new java.util.HashMap(); _combined.putAll(_methodMap); _combined.putAll(super.getMethodMap()); return _combined; {{/service:extends}} {{^service:extends}} return _methodMap; {{/service:extends}} } }