public synchronized void putOperationChain(OperationChain chain, boolean replace)
     throws OperationException {
   if (!replace && chains.containsKey(chain.getId())) {
     throw new OperationException("Chain with id " + chain.getId() + " already exists");
   }
   chains.put(chain.getId(), new ChainEntry(chain));
   chainLookup = null;
 }
 public CompiledChain compileChain(Class<?> inputType, OperationChain chain)
     throws Exception, InvalidChainException {
   List<OperationParameters> ops = chain.getOperations();
   return compileChain(inputType, ops.toArray(new OperationParameters[ops.size()]));
 }