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 org.apache.calcite.avatica.AvaticaConnection;
  
  import java.io.IOException;
  import java.util.Arrays;
  import java.util.HashMap;
  import java.util.Map;
  
  /**
   * Mock implementation of {@link Service}
   * that encodes its requests and responses as JSON
   * and looks up responses from a pre-defined map.
   */
  public class MockJsonService extends JsonService {
    private final Map<String, String> map;
  
    public MockJsonService(Map<String, String> map) {
      this.map = map;
    }
  
    @Override public String apply(String request) {
      String response = map.get(request);
      if (response == null) {
        throw new RuntimeException("No response for " + request);
      }
      return response;
    }
  
    /** Factory that creates a {@code MockJsonService}. */
    public static class Factory implements Service.Factory {
      public Service create(AvaticaConnection connection) {
        final String connectionId = connection.id;
        final Map<String, String> map1 = new HashMap<>();
        try {
          map1.put(
              "{\"request\":\"openConnection\",\"connectionId\":\"" + connectionId + "\",\"info\":{}}",
              "{\"response\":\"openConnection\"}");
          map1.put(
              "{\"request\":\"closeConnection\",\"connectionId\":\"" + connectionId + "\"}",
              "{\"response\":\"closeConnection\"}");
          map1.put(
              "{\"request\":\"getSchemas\",\"catalog\":null,\"schemaPattern\":{\"s\":null}}",
              "{\"response\":\"resultSet\", updateCount: -1, firstFrame: {offset: 0, done: true, rows: []}}");
          map1.put(
              JsonService.encode(new SchemasRequest(connectionId, null, null)),
              "{\"response\":\"resultSet\", updateCount: -1, firstFrame: {offset: 0, done: true, rows: []}}");
          map1.put(
              JsonService.encode(
                  new TablesRequest(connectionId, null, null, null, Arrays.<String>asList())),
              "{\"response\":\"resultSet\", updateCount: -1, firstFrame: {offset: 0, done: true, rows: []}}");
          map1.put(
              "{\"request\":\"createStatement\",\"connectionId\":\"" + connectionId + "\"}",
              "{\"response\":\"createStatement\",\"id\":0}");
          map1.put(
              "{\"request\":\"prepareAndExecute\",\"statementId\":0,"
                  + "\"sql\":\"select * from (\\n  values (1, 'a'), (null, 'b'), (3, 'c')) as t (c1, c2)\",\"maxRowCount\":-1}",
              "{\"response\":\"resultSet\", updateCount: -1, \"signature\": {\n"
                  + " \"columns\": [\n"
                  + "   {\"columnName\": \"C1\", \"type\": {type: \"scalar\", id: 4, rep: \"INTEGER\"}},\n"
                  + "   {\"columnName\": \"C2\", \"type\": {type: \"scalar\", id: 12, rep: \"STRING\"}}\n"
                  + " ], \"cursorFactory\": {\"style\": \"ARRAY\"}\n"
                  + "}, \"rows\": [[1, \"a\"], [null, \"b\"], [3, \"c\"]]}");
          map1.put(
              "{\"request\":\"prepare\",\"statementId\":0,"
                  + "\"sql\":\"select * from (\\n  values (1, 'a'), (null, 'b'), (3, 'c')) as t (c1, c2)\",\"maxRowCount\":-1}",
              "{\"response\":\"prepare\",\"signature\": {\n"
                  + " \"columns\": [\n"
                  + "   {\"columnName\": \"C1\", \"type\": {type: \"scalar\", id: 4, rep: \"INTEGER\"}},\n"
                  + "   {\"columnName\": \"C2\", \"type\": {type: \"scalar\", id: 12, rep: \"STRING\"}}\n"
                  + " ],\n"
                  + " \"parameters\": [],\n"
                  + " \"cursorFactory\": {\"style\": \"ARRAY\"}\n"
                  + "}}");
          map1.put(
              "{\"request\":\"getColumns\",\"connectionId\":\"" + connectionId + "\",\"catalog\":null,\"schemaPattern\":null,"
                  + "\"tableNamePattern\":\"my_table\",\"columnNamePattern\":null}",
              "{\"response\":\"resultSet\",\"connectionId\":\"00000000-0000-0000-0000-000000000000\",\"statementId\":-1,\"ownStatement\":true,"
                  + "\"signature\":{\"columns\":["
                    + "{\"ordinal\":0,\"autoIncrement\":false,\"caseSensitive\":false,\"searchable\":true,\"currency\":false,\"nullable\":1,\"signed\":false,"
                      + "\"displaySize\":40,\"label\":\"TABLE_NAME\",\"columnName\":\"TABLE_NAME\",\"schemaName\":\"\",\"precision\":0,\"scale\":0,\"tableName\":\"SYSTEM.TABLE\","
                      + "\"catalogName\":\"\",\"type\":{\"type\":\"scalar\",\"id\":12,\"name\":\"VARCHAR\",\"rep\":\"STRING\"},\"readOnly\":true,\"writable\":false,"
                      + "\"definitelyWritable\":false,\"columnClassName\":\"java.lang.String\"},"
                    + "{\"ordinal\":1,\"autoIncrement\":false,\"caseSensitive\":false,\"searchable\":true,\"currency\":false,\"nullable\":1,\"signed\":true,"
                      + "\"displaySize\":40,\"label\":\"ORDINAL_POSITION\",\"columnName\":\"ORDINAL_POSITION\",\"schemaName\":\"\",\"precision\":0,\"scale\":0,"
                      + "\"tableName\":\"SYSTEM.TABLE\",\"catalogName\":\"\",\"type\":{\"type\":\"scalar\",\"id\":-5,\"name\":\"BIGINT\",\"rep\":\"PRIMITIVE_LONG\"},"
                      + "\"readOnly\":true,\"writable\":false,\"definitelyWritable\":false,\"columnClassName\":\"java.lang.Long\"}"
                  + "],\"sql\":null,"
                  + "\"parameters\":[],"
                  + "\"cursorFactory\":{\"style\":\"LIST\",\"clazz\":null,\"fieldNames\":null},\"statementType\":null},"
                  + "\"firstFrame\":{\"offset\":0,\"done\":true,"
                  + "\"rows\":[[\"my_table\",10]]"
                  + "},\"updateCount\":-1}");
        } catch (IOException e) {
          throw new RuntimeException(e);
        }
        return new MockJsonService(map1);
      }
    }
  }
  
  // End MockJsonService.java
  