Skip to content
Permalink
Browse files
Adding rest events
  • Loading branch information
effrafax committed Feb 13, 2022
1 parent 0a2dab1 commit f41b35042911a767eb3b14f37c11969ad3144fa9
Show file tree
Hide file tree
Showing 14 changed files with 343 additions and 46 deletions.
@@ -33,7 +33,7 @@
* 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 <T extends EventContext> T getContext(Class<T> contextClazz) throws Illeg
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 <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 );
public void setContext( C context) {
throw new UnsupportedOperationException( );
}

/**
@@ -33,10 +33,10 @@
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
@@ -21,6 +21,9 @@
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 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 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 EventContextBuilder withUser( String user, String remoteAddress) {
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;
}

@@ -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 RepositoryContext( String id, String type, String flavour )
* Returns the repository id
* @return the repository id
*/
public String getId( )
public String getRepositoryId( )
{
return id;
return repositoryId;
}

/**
@@ -76,15 +76,15 @@ public String getFlavour( )
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;
}
}
@@ -20,7 +20,6 @@
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,30 +69,43 @@ public String getOperation( )
return operation;
}

public List<String> getParameters( )
public String getRequestMethod( )
{
return parameters;
return requestMethod;
}

public int getResultCode( )
{
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( );
}
}
@@ -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 String getRemoteAddress( )
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;
}
}
@@ -22,6 +22,7 @@
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 @@
* 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;
@@ -55,6 +56,17 @@ public Repository getRepository() {
return repository;
}

@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();
@@ -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 );
}
}
@@ -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 );
}
}

0 comments on commit f41b350

Please sign in to comment.