/*******************************************************************************
 * Copyright (c) 2010, 2019 Mia-Software and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *    Nicolas Bros (Mia-Software) - initial API and implementation
 *    Gregoire DUPE (Mia-Software) - initial API and implementation
 *******************************************************************************/
package org.eclipse.modisco.infra.browser.custom.tests;

import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.modisco.infra.browser.custom.CustomViewFeature;
import org.eclipse.modisco.infra.browser.custom.CustomizableFeatures;
import org.eclipse.modisco.infra.browser.custom.DerivedFeatureValue;
import org.eclipse.modisco.infra.browser.custom.MetamodelView;
import org.eclipse.modisco.infra.browser.custom.StaticFeatureValue;
import org.eclipse.modisco.infra.browser.custom.TypeView;
import org.eclipse.modisco.infra.browser.custom.core.CustomizationsCatalog;
import org.eclipse.modisco.infra.browser.uicore.internal.AppearanceConfiguration;
import org.eclipse.modisco.infra.browser.uicore.internal.customization.CustomizationEngine;
import org.eclipse.modisco.infra.browser.uicore.internal.model.AttributeItem;
import org.eclipse.modisco.infra.browser.uicore.internal.model.ItemsFactory;
import org.eclipse.modisco.infra.browser.uicore.internal.model.ModelElementItem;
import org.eclipse.modisco.infra.common.core.internal.builder.AbstractMoDiscoCatalog;
import org.eclipse.modisco.infra.common.core.internal.utils.FileUtils;
import org.eclipse.modisco.infra.common.core.internal.utils.ProjectUtils;
import org.eclipse.modisco.infra.facet.FacetAttribute;
import org.eclipse.modisco.infra.facet.FacetSet;
import org.eclipse.modisco.infra.facet.core.FacetSetCatalog;
import org.eclipse.modisco.infra.query.ModelQuery;
import org.eclipse.modisco.infra.query.ModelQuerySet;
import org.eclipse.modisco.infra.query.core.AbstractModelQuery;
import org.eclipse.modisco.infra.query.core.ModelQuerySetCatalog;
import org.eclipse.modisco.infra.query.core.exception.ModelQueryException;
import org.eclipse.swt.widgets.Display;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;

@SuppressWarnings({ "restriction", "nls" })
public class BrowserCustomTest {

	public static final String FILE_EXT = "."
			+ CustomizationsCatalog.FILE_EXTENSION;

	/** Basic test for uiCustom */
	@Test
	public void testUICustom() throws Exception {
		CustomizationEngine customizationEngine = new CustomizationEngine();
		customizationEngine
				.registerCustomization(getCustomization("testCustomization"));
		customizationEngine.loadCustomizations();
		EPackage ePackage = EPackage.Registry.INSTANCE
				.getEPackage("http://www.eclipse.org/emf/2002/Ecore");
		EClass someEClass = (EClass) ePackage.getEClassifier("EOperation");
		Assert.assertTrue(customizationEngine.isTypeUnderlined(
				someEClass.eClass(), someEClass));
		Assert.assertFalse(customizationEngine.isTypeStruckthrough(
				someEClass.eClass(), someEClass));
	}

