RemoteInterpreter extends Interpreter { public RemoteInterpreterProcess getInterpreterProcess() { InterpreterGroup intpGroup = getInterpreterGroup(); if (intpGroup == null) { return null; } synchronized (intpGroup) { if (intpGroup.getRemoteInterpreterProcess() == null) { RemoteInterpreterProcess remoteProcess = new RemoteInterpreterProcess( interpreterRunner, interpreterPath, env, connectTimeout); intpGroup.setRemoteInterpreterProcess(remoteProcess); } return intpGroup.getRemoteInterpreterProcess(); } } RemoteInterpreter(Properties property,
      String className,
      String interpreterRunner,
      String interpreterPath,
      int connectTimeout);  RemoteInterpreter(Properties property,
      String className,
      String interpreterRunner,
      String interpreterPath,
      Map<String, String> env,
      int connectTimeout); @Override String getClassName(); RemoteInterpreterProcess getInterpreterProcess(); @Override void open(); @Override void close(); @Override InterpreterResult interpret(String st, InterpreterContext context); @Override void cancel(InterpreterContext context); @Override FormType getFormType(); @Override int getProgress(InterpreterContext context); @Override List<String> completion(String buf, int cursor); @Override Scheduler getScheduler();  }
@Test public void testInterpreterGroupResetBeforeProcessStarts() { Properties p = new Properties(); RemoteInterpreter intpA = new RemoteInterpreter( p, MockInterpreterA.class.getName(), new File("../bin/interpreter.sh").getAbsolutePath(), "fake", env, 10 * 1000 ); intpA.setInterpreterGroup(intpGroup); RemoteInterpreterProcess processA = intpA.getInterpreterProcess(); intpA.setInterpreterGroup(new InterpreterGroup(intpA.getInterpreterGroup().getId())); RemoteInterpreterProcess processB = intpA.getInterpreterProcess(); assertNotSame(processA.hashCode(), processB.hashCode()); }