RfidContainer.java 3.61 KB
package fi.insomnia.bortal.view;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.insomnia.bortal.model.ReaderEvent;

@ApplicationScoped
@ManagedBean
public class RfidContainer {
    private static final Logger logger = LoggerFactory.getLogger(RfidContainer.class);

    private Map<String, List<RfidEvent>> events = Collections.synchronizedMap(new HashMap<String, List<RfidEvent>>());

    public synchronized void foundTag(String reader, String tag, ReaderEvent revent) {
        if (!events.containsKey(reader)) {
            events.put(reader, Collections.synchronizedList(new LinkedList<RfidEvent>()));
        }

        List<RfidEvent> readerevents = events.get(reader);
        while (readerevents.size() > 20) {
            readerevents.remove(readerevents.size() - 1);
            logger.debug("Cleaning readerevents fro reader {}", reader);
        }
        if (readerevents.size() > 0 && readerevents.get(0).getTag().equals(tag)) {
            readerevents.get(0).seen();
        } else {
            readerevents.add(0, new RfidEvent(reader, tag, revent));
            logger.debug("Readerevents size {}", readerevents.size());
        }
    }

    public List<RfidEvent> getReaderEvents(String reader) {
        return events.get(reader);
    }

    public Map<String, List<RfidEvent>> getReaders() {
        return events;
    }

    public class RfidEvent {
        RfidEvent(String reader, String tag, ReaderEvent revent) {
            this.reader = reader;
            this.tag = tag;
            this.event = revent;
        }

        public void seen() {
            time = Calendar.getInstance();
        }

        public String getSeenSince() {

            long diffSec = (Calendar.getInstance().getTimeInMillis() - time.getTimeInMillis()) / 1000;
            long secs = diffSec % 60;
            long diffMin = diffSec / 60;
            long mins = diffMin % 60;
            long hours = diffMin / 60;

            StringBuilder ret = new StringBuilder();
            if (hours > 0) {
                ret.append(hours).append(" h ");
            }
            if (hours > 0 || mins > 0) {
                ret.append(mins).append(" min ");
            }
            ret.append(secs).append(" sec");
            return ret.toString();
        }

        private Calendar time = Calendar.getInstance();
        private String reader;
        private String tag;
        private ReaderEvent event;
        private List<String> actions = new ArrayList<String>();

        public Calendar getTime() {
            return time;
        }

        public void setTime(Calendar time) {
            this.time = time;
        }

        public String getReader() {
            return reader;
        }

        public void setReader(String reader) {
            this.reader = reader;
        }

        public String getTag() {
            return tag;
        }

        public void setTag(String tag) {
            this.tag = tag;
        }

        public ReaderEvent getEvent() {
            return event;
        }

        public void setEvent(ReaderEvent event) {
            this.event = event;
        }

        public List<String> getActions() {
            return actions;
        }

        public void setActions(List<String> actions) {
            this.actions = actions;
        }

        public void addMessage(String msg) {
            this.actions.add(msg);

        }

    }
}