aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Schreier <martin_s@apache.org>2022-02-13 19:22:52 +0100
committerMartin Schreier <martin_s@apache.org>2022-02-13 19:22:52 +0100
commitf41b35042911a767eb3b14f37c11969ad3144fa9 (patch)
tree8f893e4f29c28a3096fdc06bb544fdc974c164ca
parent0a2dab16770cce10bda6fa2cc2e2d9c7d64c5dbf (diff)
downloadarchiva-f41b35042911a767eb3b14f37c11969ad3144fa9.tar.gz
archiva-f41b35042911a767eb3b14f37c11969ad3144fa9.zip
Adding rest events
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/Event.java10
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventContext.java6
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/EventContextBuilder.java13
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/context/RepositoryContext.java22
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/context/RestContext.java41
-rw-r--r--archiva-modules/archiva-base/archiva-event-api/src/main/java/org/apache/archiva/event/context/UserContext.java10
-rw-r--r--archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/event/RepositoryEvent.java14
-rw-r--r--archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/v2/event/RestEvent.java45
-rw-r--r--archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/v2/event/RestRequestEvent.java53
-rw-r--r--archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/v2/event/RestResponseEvent.java51
-rw-r--r--archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml11
-rw-r--r--archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/v2/interceptor/AuditInterceptor.java86
-rw-r--r--archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/v2/interceptor/Priorities.java26
-rw-r--r--archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/resources/META-INF/spring-context.xml1
14 files changed, 343 insertions, 46 deletions
diff --git a/archiva-modules/archiva-base/archiva-event-api/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 2439105de..87ba24fef 100644
--- a/archiva-modules/archiva-base/archiva-event-api/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
@@ -33,7 +33,7 @@ import java.util.stream.Collectors;
* Events can be chained, which means a event listener can catch events and rethrow them as its own event.
*
*/
-public class Event extends EventObject implements Cloneable {
+public class Event<C extends EventContext> extends EventObject implements Cloneable {
private static final long serialVersionUID = -7171846575892044990L;
@@ -95,6 +95,10 @@ public class Event extends EventObject implements Cloneable {
throw new IllegalArgumentException( "No matching event context registered for " + contextClazz );
}
+ public C getContext() {
+ throw new UnsupportedOperationException( );
+ }
+
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 ) );
@@ -104,8 +108,8 @@ public class Event extends EventObject implements Cloneable {
this.contextMap.put( clazz, context );
}
- public <T extends EventContext> void setContext( T context) {
- this.contextMap.put( context.getClass(), context );
+ public void setContext( C context) {
+ throw new UnsupportedOperationException( );
}
/**
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
index 9e113de06..d74c82c04 100644
--- 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
@@ -33,10 +33,10 @@ import java.util.Map;
public interface EventContext
{
/**
- * Returns the prefix used for entry keys in the repository data map.
- * @return the prefix string for this context
+ * Returns the id which is also used as prefix for keys in the repository data map.
+ * @return the identifier of this context
*/
- String getPrefix();
+ String getId();
/**
* Returns the context data as map of strings. Each entry key is prefixed with
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
index 41f10ceec..0ccfc9564 100644
--- 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
@@ -21,6 +21,9 @@ import org.apache.archiva.event.context.RepositoryContext;
import org.apache.archiva.event.context.RestContext;
import org.apache.archiva.event.context.UserContext;
+import java.util.List;
+import java.util.Map;
+
/**
* Static helper class that allows to set certain context data
*
@@ -34,8 +37,9 @@ public class EventContextBuilder
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 setRestContext( Event evt, String path, String service, String operation,
+ String requestMethod, int resultCode, Map<String, List<String>> pathParameter) {
+ evt.setContext( RestContext.class, new RestContext( path, service, operation, requestMethod, resultCode, pathParameter ) );
}
public static void setRepositoryContext(Event evt, String id, String type, String flavour ) {
@@ -56,8 +60,9 @@ public class EventContextBuilder
return this;
}
- public EventContextBuilder witRest( String service, String path, String operation, int resultCode, String... parameters) {
- setRestcontext( this.evt, service, path, operation, resultCode, parameters );
+ public EventContextBuilder witRest( String path, String service, String operation, String requestMethod,
+ int resultCode, Map<String,List<String>> pathParameter) {
+ setRestContext( this.evt, path, service, operation, requestMethod, resultCode, pathParameter );
return this;
}
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
index 4df023d1b..1fb7f4843 100644
--- 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
@@ -32,15 +32,15 @@ public class RepositoryContext implements EventContext, Serializable
{
private static final long serialVersionUID = -4172663291198878307L;
- private static final String PREFIX = "repository";
+ private static final String ID = "repository";
- private final String id;
+ private final String repositoryId;
private final String type;
private final String flavour;
- public RepositoryContext( String id, String type, String flavour )
+ public RepositoryContext( String repositoryId, String type, String flavour )
{
- this.id = id;
+ this.repositoryId = repositoryId;
this.type = type;
this.flavour = flavour;
}
@@ -49,9 +49,9 @@ public class RepositoryContext implements EventContext, Serializable
* Returns the repository id
* @return the repository id
*/
- public String getId( )
+ public String getRepositoryId( )
{
- return id;
+ return repositoryId;
}
/**
@@ -76,15 +76,15 @@ public class RepositoryContext implements EventContext, Serializable
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 );
+ values.put( ID +".repositoryId", repositoryId );
+ values.put( ID +".type", type );
+ values.put( ID +".flavour", flavour );
return values;
}
@Override
- public String getPrefix( )
+ public String getId( )
{
- return PREFIX;
+ return ID;
}
}
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
index 615759d42..c413735a8 100644
--- 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
@@ -20,7 +20,6 @@ package org.apache.archiva.event.context;
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;
@@ -34,22 +33,25 @@ public class RestContext implements EventContext, Serializable
{
private static final long serialVersionUID = -4109505194250928317L;
- public static final String PREFIX = "rest";
+ public static final String ID = "rest";
private final String service;
private final String path;
private final String operation;
- private final List<String> parameters;
+ private final String requestMethod;
private final int resultCode;
+ private final Map<String, List<String>> pathParameter;
- public RestContext( String service, String path, String operation, int resultCode, String... parameters )
+ public RestContext( String path, String service, String operation, String requestMethod, int resultCode,
+ Map<String, List<String>> pathParameter)
{
this.service = service;
this.path = path;
this.operation = operation;
this.resultCode = resultCode;
- this.parameters = Arrays.asList( parameters );
+ this.requestMethod = requestMethod;
+ this.pathParameter = pathParameter;
}
public String getService( )
@@ -67,9 +69,9 @@ public class RestContext implements EventContext, Serializable
return operation;
}
- public List<String> getParameters( )
+ public String getRequestMethod( )
{
- return parameters;
+ return requestMethod;
}
public int getResultCode( )
@@ -77,20 +79,33 @@ public class RestContext implements EventContext, Serializable
return resultCode;
}
+ public Map<String, List<String>> getPathParameter() {
+ return pathParameter;
+ }
+
@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 ) );
+ values.put( ID +".service", service );
+ values.put( ID +".path", path );
+ values.put( ID +".operation", operation );
+ values.put( ID +".requestMethod", requestMethod );
+ values.put( ID + ".pathParameter", getParamString( ) );
return values;
}
@Override
- public String getPrefix( )
+ public String getId( )
{
- return PREFIX;
+ return ID;
+ }
+
+ private String getParamString() {
+ StringBuilder sb = new StringBuilder( );
+ for(Map.Entry<String, List<String>> entry : pathParameter.entrySet()) {
+ sb.append( entry.getKey( ) ).append( String.join( ",", entry.getValue( ) ) );
+ }
+ return sb.toString( );
}
}
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
index 8a83c73c8..9d3eeacdc 100644
--- 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
@@ -32,7 +32,7 @@ public class UserContext implements EventContext, Serializable
{
private static final long serialVersionUID = -3499164111736559781L;
- private static final String PREFIX = "user";
+ private static final String ID = "user";
private final String userId;
private final String remoteAddress;
@@ -58,14 +58,14 @@ public class UserContext implements EventContext, Serializable
public Map<String, String> getData( )
{
Map<String, String> values = new HashMap<>( );
- values.put( PREFIX+".user_id", userId );
- values.put( PREFIX+".remote_address", remoteAddress );
+ values.put( ID +".user_id", userId );
+ values.put( ID +".remote_address", remoteAddress );
return values;
}
@Override
- public String getPrefix( )
+ public String getId( )
{
- return PREFIX;
+ return ID;
}
}
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 a4b667b3c..0bd5a0570 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
@@ -22,6 +22,7 @@ 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.event.context.RepositoryContext;
import org.apache.archiva.repository.ManagedRepository;
import org.apache.archiva.repository.RemoteRepository;
import org.apache.archiva.repository.Repository;
@@ -31,7 +32,7 @@ import org.apache.archiva.repository.RepositoryGroup;
* A repository event is specific to a repository and holds a reference to the repository that
* is related to this event.
*/
-public class RepositoryEvent extends Event
+public class RepositoryEvent extends Event<RepositoryContext>
{
private static final long serialVersionUID = 4676673476606414834L;
@@ -56,6 +57,17 @@ public class RepositoryEvent extends Event
}
@Override
+ public RepositoryContext getContext() {
+ return getContext( RepositoryContext.class );
+ }
+
+ @Override
+ public void setContext( RepositoryContext context )
+ {
+ setContext( RepositoryContext.class, context );
+ }
+
+ @Override
public EventType<? extends RepositoryEvent> getType() {
return (EventType<? extends RepositoryEvent>) super.getType();
}
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/v2/event/RestEvent.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/v2/event/RestEvent.java
new file mode 100644
index 000000000..7c2354858
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/v2/event/RestEvent.java
@@ -0,0 +1,45 @@
+package org.apache.archiva.rest.api.v2.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.Event;
+import org.apache.archiva.event.EventContextBuilder;
+import org.apache.archiva.event.EventType;
+import org.apache.archiva.event.context.RestContext;
+
+/**
+ * @author Martin Schreier <martin_s@apache.org>
+ */
+public class RestEvent extends Event<RestContext>
+{
+
+ public static EventType<RestEvent> ANY = new EventType<>( Event.ANY, "REST");
+
+
+ public RestEvent( EventType<? extends Event> type, Object originator)
+ {
+ super( type, originator );
+ EventContextBuilder builder = EventContextBuilder.withEvent( this );
+ }
+
+ @Override
+ public RestContext getContext() {
+ return getContext( RestContext.class );
+ }
+}
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/v2/event/RestRequestEvent.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/v2/event/RestRequestEvent.java
new file mode 100644
index 000000000..004ade66c
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/v2/event/RestRequestEvent.java
@@ -0,0 +1,53 @@
+package org.apache.archiva.rest.api.v2.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.Event;
+import org.apache.archiva.event.EventContextBuilder;
+import org.apache.archiva.event.EventType;
+import org.apache.archiva.event.context.RestContext;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Martin Schreier <martin_s@apache.org>
+ */
+public class RestRequestEvent extends RestEvent
+{
+
+ public static EventType<RestRequestEvent> BEFORE = new EventType<>( RestEvent.ANY, "REST.REQUEST.BEFORE" );
+
+
+ public RestRequestEvent( EventType<? extends Event> type, Object originator,
+ String path, String service, String operation, String requestMethod,
+ Map<String,List<String>> pathParameter )
+ {
+ super( type, originator );
+ EventContextBuilder builder = EventContextBuilder.withEvent( this );
+ builder.witRest( path, service, operation, requestMethod, -1, pathParameter );
+ builder.apply( );
+ }
+
+ @Override
+ public RestContext getContext( )
+ {
+ return getContext( RestContext.class );
+ }
+}
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/v2/event/RestResponseEvent.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/v2/event/RestResponseEvent.java
new file mode 100644
index 000000000..092322128
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/v2/event/RestResponseEvent.java
@@ -0,0 +1,51 @@
+package org.apache.archiva.rest.api.v2.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.Event;
+import org.apache.archiva.event.EventContextBuilder;
+import org.apache.archiva.event.EventType;
+import org.apache.archiva.event.context.RestContext;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Martin Schreier <martin_s@apache.org>
+ */
+public class RestResponseEvent extends RestEvent
+{
+ public static EventType<RestResponseEvent> AFTER = new EventType<>( RestEvent.ANY, "REST.RESPONSE.AFTER" );
+
+ public RestResponseEvent( EventType<? extends Event> type, Object originator,
+ String path, String service, String operation, String requestMethod, int resultCode,
+ Map<String, List<String>> pathParameter )
+ {
+ super( type, originator );
+ EventContextBuilder builder = EventContextBuilder.withEvent( this );
+ builder.witRest( path, service, operation, requestMethod, resultCode, pathParameter );
+ builder.apply( );
+ }
+
+ @Override
+ public RestContext getContext( )
+ {
+ return getContext( RestContext.class );
+ }
+}
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
index 519fb1e5b..c7391c6db 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
@@ -252,7 +252,11 @@
<dependency>
<groupId>jakarta.inject</groupId>
-<artifactId>jakarta.inject-api</artifactId>
+ <artifactId>jakarta.inject-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>jakarta.annotation</groupId>
+ <artifactId>jakarta.annotation-api</artifactId>
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
@@ -493,11 +497,6 @@
<!-- Needed for JDK >= 9 -->
<dependency>
- <groupId>jakarta.annotation</groupId>
- <artifactId>jakarta.annotation-api</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<scope>test</scope>
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/v2/interceptor/AuditInterceptor.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/v2/interceptor/AuditInterceptor.java
new file mode 100644
index 000000000..d18ae8c45
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/v2/interceptor/AuditInterceptor.java
@@ -0,0 +1,86 @@
+package org.apache.archiva.rest.v2.interceptor;
+/*
+ * 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.admin.model.AuditInformation;
+import org.apache.archiva.event.AbstractEventManager;
+import org.apache.archiva.event.Event;
+import org.apache.archiva.event.EventContextBuilder;
+import org.apache.archiva.event.EventHandler;
+import org.apache.archiva.event.EventSource;
+import org.apache.archiva.event.EventType;
+import org.apache.archiva.event.context.RestContext;
+import org.apache.archiva.redback.rest.services.RedbackAuthenticationThreadLocal;
+import org.apache.archiva.redback.rest.services.RedbackRequestInformation;
+import org.apache.archiva.redback.users.User;
+import org.apache.archiva.rest.api.v2.event.RestRequestEvent;
+import org.apache.archiva.rest.api.v2.event.RestResponseEvent;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.container.ContainerResponseFilter;
+import javax.ws.rs.container.ResourceInfo;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.ext.Provider;
+import java.io.IOException;
+import javax.annotation.Priority;
+
+
+/**
+ * @author Martin Schreier <martin_s@apache.org>
+ */
+@Provider
+@Service( "restInterceptor#audit" )
+@Priority( Priorities.AUDIT )
+public class AuditInterceptor extends AbstractEventManager implements ContainerRequestFilter, ContainerResponseFilter, EventSource
+{
+ @Context
+ ResourceInfo resourceInfo;
+
+ protected void addAuditInformation( Event<RestContext> evt )
+ {
+ RedbackRequestInformation redbackRequestInformation = RedbackAuthenticationThreadLocal.get();
+ String user = redbackRequestInformation == null ? "" : redbackRequestInformation.getUser().getUsername();
+ String remoteAddr = redbackRequestInformation == null ? "" : redbackRequestInformation.getRemoteAddr();
+ EventContextBuilder.withEvent( evt ).withUser( user, remoteAddr ).apply();
+ }
+
+ @Override
+ public void filter( ContainerRequestContext requestContext, ContainerResponseContext responseContext ) throws IOException
+ {
+ RestResponseEvent evt = new RestResponseEvent( RestResponseEvent.AFTER,
+ this, requestContext.getUriInfo( ).getPath( ), resourceInfo.getResourceClass( ).getName( ), resourceInfo.getResourceMethod( ).getName( )
+ , requestContext.getMethod( ), responseContext.getStatus( ), requestContext.getUriInfo( ).getPathParameters( ) );
+ addAuditInformation( evt );
+ fireEvent( evt, this );
+ }
+
+ @Override
+ public void filter( ContainerRequestContext requestContext ) throws IOException
+ {
+ RestRequestEvent evt = new RestRequestEvent( RestRequestEvent.BEFORE, this,
+ requestContext.getUriInfo().getPath(), resourceInfo.getResourceClass().getName(), resourceInfo.getResourceMethod().getName()
+ , requestContext.getMethod(), requestContext.getUriInfo().getPathParameters() );
+ addAuditInformation( evt );
+ fireEvent( evt, this );
+ }
+
+}
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/v2/interceptor/Priorities.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/v2/interceptor/Priorities.java
new file mode 100644
index 000000000..91b931905
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/v2/interceptor/Priorities.java
@@ -0,0 +1,26 @@
+package org.apache.archiva.rest.v2.interceptor;
+/*
+ * 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.
+ */
+
+/**
+ * @author Martin Schreier <martin_s@apache.org>
+ */
+public class Priorities
+{
+ public static final int AUDIT = 5000;
+}
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/resources/META-INF/spring-context.xml b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/resources/META-INF/spring-context.xml
index 044998678..95d30193d 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/resources/META-INF/spring-context.xml
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/resources/META-INF/spring-context.xml
@@ -74,6 +74,7 @@
<ref bean="requestValidationInterceptor#rest" />
<ref bean="archivaRestServiceExceptionMapper"/>
<ref bean="threadLocalUserCleaner#rest" />
+ <ref bean="restInterceptor#audit" />
</jaxrs:providers>
<jaxrs:serviceBeans>