/******************************************************************************* * Copyright (c) 2009, 2014 Borland Software Corporation 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: * Borland Software Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.m2m.internal.qvt.oml.compiler; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public final class CompositeUnitResolver implements UnitResolver, RecursiveUnitResolver { private List<UnitResolver> fResolvers; public CompositeUnitResolver(UnitResolver... resolvers) { fResolvers = new ArrayList<UnitResolver>(resolvers.length); for (UnitResolver unitResolver : resolvers) { if(unitResolver == null) { throw new IllegalArgumentException(); } fResolvers.add(unitResolver); } } public final UnitProxy resolveUnit(String qualifiedName) { return resolveUnit(qualifiedName, new HashSet<RecursiveUnitResolver>()); } public final UnitProxy resolveUnit(String qualifiedName, Set<RecursiveUnitResolver> accessedParents) { if (accessedParents.contains(this)) { return null; } for (UnitResolver nextResolver : fResolvers) { UnitProxy unit = null; if (nextResolver instanceof RecursiveUnitResolver) { accessedParents.add(this); unit = ((RecursiveUnitResolver) nextResolver).resolveUnit(qualifiedName, accessedParents); } else { unit = nextResolver.resolveUnit(qualifiedName); } if(unit != null) { return unit; } } return null; } }