/**
   * @param agentName
   * @param actionName
   * @param parameters
   * @param unifier
   * @return Maps internal Jason agent actions to camel messages
   */
  public Object agentInternallyActed(
      String agentName, String actionName, List<Term> parameters, Unifier unifier) {
    Object actionsucceeded = true;
    Exchange exchange = endpoint.createExchange();

    // Agent action can only be processed by an endpoint of type "action"
    if (endpoint.getUriOption().contains("action")) {

      try {

        List<String> paramsAsStrings = new ArrayList<String>();
        for (Term t : parameters) {
          paramsAsStrings.add(t.toString());
        }
        sendActionToCamel(agentName, actionName, paramsAsStrings, exchange, "");

      } catch (Exception e) {

      } finally {

        // log exception if an exception occurred and was not handled
        if (exchange.getException() != null) {
          getExceptionHandler()
              .handleException("Error processing exchange", exchange, exchange.getException());
          actionsucceeded = false;
        } else {
          String ep = endpoint.getExchangePattern().toString();
          // Just send out camel message and inform success to agent
          if (ep.equals("InOnly")) actionsucceeded = true;

          // Unification is applicable to InOut exchanges only. This waits for the return message
          // from the exchange
          else if (ep.equals("InOut")) {
            if (exchange.hasOut()) {
              List<String[]> mappings = getResultHeaderSplitted();
              for (String[] mapping : mappings) {
                int unPos = Integer.parseInt(mapping[1]);
                String headerVal = mapping[0];

                // ArrayList<String> l = (ArrayList<String>)exchange.getIn().getHeader(headerVal);
                // Iterator<String> it = l.iterator();
                String unVal = exchange.getIn().getHeader(headerVal).toString();
                try {
                  unifier.unifies(parameters.get(unPos), ASSyntax.parseTerm(unVal));
                } catch (jason.asSyntax.parser.ParseException e) {
                  System.out.println(
                      "Error parsing result header from synchronous InOut action: " + unVal);
                  return false;
                }
              }
              return true;
            } else actionsucceeded = false;
          }
        }
      }
    }
    return actionsucceeded;
  }
  public Proposition makeGround() {
    PropositionImpl ground = (PropositionImpl) this.clone();
    for (Term term : ground.getTerms()) {
      if (term.isVar() && !term.isGround()) {
        Term t = new Atom(term.toString().toLowerCase());
        jason.asSemantics.Unifier un = new jason.asSemantics.Unifier();
        if (un.unifies(t, term)) {
          term.apply(un);
        }
      }
    }

    return ground;
  }
Beispiel #3
0
  /**
   * Implement the method in the standard class for agent doctor to call. Executes the internal
   * action. It should return a Boolean or an Iterator. A true boolean return means that the IA was
   * successfully executed.
   *
   * @param ts TransitionSystem
   * @param un Unifier
   * @param args Term array
   * @return true or false
   * @throws Exception
   */
  @Override
  public Object execute(TransitionSystem ts, Unifier un, Term[] args) throws Exception {

    // print a message to confirm action (appear in the debug window)
    ts.getAg().getLogger().info("Executing internal action 'robot.send'.");

    // loop through each argument e.g. if robot.send(Hello, Robot)
    // the arguments will be Hello and Robot.
    // in our doctor, we only use message "start" to wake up the robot
    for (Term t : args) {
      // use the static comms class to send the message to the robot
      comm.write(t.toString());
    }

    // everything ok, so return true
    return true;
  }
  /**
   * @param jasonAction
   * @return Maps external Jason agent actions to camel messages
   */
  public boolean agentActed(JasonAction jasonAction) {
    boolean actionsucceeded = true;
    Exchange exchange = endpoint.createExchange();
    if (endpoint.getUriOption().contains("action")) {
      try {
        ActionExec action = jasonAction.getAction();

        String agName = jasonAction.getAgName();
        List<String> paramsAsStrings = new ArrayList<String>();
        for (Term t : action.getActionTerm().getTerms()) paramsAsStrings.add(t.toString());

        // extract annotations
        List<Term> ann = action.getActionTerm().getAnnots();
        String annots = "";
        if (ann != null) annots = ann.toString(); // StringUtils.join(ann, ',');    	
        exchange.getIn().setBody(action.getActionTerm().toString(), String.class);
        sendActionToCamel(
            agName, action.getActionTerm().getFunctor(), paramsAsStrings, exchange, annots);

      } catch (Exception e) {

      } finally {

        // log exception if an exception occurred and was not handled
        if (exchange.getException() != null) {
          getExceptionHandler()
              .handleException("Error processing exchange", exchange, exchange.getException());
          actionsucceeded = false;
        } else {
          String ep = endpoint.getExchangePattern().toString();

          // Just send out camel message and inform success to agent
          if (ep.equals("InOnly")) actionsucceeded = true;
          else if (ep.equals("InOut")) {
            if (exchange.getOut() != null) actionsucceeded = true;
            else actionsucceeded = false;
          }
        }
      }
    }
    return actionsucceeded;
  }