	/** Test uiCustom condition (with query) */
	@Test
	public void testUICustomWithCondition() throws Exception {
		refreshWorkspace();
		ModelQuerySetCatalog.getSingleton();
		// ModelQuerySet modelQuerySet =
		// ModelQuerySetCatalog.getSingleton().getModelQuerySet("testCustomization");
		// ModelQuery query =
		// modelQuerySet.getQuery("doesEClassNameStartWithEP");
		// JavaModelQuery javaModelQuery = (JavaModelQuery) query;
		//
		// AbstractModelQuery myModelQuery = ModelQuerySetCatalog.getSingleton()
		// .getModelQueryImpl(javaModelQuery);
		//
		CustomizationEngine customizationEngine = new CustomizationEngine();
		customizationEngine
				.registerCustomization(getCustomization("testCustomization"));
		customizationEngine.loadCustomizations();
		EPackage ePackage = EPackage.Registry.INSTANCE
				.getEPackage("http://www.eclipse.org/emf/2002/Ecore");

		EClass classFalse = (EClass) ePackage.getEClassifier("EOperation");
		EClass classTrue = (EClass) ePackage.getEClassifier("EPackage");
		// the query is "name starts with 'EP'"

		Assert.assertFalse("shouldn't be struckthrough", customizationEngine
				.isTypeStruckthrough(classFalse.eClass(), classFalse));
		Assert.assertTrue("should be struckthrough", customizationEngine
				.isTypeStruckthrough(classTrue.eClass(), classTrue));

		// doesn't work reliably on build.eclipse.org
		/*
		 * Color typeColorFalse = customizationEngine.getTypeColor(classFalse);
		 * Assert.assertTrue(typeColorFalse == null);
		 *
		 * final Color typeColorTrue =
		 * customizationEngine.getTypeColor(classTrue);
		 * Assert.assertTrue(typeColorTrue != null);
		 * Display.getDefault().syncExec(new Runnable() { public void run() {
		 * Assert
		 * .assertTrue(Display.getDefault().getSystemColor(SWT.COLOR_RED).getRGB
		 * () .equals(typeColorTrue.getRGB())); } });
		 */
	}

	/**
	 * Check that the class Display can be used.
	 */
	@Test
	public void checkDisplay() {
		Display.getCurrent();
	}

	/**
	 * Test that a customization in the workspace takes precedence over a
	 * customization with the same name from the registry.
	 */
	@SuppressWarnings("null")
	@Test
	public void testWorkspaceCustomizationHidesRegistryCustomization()
			throws Exception {
		refreshWorkspace();
		IProject project = ResourcesPlugin
				.getWorkspace()
				.getRoot()
				.getProject(
						"testWorkspaceCustomizationHidesRegistryCustomization");
		ProjectUtils.create(project, new NullProgressMonitor());
		FileUtils.copyFileFromBundle("workspaceCustomization.uiCustom",
				project, "testCustomization.uiCustom", Activator.getDefault()
						.getBundle());
		ResourcesPlugin.getWorkspace().build(
				IncrementalProjectBuilder.CLEAN_BUILD,
				new NullProgressMonitor());
		ProjectUtils.refresh(project);
		CustomizationsCatalog.getInstance().waitUntilBuilt();
		MetamodelView customization = null;
		Collection<MetamodelView> allCustomizations = CustomizationsCatalog
				.getInstance().getAllCustomizations();
		for (MetamodelView metamodelView : allCustomizations) {
			if ("testCustomization".equals(metamodelView.getName())) {
				Assert.assertTrue("several customizations with the same name",
						customization == null);
				customization = metamodelView;
			}
		}
		try {
			EList<TypeView> types = customization.getTypes();
			boolean found = false;
			for (TypeView typeView : types) {
				if ("ecore.EParameter".equals(typeView.getMetaclassName())) {
					found = true;
					CustomViewFeature customViewFeature;
					customViewFeature = typeView.getCustomizedFeatures().get(0);
					Assert.assertTrue(customViewFeature.getCustomizedFeature() == CustomizableFeatures.LABEL);
					StaticFeatureValue defaultValue = (StaticFeatureValue) customViewFeature
							.getDefaultValue();
					Assert.assertTrue(defaultValue
							.getValue()
							.equals("testWorkspaceCustomizationHidesRegistryCustomization"));
				}
			}
			Assert.assertTrue("Customization for ecore.EParameter not found",
					found);
		} catch (Exception e) {
			ResourceSet rs = new ResourceSetImpl();
			Resource r = rs.createResource(URI.createURI("tmp://"
					+ System.currentTimeMillis()));
			r.getContents().add(customization);
			ByteArrayOutputStream outputstream = new ByteArrayOutputStream();
			r.save(outputstream, Collections.emptyMap());
			throw new RuntimeException(outputstream.toString(), e);
		}
	}

	private void refreshWorkspace() throws CoreException {
		ResourcesPlugin
				.getWorkspace()
				.getRoot()
				.refreshLocal(IResource.DEPTH_INFINITE,
						new NullProgressMonitor());
	}

