blob: 862ab2bd6b571f5d9714decc01fe78500638a4d0 [file] [log] [blame]
/*******************************************************************************
* 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
*******************************************************************************/
package org.eclipse.sisu.plexus;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.codehaus.plexus.component.annotations.Configuration;
import org.codehaus.plexus.component.annotations.Requirement;
import org.eclipse.sisu.bean.BeanProperty;
/**
* Consumable {@link PlexusBeanMetadata} that uses {@link BeanProperty} names as keys.
*/
final class PlexusXmlMetadata
implements PlexusBeanMetadata
{
// ----------------------------------------------------------------------
// Implementation fields
// ----------------------------------------------------------------------
private Map<String, Configuration> configurationMap = Collections.emptyMap();
private Map<String, Requirement> requirementMap = Collections.emptyMap();
// ----------------------------------------------------------------------
// Constructors
// ----------------------------------------------------------------------
PlexusXmlMetadata( final Map<String, Configuration> configurationMap,
final Map<String, Requirement> requirementMap )
{
merge( configurationMap, requirementMap );
}
// ----------------------------------------------------------------------
// Public methods
// ----------------------------------------------------------------------
public boolean isEmpty()
{
return configurationMap.isEmpty() && requirementMap.isEmpty();
}
public Configuration getConfiguration( final BeanProperty<?> property )
{
return configurationMap.remove( property.getName() );
}
public Requirement getRequirement( final BeanProperty<?> property )
{
Requirement requirement = requirementMap.remove( property.getName() );
if ( null == requirement )
{
// perhaps requirement uses the fully-qualified role name (see PlexusXmlScanner)
requirement = requirementMap.remove( property.getType().getRawType().getName() );
}
return requirement;
}
// ----------------------------------------------------------------------
// Locally-shared methods
// ----------------------------------------------------------------------
/**
* Merges the given configuration and requirements with the current metadata, without overwriting existing entries.
*
* @param extraConfiguration The extra configuration
* @param extraRequirements The extra requirements
*/
void merge( final Map<String, Configuration> extraConfiguration, final Map<String, Requirement> extraRequirements )
{
configurationMap = addIfMissing( configurationMap, extraConfiguration );
requirementMap = addIfMissing( requirementMap, extraRequirements );
}
// ----------------------------------------------------------------------
// Implementation methods
// ----------------------------------------------------------------------
/**
* Looks for keys that exist in the secondary map, but not the primary, and adds their mappings to the primary map.
*
* @param primary The primary map
* @param secondary The secondary map
*/
private static <K, V> Map<K, V> addIfMissing( final Map<K, V> primary, final Map<K, V> secondary )
{
// nothing to add?
if ( secondary.isEmpty() )
{
return primary;
}
// nothing to merge?
if ( primary.isEmpty() )
{
return secondary;
}
// primary mappings always override secondary mappings
final Map<K, V> tempMap = new HashMap<K, V>( secondary );
tempMap.putAll( primary );
return tempMap;
}
}