/** The plan body. */
  public void body() {
    Waste waste = (Waste) getBeliefbase().getBelief("carriedwaste").getFact();
    //		System.out.println("carriedwaste a ="+waste);
    //		if(waste==null)
    //			System.out.println("here");

    // Move to a not full waste-bin
    Wastebin wastebin = (Wastebin) getParameter("wastebin").getValue();
    if (wastebin == null) throw new PlanFailureException();

    Location location = wastebin.getLocation();
    IGoal moveto = createGoal("achievemoveto");
    moveto.getParameter("location").setValue(location);
    //		System.out.println("Created: "+location+" "+this);
    dispatchSubgoalAndWait(moveto);
    //		System.out.println("Reached: "+location+" "+this);

    // Drop waste to waste-bin.
    // IEnvironment env = (IEnvironment)getBeliefbase().getBelief("environment").getFact();
    // boolean success = env.dropWasteInWastebin(waste, wastebin);
    IGoal dg = createGoal("drop_waste_action");
    dg.getParameter("waste").setValue(waste);
    dg.getParameter("wastebin").setValue(wastebin);
    dispatchSubgoalAndWait(dg);

    // Update beliefs.
    //		getLogger().info("Dropping waste to wastebin!");
    wastebin.addWaste(waste);

    // Todo: Find out why atomic is needed.
    //		startAtomic();
    IBeliefSet wbs = getBeliefbase().getBeliefSet("wastebins");
    if (wbs.containsFact(wastebin)) {
      ((Wastebin) wbs.getFact(wastebin)).update(wastebin);
      //			wbs.updateFact(wastebin);
    } else {
      wbs.addFact(wastebin);
    }
    // getBeliefbase().getBeliefSet("wastebins").updateOrAddFact(wastebin);
    getBeliefbase().getBelief("carriedwaste").setFact(null);
    //		System.out.println("carriedwaste b =null");
    //		endAtomic();
  }
  private void updateAgentBeliefs() {
    ISpaceObject myself = (ISpaceObject) getBeliefbase().getBelief("myself").getFact();
    PerceptContainer localPerceptContainer =
        (PerceptContainer) myself.getProperty("perceptContainer");
    // Update Agent Beliefs
    Set<String> perceptIDSet = localPerceptContainer.perceptIDSet();
    // System.out.println("~~~~~Inside belief update :" + perceptIDSet.size() +"-"+this);
    // for (String perceptID : perceptIDSet)
    Object[] perceptIDSetA = perceptIDSet.toArray();
    for (int m = 0; m < perceptIDSetA.length; m++) {
      String perceptID = (String) perceptIDSetA[m];
      startAtomic();
      IGoal[] oldGoal = this.getGoalbase().getGoals();
      try {
        if (getBeliefbase().containsBelief(perceptID)) {
          Object oldFact = getBeliefbase().getBelief(perceptID).getFact();
          Object newFact = localPerceptContainer.read(perceptID);
          //					if (oldFact == null)
          //						System.out.println("NULLL OLD FACT CREATE EXCEPTION!");
          if (!newFact.equals(oldFact)) {
            getBeliefbase().getBelief(perceptID).setFact(newFact);
          }
          // System.out.println("------Inside belief update :" + perceptID +"-"+this);
        } else if (getBeliefbase().containsBeliefSet(perceptID)) {
          IBeliefSet beliefSet = getBeliefbase().getBeliefSet(perceptID);
          Object newFact = localPerceptContainer.read(perceptID);

          if (newFact.getClass().equals(beliefSet.getClazz())) {
            // Replace the old fact with the new one
            if (beliefSet.containsFact(newFact) == true) beliefSet.removeFact(newFact);
            beliefSet.addFact(newFact);
          } else {
            Object[] newFacts = (Object[]) newFact;
            for (int i = 0; i < newFacts.length; i++) {
              if (beliefSet.containsFact(newFacts[i]) == true) beliefSet.removeFact(newFacts[i]);
              beliefSet.addFact(newFacts[i]);
            }
            String nh = "";
            for (int i = 0; i < newFacts.length; i++) {
              nh = nh + newFacts[i].toString();
            }
            System.out.println(agentID + nh);
          }
        } else {
          // System.out.println("------Inside belief update");
          LOGGER.severe("perceptID is not recognized by Jadex's belief/beliefset");
          // throw new RuntimeException ("perceptID is not recognized by Jadex's belief/beliefset");
        }
      } catch (Exception e) {
        LOGGER.severe(e.getMessage());
      }

      // No need to track new number of goals, because the goal itself is created and the plan
      // are in queue to be launched even before this idleplan could dispatch another idleplan
      int noOfNewlyGeneratedGoal = this.getNoOfNewlyGeneratedGoalSince(oldGoal);
      endAtomic();
      if (noOfNewlyGeneratedGoal > 0) {
        SyncInteger noOfTopLevelGoal =
            (SyncInteger) getBeliefbase().getBelief("noOfTopLevelGoal").getFact();
        //				noOfTopLevelGoal = noOfTopLevelGoal + noOfNewlyGeneratedGoal;
        noOfTopLevelGoal.add(noOfNewlyGeneratedGoal);
        getBeliefbase().getBelief("noOfTopLevelGoal").setFact(noOfTopLevelGoal);
      }
      // System.out.println("------Inside belief update :" + perceptID +"-"+this);
    }
  }