	/**
	 * Bug 304018 - Customization of inherited properties displayed in the
	 * browser
	 * <p>
	 * Test that an attribute or reference can be customized on a subtype.
	 * <p>
	 * The customization defines that NamedElement#name is underlined, and
	 * EClass#name is not.
	 */
	@Test
	public void testBug304018() {
		CustomizationEngine customizationEngine = new CustomizationEngine();
		customizationEngine
				.registerCustomization(getCustomization("testBug304018"));
		customizationEngine.loadCustomizations();

		EClass anEClass = EcoreFactory.eINSTANCE.createEClass();
		EPackage anEPackage = EcoreFactory.eINSTANCE.createEPackage();

		Assert.assertFalse(customizationEngine.isAttributeUnderlined(
				anEClass.eClass(), "name", anEClass));
		Assert.assertTrue(customizationEngine.isAttributeUnderlined(
				anEPackage.eClass(), "name", anEPackage));
	}

	@Test
	public void testBug299277() throws CoreException, IOException,
			InterruptedException, ModelQueryException {
		// CustomizationsCatalog.getInstance();
		String projectName = "testBug299277";
		IProject project = ResourcesPlugin.getWorkspace().getRoot()
				.getProject(projectName);
		ProjectUtils.create(project, new NullProgressMonitor());
		FileUtils.copyFileFromBundle(Activator.getDefault().getBundle()
				.getSymbolicName()
				+ BrowserCustomTest.FILE_EXT, project, Activator.getDefault()
				.getBundle().getSymbolicName()
				+ BrowserCustomTest.FILE_EXT, Activator.getDefault()
				.getBundle());
		ResourcesPlugin.getWorkspace().build(
				IncrementalProjectBuilder.CLEAN_BUILD,
				new NullProgressMonitor());
		ProjectUtils.refresh(project);
		MetamodelView metamodelView = null;
		Assert.assertTrue(CustomizationsCatalog.getInstance()
				.getWorkspaceCustomizations().size() >= 1);
		StringBuffer listOfWorkspaceCustomization = new StringBuffer();
		Iterator<MetamodelView> iter = CustomizationsCatalog.getInstance()
				.getWorkspaceCustomizations().iterator();
		while (iter.hasNext()) {
			MetamodelView currentMetamodelView = iter.next();
			listOfWorkspaceCustomization.append(currentMetamodelView.getName());
			if (currentMetamodelView.getName().equals(
					Activator.getDefault().getBundle().getSymbolicName())) {
				metamodelView = currentMetamodelView;
			}
		}
		if (metamodelView == null) {
			throw new RuntimeException(Activator.getDefault().getBundle()
					.getSymbolicName()
					+ "not found. Available customizations are : \n"
					+ listOfWorkspaceCustomization.toString());
		}
		Assert.assertNotNull(metamodelView);
		DerivedFeatureValue derivedFeatureValue = (DerivedFeatureValue) metamodelView
				.getTypes().get(0).getCustomizedFeatures().get(0)
				.getDefaultValue();
		ModelQuery modelQuery = derivedFeatureValue.getValueCalculator();

		ModelQuerySetCatalog catalog = ModelQuerySetCatalog.getSingleton();
		AbstractModelQuery myModelQuery = catalog.getModelQueryImpl(modelQuery);
		String result = (String) myModelQuery.basicEvaluate(modelQuery);
		Assert.assertEquals(
				"org.eclipse.modisco.infra.browser.custom.tests", result);
	}

