/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content.category;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
public class CategoryMap
implements Iterable<CategoryEntity>
{
private final List<CategoryKey> orderMask;
private LinkedHashMap<CategoryKey, CategoryEntity> insertionOrderedMapByKey;
public CategoryMap( final List<CategoryKey> categoryOrderMask )
{
Preconditions.checkNotNull( categoryOrderMask, "categoryOrderMask must be given" );
this.orderMask = categoryOrderMask;
insertionOrderedMapByKey = new LinkedHashMap<CategoryKey, CategoryEntity>( categoryOrderMask.size() );
for ( CategoryKey categoryKey : categoryOrderMask )
{
insertionOrderedMapByKey.put( categoryKey, null );
}
}
public void addAll( final Iterable<CategoryEntity> it )
{
for ( CategoryEntity c : it )
{
if ( !insertionOrderedMapByKey.containsKey( c.getKey() ) )
{
throw new IllegalStateException( "Trying to add category that does not exist in order mask" );
}
insertionOrderedMapByKey.put( c.getKey(), c );
}
}
public void add( final CategoryEntity category )
{
if ( !insertionOrderedMapByKey.containsKey( category.getKey() ) )
{
throw new IllegalStateException( "Trying to add category that does not exist in order mask" );
}
insertionOrderedMapByKey.put( category.getKey(), category );
}
public void removeEntriesWithNullValues()
{
final List<CategoryKey> keysToRemove = Lists.newArrayList();
for ( Map.Entry<CategoryKey, CategoryEntity> entry : insertionOrderedMapByKey.entrySet() )
{
if ( entry.getValue() == null )
{
keysToRemove.add( entry.getKey() );
}
}
for ( CategoryKey keyToRemove : keysToRemove )
{
insertionOrderedMapByKey.remove( keyToRemove );
}
}
public CategoryEntity get( final CategoryKey key )
{
return insertionOrderedMapByKey.get( key );
}
@Override
public Iterator<CategoryEntity> iterator()
{
return insertionOrderedMapByKey.values().iterator();
}
@Override
public boolean equals( final Object o )
{
if ( this == o )
{
return true;
}
if ( o == null || getClass() != o.getClass() )
{
return false;
}
final CategoryMap that = (CategoryMap) o;
return Objects.equal( orderMask, that.orderMask ) && Objects.equal( insertionOrderedMapByKey, that.insertionOrderedMapByKey );
}
@Override
public int hashCode()
{
return Objects.hashCode( orderMask, insertionOrderedMapByKey );
}
}