blob: 1fb7518bbded595c3ff408e438f0c6973169d683 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 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.ecore.EPackage;
/**
* This will contain all of the EMF Compare equality helper extension provider descriptors.
*
* @author <a href="mailto:stephane.thibaudeau@obeo.fr">Stephane Thibaudeau</a>
*/
public class EqualityHelperExtensionProviderDescriptorRegistryImpl implements EqualityHelperExtensionProvider.Descriptor.Registry {
/**
* Map of all known {@link EqualityHelperExtensionProvider.Descriptor}s.
*/
private final Map<String, EqualityHelperExtensionProvider.Descriptor> equalityHelperExtensionProviderDescriptors;
/**
* Cache (NsURI <-> highest ranking equality helper extension provider) associating each NsURI to his
* highest ranking equality helper extension provider.
*/
private final Map<String, EqualityHelperExtensionProvider> cache;
/**
* Creates a new extension registry.
*/
public EqualityHelperExtensionProviderDescriptorRegistryImpl() {
equalityHelperExtensionProviderDescriptors = Maps.newHashMap();
cache = Maps.newHashMap();
}
/**
* Returns a default registry i.e. an empty one
*
* @return A default empty registry
*/
public static EqualityHelperExtensionProvider.Descriptor.Registry createStandaloneInstance() {
final EqualityHelperExtensionProviderDescriptorRegistryImpl registry = new EqualityHelperExtensionProviderDescriptorRegistryImpl();
return registry;
}
/**
* {@inheritDoc}
*/
public EqualityHelperExtensionProvider.Descriptor put(String key,
EqualityHelperExtensionProvider.Descriptor equalityHelperExtensionProvider) {
cache.clear();
return equalityHelperExtensionProviderDescriptors.put(key, equalityHelperExtensionProvider);
}
/**
* {@inheritDoc}
*/
public void clear() {
equalityHelperExtensionProviderDescriptors.clear();
cache.clear();
}
/**
* {@inheritDoc}
*/
public ImmutableList<EqualityHelperExtensionProvider.Descriptor> getDescriptors() {
return ImmutableList.copyOf(equalityHelperExtensionProviderDescriptors.values());
}
/**
* {@inheritDoc}
*/
public EqualityHelperExtensionProvider.Descriptor remove(String key) {
cache.clear();
return equalityHelperExtensionProviderDescriptors.remove(key);
}
/**
* {@inheritDoc}
*/
public EqualityHelperExtensionProvider getHighestRankingEqualityHelperExtensionProvider(
EPackage ePackage) {
EqualityHelperExtensionProvider equalityHelperExtensionProvider = cache.get(ePackage.getNsURI());
if (equalityHelperExtensionProvider == null) {
EqualityHelperExtensionProvider.Descriptor highestRankingEqualityHelperExtensionProviderDescriptor = getHighestRankingEqualityHelperExtensionProviderDescriptor(
ePackage.getNsURI());
if (highestRankingEqualityHelperExtensionProviderDescriptor != null) {
equalityHelperExtensionProvider = highestRankingEqualityHelperExtensionProviderDescriptor
.getEqualityHelperExtensionProvider();
cache.put(ePackage.getNsURI(), equalityHelperExtensionProvider);
}
}
return equalityHelperExtensionProvider;
}
/**
* {@inheritDoc}
*/
public ImmutableList<EqualityHelperExtensionProvider> getEqualityHelperExtensionProviders(
EPackage ePackage) {
final ImmutableList.Builder<EqualityHelperExtensionProvider> equalityHelperExtensionProvidersBuilder = ImmutableList
.builder();
for (EqualityHelperExtensionProvider.Descriptor descriptor : getEqualityHelperExtensionProviderDescriptors(
ePackage)) {
equalityHelperExtensionProvidersBuilder.add(descriptor.getEqualityHelperExtensionProvider());
}
return equalityHelperExtensionProvidersBuilder.build();
}
/**
* Retrieve the equality helper extension providers descriptors from a given ePackage.
*
* @param ePackage
* the given ePackage.
* @return the equality helper extension providers descriptors from a given ePackage.
*/
private ImmutableList<EqualityHelperExtensionProvider.Descriptor> getEqualityHelperExtensionProviderDescriptors(
EPackage ePackage) {
return getEqualityHelperExtensionProviderDescriptors(ePackage.getNsURI());
}
/**
* Retrieve the equality helper extension providers descriptors from a given nsURI.
*
* @param nsURI
* the given nsURI.
* @return the equality helper extension providers descriptors from a given nsURI.
*/
private ImmutableList<EqualityHelperExtensionProvider.Descriptor> getEqualityHelperExtensionProviderDescriptors(
String nsURI) {
final ImmutableList.Builder<EqualityHelperExtensionProvider.Descriptor> equalityHelperExtensionProvidersBuilder = ImmutableList
.builder();
for (EqualityHelperExtensionProvider.Descriptor descriptor : getDescriptors()) {
Pattern nsURIPattern = descriptor.getNsURI();
if (nsURIPattern != null) {
if (nsURIPattern.matcher(nsURI).matches()) {
equalityHelperExtensionProvidersBuilder.add(descriptor);
}
}
}
return equalityHelperExtensionProvidersBuilder.build();
}
/**
* Returns the highest ranking equality helper extension provider descriptor associated to the given
* nsURI.
*
* @param nsURI
* the nsURI for which we want to get the highest ranking equality helper extension provider
* descriptor.
* @return the highest ranking equality helper extension provider descriptor associated to the given
* nsURI.
*/
private EqualityHelperExtensionProvider.Descriptor getHighestRankingEqualityHelperExtensionProviderDescriptor(
String nsURI) {
EqualityHelperExtensionProvider.Descriptor ret = null;
Iterator<EqualityHelperExtensionProvider.Descriptor> descriptors = getEqualityHelperExtensionProviderDescriptors(
nsURI).iterator();
if (descriptors.hasNext()) {
EqualityHelperExtensionProvider.Descriptor highestRanking = descriptors.next();
while (descriptors.hasNext()) {
EqualityHelperExtensionProvider.Descriptor desc = descriptors.next();
if (desc.getRanking() > highestRanking.getRanking()) {
highestRanking = desc;
}
}
ret = highestRanking;
}
return ret;
}
}