/*
 * Copyright (c) 2009, Rickard Öberg. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package org.qi4j.spi.entitystore.helpers;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import org.qi4j.api.entity.EntityReference;
import org.qi4j.spi.entity.ManyAssociationState;

/**
 * Default implementation of ManyAssociationState. Backed by ArrayList.
 */
public final class DefaultManyAssociationState
    implements ManyAssociationState, Serializable
{
    private DefaultEntityState entityState;
    private List<EntityReference> references;

    public DefaultManyAssociationState( DefaultEntityState entityState, List<EntityReference> references )
    {
        this.entityState = entityState;
        this.references = references;
    }

    public int count()
    {
        return references.size();
    }

    public boolean contains( EntityReference entityReference )
    {
        return references.contains( entityReference );
    }

    public boolean add( int i, EntityReference entityReference )
    {
        if( references.contains( entityReference ) )
        {
            return false;
        }

        references.add( i, entityReference );
        entityState.markUpdated();
        return true;
    }

    public boolean remove( EntityReference entity )
    {
        boolean removed = references.remove( entity );
        entityState.markUpdated();
        return removed;
    }

    public EntityReference get( int i )
    {
        return references.get( i );
    }

    public Iterator<EntityReference> iterator()
    {
        return references.iterator();
    }
}

@@ -655,87 +655,8 @@
 s;%0A%0A
-import java.io.Serializable;%0Aimport java.util.Iterator;%0Aimport java.util.List;%0A
 impo
@@ -745,16 +745,96 @@
 State;%0A%0A
+import java.io.Serializable;%0Aimport java.util.Iterator;%0Aimport java.util.List;%0A%0A
 /**%0A * D
@@ -952,16 +952,20 @@
 onState%0A
+    
     impl
@@ -2112,36 +2112,557 @@
     
-return references.iterator()
+final Iterator%3CEntityReference%3E iter = references.iterator();%0A%0A        return new Iterator%3CEntityReference%3E()%0A        %7B%0A            EntityReference current;%0A%0A            public boolean hasNext()%0A            %7B%0A                return iter.hasNext();%0A            %7D%0A%0A            public EntityReference next()%0A            %7B%0A                current = iter.next();%0A                return current;%0A            %7D%0A%0A            public void remove()%0A            %7B%0A                iter.remove();%0A                entityState.markUpdated();%0A            %7D%0A        %7D
 ;%0A  

Mark state as updated on Iterator.remove()