/******************************************************************************* * Copyright (c) 2014 Obeo. * 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: * Obeo - initial API and implementation *******************************************************************************/ package org.eclipse.emf.compare.match.eobject; import com.google.common.collect.ImmutableList; import com.google.common.collect.Maps; import java.util.Iterator; import java.util.Map; import java.util.regex.Pattern; import org.eclipse.emf.compare.match.eobject.WeightProvider.Descriptor; import org.eclipse.emf.compare.match.eobject.internal.WeightProviderDescriptorImpl; import org.eclipse.emf.ecore.EPackage; /** * This will contain all of the EMF Compare Weight Providers Descriptors. * * @since 3.1.0 * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a> */ public class WeightProviderDescriptorRegistryImpl implements WeightProvider.Descriptor.Registry { /** * Map of all known {@link WeightProvider.Descriptor}s. */ private final Map<String, WeightProvider.Descriptor> weightProviderDescriptors; /** * Cache (NsURI <-> highest ranking weight provider) associating each NsURI to his highest ranking weight * provider. */ private final Map<String, WeightProvider> cache; /** * Creates a new extension registry. */ public WeightProviderDescriptorRegistryImpl() { weightProviderDescriptors = Maps.newHashMap(); cache = Maps.newHashMap(); } /** * Returns a registry filled with the default weight provider {@link DefaultWeightProvider} and the ecore * weight provider {@link EcoreWeightProvider} provided by EMF Compare. * * @return A registry filled with the default & ecore weight providers provided by EMF Compare. */ public static WeightProvider.Descriptor.Registry createStandaloneInstance() { final WeightProviderDescriptorRegistryImpl registry = new WeightProviderDescriptorRegistryImpl(); final DefaultWeightProvider defaultWeightProvider = new DefaultWeightProvider(); final WeightProviderDescriptorImpl dwpDescriptor = new WeightProviderDescriptorImpl( defaultWeightProvider, 100, Pattern.compile(".*")); //$NON-NLS-1$ final EcoreWeightProvider ecoreWeightProvider = new EcoreWeightProvider(); final WeightProviderDescriptorImpl ewpDescriptor = new WeightProviderDescriptorImpl( ecoreWeightProvider, 101, Pattern.compile("http://www.eclipse.org/emf/2002/Ecore")); //$NON-NLS-1$ registry.put(defaultWeightProvider.getClass().getName(), dwpDescriptor); registry.put(ecoreWeightProvider.getClass().getName(), ewpDescriptor); return registry; } /** * {@inheritDoc} */ public WeightProvider.Descriptor put(String key, WeightProvider.Descriptor weightProvider) { cache.clear(); return weightProviderDescriptors.put(key, weightProvider); } /** * {@inheritDoc} */ public void clear() { weightProviderDescriptors.clear(); cache.clear(); } /** * {@inheritDoc} */ public ImmutableList<WeightProvider.Descriptor> getDescriptors() { return ImmutableList.copyOf(weightProviderDescriptors.values()); } /** * {@inheritDoc} */ public WeightProvider.Descriptor remove(String key) { cache.clear(); return weightProviderDescriptors.remove(key); } /** * {@inheritDoc} */ public WeightProvider getHighestRankingWeightProvider(EPackage ePackage) { WeightProvider weightProvider = cache.get(ePackage.getNsURI()); if (weightProvider == null) { WeightProvider.Descriptor highestRankingWeightProviderDescriptor = getHighestRankingWeightProviderDescriptor( ePackage.getNsURI()); if (highestRankingWeightProviderDescriptor != null) { weightProvider = highestRankingWeightProviderDescriptor.getWeightProvider(); cache.put(ePackage.getNsURI(), weightProvider); } } return weightProvider; } /** * {@inheritDoc} */ public ImmutableList<WeightProvider> getWeightProviders(EPackage ePackage) { final ImmutableList.Builder<WeightProvider> weightProvidersBuilder = ImmutableList.builder(); for (WeightProvider.Descriptor descriptor : getWeightProviderDescriptors(ePackage)) { weightProvidersBuilder.add(descriptor.getWeightProvider()); } return weightProvidersBuilder.build(); } /** * Retrieve the weight providers descriptors from a given ePackage. * * @param ePackage * the given ePackage. * @return the weight providers descriptors from a given ePackage. */ private ImmutableList<WeightProvider.Descriptor> getWeightProviderDescriptors(EPackage ePackage) { return getWeightProviderDescriptors(ePackage.getNsURI()); } /** * Retrieve the weight providers descriptors from a given nsURI. * * @param nsURI * the given nsURI. * @return the weight providers descriptors from a given nsURI. */ private ImmutableList<Descriptor> getWeightProviderDescriptors(String nsURI) { final ImmutableList.Builder<WeightProvider.Descriptor> weightProvidersBuilder = ImmutableList .builder(); for (WeightProvider.Descriptor descriptor : getDescriptors()) { Pattern nsURIPattern = descriptor.getNsURI(); if (nsURIPattern != null) { if (nsURIPattern.matcher(nsURI).matches()) { weightProvidersBuilder.add(descriptor); } } } return weightProvidersBuilder.build(); } /** * Returns the highest ranking weight provider descriptor associated to the given nsURI. * * @param nsURI * the nsURI for which we want to get the highest ranking weight provider descriptor. * @return the highest ranking weight provider descriptor associated to the given nsURI. */ private WeightProvider.Descriptor getHighestRankingWeightProviderDescriptor(String nsURI) { WeightProvider.Descriptor ret = null; Iterator<WeightProvider.Descriptor> descriptors = getWeightProviderDescriptors(nsURI).iterator(); if (descriptors.hasNext()) { WeightProvider.Descriptor highestRanking = descriptors.next(); while (descriptors.hasNext()) { WeightProvider.Descriptor desc = descriptors.next(); if (desc.getRanking() > highestRanking.getRanking()) { highestRanking = desc; } } ret = highestRanking; } return ret; } }