/*******************************************************************************
* Copyright (c) 2010-present Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Stuart McCulloch (Sonatype, Inc.) - initial API and implementation
*
* Minimal facade required to be binary-compatible with legacy Plexus API
*******************************************************************************/
package org.codehaus.plexus.component.configurator.converters.lookup;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
import org.codehaus.plexus.component.configurator.converters.ConfigurationConverter;
import org.codehaus.plexus.component.configurator.converters.basic.BooleanConverter;
import org.codehaus.plexus.component.configurator.converters.basic.ByteConverter;
import org.codehaus.plexus.component.configurator.converters.basic.CharConverter;
import org.codehaus.plexus.component.configurator.converters.basic.DateConverter;
import org.codehaus.plexus.component.configurator.converters.basic.DoubleConverter;
import org.codehaus.plexus.component.configurator.converters.basic.EnumConverter;
import org.codehaus.plexus.component.configurator.converters.basic.FileConverter;
import org.codehaus.plexus.component.configurator.converters.basic.FloatConverter;
import org.codehaus.plexus.component.configurator.converters.basic.IntConverter;
import org.codehaus.plexus.component.configurator.converters.basic.LongConverter;
import org.codehaus.plexus.component.configurator.converters.basic.ShortConverter;
import org.codehaus.plexus.component.configurator.converters.basic.StringBufferConverter;
import org.codehaus.plexus.component.configurator.converters.basic.StringBuilderConverter;
import org.codehaus.plexus.component.configurator.converters.basic.StringConverter;
import org.codehaus.plexus.component.configurator.converters.basic.UriConverter;
import org.codehaus.plexus.component.configurator.converters.basic.UrlConverter;
import org.codehaus.plexus.component.configurator.converters.composite.ArrayConverter;
import org.codehaus.plexus.component.configurator.converters.composite.CollectionConverter;
import org.codehaus.plexus.component.configurator.converters.composite.MapConverter;
import org.codehaus.plexus.component.configurator.converters.composite.ObjectWithFieldsConverter;
import org.codehaus.plexus.component.configurator.converters.composite.PlexusConfigurationConverter;
import org.codehaus.plexus.component.configurator.converters.composite.PropertiesConverter;
import org.codehaus.plexus.component.configurator.converters.special.ClassRealmConverter;
import org.eclipse.sisu.inject.Weak;
public final class DefaultConverterLookup
implements ConverterLookup
{
private static final ConfigurationConverter[] DEFAULT_CONVERTERS = {
// optimized ordering...
new FileConverter(), //
new BooleanConverter(), //
new StringConverter(), //
new IntConverter(), //
new CollectionConverter(), //
new ArrayConverter(), //
new MapConverter(), //
new PropertiesConverter(), //
new UrlConverter(), //
new UriConverter(), //
new DateConverter(), //
new EnumConverter(), //
new LongConverter(), //
new FloatConverter(), //
new DoubleConverter(), //
new CharConverter(), //
new ByteConverter(), //
new ShortConverter(), //
// new ClassConverter(), // not installed by default
new PlexusConfigurationConverter(), //
new ClassRealmConverter(), //
new StringBufferConverter(), //
new StringBuilderConverter(), //
new ObjectWithFieldsConverter() };
private final Map<Class<?>, ConfigurationConverter> lookupCache = //
Weak.concurrentKeys(); // entries will expire on class unload
private final List<ConfigurationConverter> customConverters = //
new CopyOnWriteArrayList<ConfigurationConverter>();
public void registerConverter( final ConfigurationConverter converter )
{
customConverters.add( converter );
}
public ConfigurationConverter lookupConverterForType( final Class<?> type )
throws ComponentConfigurationException
{
ConfigurationConverter converter = lookupCache.get( type );
if ( null != converter )
{
return converter;
}
for ( int i = 0; i < customConverters.size(); i++ )
{
converter = customConverters.get( i );
if ( converter.canConvert( type ) )
{
lookupCache.put( type, converter );
return converter;
}
}
for ( int i = 0; i < DEFAULT_CONVERTERS.length; i++ )
{
converter = DEFAULT_CONVERTERS[i];
if ( converter.canConvert( type ) )
{
lookupCache.put( type, converter );
return converter;
}
}
throw new ComponentConfigurationException( "Cannot find converter for type: " + type );
}
/*
* Referenced by some external XML configurations
*/
void setCustomConverters( final List<ConfigurationConverter> converters )
{
customConverters.addAll( converters );
}
}