@Override
  public InterpreterResult interpret(String st, InterpreterContext context)
      throws InterpreterException {
    try {
      Properties finalProperties = new Properties();
      finalProperties.putAll(this.properties);
      Properties updatedProperties = new Properties();
      updatedProperties.load(new StringReader(st));
      finalProperties.putAll(updatedProperties);
      LOGGER.debug("Properties for Session: {}:{}", sessionId, finalProperties);

      List<Interpreter> interpreters =
          interpreterSetting.getInterpreterGroup(interpreterGroupId).get(sessionId);
      for (Interpreter intp : interpreters) {
        // only check the RemoteInterpreter, ConfInterpreter itself will be ignored here.
        if (intp instanceof RemoteInterpreter) {
          RemoteInterpreter remoteInterpreter = (RemoteInterpreter) intp;
          if (remoteInterpreter.isOpened()) {
            return new InterpreterResult(InterpreterResult.Code.ERROR,
                "Can not change interpreter session properties after this session is started");
          }
          remoteInterpreter.setProperties(finalProperties);
        }
      }
      return new InterpreterResult(InterpreterResult.Code.SUCCESS);
    } catch (IOException e) {
      LOGGER.error("Fail to update interpreter setting", e);
      return new InterpreterResult(InterpreterResult.Code.ERROR, ExceptionUtils.getStackTrace(e));
    }
  }
@Test
  void testUserSessionConfInterpreter() throws InterpreterException {

    InterpreterSetting mockInterpreterSetting = mock(InterpreterSetting.class);
    ManagedInterpreterGroup mockInterpreterGroup = mock(ManagedInterpreterGroup.class);
    when(mockInterpreterSetting.getInterpreterGroup("group_1")).thenReturn(mockInterpreterGroup);

    Properties properties = new Properties();
    properties.setProperty("property_1", "value_1");
    properties.setProperty("property_2", "value_2");
    SessionConfInterpreter confInterpreter = new SessionConfInterpreter(
        properties, "session_1", "group_1", mockInterpreterSetting);

    RemoteInterpreter remoteInterpreter =
        new RemoteInterpreter(properties, "session_1", "clasName", "user1",
            ZeppelinConfiguration.load());
    List<Interpreter> interpreters = new ArrayList<>();
    interpreters.add(confInterpreter);
    interpreters.add(remoteInterpreter);
    when(mockInterpreterGroup.get("session_1")).thenReturn(interpreters);

    InterpreterResult result =
        confInterpreter.interpret("property_1\tupdated_value_1\nproperty_3\tvalue_3",
            mock(InterpreterContext.class));
    assertEquals(InterpreterResult.Code.SUCCESS, result.code);
    assertEquals(3, remoteInterpreter.getProperties().size());
    assertEquals("updated_value_1", remoteInterpreter.getProperty("property_1"));
    assertEquals("value_2", remoteInterpreter.getProperty("property_2"));
    assertEquals("value_3", remoteInterpreter.getProperty("property_3"));

    remoteInterpreter.setOpened(true);
    result =
        confInterpreter.interpret("property_1\tupdated_value_1\nproperty_3\tvalue_3",
            mock(InterpreterContext.class));
    assertEquals(InterpreterResult.Code.ERROR, result.code);
  }