All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.magentys.Agent Maven / Gradle / Ivy

There is a newer version: 1.0.7
Show newest version
package io.magentys;

import io.magentys.annotations.Narrate;
import io.magentys.exceptions.NotAvailableException;
import io.magentys.utils.Any;
import io.magentys.utils.Clazz;
import io.magentys.utils.Strings;
import io.magentys.utils.UniqueId;

import java.util.*;

import static io.magentys.utils.Any.any;
import static io.magentys.utils.Requires.requires;
import static io.magentys.utils.Requires.requiresNotNull;

public class Agent {

    protected Memory memory;
    protected List tools = new ArrayList();

    public String name() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    protected String name = UniqueId.incrementalId();


    public Set getNarrators() {
        return narrators;
    }

    protected Set narrators = new HashSet();

    public Agent(final Memory memory) {
        this.memory = memory;
    }

    public void setMemory(final Memory mem) {
        this.memory = mem;
    }

    public  RESULT performs(final Mission mission) {
        narrateBefore(mission);
        RESULT result = mission.accomplishAs(this);
        narrateAfter(mission);
        return result;
    }

    protected  void narrateBefore(Mission mission) {
        if(mission.getClass().isAnnotationPresent(Narrate.class)){
            Narrate narrate = mission.getClass().getAnnotation(Narrate.class);
            narrateThat(narrate.value());
        }
    }

    protected  void narrateAfter(Mission mission) {
        if(mission.getClass().isAnnotationPresent(Narrate.class)){
            Narrate narrate = mission.getClass().getAnnotation(Narrate.class);
            if(!Strings.empty.equals(narrate.after()) && narrate.after() != null) narrateThat(narrate.after());
        }
    }

    public void narrateThat(String message){
        for(Narrator narrator : narrators) {
            narrator.narrate(name, "info", message);
        }
    }

    public void narrateThat(String level, String message){
        for(Narrator narrator : narrators){
            narrator.narrate(name, "info", message);
        }
    }

    public Agent performAll(final Mission... missions) {
        requires(missions != null && missions.length > 0, "No Missions were passed");
        for (final Mission mission : missions) {
            performs(mission);
        }
        return this;
    }

    public Agent obtains(final Object... tools) {
        requiresNotNull(tools, "tools were empty");
        for (final Object tool : tools) {
            this.tools.add(any(tool));
        }
        return this;
    }

    public Agent reportsUsing(final Narrator... narrators){
        requiresNotNull(narrators, "narrators were null");
        for(final Narrator narrator : narrators){
            this.narrators.add(narrator);
        }
        return this;
    }

    public Agent setTools(List tools){
        this.tools = tools;
        return this;
    }

    public Agent setNarrators(Set narrators){
        this.narrators = narrators;
        return this;
    }

    public  TOOL usingThe(final Class toolClass) {

        for (final Any tool : tools) {
            if (Clazz.isClassOrSubclass(toolClass, tool.get().getClass())) {
                return (TOOL) tool.get();
            }
        }

        throw new NotAvailableException("I don't know this skill: " + toolClass);
    }

    public  void keepsInMind(final String key, final VALUE value) {
        this.memory.remember(key, value);
    }

    public  VALUE recalls(final String key, final Class clazz) {
        return (VALUE) memory.recall(key, clazz);
    }

    public Agent and(final Mission mission) {
        performAll(mission);
        return this;
    }

    public Agent andHe(final Mission... missions) {
        return performAll(missions);
    }

    public Agent andShe(final Mission... missions) {
        return performAll(missions);
    }


    public List getTools() {
        return tools;
    }

    public Memory getMemory() {
        return memory;
    }

    public Agent addNarrators(Narrator... narrators){
        requiresNotNull(narrators, "Narrators passed were null");
        for(Narrator narrator : narrators){
            requiresNotNull(narrator, "narrator was null");
            this.narrators.add(narrator);
        }
        return this;
    }

    public Agent clone(){
        return new Agent(memory).setTools(tools).setNarrators(narrators);
    }

    public  Agent askThe(final Agent anotherAgent, KEY key){
        anotherAgent.getMemory().transferTo(memory, key);
        return this;
    }


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy