/******************************************************************************* | |
* Copyright (c) 2012, 2015 CEA LIST, Soft-Maint and Mia-Software. | |
* 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: | |
* Nicolas Bros (Mia-Software) - Bug 374758 - [Table] repair the table | |
* Gregoire Dupe (Mia-Software) - Bug 372626 - Aggregates | |
* Thomas Cicognani (Soft-Maint) - Bug 420192 - UnsupportedOperationException in a usefull method | |
* Thomas Cicognani (Soft-Maint) - Bug 435882 - org.eclipse.emf.facet.custom.core.internal.CustomizationsDelegatingList not fully implemented | |
* Thomas Cicognani (Soft-Maint) - Bug 441317 - Clearing a CustomizationsDelegatingList doesn't notify listeners | |
* Grégoire Dupé (Mia-Software) - Bug 476141 - Facet manger can fail with ConcurrentModificationException | |
*******************************************************************************/ | |
package org.eclipse.emf.facet.custom.core.internal; | |
import java.util.ArrayList; | |
import java.util.Collection; | |
import java.util.Iterator; | |
import java.util.List; | |
import java.util.ListIterator; | |
import org.eclipse.emf.facet.custom.metamodel.v0_2_0.custom.Customization; | |
import org.eclipse.emf.facet.efacet.metamodel.v0_2_0.efacet.FacetSet; | |
/** Represents a list of {@link Customization}s that exists as a subset of a delegate list of {@link FacetSet}s. */ | |
public class CustomizationsDelegatingList implements List<Customization> { | |
private final List<FacetSet> delegate; | |
public CustomizationsDelegatingList(final List<FacetSet> delegate) { | |
this.delegate = delegate; | |
} | |
private List<Customization> createSubList() { | |
final List<Customization> customizations = new ArrayList<Customization>(this.delegate.size()); | |
for (FacetSet facetSet : this.delegate) { | |
if (facetSet instanceof Customization) { | |
final Customization customization = (Customization) facetSet; | |
customizations.add(customization); | |
} | |
} | |
return customizations; | |
} | |
private static void throwOutOfBoundException(final int index, final int customIndex) { | |
final String message = String.format("Index: %d, Size: %d", //$NON-NLS-1$ | |
Integer.valueOf(index), Integer.valueOf(customIndex)); | |
throw new IndexOutOfBoundsException(message); | |
} | |
public int size() { | |
return this.createSubList().size(); | |
} | |
public boolean isEmpty() { | |
return this.createSubList().isEmpty(); | |
} | |
public boolean contains(final Object element) { | |
return element instanceof Customization && this.delegate.contains(element); | |
} | |
public Iterator<Customization> iterator() { | |
final List<Customization> customizations = createSubList(); | |
return customizations.iterator(); | |
} | |
public Object[] toArray() { | |
return createSubList().toArray(); | |
} | |
public <T> T[] toArray(final T[] array) { | |
return createSubList().toArray(array); | |
} | |
public boolean add(final Customization customization) { | |
return this.delegate.add(customization); | |
} | |
public boolean remove(final Object element) { | |
return this.delegate.remove(element); | |
} | |
public boolean containsAll(final Collection<?> collection) { | |
return createSubList().containsAll(collection); | |
} | |
public boolean addAll(final Collection<? extends Customization> collection) { | |
return this.delegate.addAll(collection); | |
} | |
public boolean addAll(final int index, | |
final Collection<? extends Customization> collection) { | |
boolean addAllDone = false; | |
int customIndex = 0; | |
for (int i = 0; i < this.delegate.size(); i++) { | |
final FacetSet facetSet = this.delegate.get(i); | |
if (facetSet instanceof Customization) { | |
if (customIndex == index) { | |
addAllDone = true; | |
this.delegate.addAll(i, collection); | |
break; | |
} | |
customIndex++; | |
} | |
} | |
return addAllDone; | |
} | |
public boolean removeAll(final Collection<?> collection) { | |
return this.delegate.removeAll(collection); | |
} | |
public boolean retainAll(final Collection<?> collection) { | |
boolean modified = false; | |
final Iterator<FacetSet> iterator = this.delegate.iterator(); | |
while (iterator.hasNext()) { | |
final FacetSet next = iterator.next(); | |
if (next instanceof Customization && !collection.contains(next)) { | |
this.delegate.remove(next); | |
modified = true; | |
} | |
} | |
return modified; | |
} | |
public void clear() { | |
final List<Customization> customToClear = new ArrayList<Customization>(); | |
final Iterator<FacetSet> iterator = this.delegate.iterator(); | |
while (iterator.hasNext()) { | |
final FacetSet facetSet = iterator.next(); | |
if (facetSet instanceof Customization) { | |
customToClear.add((Customization) facetSet); | |
} | |
} | |
this.delegate.removeAll(customToClear); | |
} | |
public Customization get(final int index) { | |
Customization getValue = null; | |
int customIndex = 0; | |
for (FacetSet facetSet : this.delegate) { | |
if (facetSet instanceof Customization) { | |
if (customIndex == index) { | |
getValue = (Customization) facetSet; | |
break; | |
} | |
customIndex++; | |
} | |
} | |
if (getValue == null) { | |
throwOutOfBoundException(index, customIndex); | |
} | |
return getValue; | |
} | |
public Customization set(final int index, final Customization element) { | |
Customization oldValue = null; | |
int customIndex = 0; | |
for (int i = 0; i < this.delegate.size(); i++) { | |
final FacetSet facetSet = this.delegate.get(i); | |
if (facetSet instanceof Customization) { | |
if (customIndex == index) { | |
oldValue = (Customization) facetSet; | |
this.delegate.set(i, element); | |
break; | |
} | |
customIndex++; | |
} | |
} | |
if (oldValue == null) { | |
throwOutOfBoundException(index, customIndex); | |
} | |
return oldValue; | |
} | |
public void add(final int index, final Customization element) { | |
Customization movedFacet = null; | |
int customIndex = 0; | |
if (index == 0) { | |
this.delegate.add(0, element); | |
} else { | |
for (int i = 0; i < this.delegate.size(); i++) { | |
final FacetSet facetSet = this.delegate.get(i); | |
if (facetSet instanceof Customization) { | |
if (customIndex == index) { | |
movedFacet = (Customization) facetSet; | |
this.delegate.add(i, element); | |
break; | |
} | |
customIndex++; | |
} | |
} | |
if (movedFacet == null) { | |
throwOutOfBoundException(index, customIndex); | |
} | |
} | |
} | |
public Customization remove(final int index) { | |
Customization removedCustom = null; | |
int customIndex = 0; | |
for (int i = 0; i < this.delegate.size(); i++) { | |
final FacetSet facetSet = this.delegate.get(i); | |
if (facetSet instanceof Customization) { | |
if (customIndex == index) { | |
removedCustom = (Customization) facetSet; | |
this.delegate.remove(i); | |
break; | |
} | |
customIndex++; | |
} | |
} | |
if (removedCustom == null) { | |
throwOutOfBoundException(index, customIndex); | |
} | |
return removedCustom; | |
} | |
public int indexOf(final Object element) { | |
int indexOfElement = -1; | |
int customIndex = 0; | |
for (FacetSet facetSet : this.delegate) { | |
if (facetSet instanceof Customization) { | |
if (facetSet.equals(element)) { | |
indexOfElement = customIndex; | |
break; | |
} | |
customIndex++; | |
} | |
} | |
return indexOfElement; | |
} | |
public int lastIndexOf(final Object element) { | |
return createSubList().lastIndexOf(element); | |
} | |
public ListIterator<Customization> listIterator() { | |
return this.createSubList().listIterator(); | |
} | |
public ListIterator<Customization> listIterator(final int index) { | |
return createSubList().listIterator(index); | |
} | |
public List<Customization> subList(final int fromIndex, final int toIndex) { | |
final List<Customization> subList = new ArrayList<Customization>(); | |
int customIndex = 0; | |
for (FacetSet facetSet : this.delegate) { | |
if (facetSet instanceof Customization) { | |
if (customIndex >= fromIndex && customIndex < toIndex) { | |
subList.add((Customization) facetSet); | |
} else if (customIndex >= toIndex) { | |
break; | |
} | |
customIndex++; | |
} | |
} | |
return subList; | |
} | |
} |