blob: 7750f0718fa215406f710e78ff7dae1fe60ef611 [file] [log] [blame]
/*
* 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.
*/
package org.eclipse.aether.util.listener;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.eclipse.aether.AbstractRepositoryListener;
import org.eclipse.aether.RepositoryEvent;
import org.eclipse.aether.RepositoryListener;
/**
* A repository listener that delegates to zero or more other listeners (multicast). The list of target listeners is
* thread-safe, i.e. target listeners can be added or removed by any thread at any time.
*/
public final class ChainedRepositoryListener
extends AbstractRepositoryListener
{
private final List<RepositoryListener> listeners = new CopyOnWriteArrayList<RepositoryListener>();
/**
* Creates a new multicast listener that delegates to the specified listeners. In contrast to the constructor, this
* factory method will avoid creating an actual chained listener if one of the specified readers is actually
* {@code null}.
*
* @param listener1 The first listener, may be {@code null}.
* @param listener2 The second listener, may be {@code null}.
* @return The chained listener or {@code null} if no listener was supplied.
*/
public static RepositoryListener newInstance( RepositoryListener listener1, RepositoryListener listener2 )
{
if ( listener1 == null )
{
return listener2;
}
else if ( listener2 == null )
{
return listener1;
}
return new ChainedRepositoryListener( listener1, listener2 );
}
/**
* Creates a new multicast listener that delegates to the specified listeners.
*
* @param listeners The listeners to delegate to, may be {@code null} or empty.
*/
public ChainedRepositoryListener( RepositoryListener... listeners )
{
if ( listeners != null )
{
add( Arrays.asList( listeners ) );
}
}
/**
* Creates a new multicast listener that delegates to the specified listeners.
*
* @param listeners The listeners to delegate to, may be {@code null} or empty.
*/
public ChainedRepositoryListener( Collection<? extends RepositoryListener> listeners )
{
add( listeners );
}
/**
* Adds the specified listeners to the end of the multicast chain.
*
* @param listeners The listeners to add, may be {@code null} or empty.
*/
public void add( Collection<? extends RepositoryListener> listeners )
{
if ( listeners != null )
{
for ( RepositoryListener listener : listeners )
{
add( listener );
}
}
}
/**
* Adds the specified listener to the end of the multicast chain.
*
* @param listener The listener to add, may be {@code null}.
*/
public void add( RepositoryListener listener )
{
if ( listener != null )
{
listeners.add( listener );
}
}
/**
* Removes the specified listener from the multicast chain. Trying to remove a non-existing listener has no effect.
*
* @param listener The listener to remove, may be {@code null}.
*/
public void remove( RepositoryListener listener )
{
if ( listener != null )
{
listeners.remove( listener );
}
}
protected void handleError( RepositoryEvent event, RepositoryListener listener, RuntimeException error )
{
// default just swallows errors
}
@Override
public void artifactDeployed( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.artifactDeployed( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void artifactDeploying( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.artifactDeploying( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void artifactDescriptorInvalid( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.artifactDescriptorInvalid( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void artifactDescriptorMissing( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.artifactDescriptorMissing( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void artifactDownloaded( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.artifactDownloaded( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void artifactDownloading( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.artifactDownloading( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void artifactInstalled( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.artifactInstalled( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void artifactInstalling( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.artifactInstalling( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void artifactResolved( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.artifactResolved( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void artifactResolving( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.artifactResolving( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void metadataDeployed( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.metadataDeployed( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void metadataDeploying( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.metadataDeploying( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void metadataDownloaded( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.metadataDownloaded( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void metadataDownloading( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.metadataDownloading( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void metadataInstalled( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.metadataInstalled( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void metadataInstalling( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.metadataInstalling( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void metadataInvalid( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.metadataInvalid( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void metadataResolved( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.metadataResolved( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
@Override
public void metadataResolving( RepositoryEvent event )
{
for ( RepositoryListener listener : listeners )
{
try
{
listener.metadataResolving( event );
}
catch ( RuntimeException e )
{
handleError( event, listener, e );
}
}
}
}