/*******************************************************************************
* 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.configuration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class DefaultPlexusConfiguration
implements PlexusConfiguration
{
// ----------------------------------------------------------------------
// Constants
// ----------------------------------------------------------------------
private static final PlexusConfiguration[] NO_CHILDREN = new PlexusConfiguration[0];
// ----------------------------------------------------------------------
// Implementation fields
// ----------------------------------------------------------------------
private final String name;
private String value;
private List<PlexusConfiguration> childIndex = Collections.emptyList();
private Map<String, List<PlexusConfiguration>> childMap = Collections.emptyMap();
private Map<String, String> attributeMap = Collections.emptyMap();
// ----------------------------------------------------------------------
// Constructors
// ----------------------------------------------------------------------
public DefaultPlexusConfiguration( final String name )
{
this( name, null );
}
public DefaultPlexusConfiguration( final String name, final String value )
{
this.name = name;
this.value = value;
}
// ----------------------------------------------------------------------
// Public methods
// ----------------------------------------------------------------------
public final String getName()
{
return name;
}
public final String getValue()
{
return value;
}
public final String getValue( final String defaultValue )
{
return null != value ? value : defaultValue;
}
public final void setValue( final String value )
{
this.value = value;
}
public final String[] getAttributeNames()
{
return attributeMap.keySet().toArray( new String[attributeMap.size()] );
}
public final String getAttribute( final String attributeName )
{
return attributeMap.get( attributeName );
}
public final String getAttribute( final String attributeName, final String defaultValue )
{
final String attributeValue = attributeMap.get( attributeName );
return null != attributeValue ? attributeValue : defaultValue;
}
public final void setAttribute( final String attributeName, final String attributeValue )
{
if ( attributeMap.isEmpty() )
{
attributeMap = new HashMap<String, String>();
}
attributeMap.put( attributeName, attributeValue );
}
public final PlexusConfiguration getChild( final String childName )
{
return getChild( childName, true );
}
public final PlexusConfiguration getChild( final String childName, final boolean create )
{
final List<PlexusConfiguration> children = childMap.get( childName );
if ( null != children )
{
return children.get( 0 );
}
return create ? add( createChild( childName ) ) : null;
}
public final PlexusConfiguration[] getChildren()
{
return childIndex.toArray( new PlexusConfiguration[childIndex.size()] );
}
public final PlexusConfiguration[] getChildren( final String childName )
{
final List<PlexusConfiguration> children = childMap.get( childName );
if ( null != children )
{
return children.toArray( new PlexusConfiguration[children.size()] );
}
return NO_CHILDREN;
}
public final int getChildCount()
{
return childIndex.size();
}
public final PlexusConfiguration getChild( final int index )
{
return childIndex.get( index );
}
public final void addChild( final PlexusConfiguration child )
{
add( child );
}
public final PlexusConfiguration addChild( final String childName, final String childValue )
{
add( createChild( childName ) ).setValue( childValue );
return this;
}
// ----------------------------------------------------------------------
// Customizable methods
// ----------------------------------------------------------------------
protected PlexusConfiguration createChild( final String childName )
{
return new DefaultPlexusConfiguration( childName );
}
// ----------------------------------------------------------------------
// Shared methods
// ----------------------------------------------------------------------
protected final PlexusConfiguration add( final PlexusConfiguration child )
{
final String childName = child.getName();
List<PlexusConfiguration> children = childMap.get( childName );
if ( null == children )
{
children = new ArrayList<PlexusConfiguration>();
if ( childMap.isEmpty() )
{
// create mutable map and index at the same time
childMap = new LinkedHashMap<String, List<PlexusConfiguration>>();
childIndex = new ArrayList<PlexusConfiguration>();
}
childMap.put( childName, children );
}
childIndex.add( child );
children.add( child );
return child;
}
}