	/**
	 * Check that a query referenced by a customization is the same physical
	 * object as a query with the same name from the catalog.
	 */
	@Test
	public void test001() throws CoreException, IOException,
			InterruptedException {
		String projectName = "test001";
		IProject project = ResourcesPlugin.getWorkspace().getRoot()
				.getProject(projectName);
		ProjectUtils.create(project, new NullProgressMonitor());
		FileUtils.copyFileFromBundle(Activator.getDefault().getBundle()
				.getSymbolicName()
				+ BrowserCustomTest.FILE_EXT, project, Activator.getDefault()
				.getBundle().getSymbolicName()
				+ BrowserCustomTest.FILE_EXT, Activator.getDefault()
				.getBundle());
		ResourcesPlugin.getWorkspace().build(
				IncrementalProjectBuilder.CLEAN_BUILD,
				new NullProgressMonitor());
		ProjectUtils.refresh(project);
		CustomizationsCatalog.getInstance().waitUntilBuilt();
		MetamodelView metamodelView = null;
		Assert.assertTrue(CustomizationsCatalog.getInstance()
				.getWorkspaceCustomizations().size() >= 1);
		Iterator<MetamodelView> iter = CustomizationsCatalog.getInstance()
				.getWorkspaceCustomizations().iterator();
		while (iter.hasNext()) {
			MetamodelView currentMetamodelView = iter.next();
			if (currentMetamodelView.getName().equals(
					Activator.getDefault().getBundle().getSymbolicName())) {
				metamodelView = currentMetamodelView;
			}
		}
		Assert.assertNotNull(metamodelView);
		@SuppressWarnings("null")
		DerivedFeatureValue derivedFeatureValue = (DerivedFeatureValue) metamodelView
				.getTypes().get(0).getCustomizedFeatures().get(0)
				.getDefaultValue();
		ModelQuery modelQuery = derivedFeatureValue.getValueCalculator();
		ModelQuerySetCatalog modelQuerySetCatalog = ModelQuerySetCatalog
				.getSingleton();
		ModelQuerySet modelQuerySet2 = modelQuerySetCatalog
				.getModelQuerySet(modelQuery.getModelQuerySet().getName());
		ModelQuery modelQuery2 = modelQuerySet2.getQuery(modelQuery.getName());
		// This checks that a query is represented by a unique object.
		Assert.assertEquals(modelQuery2, modelQuery);
	}

	private MetamodelView getCustomization(final String name) {
		Collection<MetamodelView> allCustomizations = CustomizationsCatalog
				.getInstance().getAllCustomizations();
		for (MetamodelView metamodelView : allCustomizations) {
			if (name.equals(metamodelView.getName())) {
				return metamodelView;
			}
		}
		throw new IllegalStateException("Customization not found: " + name);
	}

	private FacetSet getFacetSet(final String name) {
		FacetSet facetSet = FacetSetCatalog.getSingleton().getFacetSet(name);
		if (facetSet != null) {
			return facetSet;
		}
		throw new IllegalStateException("FacetSet not found: " + name);
	}

	/**
	 * Bug 309657 - Moving facet or query models generates wrong problem
	 * messages
	 */
	@Test
	public void bug309657() throws Exception {
		final String name = "bug309657"; //$NON-NLS-1$
		IProject project = ProjectUtils.createTestProject(name,
				org.eclipse.modisco.infra.browser.custom.tests.Activator
						.getDefault().getBundle(), ".");
		FileUtils.copyFileFromBundle(name + BrowserCustomTest.FILE_EXT,
				project, name + BrowserCustomTest.FILE_EXT, Activator
						.getDefault().getBundle());
		ProjectUtils.refresh(project);
		IFolder folder = project.getFolder("f1"); //$NON-NLS-1$
		folder.create(true, true, new NullProgressMonitor());
		IFile sourceFile = project.getFile(name + BrowserCustomTest.FILE_EXT);
		IPath sourcePath = sourceFile.getFullPath();
		IPath targetPath = new Path(folder.getFullPath() + "/" + name //$NON-NLS-1$
				+ BrowserCustomTest.FILE_EXT);
		sourceFile.move(targetPath, true, new NullProgressMonitor());
		ProjectUtils.refresh(project);
		IFile targetFile = ResourcesPlugin.getWorkspace().getRoot()
				.getFile(targetPath);
		IMarker[] markers = targetFile.findMarkers(
				AbstractMoDiscoCatalog.PROBLEM_MARKER, true,
				IResource.DEPTH_INFINITE);
		Assert.assertEquals(0, markers.length);
		targetFile.move(sourcePath, true, new NullProgressMonitor());
		ProjectUtils.refresh(project);
		markers = sourceFile.findMarkers(AbstractMoDiscoCatalog.PROBLEM_MARKER,
				true, IResource.DEPTH_INFINITE);
		Assert.assertEquals(0, markers.length);
	}

