From 4777c132d4e942083a7bb5a8d867ba8ae3b23cc7 Mon Sep 17 00:00:00 2001 From: brian Date: Wed, 27 Sep 2023 11:42:38 +0200 Subject: [PATCH] Allow init_delay and configurable alf_event filters. This closes #4 and closes #2 --- .../brutex/xservices/util/ALFEventFilter.java | 18 +++++++++++++++ .../xservices/util/EventIdTruncateFilter.java | 23 +++++++++++++++++++ .../util/EventmanagerConfiguration.java | 18 +++++++++++++++ .../MiscServiceServletContextListener.java | 3 ++- .../xservices/ws/impl/MiscServiceImpl.java | 10 +++++--- .../webapp/WEB-INF/eventmanager.properties | 11 +++++++-- 6 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 src/main/java/net/brutex/xservices/util/ALFEventFilter.java create mode 100644 src/main/java/net/brutex/xservices/util/EventIdTruncateFilter.java diff --git a/src/main/java/net/brutex/xservices/util/ALFEventFilter.java b/src/main/java/net/brutex/xservices/util/ALFEventFilter.java new file mode 100644 index 0000000..2db9535 --- /dev/null +++ b/src/main/java/net/brutex/xservices/util/ALFEventFilter.java @@ -0,0 +1,18 @@ +package net.brutex.xservices.util; + +import lombok.NonNull; +import net.brutex.xservices.types.alfevent.ALFEventType; + +/** + * Provides filtering and modification of ALF Events + */ +public interface ALFEventFilter { + + /** + * Modify or filter the alf event. + * + * @param event + * @return modified event or null if it should be filtered out + */ + ALFEventType filter(@NonNull ALFEventType event); +} diff --git a/src/main/java/net/brutex/xservices/util/EventIdTruncateFilter.java b/src/main/java/net/brutex/xservices/util/EventIdTruncateFilter.java new file mode 100644 index 0000000..9a4e11d --- /dev/null +++ b/src/main/java/net/brutex/xservices/util/EventIdTruncateFilter.java @@ -0,0 +1,23 @@ +package net.brutex.xservices.util; + +import lombok.NonNull; +import net.brutex.xservices.types.alfevent.ALFEventType; + +/** + * This example filter cuts the eventid to max of 32 characters + */ +public class EventIdTruncateFilter implements ALFEventFilter { + /** + * Modify or filter the alf event. + * + * @param event + * @return modified event or null if it should be filtered out + */ + @Override + public ALFEventType filter(@NonNull ALFEventType event) { + if (event.getBase().getEventId().length() > 32) { + event.getBase().setEventId(event.getBase().getEventId().substring(0, 32)); + } + return event; + } +} diff --git a/src/main/java/net/brutex/xservices/util/EventmanagerConfiguration.java b/src/main/java/net/brutex/xservices/util/EventmanagerConfiguration.java index cdf0d5b..512dc50 100644 --- a/src/main/java/net/brutex/xservices/util/EventmanagerConfiguration.java +++ b/src/main/java/net/brutex/xservices/util/EventmanagerConfiguration.java @@ -13,6 +13,9 @@ import org.apache.commons.configuration2.event.EventListener; import org.apache.commons.configuration2.ex.ConfigurationException; import javax.servlet.ServletContext; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; /** * A configuration object for the MiscService -> Eventmanager. Implemented as singleton. @@ -43,6 +46,8 @@ public class EventmanagerConfiguration { private String jdbc_filedb; private boolean isEmitterActive = true; private int cleaner_interval; + private List alf_filter = new ArrayList<>(); + private int init_delay; public synchronized EventmanagerConfiguration refreshConfig() { @@ -61,6 +66,19 @@ public class EventmanagerConfiguration { this.jdbc_filedb = config.getString("fdb", "jdbc:h2:mem:lockdb;DB_CLOSE_DELAY=-1;"); this.isEmitterActive = config.getBoolean("emitter_active", true); this.cleaner_interval = config.getInt("cleaner_interval", 5); + List lst = config.getList(String.class,"alf_filter", new ArrayList()); + + for ( String c :lst ) { + try{ + alf_filter.add( (ALFEventFilter) Class.forName(c).getDeclaredConstructor().newInstance()); + } catch (ClassNotFoundException e) { + log.error("Cannot find class for alf filter with name '{}'.", c); + } catch (InvocationTargetException | InstantiationException | IllegalAccessException | + NoSuchMethodException e) { + log.error("Cannot instantiate class for alf filter with name '{}'.", c); + } + } + this.init_delay = config.getInt("init_delay", 15); } catch (ConfigurationException e) { diff --git a/src/main/java/net/brutex/xservices/util/MiscServiceServletContextListener.java b/src/main/java/net/brutex/xservices/util/MiscServiceServletContextListener.java index 77a1eef..f617250 100644 --- a/src/main/java/net/brutex/xservices/util/MiscServiceServletContextListener.java +++ b/src/main/java/net/brutex/xservices/util/MiscServiceServletContextListener.java @@ -205,7 +205,8 @@ public class MiscServiceServletContextListener implements ServletContextListener job2.getJobDataMap().put("run_key", Instant.now().toEpochMilli()); job2.getJobDataMap().put("egres_counter", egres); job2.getJobDataMap().put(EventmanagerConfiguration.KEY, EventmanagerConfiguration.getInstance()); - SimpleTrigger t = (SimpleTrigger) newTrigger().withIdentity("ALFEmitter").startNow().build(); + SimpleTrigger t = (SimpleTrigger) newTrigger().withIdentity("ALFEmitter") + .startAt(Date.from(Instant.now().plusSeconds(configuration.getInit_delay()))).build(); scheduler.scheduleJob(job2, t); } } catch (SchedulerException ex) { diff --git a/src/main/java/net/brutex/xservices/ws/impl/MiscServiceImpl.java b/src/main/java/net/brutex/xservices/ws/impl/MiscServiceImpl.java index 440c3a9..c9605aa 100644 --- a/src/main/java/net/brutex/xservices/ws/impl/MiscServiceImpl.java +++ b/src/main/java/net/brutex/xservices/ws/impl/MiscServiceImpl.java @@ -23,10 +23,8 @@ import java.io.StringWriter; import java.math.BigInteger; import java.sql.*; import java.time.Instant; +import java.util.*; import java.util.Date; -import java.util.Enumeration; -import java.util.Properties; -import java.util.UUID; import java.util.concurrent.atomic.AtomicLong; import javax.annotation.Resource; import javax.jws.WebService; @@ -43,6 +41,7 @@ import net.brutex.xservices.types.alfevent.ALFEventResponseType; import net.brutex.xservices.types.alfevent.ALFEventType; import net.brutex.xservices.types.alfevent.ObjectFactory; import net.brutex.xservices.types.ant.FileSetResource; +import net.brutex.xservices.util.ALFEventFilter; import net.brutex.xservices.util.EventEmitter; import net.brutex.xservices.util.EventmanagerConfiguration; import net.brutex.xservices.util.RunTask; @@ -259,6 +258,11 @@ public class MiscServiceImpl try (Connection con = pool.getConnection()) { + List filter = conf.getAlf_filter(); + for(ALFEventFilter f : filter) { + event = f.filter(event); + } + Marshaller m = JAXBContext.newInstance(ALFEventType.class).createMarshaller(); //m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); diff --git a/src/main/webapp/WEB-INF/eventmanager.properties b/src/main/webapp/WEB-INF/eventmanager.properties index 3ac9e99..3204121 100644 --- a/src/main/webapp/WEB-INF/eventmanager.properties +++ b/src/main/webapp/WEB-INF/eventmanager.properties @@ -11,6 +11,10 @@ target.url = http://localhost:8085/eventmanager/services/ALFEventManagerDocLit # default: interval = 10 interval = 30 +# Initial delay in seconds before sending events recovered from the file based database. This should be +# smaller than the 'interval' setting. Default is 20 seconds. +init_delay = 20 + # In-Memory Database (H2 in this case) to use for event processing # This is the JDBC connection string. # default: memdb = jdbc:h2:mem:lockdb;DB_CLOSE_DELAY=-1; @@ -21,7 +25,6 @@ memdb = jdbc:h2:mem:lockdb;DB_CLOSE_DELAY=-1; # default: fdb = jdbc:h2:file:~/alf_event_db fdb = jdbc:h2:file:~/alf_event_db - # Activate Emitter # Default is true, otherwise XServices will receive events, but not make any attempt to # forward them. Memory inbound queue will only be written to disk when the service is @@ -31,4 +34,8 @@ emitter_active = true # EventLogCleaner interval in minutes, how often to move all registered events from memory to the file based # storage. For trace and debugging purpose. Default value is every 5 minutes. A value of zero or smaller # deactivates the cleaner. Value in minutes. -cleaner_interval = 4 \ No newline at end of file +cleaner_interval = 4 + +# ALFEventFilter classes, executed in order. This can be a comma separated list of classes +# default: empty +alf_filter = net.brutex.xservices.util.EventIdTruncateFilter \ No newline at end of file