aboutsummaryrefslogtreecommitdiffstats
path: root/archiva-modules/archiva-base
diff options
context:
space:
mode:
authorMartin Schreier <martin_s@apache.org>2022-02-13 10:27:32 +0100
committerMartin Schreier <martin_s@apache.org>2022-02-13 10:27:32 +0100
commit0a2dab16770cce10bda6fa2cc2e2d9c7d64c5dbf (patch)
tree1e633e0ae7fc56a857b5467a12a67adfc017b9e2 /archiva-modules/archiva-base
parent99bd81ac000598105529473a53f62a5b53d885a5 (diff)
downloadarchiva-0a2dab16770cce10bda6fa2cc2e2d9c7d64c5dbf.tar.gz
archiva-0a2dab16770cce10bda6fa2cc2e2d9c7d64c5dbf.zip
Improving event API
Diffstat (limited to 'archiva-modules/archiva-base')
-rw-r--r--archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/pom.xml6
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/pom.xml41
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/AbstractEventManager.java (renamed from archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/archiva/event/EventManager.java)58
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/BasicEventManager.java41
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/Event.java (renamed from archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/archiva/event/Event.java)42
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventContext.java48
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventContextBuilder.java72
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventHandler.java (renamed from archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/archiva/event/EventHandler.java)0
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventSource.java (renamed from archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/archiva/event/EventSource.java)0
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventType.java (renamed from archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/archiva/event/EventType.java)15
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/context/RepositoryContext.java90
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/context/RestContext.java96
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/context/UserContext.java71
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/package-info.java37
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/test/java/org/apache/archiva/event/BasicEventManagerTest.java (renamed from archiva-modules/archiva-base/archiva-common/src/test/java/org/apache/archiva/event/EventManagerTest.java)11
-rw-r--r--archiva-modules/archiva-base/archiva-event-central/pom.xml44
-rw-r--r--archiva-modules/archiva-base/archiva-event-central/src/main/java/org/apache/archiva/event/central/CentralEventManager.java42
-rw-r--r--archiva-modules/archiva-base/archiva-event-central/src/main/resources/META-INF/spring-context.xml32
-rw-r--r--archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/pom.xml4
-rw-r--r--archiva-modules/archiva-base/archiva-repository-api/pom.xml4
-rw-r--r--archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryHandler.java4
-rw-r--r--archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/event/RepositoryEvent.java22
-rw-r--r--archiva-modules/archiva-base/archiva-repository-layer/pom.xml4
-rw-r--r--archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/AbstractRepository.java8
-rw-r--r--archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/AbstractRepositoryHandler.java10
-rw-r--r--archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/ArchivaRepositoryRegistry.java20
-rw-r--r--archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/managed/ManagedRepositoryHandler.java2
-rw-r--r--archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/base/group/RepositoryGroupHandlerTest.java4
-rw-r--r--archiva-modules/archiva-base/pom.xml2
29 files changed, 774 insertions, 56 deletions
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/pom.xml b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/pom.xml
index 42844565e..6e2f82f47 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/pom.xml
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/pom.xml
@@ -76,6 +76,12 @@
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
+ <!-- Test scope -->
+ <dependency>
+ <groupId>org.apache.archiva.event</groupId>
+ <artifactId>archiva-event-api</artifactId>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.apache.archiva</groupId>
<artifactId>archiva-consumer-api</artifactId>
diff --git a/archiva-modules/archiva-base/archiva-event-api/pom.xml b/archiva-modules/archiva-base/archiva-event-api/pom.xml
new file mode 100644
index 000000000..6c9119c53
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-event-api/pom.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>archiva-base</artifactId>
+ <groupId>org.apache.archiva</groupId>
+ <version>3.0.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <name>Archiva :: Base :: Event API</name>
+ <groupId>org.apache.archiva.event</groupId>
+ <artifactId>archiva-event-api</artifactId>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-common</artifactId>
+ </dependency>
+ </dependencies>
+
+</project> \ No newline at end of file
diff --git a/archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/archiva/event/EventManager.java b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/AbstractEventManager.java
index 00a240066..6d2ddff7a 100644
--- a/archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/archiva/event/EventManager.java
+++ b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/AbstractEventManager.java
@@ -1,5 +1,4 @@
package org.apache.archiva.event;
-
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
@@ -9,8 +8,7 @@ package org.apache.archiva.event;
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -22,41 +20,47 @@ package org.apache.archiva.event;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.*;
+import java.util.LinkedHashSet;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
-public class EventManager implements EventSource
+/**
+ * @author Martin Schreier <martin_s@apache.org>
+ */
+public class AbstractEventManager implements EventSource
{
+ private static final Logger log = LoggerFactory.getLogger( AbstractEventManager.class );
- private static final Logger LOG = LoggerFactory.getLogger(EventManager.class);
-
- private final ConcurrentHashMap<EventType<? extends Event>, Set<EventHandler>> handlerMap = new ConcurrentHashMap<>();
-
- private final Object source;
-
- public EventManager(Object source) {
- if (source==null) {
- throw new IllegalArgumentException("The source may not be null");
- }
- this.source = source;
- }
+ protected final ConcurrentHashMap<EventType<? extends Event>, Set<EventHandler>> handlerMap = new ConcurrentHashMap<>();
@Override
- public <T extends Event> void registerEventHandler(EventType<T> type, EventHandler<? super T> eventHandler) {
+ public <T extends Event> void registerEventHandler( EventType<T> type, EventHandler<? super T> eventHandler) {
Set<EventHandler> handlers = handlerMap.computeIfAbsent(type, t -> new LinkedHashSet<>());
if (!handlers.contains(eventHandler)) {
handlers.add(eventHandler);
}
+ log.debug( "Event handler registered: " + eventHandler.getClass( ) );
}
@Override
- public <T extends Event> void unregisterEventHandler(EventType<T> type, EventHandler<? super T> eventHandler) {
+ public <T extends Event> void unregisterEventHandler( EventType<T> type, EventHandler<? super T> eventHandler) {
if (handlerMap.containsKey(type)) {
handlerMap.get(type).remove(eventHandler);
+ log.debug( "Event handler unregistered: " + eventHandler.getClass( ) );
}
}
- public void fireEvent(Event fireEvent) {
+ /**
+ * Fires the given event for the given source. If the source of the provided event does not match the <code>source</code>
+ * parameter the event will be chained.
+ *
+ * The event will be sent to all registered event handler. Exceptions during handling are not propagated to the
+ * caller.
+ *
+ * @param fireEvent the event to fire
+ * @param source the source object
+ */
+ public void fireEvent(Event fireEvent, Object source) {
final EventType<? extends Event> type = fireEvent.getType();
Event event;
if (fireEvent.getSource()!=source) {
@@ -66,14 +70,14 @@ public class EventManager implements EventSource
}
for (EventType<? extends Event> handlerType : handlerMap.keySet()) {
if (EventType.isInstanceOf(type, handlerType)) {
- for (EventHandler handler : handlerMap.get(handlerType)) {
- try {
- handler.handle(event);
- } catch (Exception e) {
- // We catch all errors from handlers
- LOG.error("An error occured during event handling: {}", e.getMessage(), e);
- }
+ for (EventHandler handler : handlerMap.get(handlerType)) {
+ try {
+ handler.handle(event);
+ } catch (Throwable e) {
+ // We catch all errors from handlers
+ log.error("An error occured during event handling: {}", e.getMessage(), e);
}
+ }
}
}
}
diff --git a/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/BasicEventManager.java b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/BasicEventManager.java
new file mode 100644
index 000000000..f952b9eaa
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/BasicEventManager.java
@@ -0,0 +1,41 @@
+package org.apache.archiva.event;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BasicEventManager extends AbstractEventManager implements EventSource
+{
+
+ private static final Logger LOG = LoggerFactory.getLogger( BasicEventManager.class);
+
+ private final Object source;
+
+ public BasicEventManager( Object source) {
+ if (source==null) {
+ throw new IllegalArgumentException("The source may not be null");
+ }
+ this.source = source;
+ }
+
+ public void fireEvent(Event fireEvent) {
+ super.fireEvent( fireEvent, source );
+ }
+}
diff --git a/archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/archiva/event/Event.java b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/Event.java
index eda85701e..2439105de 100644
--- a/archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/archiva/event/Event.java
+++ b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/Event.java
@@ -9,8 +9,7 @@ package org.apache.archiva.event;
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -21,6 +20,9 @@ package org.apache.archiva.event;
import java.time.LocalDateTime;
import java.util.EventObject;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Collectors;
/**
* Base class for events. Events have a type and a source.
@@ -41,6 +43,8 @@ public class Event extends EventObject implements Cloneable {
private final EventType<? extends Event> type;
private final LocalDateTime createTime;
+ private HashMap<Class<? extends EventContext>, EventContext> contextMap = new HashMap<>( );
+
public Event(EventType<? extends Event> type, Object originator) {
super(originator);
this.type = type;
@@ -52,6 +56,7 @@ public class Event extends EventObject implements Cloneable {
this.previous = previous;
this.type = previous.getType();
this.createTime = previous.getCreateTime();
+ this.contextMap = previous.contextMap;
}
/**
@@ -70,6 +75,38 @@ public class Event extends EventObject implements Cloneable {
return createTime;
}
+ public <T extends EventContext> T getContext(Class<T> contextClazz) throws IllegalArgumentException {
+ if (contextMap.containsKey( contextClazz )) {
+ return (T) contextMap.get( contextClazz );
+ } else {
+ T ctx = null;
+ for ( Map.Entry<Class<? extends EventContext>, EventContext> clazzEntry : contextMap.entrySet()) {
+ if ( contextClazz.isAssignableFrom( clazzEntry.getKey() ) )
+ {
+ ctx = (T) clazzEntry.getValue( );
+ break;
+ }
+ }
+ if (ctx!=null) {
+ contextMap.put( contextClazz, ctx );
+ return ctx;
+ }
+ }
+ throw new IllegalArgumentException( "No matching event context registered for " + contextClazz );
+ }
+
+ public Map<String, String> getContextData() {
+ return contextMap.entrySet( ).stream( ).flatMap( ctx -> ctx.getValue( ).getData( ).entrySet( ).stream( ) )
+ .collect( Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue ) );
+ }
+
+ public <T extends EventContext> void setContext( Class<T> clazz, T context) {
+ this.contextMap.put( clazz, context );
+ }
+
+ public <T extends EventContext> void setContext( T context) {
+ this.contextMap.put( context.getClass(), context );
+ }
/**
* Recreates the event with the given instance as the new source. The
@@ -81,6 +118,7 @@ public class Event extends EventObject implements Cloneable {
Event newEvent = (Event) this.clone();
newEvent.previous = this;
newEvent.source = newSource;
+ newEvent.contextMap = this.contextMap;
return newEvent;
}
diff --git a/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventContext.java b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventContext.java
new file mode 100644
index 000000000..9e113de06
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventContext.java
@@ -0,0 +1,48 @@
+package org.apache.archiva.event;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.Map;
+
+/**
+ * Context information about a specific event.
+ * This is used to provide specific information about the event context by using the generic
+ * event interface.
+ * Some event handler may need information about the underlying event but have no access to the
+ * API classes that represent the event.
+ *
+ * Context information is always string based and should not depend on external classes apart from JDK classes.
+ *
+ * @author Martin Schreier <martin_s@apache.org>
+ */
+public interface EventContext
+{
+ /**
+ * Returns the prefix used for entry keys in the repository data map.
+ * @return the prefix string for this context
+ */
+ String getPrefix();
+
+ /**
+ * Returns the context data as map of strings. Each entry key is prefixed with
+ * the unique prefix of this context.
+ *
+ * @return the map of key value pairs stored in this context
+ */
+ Map<String,String> getData();
+}
diff --git a/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventContextBuilder.java b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventContextBuilder.java
new file mode 100644
index 000000000..41f10ceec
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventContextBuilder.java
@@ -0,0 +1,72 @@
+package org.apache.archiva.event;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.archiva.event.context.RepositoryContext;
+import org.apache.archiva.event.context.RestContext;
+import org.apache.archiva.event.context.UserContext;
+
+/**
+ * Static helper class that allows to set certain context data
+ *
+ * @author Martin Schreier <martin_s@apache.org>
+ */
+public class EventContextBuilder
+{
+ Event evt;
+
+ public static void setUserContext(Event evt, String user, String remoteAddress) {
+ evt.setContext( UserContext.class, new UserContext( user, remoteAddress ) );
+ }
+
+ public static void setRestcontext(Event evt, String service, String path, String operation, int resultCode, String... parameters ) {
+ evt.setContext( RestContext.class, new RestContext( service, path, operation, resultCode, parameters ) );
+ }
+
+ public static void setRepositoryContext(Event evt, String id, String type, String flavour ) {
+ evt.setContext( RepositoryContext.class, new RepositoryContext( id, type, flavour ) );
+ }
+
+ private EventContextBuilder( Event evt) {
+ this.evt = evt;
+ }
+
+ public static EventContextBuilder withEvent( Event evt )
+ {
+ return new EventContextBuilder( evt );
+ }
+
+ public EventContextBuilder withUser( String user, String remoteAddress) {
+ setUserContext( this.evt, user, remoteAddress );
+ return this;
+ }
+
+ public EventContextBuilder witRest( String service, String path, String operation, int resultCode, String... parameters) {
+ setRestcontext( this.evt, service, path, operation, resultCode, parameters );
+ return this;
+ }
+
+ public EventContextBuilder withRepository(String id, String type, String flavour) {
+ setRepositoryContext( this.evt, id, type, flavour );
+ return this;
+ }
+
+ public Event apply() {
+ return this.evt;
+ }
+}
diff --git a/archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/archiva/event/EventHandler.java b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventHandler.java
index f98adcdab..f98adcdab 100644
--- a/archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/archiva/event/EventHandler.java
+++ b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventHandler.java
diff --git a/archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/archiva/event/EventSource.java b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventSource.java
index 452a5e9d9..452a5e9d9 100644
--- a/archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/archiva/event/EventSource.java
+++ b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventSource.java
diff --git a/archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/archiva/event/EventType.java b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventType.java
index 50d42679e..6927c818a 100644
--- a/archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/archiva/event/EventType.java
+++ b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventType.java
@@ -9,8 +9,7 @@ package org.apache.archiva.event;
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -82,6 +81,18 @@ public class EventType<T extends Event> implements Serializable {
return superType;
}
+ public String getPath() {
+ List<String> path = new ArrayList<>( );
+ EventType eventType = this;
+ while(eventType!=ROOT)
+ {
+ path.add( eventType.name( ) );
+ eventType = this.getSuperType( );
+ }
+ Collections.reverse( path );
+ return String.join( "/", path );
+ }
+
private void register(EventType<? extends T> subType) {
if (subTypes == null) {
subTypes = new WeakHashMap<>();
diff --git a/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/context/RepositoryContext.java b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/context/RepositoryContext.java
new file mode 100644
index 000000000..4df023d1b
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/context/RepositoryContext.java
@@ -0,0 +1,90 @@
+package org.apache.archiva.event.context;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.archiva.event.EventContext;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This context provides repository data.
+ *
+ * @author Martin Schreier <martin_s@apache.org>
+ */
+public class RepositoryContext implements EventContext, Serializable
+{
+ private static final long serialVersionUID = -4172663291198878307L;
+
+ private static final String PREFIX = "repository";
+
+ private final String id;
+ private final String type;
+ private final String flavour;
+
+ public RepositoryContext( String id, String type, String flavour )
+ {
+ this.id = id;
+ this.type = type;
+ this.flavour = flavour;
+ }
+
+ /**
+ * Returns the repository id
+ * @return the repository id
+ */
+ public String getId( )
+ {
+ return id;
+ }
+
+ /**
+ * Returns the repository type (e.g. MAVEN)
+ * @return the string representation of the repository type
+ */
+ public String getType( )
+ {
+ return type;
+ }
+
+ /**
+ * Returns the repository flavour (e.g. Remote, Managed, Group)
+ * @return
+ */
+ public String getFlavour( )
+ {
+ return flavour;
+ }
+
+ @Override
+ public Map<String, String> getData( )
+ {
+ Map<String, String> values = new HashMap<>( );
+ values.put( PREFIX+".id", id );
+ values.put( PREFIX+".type", type );
+ values.put( PREFIX+".flavour", flavour );
+ return values;
+ }
+
+ @Override
+ public String getPrefix( )
+ {
+ return PREFIX;
+ }
+}
diff --git a/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/context/RestContext.java b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/context/RestContext.java
new file mode 100644
index 000000000..615759d42
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/context/RestContext.java
@@ -0,0 +1,96 @@
+package org.apache.archiva.event.context;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.archiva.event.EventContext;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Provides information about a REST call.
+ *
+ * @author Martin Schreier <martin_s@apache.org>
+ */
+public class RestContext implements EventContext, Serializable
+{
+ private static final long serialVersionUID = -4109505194250928317L;
+
+ public static final String PREFIX = "rest";
+
+ private final String service;
+ private final String path;
+ private final String operation;
+ private final List<String> parameters;
+ private final int resultCode;
+
+
+ public RestContext( String service, String path, String operation, int resultCode, String... parameters )
+ {
+ this.service = service;
+ this.path = path;
+ this.operation = operation;
+ this.resultCode = resultCode;
+ this.parameters = Arrays.asList( parameters );
+ }
+
+ public String getService( )
+ {
+ return service;
+ }
+
+ public String getPath( )
+ {
+ return path;
+ }
+
+ public String getOperation( )
+ {
+ return operation;
+ }
+
+ public List<String> getParameters( )
+ {
+ return parameters;
+ }
+
+ public int getResultCode( )
+ {
+ return resultCode;
+ }
+
+ @Override
+ public Map<String, String> getData( )
+ {
+ Map<String, String> values = new HashMap<>( );
+ values.put( PREFIX+".service", service );
+ values.put( PREFIX+".path", path );
+ values.put( PREFIX+".operation", operation );
+ values.put( PREFIX+".parameter", String.join( ",", parameters ) );
+ return values;
+ }
+
+ @Override
+ public String getPrefix( )
+ {
+ return PREFIX;
+ }
+}
diff --git a/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/context/UserContext.java b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/context/UserContext.java
new file mode 100644
index 000000000..8a83c73c8
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/context/UserContext.java
@@ -0,0 +1,71 @@
+package org.apache.archiva.event.context;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.archiva.event.EventContext;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This context provides user information.
+ *
+ * @author Martin Schreier <martin_s@apache.org>
+ */
+public class UserContext implements EventContext, Serializable
+{
+ private static final long serialVersionUID = -3499164111736559781L;
+
+ private static final String PREFIX = "user";
+
+ private final String userId;
+ private final String remoteAddress;
+
+ public UserContext( String user, String remoteAddress )
+ {
+ this.userId = user == null ? "" : user;
+ this.remoteAddress = remoteAddress == null ? "" : remoteAddress;
+
+ }
+
+ public String getUserId( )
+ {
+ return userId;
+ }
+
+ public String getRemoteAddress( )
+ {
+ return remoteAddress;
+ }
+
+ @Override
+ public Map<String, String> getData( )
+ {
+ Map<String, String> values = new HashMap<>( );
+ values.put( PREFIX+".user_id", userId );
+ values.put( PREFIX+".remote_address", remoteAddress );
+ return values;
+ }
+
+ @Override
+ public String getPrefix( )
+ {
+ return PREFIX;
+ }
+}
diff --git a/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/package-info.java b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/package-info.java
new file mode 100644
index 000000000..30db350f0
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/package-info.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * This module provides an event mechanism for all archiva subsystems.
+ *
+ * The events are hierarchical organized. That means each subsystem has its own event manager that collects events
+ * and processes and forwards them to the parent event manager (normally the central event manager).
+ * Each event manager clones the event and stores the origin event in the chain before forwarding them to the parent manager.
+ *
+ * Event Types are also hierarchical. There is one special type {@link org.apache.archiva.event.EventType#ROOT} that is the
+ * root type and has no parent type. All other types must be descendants of the ROOT type.
+ *
+ * Event types may have certain methods to access context information. But context information can also be accessed in a
+ * subsystem independent way using the event context data. Event contexts provide access to data without using the
+ * subsystem API and classes.
+ * Event types may be used for filtering events.
+ *
+ * @since 3.0
+ * @author Martin Schreier <martin_s@apache.org>
+ */
+package org.apache.archiva.event; \ No newline at end of file
diff --git a/archiva-modules/archiva-base/archiva-common/src/test/java/org/apache/archiva/event/EventManagerTest.java b/archiva-modules/archiva-base/archiva-event-api/src/test/java/org/apache/archiva/event/BasicEventManagerTest.java
index f894cb574..6e0ba611b 100644
--- a/archiva-modules/archiva-base/archiva-common/src/test/java/org/apache/archiva/event/EventManagerTest.java
+++ b/archiva-modules/archiva-base/archiva-event-api/src/test/java/org/apache/archiva/event/BasicEventManagerTest.java
@@ -9,8 +9,7 @@ package org.apache.archiva.event;
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -29,7 +28,7 @@ import static org.junit.jupiter.api.Assertions.*;
/**
* @author Martin Stockhammer <martin_s@apache.org>
*/
-public class EventManagerTest
+public class BasicEventManagerTest
{
private class TestHandler implements EventHandler<Event> {
@@ -53,7 +52,7 @@ public class EventManagerTest
@Test
public void registerEventHandler( )
{
- EventManager eventManager = new EventManager( this );
+ BasicEventManager eventManager = new BasicEventManager( this );
TestHandler handler1 = new TestHandler( );
TestHandler handler2 = new TestHandler( );
TestHandler handler3 = new TestHandler( );
@@ -92,7 +91,7 @@ public class EventManagerTest
@Test
public void unregisterEventHandler( )
{
- EventManager eventManager = new EventManager( this );
+ BasicEventManager eventManager = new BasicEventManager( this );
TestHandler handler1 = new TestHandler( );
TestHandler handler2 = new TestHandler( );
TestHandler handler3 = new TestHandler( );
@@ -124,7 +123,7 @@ public class EventManagerTest
public void fireEvent( )
{
Object other = new Object( );
- EventManager eventManager = new EventManager( this );
+ BasicEventManager eventManager = new BasicEventManager( this );
assertThrows( NullPointerException.class, ( ) -> eventManager.fireEvent( null ) );
Event event = new Event( EventType.ROOT, other );
assertEquals( other, event.getSource( ) );
diff --git a/archiva-modules/archiva-base/archiva-event-central/pom.xml b/archiva-modules/archiva-base/archiva-event-central/pom.xml
new file mode 100644
index 000000000..cd8a5b084
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-event-central/pom.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>archiva-base</artifactId>
+ <groupId>org.apache.archiva</groupId>
+ <version>3.0.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.apache.archiva.event</groupId>
+ <artifactId>archiva-event-central</artifactId>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.archiva.event</groupId>
+ <artifactId>archiva-event-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context</artifactId>
+ </dependency>
+ </dependencies>
+
+</project> \ No newline at end of file
diff --git a/archiva-modules/archiva-base/archiva-event-central/src/main/java/org/apache/archiva/event/central/CentralEventManager.java b/archiva-modules/archiva-base/archiva-event-central/src/main/java/org/apache/archiva/event/central/CentralEventManager.java
new file mode 100644
index 000000000..44ba9df43
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-event-central/src/main/java/org/apache/archiva/event/central/CentralEventManager.java
@@ -0,0 +1,42 @@
+package org.apache.archiva.event.central;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.archiva.event.AbstractEventManager;
+import org.apache.archiva.event.Event;
+import org.apache.archiva.event.EventHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * Event manager that collects all events from archiva subsystems.
+ *
+ * @author Martin Schreier <martin_s@apache.org>
+ */
+@Service("eventManager#archiva")
+public class CentralEventManager extends AbstractEventManager implements EventHandler<Event>
+{
+ private static final Logger log = LoggerFactory.getLogger( CentralEventManager.class );
+
+ @Override
+ public void handle( Event event )
+ {
+ log.info( "Event: type={}, sourceClass={}, source={}", event.getType( ), event.getSource().getClass(), event.getSource() );
+ }
+}
diff --git a/archiva-modules/archiva-base/archiva-event-central/src/main/resources/META-INF/spring-context.xml b/archiva-modules/archiva-base/archiva-event-central/src/main/resources/META-INF/spring-context.xml
new file mode 100644
index 000000000..654b2f876
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-event-central/src/main/resources/META-INF/spring-context.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd"
+ default-lazy-init="true">
+
+ <context:annotation-config />
+ <context:component-scan base-package="org.apache.archiva.event.central"/>
+
+</beans> \ No newline at end of file
diff --git a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/pom.xml b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/pom.xml
index 8c231f2c1..b34922d17 100644
--- a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/pom.xml
+++ b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/pom.xml
@@ -34,6 +34,10 @@
<dependencies>
<dependency>
+ <groupId>org.apache.archiva.event</groupId>
+ <artifactId>archiva-event-api</artifactId>
+ </dependency>
+ <dependency>
<groupId>org.apache.archiva.configuration</groupId>
<artifactId>archiva-configuration-provider</artifactId>
</dependency>
diff --git a/archiva-modules/archiva-base/archiva-repository-api/pom.xml b/archiva-modules/archiva-base/archiva-repository-api/pom.xml
index 4ae27d9e3..820525f9c 100644
--- a/archiva-modules/archiva-base/archiva-repository-api/pom.xml
+++ b/archiva-modules/archiva-base/archiva-repository-api/pom.xml
@@ -35,6 +35,10 @@
<dependencies>
<dependency>
+ <groupId>org.apache.archiva.event</groupId>
+ <artifactId>archiva-event-api</artifactId>
+ </dependency>
+ <dependency>
<groupId>org.apache.archiva</groupId>
<artifactId>archiva-common</artifactId>
</dependency>
diff --git a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryHandler.java b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryHandler.java
index 8ed6c37da..4b877d905 100644
--- a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryHandler.java
+++ b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryHandler.java
@@ -277,11 +277,11 @@ public interface RepositoryHandler<R extends Repository, C extends AbstractRepos
* Returns the repository variant, this handler manages.
* @return the concrete variant class
*/
- Class<R> getVariant();
+ Class<R> getFlavour();
/**
* Returns the repository configuration variant, this handler manages.
* @return the concrete configuration variant class
*/
- Class<C> getConfigurationVariant();
+ Class<C> getConfigurationFlavour();
}
diff --git a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/event/RepositoryEvent.java b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/event/RepositoryEvent.java
index 88c95adde..a4b667b3c 100644
--- a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/event/RepositoryEvent.java
+++ b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/event/RepositoryEvent.java
@@ -20,8 +20,12 @@ package org.apache.archiva.repository.event;
*/
import org.apache.archiva.event.Event;
+import org.apache.archiva.event.EventContextBuilder;
import org.apache.archiva.event.EventType;
+import org.apache.archiva.repository.ManagedRepository;
+import org.apache.archiva.repository.RemoteRepository;
import org.apache.archiva.repository.Repository;
+import org.apache.archiva.repository.RepositoryGroup;
/**
* A repository event is specific to a repository and holds a reference to the repository that
@@ -39,6 +43,12 @@ public class RepositoryEvent extends Event
public RepositoryEvent(EventType<? extends RepositoryEvent> type, Object origin, Repository repository) {
super(type, origin);
this.repository = repository;
+ EventContextBuilder builder = EventContextBuilder.withEvent( this );
+ if (repository!=null)
+ {
+ builder.withRepository( repository.getId( ), repository.getType( ).name( ), getFlavour( repository ) );
+ }
+ builder.apply( );
}
public Repository getRepository() {
@@ -49,4 +59,16 @@ public class RepositoryEvent extends Event
public EventType<? extends RepositoryEvent> getType() {
return (EventType<? extends RepositoryEvent>) super.getType();
}
+
+ private String getFlavour(Repository repository) {
+ if (repository instanceof RemoteRepository ) {
+ return RemoteRepository.class.getName( );
+ } else if (repository instanceof ManagedRepository ) {
+ return ManagedRepository.class.getName( );
+ } else if ( repository instanceof RepositoryGroup ) {
+ return RepositoryGroup.class.getName( );
+ } else {
+ return "UNKNOWN";
+ }
+ }
}
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/pom.xml b/archiva-modules/archiva-base/archiva-repository-layer/pom.xml
index b9b6f4558..8c424f6de 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/pom.xml
+++ b/archiva-modules/archiva-base/archiva-repository-layer/pom.xml
@@ -70,6 +70,10 @@
<artifactId>archiva-common</artifactId>
</dependency>
<dependency>
+ <groupId>org.apache.archiva.event</groupId>
+ <artifactId>archiva-event-central</artifactId>
+ </dependency>
+ <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/AbstractRepository.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/AbstractRepository.java
index ca15e5f31..7a10b7387 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/AbstractRepository.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/AbstractRepository.java
@@ -24,7 +24,7 @@ import com.cronutils.model.definition.CronDefinition;
import com.cronutils.model.definition.CronDefinitionBuilder;
import org.apache.archiva.event.Event;
import org.apache.archiva.event.EventHandler;
-import org.apache.archiva.event.EventManager;
+import org.apache.archiva.event.BasicEventManager;
import org.apache.archiva.event.EventType;
import org.apache.archiva.indexer.ArchivaIndexingContext;
import org.apache.archiva.repository.EditableRepository;
@@ -86,7 +86,7 @@ public abstract class AbstractRepository implements EditableRepository, EventHan
public static final CronDefinition CRON_DEFINITION = CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ);
private RepositoryState state;
- private final EventManager eventManager;
+ private final BasicEventManager eventManager;
Map<Class<? extends RepositoryFeature<?>>, RepositoryFeature<?>> featureMap = new HashMap<>( );
@@ -100,7 +100,7 @@ public abstract class AbstractRepository implements EditableRepository, EventHan
this.storage = repositoryStorage;
this.location = repositoryStorage.getLocation();
this.openStatus.compareAndSet(false, true);
- this.eventManager = new EventManager(this);
+ this.eventManager = new BasicEventManager(this);
}
public AbstractRepository(Locale primaryLocale, RepositoryType type, String id, String name, RepositoryStorage repositoryStorage) {
@@ -111,7 +111,7 @@ public abstract class AbstractRepository implements EditableRepository, EventHan
this.storage = repositoryStorage;
this.location = repositoryStorage.getLocation();
this.openStatus.compareAndSet(false, true);
- this.eventManager = new EventManager(this);
+ this.eventManager = new BasicEventManager(this);
}
protected void setPrimaryLocale(Locale locale) {
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/AbstractRepositoryHandler.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/AbstractRepositoryHandler.java
index 0e17aacd6..2ffeac281 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/AbstractRepositoryHandler.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/AbstractRepositoryHandler.java
@@ -22,7 +22,7 @@ import org.apache.archiva.configuration.model.AbstractRepositoryConfiguration;
import org.apache.archiva.configuration.model.Configuration;
import org.apache.archiva.configuration.provider.IndeterminateConfigurationException;
import org.apache.archiva.event.Event;
-import org.apache.archiva.event.EventManager;
+import org.apache.archiva.event.BasicEventManager;
import org.apache.archiva.event.EventType;
import org.apache.archiva.repository.EditableRepository;
import org.apache.archiva.repository.Repository;
@@ -61,14 +61,14 @@ public abstract class AbstractRepositoryHandler<R extends Repository, C extends
private CombinedValidator<R> combinedValidator;
private final Class<R> repositoryClazz;
private final Class<C> configurationClazz;
- private final EventManager eventManager;
+ private final BasicEventManager eventManager;
private final Map<String, R> repositoryMap = new HashMap<>( );
private final ConfigurationHandler configurationHandler;
public AbstractRepositoryHandler(Class<R> repositoryClazz, Class<C> configurationClazz, ConfigurationHandler configurationHandler) {
this.repositoryClazz = repositoryClazz;
this.configurationClazz = configurationClazz;
- this.eventManager = new EventManager( this );
+ this.eventManager = new BasicEventManager( this );
this.configurationHandler = configurationHandler;
}
@@ -142,13 +142,13 @@ public abstract class AbstractRepositoryHandler<R extends Repository, C extends
}
@Override
- public Class<R> getVariant( )
+ public Class<R> getFlavour( )
{
return this.repositoryClazz;
}
@Override
- public Class<C> getConfigurationVariant( )
+ public Class<C> getConfigurationFlavour( )
{
return this.configurationClazz;
}
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/ArchivaRepositoryRegistry.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/ArchivaRepositoryRegistry.java
index 1d0c32207..c3a3c0b05 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/ArchivaRepositoryRegistry.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/ArchivaRepositoryRegistry.java
@@ -31,8 +31,10 @@ import org.apache.archiva.configuration.model.RemoteRepositoryConfiguration;
import org.apache.archiva.configuration.model.RepositoryGroupConfiguration;
import org.apache.archiva.event.Event;
import org.apache.archiva.event.EventHandler;
-import org.apache.archiva.event.EventManager;
+import org.apache.archiva.event.BasicEventManager;
+import org.apache.archiva.event.EventSource;
import org.apache.archiva.event.EventType;
+import org.apache.archiva.event.central.CentralEventManager;
import org.apache.archiva.indexer.ArchivaIndexManager;
import org.apache.archiva.indexer.ArchivaIndexingContext;
import org.apache.archiva.indexer.IndexCreationFailedException;
@@ -65,6 +67,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
+import javax.inject.Named;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -111,9 +114,13 @@ public class ArchivaRepositoryRegistry implements ConfigurationListener, EventHa
@Inject
List<RepositoryValidator<? extends Repository>> repositoryValidatorList;
+ @Inject
+ @Named("eventManager#archiva")
+ CentralEventManager centralEventManager;
+
private boolean ignoreIndexing = false;
- private final EventManager eventManager;
+ private final BasicEventManager eventManager;
private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock( );
@@ -133,7 +140,7 @@ public class ArchivaRepositoryRegistry implements ConfigurationListener, EventHa
public ArchivaRepositoryRegistry( ConfigurationHandler configurationHandler, List<RepositoryValidator<? extends Repository>> validatorList )
{
- this.eventManager = new EventManager( this );
+ this.eventManager = new BasicEventManager( this );
this.configurationHandler = configurationHandler;
this.validators = initValidatorList( validatorList );
}
@@ -172,6 +179,7 @@ public class ArchivaRepositoryRegistry implements ConfigurationListener, EventHa
provider.addRepositoryEventHandler( this );
}
this.configurationHandler.addListener( this );
+ registerEventHandler( EventType.ROOT, centralEventManager );
}
finally
{
@@ -1162,15 +1170,15 @@ public class ArchivaRepositoryRegistry implements ConfigurationListener, EventHa
@Override
public void registerHandler( RepositoryHandler<?, ?> handler )
{
- if ( handler.getVariant( ).isAssignableFrom( RepositoryGroup.class ) )
+ if ( handler.getFlavour( ).isAssignableFrom( RepositoryGroup.class ) )
{
registerGroupHandler( (RepositoryHandler<RepositoryGroup, RepositoryGroupConfiguration>) handler );
}
- else if ( handler.getVariant( ).isAssignableFrom( ManagedRepository.class ) )
+ else if ( handler.getFlavour( ).isAssignableFrom( ManagedRepository.class ) )
{
registerManagedRepositoryHandler( (RepositoryHandler<ManagedRepository, ManagedRepositoryConfiguration>) handler );
}
- else if ( handler.getVariant().isAssignableFrom( RemoteRepository.class )) {
+ else if ( handler.getFlavour().isAssignableFrom( RemoteRepository.class )) {
registerRemoteRepositoryHandler( (RepositoryHandler<RemoteRepository, RemoteRepositoryConfiguration>) handler );
}
}
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/managed/ManagedRepositoryHandler.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/managed/ManagedRepositoryHandler.java
index f7cf8a46f..b46c12a79 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/managed/ManagedRepositoryHandler.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/managed/ManagedRepositoryHandler.java
@@ -47,6 +47,8 @@ import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.inject.Named;
import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/base/group/RepositoryGroupHandlerTest.java b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/base/group/RepositoryGroupHandlerTest.java
index fb607e427..be4933beb 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/base/group/RepositoryGroupHandlerTest.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/base/group/RepositoryGroupHandlerTest.java
@@ -148,7 +148,7 @@ class RepositoryGroupHandlerTest
private RepositoryGroupHandler createHandler( )
{
- Mockito.when( managedRepositoryHandler.getVariant( ) ).thenReturn( ManagedRepository.class );
+ Mockito.when( managedRepositoryHandler.getFlavour( ) ).thenReturn( ManagedRepository.class );
final ManagedRepository internalRepo;
try
{
@@ -161,7 +161,7 @@ class RepositoryGroupHandlerTest
Mockito.when( managedRepositoryHandler.get( ArgumentMatchers.eq("internal") ) ).thenReturn( internalRepo );
repositoryRegistry.registerHandler( managedRepositoryHandler );
- Mockito.when( remoteRepositoryHandler.getVariant( ) ).thenReturn( RemoteRepository.class );
+ Mockito.when( remoteRepositoryHandler.getFlavour( ) ).thenReturn( RemoteRepository.class );
final RemoteRepository centralRepo;
try
{
diff --git a/archiva-modules/archiva-base/pom.xml b/archiva-modules/archiva-base/pom.xml
index 55b0f87f1..91c0278ca 100644
--- a/archiva-modules/archiva-base/pom.xml
+++ b/archiva-modules/archiva-base/pom.xml
@@ -33,6 +33,7 @@
<site.staging.base>${project.parent.basedir}</site.staging.base>
</properties>
<modules>
+ <module>archiva-event-api</module>
<module>archiva-test-utils</module>
<module>archiva-common</module>
<module>archiva-mock</module>
@@ -53,5 +54,6 @@
<module>archiva-security-common</module>
<module>archiva-storage-api</module>
<module>archiva-storage-fs</module>
+ <module>archiva-event-central</module>
</modules>
</project>