mirror of https://github.com/micromata/borgbackup-butler.git

Kai Reinhard
11.05.2019 725b302f0272875f961b132e9c963378c11e8365
#30 Log viewer: newest entries are not displayed for max result size < size.
1 files modified
2 files added
147 ■■■■ changed files
borgbutler-server/src/main/java/de/micromata/borgbutler/server/logging/FiFoBuffer.java 38 ●●●●● patch | view | raw | blame | history
borgbutler-server/src/main/java/de/micromata/borgbutler/server/logging/Log4jMemoryAppender.java 42 ●●●●● patch | view | raw | blame | history
borgbutler-server/src/test/java/de/micromata/borgbutler/server/logging/FiFoBufferTest.java 67 ●●●●● patch | view | raw | blame | history
borgbutler-server/src/main/java/de/micromata/borgbutler/server/logging/FiFoBuffer.java
New file
@@ -0,0 +1,38 @@
package de.micromata.borgbutler.server.logging;
import java.util.ArrayList;
import java.util.Iterator;
public class FiFoBuffer<T> {
    private ArrayList<T> list;
    private int maxSize;
    public FiFoBuffer(int maxSize) {
        this.maxSize = maxSize;
        list = new ArrayList<>(maxSize);
    }
    public void add(T element) {
        synchronized (list) {
            if (list.size() >= maxSize) {
                Iterator<T> it = list.iterator();
                it.next();
                it.remove();
            }
            list.add(element);
        }
    }
    public T get(int index) {
        synchronized (list) {
            if (index <= 0 || index >= list.size()) {
                return null;
            }
            return list.get(index);
        }
    }
    public int getSize() {
        return list.size();
    }
}
borgbutler-server/src/main/java/de/micromata/borgbutler/server/logging/Log4jMemoryAppender.java
@@ -1,6 +1,5 @@
package de.micromata.borgbutler.server.logging;
import org.apache.commons.collections4.queue.CircularFifoQueue;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;
@@ -34,7 +33,7 @@
    }
    CircularFifoQueue<LoggingEventData> queue = new CircularFifoQueue<>(QUEUE_SIZE);
    FiFoBuffer<LoggingEventData> queue = new FiFoBuffer<>(QUEUE_SIZE);
    @Override
    protected void append(LoggingEvent event) {
@@ -63,13 +62,34 @@
        }
        int counter = 0;
        //I18n i18n = CoreI18n.getDefault().get(locale);
        for (LoggingEventData event : queue) {
        if (filter.isAscendingOrder()) {
            for (int i = 0; i < queue.getSize(); i++) {
                LoggingEventData resultEvent = getResultEvent(filter, queue.get(i), locale);
                if (resultEvent == null) continue;
                result.add(resultEvent);
                if (++counter > maxSize) break;
            }
        } else {
            for (int i = queue.getSize(); i >= 0; i--) {
                LoggingEventData resultEvent = getResultEvent(filter, queue.get(i), locale);
                if (resultEvent == null) continue;
                result.add(resultEvent);
                if (++counter > maxSize) break;
            }
        }
        return result;
    }
    private LoggingEventData getResultEvent(LogFilter filter, LoggingEventData event, Locale locale) {
        if (event == null) {
            return null;
        }
            if (!event.getLevel().matches(filter.getThreshold())) {
                continue;
            return null;
            }
            if (filter.getLastReceivedLogOrderNumber() != null) {
                if (event.getOrderNumber() <= filter.getLastReceivedLogOrderNumber()) {
                    continue;
                return null;
                }
            }
            String logString = null;
@@ -97,17 +117,9 @@
                    resultEvent = event.clone();
                    resultEvent.setMessage(message);
                }
                if (filter.isAscendingOrder()) {
                    result.add(resultEvent);
                } else {
                    result.add(0, resultEvent);
            return resultEvent;
                }
                if (counter++ > maxSize) {
                    break;
                }
            }
        }
        return result;
        return null;
    }
    private void append(StringBuilder sb, Object value, boolean append) {
borgbutler-server/src/test/java/de/micromata/borgbutler/server/logging/FiFoBufferTest.java
New file
@@ -0,0 +1,67 @@
package de.micromata.borgbutler.server.logging;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
public class FiFoBufferTest {
    private FiFoBuffer<Long> fiFoBuffer;
    private Long counter = 0L;
    private ArrayList<Thread> threads = new ArrayList<>();
    @Test
    void test() {
        fiFoBuffer = new FiFoBuffer<>(1000);
        for (int i = 0; i < 10; i++) {
            startProducerThread();
            startConsumerThread(i % 2 == 0);
        }
        for (Thread thread : threads) {
            try {
                thread.join();
            } catch (InterruptedException ex) {
            }
        }
        Assert.assertEquals(100000, counter.longValue());
    }
    private void startProducerThread() {
        Thread thread = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 10000; i++) {
                    long value;
                    synchronized (threads) {
                        value = ++counter;
                    }
                    fiFoBuffer.add(value);
                }
            }
        };
        thread.start();
        threads.add(thread);
    }
    private void startConsumerThread(boolean ascending) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 1000; i++) {
                    if (ascending) {
                        for (int j = 0; j < fiFoBuffer.getSize(); j++) {
                            fiFoBuffer.get(j);
                        }
                    } else {
                        for (int j = fiFoBuffer.getSize(); j >= 0; j--) {
                            fiFoBuffer.get(j);
                        }
                    }
                }
            }
        };
        thread.start();
        threads.add(thread);
    }
}