content: /*
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to you 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 org.apache.calcite.avatica.remote;
  
  import com.google.protobuf.Message;
  
  /**
   * Service implementation that encodes requests and responses as protocol buffers.
   */
  public abstract class ProtobufService extends AbstractService {
  
    /**
     * Derived class should implement this method to transport requests and
     * responses to and from the peer service.
     */
    public abstract Response _apply(Request request);
  
    @Override SerializationType getSerializationType() {
      return SerializationType.PROTOBUF;
    }
  
    @Override public ResultSetResponse apply(CatalogsRequest request) {
      return finagle((ResultSetResponse) _apply(request));
    }
  
    @Override public ResultSetResponse apply(SchemasRequest request) {
      return finagle((ResultSetResponse) _apply(request));
    }
  
    @Override public ResultSetResponse apply(TablesRequest request) {
      return finagle((ResultSetResponse) _apply(request));
    }
  
    @Override public ResultSetResponse apply(TableTypesRequest request) {
      return finagle((ResultSetResponse) _apply(request));
    }
  
    @Override public ResultSetResponse apply(TypeInfoRequest request) {
      return finagle((ResultSetResponse) _apply(request));
    }
  
    @Override public ResultSetResponse apply(ColumnsRequest request) {
      return finagle((ResultSetResponse) _apply(request));
    }
  
    @Override public PrepareResponse apply(PrepareRequest request) {
      return finagle((PrepareResponse) _apply(request));
    }
  
    @Override public ExecuteResponse apply(PrepareAndExecuteRequest request) {
      return finagle((ExecuteResponse) _apply(request));
    }
  
    @Override public FetchResponse apply(FetchRequest request) {
      return (FetchResponse) _apply(request);
    }
  
    @Override public CreateStatementResponse apply(CreateStatementRequest request) {
      return (CreateStatementResponse) _apply(request);
    }
  
    @Override public CloseStatementResponse apply(CloseStatementRequest request) {
      return (CloseStatementResponse) _apply(request);
    }
  
    @Override public OpenConnectionResponse apply(OpenConnectionRequest request) {
      return (OpenConnectionResponse) _apply(request);
    }
  
    @Override public CloseConnectionResponse apply(CloseConnectionRequest request) {
      return (CloseConnectionResponse) _apply(request);
    }
  
    @Override public ConnectionSyncResponse apply(ConnectionSyncRequest request) {
      return (ConnectionSyncResponse) _apply(request);
    }
  
    @Override public DatabasePropertyResponse apply(DatabasePropertyRequest request) {
      return (DatabasePropertyResponse) _apply(request);
    }
  
    @Override public ExecuteResponse apply(ExecuteRequest request) {
      return finagle((ExecuteResponse) _apply(request));
    }
  
    @Override public SyncResultsResponse apply(SyncResultsRequest request) {
      return (SyncResultsResponse) _apply(request);
    }
  
    @Override public CommitResponse apply(CommitRequest request) {
      return (CommitResponse) _apply(request);
    }
  
    @Override public RollbackResponse apply(RollbackRequest request) {
      return (RollbackResponse) _apply(request);
    }
  
    @Override public ExecuteBatchResponse apply(PrepareAndExecuteBatchRequest request) {
      return (ExecuteBatchResponse) _apply(request);
    }
  
    @Override public ExecuteBatchResponse apply(ExecuteBatchRequest request) {
      return (ExecuteBatchResponse) _apply(request);
    }
  
    /**
     * Checks if the provided {@link Message} is an instance of the Class given by
     * <code>expectedType</code>. Throws an IllegalArgumentException if the message is not of the
     * expected type, otherwise, it returns the message cast as the expected type.
     *
     * @param msg A Protocol Buffer message.
     * @param expectedType The expected type of the Protocol Buffer message.
     * @return The msg cast to the concrete Message type.
     * @throws IllegalArgumentException If the type of the message is not the expectedType.
     */
    public static <T extends Message> T castProtobufMessage(Message msg, Class<T> expectedType) {
      if (!expectedType.isInstance(msg)) {
        throw new IllegalArgumentException("Expected instance of " + expectedType.getName()
            + ", but got " + msg.getClass().getName());
      }
  
      return expectedType.cast(msg);
    }
  }
  
  // End ProtobufService.java
  