Skip to content

Commit

Permalink
[MRESOLVER-232] Refactor selector (#138)
Browse files Browse the repository at this point in the history
Make SimpleNamedLockFactorySelector logic reusable.
  • Loading branch information
cstamas committed Dec 18, 2021
1 parent b95696e commit 1b08d68
Show file tree
Hide file tree
Showing 2 changed files with 138 additions and 86 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package org.eclipse.aether.internal.impl.synccontext.named;

/*
* 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.eclipse.aether.named.NamedLockFactory;

import java.util.Map;

/**
* Selector implementation support class: by extending this class one may override defaults, or provide completely
* alternative way of configuration. This implementation uses Java System properties to select factory and name mapper.
*
* @since TBD
*/
public abstract class NamedLockFactorySelectorSupport
implements NamedLockFactorySelector
{
public static final String FACTORY_KEY = "aether.syncContext.named.factory";

public static final String NAME_MAPPER_KEY = "aether.syncContext.named.nameMapper";

private final NamedLockFactory namedLockFactory;

private final NameMapper nameMapper;

public NamedLockFactorySelectorSupport( final Map<String, NamedLockFactory> factories,
final String defaultFactoryName,
final Map<String, NameMapper> nameMappers,
final String defaultNameMapperName )
{
this.namedLockFactory = selectNamedLockFactory( factories, getFactoryName( defaultFactoryName ) );
this.nameMapper = selectNameMapper( nameMappers, getNameMapperName( defaultNameMapperName ) );
}

/**
* Returns the selected {@link NamedLockFactory}, never null.
*/
@Override
public NamedLockFactory getSelectedNamedLockFactory()
{
return namedLockFactory;
}

/**
* Returns the selected {@link NameMapper}, never null.
*/
@Override
public NameMapper getSelectedNameMapper()
{
return nameMapper;
}

/**
* Returns selected factory name (or passed in default) using System property value of {@link #FACTORY_KEY}.
*/
protected String getFactoryName( final String defaultFactoryName )
{
return System.getProperty( FACTORY_KEY, defaultFactoryName );
}

/**
* Returns selected name mapper name (or passed in default) using System property value of {@link #NAME_MAPPER_KEY}.
*/
protected String getNameMapperName( final String defaultNameMapperName )
{
return System.getProperty( NAME_MAPPER_KEY, defaultNameMapperName );
}

private NamedLockFactory selectNamedLockFactory( final Map<String, NamedLockFactory> factories,
final String factoryName )
{
NamedLockFactory factory = factories.get( factoryName );
if ( factory == null )
{
throw new IllegalArgumentException( "Unknown NamedLockFactory name: " + factoryName
+ ", known ones: " + factories.keySet() );
}
return factory;
}

private NameMapper selectNameMapper( final Map<String, NameMapper> nameMappers,
final String mapperName )
{
NameMapper nameMapper = nameMappers.get( mapperName );
if ( nameMapper == null )
{
throw new IllegalArgumentException( "Unknown NameMapper name: " + mapperName
+ ", known ones: " + nameMappers.keySet() );
}
return nameMapper;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,109 +32,52 @@
import java.util.Map;

/**
* Simple selector implementation that uses Java system properties and sane default values.
* Simple selector implementation that uses {@link LocalReadWriteLockNamedLockFactory} and {@link GAVNameMapper} as
* default name lock factory and name mapper.
*
* @since TBD
*/
@Singleton
@Named
public final class SimpleNamedLockFactorySelector
implements NamedLockFactorySelector
extends NamedLockFactorySelectorSupport
{
public static final String FACTORY_KEY = "aether.syncContext.named.factory";

public static final String NAME_MAPPER_KEY = "aether.syncContext.named.nameMapper";

private final NamedLockFactory namedLockFactory;

private final NameMapper nameMapper;

/**
* Constructor used with DI, where factories are injected and selected based on key.
*/
@Inject
public SimpleNamedLockFactorySelector( final Map<String, NamedLockFactory> factories,
final Map<String, NameMapper> nameMappers )
{
this.namedLockFactory = selectNamedLockFactory( factories, getFactoryName() );
this.nameMapper = selectNameMapper( nameMappers, getNameMapperName() );
}
private static final Map<String, NamedLockFactory> FACTORIES;

/**
* Returns selected factory name (or sane default) using System property value of {@link #FACTORY_KEY} and defaults
* to {@link LocalReadWriteLockNamedLockFactory#NAME}.
*/
private String getFactoryName()
{
return System.getProperty( FACTORY_KEY, LocalReadWriteLockNamedLockFactory.NAME );
}
private static final Map<String, NameMapper> NAME_MAPPERS;

/**
* Returns selected name mapper name (or sane default) using System property value of {@link #NAME_MAPPER_KEY} and
* defaults to {@link GAVNameMapper#NAME}.
*/
private String getNameMapperName()
static
{
return System.getProperty( NAME_MAPPER_KEY, GAVNameMapper.NAME );
FACTORIES = new HashMap<>();
FACTORIES.put( NoopNamedLockFactory.NAME, new NoopNamedLockFactory() );
FACTORIES.put( LocalReadWriteLockNamedLockFactory.NAME, new LocalReadWriteLockNamedLockFactory() );
FACTORIES.put( LocalSemaphoreNamedLockFactory.NAME, new LocalSemaphoreNamedLockFactory() );
FACTORIES.put( FileLockNamedLockFactory.NAME, new FileLockNamedLockFactory() );

NAME_MAPPERS = new HashMap<>();
NAME_MAPPERS.put( StaticNameMapper.NAME, new StaticNameMapper() );
NAME_MAPPERS.put( GAVNameMapper.NAME, new GAVNameMapper() );
NAME_MAPPERS.put( DiscriminatingNameMapper.NAME, new DiscriminatingNameMapper( new GAVNameMapper() ) );
NAME_MAPPERS.put( FileGAVNameMapper.NAME, new FileGAVNameMapper() );
}

/**
* Default constructor for ServiceLocator.
*/
public SimpleNamedLockFactorySelector()
{
Map<String, NamedLockFactory> factories = new HashMap<>();
factories.put( NoopNamedLockFactory.NAME, new NoopNamedLockFactory() );
factories.put( LocalReadWriteLockNamedLockFactory.NAME, new LocalReadWriteLockNamedLockFactory() );
factories.put( LocalSemaphoreNamedLockFactory.NAME, new LocalSemaphoreNamedLockFactory() );
factories.put( FileLockNamedLockFactory.NAME, new FileLockNamedLockFactory() );
this.namedLockFactory = selectNamedLockFactory( factories, getFactoryName() );

Map<String, NameMapper> nameMappers = new HashMap<>();
nameMappers.put( StaticNameMapper.NAME, new StaticNameMapper() );
nameMappers.put( GAVNameMapper.NAME, new GAVNameMapper() );
nameMappers.put( DiscriminatingNameMapper.NAME, new DiscriminatingNameMapper( new GAVNameMapper() ) );
nameMappers.put( FileGAVNameMapper.NAME, new FileGAVNameMapper() );
this.nameMapper = selectNameMapper( nameMappers, getNameMapperName() );
this( FACTORIES, NAME_MAPPERS );
}

/**
* Returns the selected {@link NamedLockFactory}, never null.
*/
@Override
public NamedLockFactory getSelectedNamedLockFactory()
{
return namedLockFactory;
}

/**
* Returns the selected {@link NameMapper}, never null.
*/
@Override
public NameMapper getSelectedNameMapper()
{
return nameMapper;
}

private NamedLockFactory selectNamedLockFactory( final Map<String, NamedLockFactory> factories,
final String factoryName )
{
NamedLockFactory factory = factories.get( factoryName );
if ( factory == null )
{
throw new IllegalArgumentException( "Unknown NamedLockFactory name: " + factoryName
+ ", known ones: " + factories.keySet() );
}
return factory;
}

private NameMapper selectNameMapper( final Map<String, NameMapper> nameMappers,
final String mapperName )
@Inject
public SimpleNamedLockFactorySelector( final Map<String, NamedLockFactory> factories,
final Map<String, NameMapper> nameMappers )
{
NameMapper nameMapper = nameMappers.get( mapperName );
if ( nameMapper == null )
{
throw new IllegalArgumentException( "Unknown NameMapper name: " + mapperName
+ ", known ones: " + nameMappers.keySet() );
}
return nameMapper;
super(
factories,
LocalReadWriteLockNamedLockFactory.NAME,
nameMappers,
GAVNameMapper.NAME
);
}
}

0 comments on commit 1b08d68

Please sign in to comment.