/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.esl.containers; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import java.util.Map; public class MultiValueMap extends HashMap { private final HashMap attributeMap = new HashMap<Object, String>(); private boolean allowNullValues = false; private static class ValueList implements List, Serializable { private final List<Object> values; public ValueList() { values = new ArrayList<Object>(); } public ValueList( Collection<Object> c ) { values = new ArrayList<Object>( c ); } public ValueList( int initialCapacity ) { values = new ArrayList<Object>( initialCapacity ); } public ValueList( Object obj ) { values = new ArrayList<Object>(); values.add( obj ); } public int size() { return values.size(); } public boolean isEmpty() { return values.isEmpty(); } public boolean contains( Object o ) { return values.contains( o ); } public Iterator<Object> iterator() { return values.iterator(); } public Object[] toArray() { return values.toArray(); } public Object[] toArray( Object[] a ) { return values.toArray( a ); } public boolean add( Object o ) { return values.add( o ); } public boolean remove( Object o ) { return values.remove( o ); } public boolean containsAll( Collection c ) { return values.containsAll( c ); } public boolean addAll( Collection c ) { return values.addAll( c ); } public boolean addAll( int index, Collection c ) { return values.addAll( index, c ); } public boolean removeAll( Collection c ) { return values.removeAll( c ); } public boolean retainAll( Collection c ) { return values.retainAll( c ); } public void clear() { values.clear(); } public Object get( int index ) { return values.get( index ); } public Object set( int index, Object element ) { return values.set( index, element ); } public void add( int index, Object element ) { values.add( index, element ); } public Object remove( int index ) { return values.remove( index ); } public int indexOf( Object o ) { return values.indexOf( o ); } public int lastIndexOf( Object o ) { return values.lastIndexOf( o ); } public ListIterator<Object> listIterator() { return values.listIterator(); } public ListIterator<Object> listIterator( int index ) { return values.listIterator( index ); } public List<Object> subList( int fromIndex, int toIndex ) { return values.subList( fromIndex, toIndex ); } public String toString() { return values.toString(); } } public MultiValueMap( int initialCapacity, float loadFactor ) { super( initialCapacity, loadFactor ); } public MultiValueMap( int initialCapacity ) { super( initialCapacity ); } public MultiValueMap() { super(); } public MultiValueMap( boolean allowNullValues ) { super(); this.allowNullValues = allowNullValues; } public MultiValueMap( Map m ) { Iterator iterator = m.entrySet().iterator(); while ( iterator.hasNext() ) { Map.Entry entry = (Map.Entry) iterator.next(); put( entry.getKey(), entry.getValue() ); } } /** * @see java.util.Map#put(java.lang.Object,java.lang.Object) */ public Object put( Object key, Object value ) { return put( key, value, null, false ); } public Object put( Object key, Object value, String attribute ) { return put( key, value, attribute, false ); } public Object put( Object key, int value ) { return put( key, value, null, false ); } public Object put( Object key, int value, String attribute ) { return put( key, value, attribute, false ); } public Object put( Object key, int[] values ) { return put( key, values, null ); } public Object put( Object key, int[] values, String attribute ) { if ( values == null ) { return put( key, null, attribute, false ); } Object obj = null; for ( int i = 0; i < values.length; i++ ) { if ( i == 0 ) { obj = put( key, values[0], false ); } else { put( key, values[i], attribute, false ); } } return obj; } public Object put( Object key, boolean value ) { return put( key, value, null, false ); } public Object put( Object key, boolean value, String attribute ) { return put( key, value, attribute, false ); } public Object put( Object key, Object value, boolean removeOld ) { return put( key, value, null, removeOld ); } public Object put( Object key, Object value, String attribute, boolean removeOld ) { Object obj; if ( !removeOld && containsKey( key ) && ( value != null || allowNullValues ) ) { List<Object> values = (List<Object>) get( key ); if ( value instanceof ValueList ) { values.addAll( (ValueList) value ); } else { values.add( value ); } obj = values; } else if ( value != null && value instanceof ValueList ) { obj = super.put( key, value ); } else { List<Object> values = new ValueList(); if ( value != null || allowNullValues ) { values.add( value ); } obj = super.put( key, values ); } if ( attribute != null ) { attributeMap.put( key, attribute ); } return obj; } public List getValueList( Object key ) { return (List) get( key ); } public String getAttribute( Object key ) { return (String) attributeMap.get( key ); } public boolean containsValue( Object value ) { Iterator iterator = super.values().iterator(); while ( iterator.hasNext() ) { List values = (List) iterator.next(); if ( values.contains( value ) ) { return true; } } return false; } }