	// @Test
	// public void uniqueName() throws Exception {
	//		String name = "uniqueName"; //$NON-NLS-1$
	// wrongX(name, 2);
	// }

	// private IMarker[] wrongX(final String name, final int
	// nbOfExpectedMarkers) throws Exception {
	// IMarker[] markers = null;
	// IProject projectToCreate = this.utils.createProject(name);
	//		FileUtils.copyFileFromBundle("resources/validation/" + name //$NON-NLS-1$
	// + UnitTests.FILE_EXT, projectToCreate, name + UnitTests.FILE_EXT,
	// Activator
	// .getDefault().getBundle());
	// ProjectUtils.refresh(projectToCreate);
	// ModelQuerySetCatalog catalog = ModelQuerySetCatalog.getSingleton();
	// Assert.assertEquals(null, catalog.getModelQuerySet(name));
	// IFile file = projectToCreate.getFile(name + UnitTests.FILE_EXT);
	// markers = file
	// .findMarkers(ValidationJob.EMF_PROBLEM_MARKER, true,
	// IResource.DEPTH_INFINITE);
	// if (nbOfExpectedMarkers != markers.length) {
	// StringBuilder errorMessage = new StringBuilder();
	// errorMessage.append("Wrong number of markers. Expected " +
	// nbOfExpectedMarkers
	// + ", got " + markers.length + ":\n");
	// for (IMarker marker : markers) {
	// errorMessage.append(marker.getAttribute("message") + "\n");
	// }
	// Assert.assertTrue(errorMessage.toString(), false);
	// }
	// return markers;
	// }

	@Test
	public void modiscoProtocol() {
		URI uri = URI.createURI("modisco:/customization/testCustomization"); //$NON-NLS-1$
		ResourceSetImpl resourceSet = new ResourceSetImpl();
		Resource r = resourceSet.getResource(uri, true);
		EObject root = r.getContents().get(0);
		Assert.assertTrue(
				"A MetamodelView instance is expected as root element.", root instanceof MetamodelView); //$NON-NLS-1$
		MetamodelView metamodelView = (MetamodelView) root;
		Assert.assertEquals("testCustomization", metamodelView.getName()); //$NON-NLS-1$
	}

	/**
	 * Bug 306724 - deleting a project containing a query set does not remove
	 * the query set from its catalog
	 */
	@Test
	public void bug306724() throws Exception {
		String name = "bug306724"; //$NON-NLS-1$
		IProject project = ProjectUtils.createTestProject(name, Activator
				.getDefault().getBundle(), ".");
		FileUtils.copyFileFromBundle(name + BrowserCustomTest.FILE_EXT, //$NON-NLS-1$
				project, name + BrowserCustomTest.FILE_EXT, Activator
						.getDefault().getBundle());
		ProjectUtils.refresh(project);
		CustomizationsCatalog.getInstance().waitUntilBuilt();
		MetamodelView customization = (MetamodelView) CustomizationsCatalog
				.getInstance().getRootObject(name);
		Assert.assertNotNull(customization);
		project.close(new NullProgressMonitor());
		CustomizationsCatalog.getInstance().waitUntilBuilt();
		customization = (MetamodelView) CustomizationsCatalog.getInstance()
				.getRootObject(name);
		Assert.assertNull(customization);
		project.open(new NullProgressMonitor());
		CustomizationsCatalog.getInstance().waitUntilBuilt();
		customization = (MetamodelView) CustomizationsCatalog.getInstance()
				.getRootObject(name);
		Assert.assertNotNull(customization);
		project.delete(true, new NullProgressMonitor());
		CustomizationsCatalog.getInstance().waitUntilBuilt();
		customization = (MetamodelView) CustomizationsCatalog.getInstance()
				.getRootObject(name);
		Assert.assertNull(customization);
	}

