{"id":19015343,"url":"https://github.com/hansolo/evt","last_synced_at":"2026-06-30T10:31:16.961Z","repository":{"id":57731271,"uuid":"264849627","full_name":"HanSolo/evt","owner":"HanSolo","description":"A custom java event implementation with priorities","archived":false,"fork":false,"pushed_at":"2021-12-21T11:46:26.000Z","size":110,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-01-01T22:43:13.407Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HanSolo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"license.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-05-18T06:36:36.000Z","updated_at":"2023-09-23T21:36:28.000Z","dependencies_parsed_at":"2022-09-26T22:10:18.572Z","dependency_job_id":null,"html_url":"https://github.com/HanSolo/evt","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HanSolo%2Fevt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HanSolo%2Fevt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HanSolo%2Fevt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HanSolo%2Fevt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HanSolo","download_url":"https://codeload.github.com/HanSolo/evt/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240055662,"owners_count":19740984,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T19:36:51.442Z","updated_at":"2026-04-26T06:30:16.792Z","avatar_url":"https://github.com/HanSolo.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"## EVT - Custom Java Events with priority \n\nThis projects simply offers custom Java events that supports priorities if you like.\n\nOne can create a custom event as shown below\n\n```Java\npublic class MyEvt extends Evt {\n\n    public static final EvtType\u003cMyEvt\u003e ANY = new EvtType\u003c\u003e(Evt.ANY, \"MY_EVENT\");\n\n    public MyEvt(final EvtType\u003c? extends MyEvt\u003e evtType) {\n        super(evtType);\n    }\n    public MyEvt(final Object source, final EvtType\u003c? extends MyEvt\u003e evtType) {\n        super(source, evtType);\n    }\n    public MyEvt(final Object source, final EvtType\u003c? extends MyEvt\u003e evtType, final EvtPriority priority) {\n        super(source, evtType, priority);\n    }\n\n\n    public EvtType\u003c? extends MyEvt\u003e getEvtType() {\n        return (EvtType\u003c? extends MyEvt\u003e) super.getEvtType();\n    }\n}\n```\n\nNow with your event in place you can create specific events extending MyEvt as follows:\n\n```Java\npublic class MyValueEvt extends MyEvt {\n    public  static final EvtType\u003cMyValueEvt\u003e ANY          = new EvtType\u003c\u003e(MyEvt.ANY, \"VALUE\");\n    public  static final EvtType\u003cMyValueEvt\u003e VALUE_TYPE_1 = new EvtType\u003c\u003e(MyValueEvt.ANY, \"VALUE_TYPE_1\");\n    public  static final EvtType\u003cMyValueEvt\u003e VALUE_TYPE_2 = new EvtType\u003c\u003e(MyValueEvt.ANY, \"VALUE_TYPE_2\");\n    private              double              value;\n\n\n    // ******************** Constructors **************************************\n    public MyValueEvt(final Object source, final EvtType\u003c? extends MyValueEvt\u003e evtType, final double value) {\n        this(source, evtType, value, EvtPriority.NORMAL);\n    }\n    public MyValueEvt(final Object source, final EvtType\u003c? extends MyValueEvt\u003e evtType, final double value, final EvtPriority priority) {\n        super(source, evtType, priority);\n        this.value = value;\n    }\n\n\n    // ******************** Methods *******************************************\n    public EvtType\u003c? extends MyValueEvt\u003e getEvtType() {\n        return (EvtType\u003c? extends MyValueEvt\u003e) super.getEvtType();\n    }\n\n    public double getValue() { return value; }\n} \n```\n\nAs an example we use a control with a value property as follows:\n\n```Java\npublic interface MyControl {\n    void fireEvt(final Evt evt);\n\n    void dispose();\n}\n\npublic class MyClass implements MyControl {\n    private final Map\u003cString, List\u003cEvtObserver\u003e\u003e observers = new ConcurrentHashMap\u003c\u003e();\n    private double                               value;\n    private String string;\n\n\n    // ******************** Constructors **************************************\n    public MyClass() {\n        this.value  = 0;\n        this.string = \"\";\n    }\n\n\n    // ******************** Methods *******************************************\n    public double getValue() { return value; }\n    public void setValue(final double value) {\n        this.value = value;\n        fireEvt(new MyValueEvt(MyClass.this, MyValueEvt.VALUE_TYPE_1, value));\n    }\n\n    public String getString() { return string; }\n    public void setString(final String string) {\n        this.string = string;\n        fireEvt(new MyStringEvt(MyClass.this, MyStringEvt.STRING_TYPE_1, string));\n    }\n\n\n    // ******************** EventHandling *************************************\n    public void setOnEvt(final EvtType\u003c? extends Evt\u003e type, final EvtObserver observer) {\n        if (!observers.keySet().contains(type.getName())) { observers.put(type.getName(), new CopyOnWriteArrayList\u003c\u003e()); }\n        if (!observers.get(type.getName()).contains(observer)) { observers.get(type.getName()).add(observer); }\n    }\n    public void removeOnEvt(final EvtType\u003c? extends Evt\u003e type, final EvtObserver observer) {\n        if (!observers.keySet().contains(type.getName())) { return; }\n        if (observers.get(type.getName()).contains(observer)) { observers.get(type.getName()).remove(observer); }\n    }\n    public void removeAllObservers() { observers.entrySet().forEach(entry -\u003e entry.getValue().clear()); }\n\n    @Override public void fireEvt(final Evt evt) {\n        final EvtType\u003c? extends Evt\u003e type = evt.getEvtType();\n        if (observers.containsKey(type.getName())) {\n            observers.get(type.getName()).forEach(observer -\u003e observer.handle(evt));\n        }\n    }\n\n    @Override public void dispose() {\n\n    }\n}\n```\n\nNow if we would like to listen to those events we can create an instance of it and set a value as follows:\n\n```Java\npublic class Main {\n    private MyClass                      myClass;\n    private MyOtherClass             myOtherClass;\n    private EvtObserver\u003cMyValueEvt\u003e  valueEventEvtObserver;\n    private EvtObserver\u003cMyStringEvt\u003e stringEventEvtObserver;\n\n\n    public Main() {\n        myClass      = new MyClass();        \n\n        valueEventEvtObserver = e -\u003e System.out.println(\"New Value Event with priority \" + e.getPriority().name() + \" and value: \" + e.getValue() + \" from class \" + e.getSource().getClass());\n        myClass.setOnEvt(MyValueEvt.VALUE_TYPE_1, valueEventEvtObserver);        \n\n        stringEventEvtObserver = e -\u003e System.out.println(\"New String Event with priority \" + e.getPriority().name() + \" and string: \" + e.getString() + \" from class \" + e.getSource().getClass());\n        myClass.setOnEvt(MyStringEvt.STRING_TYPE_1, stringEventEvtObserver);        \n\n\n        myClass.setValue(312);\n        myClass.setString(\"Gerrit\");\n    }\n    \n    public static void main(String[] args) {\n        new Main();\n    }\n}\n```\n\nIn the example above we simply set the value and fire a MyValueEvt with priority NORMAL.\n\n\nIn case we would like to make use of the priorities we can create another control as follows:\n\n```Java\npublic class MyOtherClass implements MyControl {\n    private final Map\u003cString, List\u003cEvtObserver\u003e\u003e observers       = new ConcurrentHashMap\u003c\u003e();\n    private final BlockingQueue\u003cEvt\u003e             evtQueue        = new PriorityBlockingQueue\u003c\u003e();\n    private final Callable\u003cBoolean\u003e              consumerTask    = () -\u003e {\n        while (true) {\n            final Evt evt;\n            try {\n                evt = evtQueue.take();\n                final EvtType\u003c? extends Evt\u003e type = evt.getEvtType();\n                if (observers.containsKey(type.getName())) {\n                    observers.get(type.getName()).forEach(observer -\u003e observer.handle(evt));\n                }\n            } catch (InterruptedException ex) {\n                return false;\n            }\n        }\n    };\n    private ScheduledExecutorService             consumerService = new ScheduledThreadPoolExecutor(1, runnable -\u003e new Thread(runnable, \"EventConsumerThread\"));\n    private double                               value;\n    private String                               string;\n\n\n    // ******************** Constructors **************************************\n    public MyOtherClass() {\n        this.value  = 0;\n        this.string = \"\";\n\n        consumerService.schedule(consumerTask, 0, TimeUnit.MILLISECONDS);\n    }\n\n\n    // ******************** Methods *******************************************\n    public double getValue() { return value; }\n    public void setValue(final double value) {\n        this.value = value;\n        // Fires events with Priority LOW which will be served last\n        fireEvt(new MyValueEvt(MyOtherClass.this, MyValueEvt.VALUE_TYPE_2, value, EvtPriority.LOW));\n    }\n\n    public String getString() { return string; }\n    public void setString(final String string) {\n        this.string = string;\n        // Fires events with Priority HIGH which will be served first\n        fireEvt(new MyStringEvt(MyOtherClass.this, MyStringEvt.STRING_TYPE_2, string, EvtPriority.HIGH));\n    }\n\n\n    // ******************** EventHandling *************************************\n    public void setOnEvent(final EvtType\u003c? extends Evt\u003e type, final EvtObserver observer) {\n        if (!observers.keySet().contains(type.getName())) { observers.put(type.getName(), new CopyOnWriteArrayList\u003c\u003e()); }\n        if (!observers.get(type.getName()).contains(observer)) { observers.get(type.getName()).add(observer); }\n    }\n    public void removeOnEvent(final EvtType\u003c? extends Evt\u003e type, final EvtObserver observer) {\n        if (!observers.keySet().contains(type.getName())) { return; }\n        if (observers.get(type.getName()).contains(observer)) { observers.get(type.getName()).remove(observer); }\n    }\n    public void removeAllObservers() { observers.entrySet().forEach(entry -\u003e entry.getValue().clear()); }\n\n    @Override public void fireEvt(final Evt evt) {\n        evtQueue.add(evt);\n    }\n\n    @Override public void dispose() {\n        consumerService.shutdown();\n        try {\n            if (!consumerService.awaitTermination(500, TimeUnit.MILLISECONDS)) {\n                consumerService.shutdownNow();\n            }\n        } catch (InterruptedException e) {\n            consumerService.shutdownNow();\n        }\n    }\n}\n```\n\nIn this class we put the events on a concurrent priority queue so that they will be ordered by priority.\nHere we fire an HIGH priority event in case the string property was changed and a LOW priority event in case the value changed.\n\nThe Main class to observe the priority based events will look as follows:\n\n```Java\npublic class Main {\n    private MyClass                      myClass;\n    private MyOtherClass             myOtherClass;\n    private EvtObserver\u003cMyValueEvt\u003e  valueEventEvtObserver;\n    private EvtObserver\u003cMyStringEvt\u003e stringEventEvtObserver;\n\n\n    public Main() {\n        myClass      = new MyClass();\n        myOtherClass = new MyOtherClass();\n\n        valueEventEvtObserver = e -\u003e System.out.println(\"New Value Event with priority \" + e.getPriority().name() + \" and value: \" + e.getValue() + \" from class \" + e.getSource().getClass());\n        myClass.setOnEvt(MyValueEvt.VALUE_TYPE_1, valueEventEvtObserver);\n        myOtherClass.setOnEvent(MyValueEvt.VALUE_TYPE_2, valueEventEvtObserver);\n\n        stringEventEvtObserver = e -\u003e System.out.println(\"New String Event with priority \" + e.getPriority().name() + \" and string: \" + e.getString() + \" from class \" + e.getSource().getClass());\n        myClass.setOnEvt(MyStringEvt.STRING_TYPE_1, stringEventEvtObserver);\n        myOtherClass.setOnEvent(MyStringEvt.STRING_TYPE_2, stringEventEvtObserver);\n\n\n        myClass.setValue(312);\n        myClass.setString(\"Gerrit\");\n\n        Random rnd = new Random();\n        for (int i = 0 ; i \u003c 100 ; i++) {\n            boolean callValue = rnd.nextBoolean();\n            if (callValue) {\n                myOtherClass.setValue(rnd.nextInt(100));\n            } else {\n                myOtherClass.setString(\"Neo \" + rnd.nextInt(100));\n            }\n        }\n\n        stop();\n    }\n\n    private void stop() {\n        myClass.dispose();\n        myOtherClass.dispose();\n    }\n\n    public static void main(String[] args) {\n        new Main();\n    }\n}\n```\n\nIn the output of the last example you will see that first all HIGH priority events will be handled followed by the LOW priority events.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhansolo%2Fevt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhansolo%2Fevt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhansolo%2Fevt/lists"}