예제 #1
0
    /* (non-Javadoc)
     * @see jade.core.Filter#accept(jade.core.VerticalCommand)
     */
    @Override
    public final boolean accept(VerticalCommand cmd) {
      if (cmd == null) {
        return true;
      }

      String cmdName = cmd.getName();
      if (cmdName.equals(MessagingSlice.SET_PLATFORM_ADDRESSES) && myContainerMTPurl == null) {
        // --- Handle that the MTP-Address was created ------
        Object[] params = cmd.getParams();
        AID aid = (AID) params[0];
        String[] aidArr = aid.getAddressesArray();
        if (aidArr.length != 0) {
          myContainerMTPurl = aidArr[0];
          setLocalCRCReply(false);
        }
        // Veto the original SEND_MESSAGE command, if needed
        // return false;
      } else if (cmdName.equals(AgentManagementSlice.KILL_CONTAINER)) {
        Object[] params = cmd.getParams();
        ContainerID id = (ContainerID) params[0];
        String containerName = id.getName();
        loadInfo.containerLoads.remove(containerName);
        loadInfo.containerLocations.remove(containerName);

      } else if (cmdName.equals(AgentMobilityHelper.INFORM_MOVED)) {
        Object[] params = cmd.getParams();
        @SuppressWarnings("unused")
        AID aid = (AID) params[0];
      }
      // Never veto other commands
      return true;
    }
    private void handleKillContainer(VerticalCommand cmd)
        throws IMTPException, ServiceException, NotFoundException {
      Object[] params = cmd.getParams();
      ContainerID cid = (ContainerID) params[0];

      if (myLogger.isLoggable(Logger.CONFIG)) {
        myLogger.log(
            Logger.CONFIG,
            "Source Sink consuming command KILL_CONTAINER. Container is " + cid.getName());
      }

      // Forward to the correct slice
      AgentManagementSlice targetSlice = (AgentManagementSlice) getSlice(cid.getName());
      try {
        try {
          targetSlice.exitContainer();
        } catch (IMTPException imtpe) {
          // Try to get a newer slice and repeat...
          targetSlice = (AgentManagementSlice) getFreshSlice(cid.getName());
          targetSlice.exitContainer();
        }
      } catch (NullPointerException npe) {
        // targetSlice not found --> The container does not exist
        throw new NotFoundException("Container " + cid.getName() + " not found");
      }
    }
    private void handleRequestKill(VerticalCommand cmd)
        throws IMTPException, JADESecurityException, NotFoundException, ServiceException {

      Object[] params = cmd.getParams();
      AID agentID = (AID) params[0];

      // log("Source Sink consuming command REQUEST_KILL. Name is "+agentID.getName(), 3);
      if (myLogger.isLoggable(Logger.CONFIG))
        myLogger.log(
            Logger.CONFIG,
            "Source Sink consuming command REQUEST_KILL. Name is " + agentID.getName());

      MainContainer impl = myContainer.getMain();
      if (impl != null) {
        ContainerID cid = impl.getContainerID(agentID);
        // Note that since getContainerID() succeeded, targetSlice can't be null
        AgentManagementSlice targetSlice = (AgentManagementSlice) getSlice(cid.getName());
        try {
          targetSlice.killAgent(agentID, cmd);
        } catch (IMTPException imtpe) {
          // Try to get a newer slice and repeat...
          targetSlice = (AgentManagementSlice) getFreshSlice(cid.getName());
          targetSlice.killAgent(agentID, cmd);
        }
      } else {
        // Do nothing for now, but could also route the command to the main slice, thus enabling
        // e.g. AMS replication
      }
    }
    private void handleRequestStateChange(VerticalCommand cmd)
        throws IMTPException, JADESecurityException, NotFoundException, ServiceException {

      Object[] params = cmd.getParams();
      AID agentID = (AID) params[0];
      AgentState as = (AgentState) params[1];

      int newState = Agent.AP_MIN;
      if (as.equals(jade.domain.FIPAAgentManagement.AMSAgentDescription.SUSPENDED)) {
        newState = Agent.AP_SUSPENDED;
      } else if (as.equals(jade.domain.FIPAAgentManagement.AMSAgentDescription.WAITING)) {
        newState = Agent.AP_WAITING;
      } else if (as.equals(jade.domain.FIPAAgentManagement.AMSAgentDescription.ACTIVE)) {
        newState = Agent.AP_ACTIVE;
      }

      MainContainer impl = myContainer.getMain();
      if (impl != null) {
        ContainerID cid = impl.getContainerID(agentID);
        // Note that since getContainerID() succeeded, targetSlice can't be null
        AgentManagementSlice targetSlice = (AgentManagementSlice) getSlice(cid.getName());
        try {
          targetSlice.changeAgentState(agentID, newState);
        } catch (IMTPException imtpe) {
          // Try to get a newer slice and repeat...
          targetSlice = (AgentManagementSlice) getFreshSlice(cid.getName());
          targetSlice.changeAgentState(agentID, newState);
        }
      } else {
        // Do nothing for now, but could also route the command to the main slice, thus enabling
        // e.g. AMS replication
      }
    }
    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
      }
    }