	/**
	 * Bug 307187 - AbstractMoDiscoCatalog and name conflicts : If two
	 * customizations have the same name, only one will be registered in the
	 * catalog and the user will never be informed about this problem.
	 */
	@Test
	public void bug307187() throws Exception {
		final String name = "bug307187"; //$NON-NLS-1$
		final String dir1 = "1/"; //$NON-NLS-1$
		final String dir2 = "2/"; //$NON-NLS-1$
		IProject project = ProjectUtils.createTestProject(name, Activator
				.getDefault().getBundle(), ".");
		FileUtils.copyFileFromBundle(name + BrowserCustomTest.FILE_EXT, //$NON-NLS-1$
				project, dir1 + name + BrowserCustomTest.FILE_EXT, Activator
						.getDefault().getBundle());
		FileUtils.copyFileFromBundle(name + BrowserCustomTest.FILE_EXT, //$NON-NLS-1$
				project, dir2 + name + BrowserCustomTest.FILE_EXT, Activator
						.getDefault().getBundle());
		ProjectUtils.refresh(project);
		CustomizationsCatalog.getInstance().waitUntilBuilt();
		IFile customizationFile1 = project.getFile(new Path(dir1 + name
				+ BrowserCustomTest.FILE_EXT));
		IFile customizationFile2 = project.getFile(new Path(dir2 + name
				+ BrowserCustomTest.FILE_EXT));
		IMarker[] markers1 = customizationFile1.findMarkers(null, true,
				IResource.DEPTH_INFINITE);
		IMarker[] markers2 = customizationFile2.findMarkers(null, true,
				IResource.DEPTH_INFINITE);
		Assert.assertEquals(1, markers1.length + markers2.length);
	}

	/**
	 * Bug 336502 - Browser customization: "is Visible" and "collapse link"
	 * attributes are not taken into account for a Facet
	 */
	@Test
	public void bug336502() throws Exception {
		ModelQuerySetCatalog.getSingleton();

		CustomizationEngine customizationEngine = new CustomizationEngine();
		customizationEngine
				.registerCustomization(getCustomization("testBug304018"));
		customizationEngine.loadCustomizations();
		EPackage ePackage = EPackage.Registry.INSTANCE
				.getEPackage("http://www.eclipse.org/emf/2002/Ecore");
		EClass anEclass = (EClass) ePackage.getEClassifier("EOperation");

		AppearanceConfiguration appearanceConfiguration = new AppearanceConfiguration(
				new ItemsFactory());
		appearanceConfiguration.setShowAttributes(true);

		appearanceConfiguration.getFacetContext().addFacetSet(
				getFacetSet("bug336502"));
		appearanceConfiguration.getCustomizationEngine().registerCustomization(
				getCustomization("bug336502"));
		appearanceConfiguration.getCustomizationEngine().loadCustomizations();

		ModelElementItem modelElementItem = new ModelElementItem(anEclass,
				null, appearanceConfiguration);
		List<Object> children = modelElementItem.getChildren();

		boolean foundSelf = false;
		for (Object object : children) {
			if (object instanceof ModelElementItem) {
				ModelElementItem elementItem = (ModelElementItem) object;
				if (elementItem.getEObject() == anEclass) {
					foundSelf = true;
				}
			}
			if (object instanceof AttributeItem) {
				AttributeItem attributeItem = (AttributeItem) object;
				if (attributeItem.getAttribute() instanceof FacetAttribute) {
					fail("The customization should hide the FacetAttribute");
				}
			}
		}

		assertTrue(
				"The element should appear directly in its own children with 'collapse links' on a FacetReference with the 'identity' query",
				foundSelf);
	}

	/** Bug 341222 - customization on feature defined in another metamodel */
	@Test
	public void bug341222() throws Exception {
		final String umlPackageURI = "http://www.eclipse.org/uml2/3.0.0/UML";
		CustomizationEngine customizationEngine = new CustomizationEngine();
		customizationEngine
				.registerCustomization(getCustomization("bug341222"));
		customizationEngine.registerMetamodel(umlPackageURI);
		customizationEngine.loadCustomizations();
		EPackage umlPackage = EPackage.Registry.INSTANCE
				.getEPackage(umlPackageURI);
		EClass anEclass = (EClass) umlPackage.getEClassifier("Class");
		assertTrue(
				"customization defined on ecore.EModelElement should also apply to uml.Class",
				customizationEngine.isReferenceUnderlined(anEclass,
						"eAnnotations", null));
	}
}
