private void handleRequestCreate(VerticalCommand cmd)
        throws IMTPException, JADESecurityException, NotFoundException, NameClashException,
            ServiceException {

      Object[] params = cmd.getParams();
      String name = (String) params[0];
      String className = (String) params[1];
      Object[] args = (Object[]) params[2];
      ContainerID cid = (ContainerID) params[3];
      JADEPrincipal owner = (JADEPrincipal) params[4];
      Credentials initialCredentials = (Credentials) params[5];

      if (myLogger.isLoggable(Logger.CONFIG))
        myLogger.log(
            Logger.CONFIG, "Source Sink consuming command REQUEST_CREATE. Name is " + name);
      MainContainer impl = myContainer.getMain();
      if (impl != null) {

        AID agentID = new AID(AID.createGUID(name, myContainer.getPlatformID()), AID.ISGUID);
        AgentManagementSlice targetSlice = (AgentManagementSlice) getSlice(cid.getName());
        if (targetSlice != null) {
          try {
            targetSlice.createAgent(
                agentID,
                className,
                args,
                owner,
                initialCredentials,
                AgentManagementSlice.CREATE_AND_START,
                cmd);
          } catch (IMTPException imtpe) {
            // Try to get a newer slice and repeat...
            targetSlice = (AgentManagementSlice) getFreshSlice(cid.getName());
            targetSlice.createAgent(
                agentID,
                className,
                args,
                owner,
                initialCredentials,
                AgentManagementSlice.CREATE_AND_START,
                cmd);
          }
        } else {
          throw new NotFoundException("Container " + cid.getName() + " not found");
        }
      } else {
        // Do nothing for now, but could also route the command to the main slice, thus enabling
        // e.g. AMS replication
      }
    }
  /**
   * Creates a new JADE agent, running within this container,
   *
   * @param nickname A platform-unique nickname for the newly created agent. The agent will be given
   *     a FIPA compliant agent identifier using the nickname and the ID of the platform it is
   *     running on.
   * @param className The fully qualified name of the class that implements the agent.
   * @param args An object array, containing initialization parameters to pass to the new agent.
   * @return A proxy object, allowing to call state-transition forcing methods on the real agent
   *     instance.
   */
  public AgentController createNewAgent(String nickname, String className, Object[] args)
      throws StaleProxyException {
    if (myImpl == null || myProxy == null) {
      throw new StaleProxyException();
    }

    AID agentID = new AID(AID.createGUID(nickname, myImpl.getPlatformID()), AID.ISGUID);

    try {
      myProxy.createAgent(agentID, className, args);
      return new AgentControllerImpl(agentID, myProxy, myImpl);
    } catch (Throwable t) {
      t.printStackTrace();
      throw new StaleProxyException(t);
    }
  }
  /**
   * Get a controller (i.e. a proxy) to a local agent given its local-name or GUID.
   *
   * @param name The local name or the GUID of the desired agent.
   * @param isGuid A flag indicating whether <code>name</code> represents the local-name (<code>
   *     AID.ISLOCALNAME</code>) or the GUID (<code>AID.ISGUID</code>) of the desired agent.
   * @throws ControllerException If any problems occur obtaining this proxy or if no such agent
   *     exists in the local container.
   */
  public AgentController getAgent(String name, boolean isGuid) throws ControllerException {
    if (myImpl == null || myProxy == null) {
      throw new StaleProxyException();
    }

    if (!isGuid) {
      name = AID.createGUID(name, myImpl.getPlatformID());
    }
    AID agentID = new AID(name, AID.ISGUID);

    // Check that the agent exists
    jade.core.Agent instance = myImpl.acquireLocalAgent(agentID);
    if (instance == null) {
      throw new ControllerException("Agent " + agentID.getName() + " not found.");
    }
    myImpl.releaseLocalAgent(agentID);
    return new AgentControllerImpl(agentID, myProxy, myImpl);
  }
  /**
   * Add an Agent to this container. Typically Agent would be some class extending Agent which was
   * instantiated and configured.
   *
   * @param nickname A platform-unique nickname for the newly created agent. The agent will be given
   *     a FIPA compliant agent identifier using the nickname and the ID of the platform it is
   *     running on.
   * @param anAgent The agent to be added to this agent container.
   * @return An AgentController, allowing to call state-transition forcing methods on the real agent
   *     instance.
   */
  public AgentController acceptNewAgent(String nickname, jade.core.Agent anAgent)
      throws StaleProxyException {
    if (myImpl == null || myProxy == null) {
      throw new StaleProxyException();
    }

    AID agentID = new AID(AID.createGUID(nickname, myImpl.getPlatformID()), AID.ISGUID);
    // FIXME: This call skips the security checks on the local container
    try {
      jade.core.NodeDescriptor nd = myImpl.getNodeDescriptor();
      // The owner of the new agent is the owner of the local container.
      // The new agent has NO initial credentials
      myImpl.initAgent(agentID, anAgent, nd.getOwnerPrincipal(), null);
    } catch (Exception e) {
      throw new StaleProxyException(e);
    }
    return new AgentControllerImpl(agentID, myProxy, myImpl);
  }