/******************************************************************************* * Copyright (c) 2009, 2010 Fraunhofer IWU and others. * 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: * Fraunhofer IWU - initial API and implementation *******************************************************************************/ package net.enilink.komma.model.base; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import net.enilink.commons.iterator.IExtendedIterator; import net.enilink.commons.iterator.NiceIterator; import net.enilink.komma.core.URI; public class CompoundURIMapRuleSet implements IURIMapRuleSet { private List<IURIMapRuleSet> members; public CompoundURIMapRuleSet(List<IURIMapRuleSet> members) { this.members = new CopyOnWriteArrayList<IURIMapRuleSet>(members); } public CompoundURIMapRuleSet(IURIMapRuleSet... members) { this(Arrays.asList(members)); } public void addMember(IURIMapRuleSet member) { if (!this.members.contains(member)) { this.members.add(member); } } @Override public void addRule(IURIMapRule rule) { members.get(0).addRule(rule); } @Override public IExtendedIterator<IURIMapRule> iterator() { Iterator<IURIMapRuleSet> memberIt = members.iterator(); if (!memberIt.hasNext()) { return NiceIterator.emptyIterator(); } IExtendedIterator<IURIMapRule> ruleIt = memberIt.next().iterator(); while (memberIt.hasNext()) { ruleIt.andThen(memberIt.next().iterator()); } return ruleIt; } @Override public URI map(URI uri) { for (Iterator<IURIMapRuleSet> memberIt = members.iterator(); memberIt .hasNext();) { URI replaced = memberIt.next().map(uri); if (!uri.equals(replaced)) { return replaced; } } return uri; } public boolean removeMember(IURIMapRuleSet member) { return this.members.remove(member); } @Override public void removeRule(IURIMapRule rule) { members.get(0).removeRule(rule); } }