/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.core.compare;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcorePackage;
/**
* EcoreMatcherFactory
*
* @since 8.0
*/
public class EcoreMatcherFactory implements EObjectMatcherFactory {
private final EObjectMatcher eAnnotationMatcher = new EAnnotationMatcher();
private final EObjectMatcher eNamedElementMatcher = new ENamedElementMatcher();
/**
* Construct an instance of EcoreMatcherFactory.
*
*/
public EcoreMatcherFactory() {
super();
}
/**
* @see org.teiid.designer.core.compare.EObjectMatcherFactory#createEObjectMatchersForRoots()
*/
@Override
public List createEObjectMatchersForRoots() {
final List results = new LinkedList();
results.add(eAnnotationMatcher);
results.add(eNamedElementMatcher);
return results;
}
/**
* @see org.teiid.designer.core.compare.EObjectMatcherFactory#createEObjectMatchers(org.eclipse.emf.ecore.EReference)
*/
@Override
public List createEObjectMatchers(final EReference reference) {
// Check to see whether the reference has a type that is EStringToStringMapEntry
// Create the appropriate matchers ...
final List results = new LinkedList();
final EClassifier refType = reference.getEType();
if ( EcorePackage.eINSTANCE.getEStringToStringMapEntry().equals(refType) ) {
results.add( new EcoreEStringToStringMapEntryMatcher() );
}
if ( refType instanceof EClass ) {
final EClass eClass = (EClass)refType;
if ( EcorePackage.eINSTANCE.getEAnnotation().equals(refType) || eClass.isSuperTypeOf(EcorePackage.eINSTANCE.getEAnnotation()) ) {
results.add(eAnnotationMatcher);
}
if ( EcorePackage.eINSTANCE.getEPackage().equals(refType) || eClass.isSuperTypeOf(EcorePackage.eINSTANCE.getEPackage()) ) {
results.add(eNamedElementMatcher);
}
if ( EcorePackage.eINSTANCE.getEAttribute().equals(refType) || eClass.isSuperTypeOf(EcorePackage.eINSTANCE.getEAttribute()) ) {
results.add(eNamedElementMatcher);
}
if ( EcorePackage.eINSTANCE.getEClass().equals(refType) || eClass.isSuperTypeOf(EcorePackage.eINSTANCE.getEClass()) ) {
results.add(eNamedElementMatcher);
}
if ( EcorePackage.eINSTANCE.getENamedElement().equals(refType) || EcorePackage.eINSTANCE.getEClass().isSuperTypeOf(eClass) ) {
results.add(eNamedElementMatcher);
}
}
if ( EcorePackage.eINSTANCE.getEAnnotation_Contents().equals(reference) ) {
results.add(new EAnnotationContentsMatcher());
}
return results;
}
}