/*******************************************************************************
 * Copyright (c) 2007, 2018 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 v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 * 
 * Contributors:
 *     Borland Software Corporation - initial API and implementation
 *     Christopher Gerking - bugs 376274, 537041
 *******************************************************************************/
package org.eclipse.m2m.tests.qvt.oml;

import java.io.IOException;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EFactory;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.impl.EPackageRegistryImpl;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.m2m.internal.qvt.oml.compiler.CompilerUtils;
import org.eclipse.m2m.internal.qvt.oml.compiler.ProjectMetamodelRegistryProvider;
import org.eclipse.m2m.internal.qvt.oml.emf.util.EmfException;
import org.eclipse.m2m.internal.qvt.oml.emf.util.EmfUtilPlugin;
import org.eclipse.m2m.internal.qvt.oml.emf.util.URIUtils;
import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.IMetamodelDesc;
import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.IMetamodelRegistryProvider;
import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.MetamodelRegistry;
import org.eclipse.m2m.internal.qvt.oml.emf.util.urimap.MModelURIMapFactory;
import org.eclipse.m2m.internal.qvt.oml.emf.util.urimap.MappingContainer;
import org.eclipse.m2m.internal.qvt.oml.emf.util.urimap.MetamodelURIMappingHelper;
import org.eclipse.m2m.internal.qvt.oml.emf.util.urimap.URIMapping;
import org.eclipse.m2m.internal.qvt.oml.project.QVTOProjectPlugin;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import junit.framework.TestCase;


public class TestMetamodelRegistry extends TestCase {
	private static final String METAMODEL_ID = "qvt.tests.metamodelID"; //$NON-NLS-1$
	private static final URI platformTestModelURI = URI.createPlatformPluginURI("org.eclipse.m2m.tests.qvt.oml/models/javaless.ecore", false); //$NON-NLS-1$
	private static final String NESTED_PACKAGE_NAME = "nested"; //$NON-NLS-1$
	
	private TestProject myProject;
    private URI testEcoreFileURI;
    private MetamodelRegistry metamodelRegistry;
	
	@Override
	@Before
	public void setUp() throws Exception {
		myProject = new TestProject("MModelREgistryTest", new String[] {QVTOProjectPlugin.NATURE_ID}); //$NON-NLS-1$
        
		Resource mappingResource = MetamodelURIMappingHelper.createMappingResource(myProject.getProject());
        MappingContainer allMappings = MetamodelURIMappingHelper.createNewMappings(mappingResource);
        
        URIMapping uriMapping = MModelURIMapFactory.eINSTANCE.createURIMapping();
        uriMapping.setSourceURI(METAMODEL_ID);
        
        URIMapping nestedUriMapping = MModelURIMapFactory.eINSTANCE.createURIMapping();
        nestedUriMapping.setSourceURI(METAMODEL_ID + "." + NESTED_PACKAGE_NAME);
        
        URIMapping overridingUriMapping = MModelURIMapFactory.eINSTANCE.createURIMapping();
        overridingUriMapping.setSourceURI(EcorePackage.eNS_URI);
                
        testEcoreFileURI = prepareTestMetamodel();
        uriMapping.setTargetURI(testEcoreFileURI.toString());
        nestedUriMapping.setTargetURI(platformTestModelURI.appendFragment("//" + NESTED_PACKAGE_NAME).toString());
        overridingUriMapping.setTargetURI("invalid");
        
        allMappings.getMapping().add(uriMapping);
        allMappings.getMapping().add(nestedUriMapping);
        allMappings.getMapping().add(overridingUriMapping);
        
        mappingResource.save(null);
        // TODO - should rather be MetamodelURIMappingHelper operation
        // refresh .settings folder structure        
        myProject.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
        
        assertTrue(MetamodelURIMappingHelper.hasMappingResource(myProject.getProject()));  
        
        IMetamodelRegistryProvider.IRepositoryContext ctx = createContext();
        metamodelRegistry = new ProjectMetamodelRegistryProvider().getRegistry(ctx);
	}

	private IMetamodelRegistryProvider.IRepositoryContext createContext() {
		IFile projectDescFile = myProject.getProject().getFile(".project");
        URI projectDescURI = URIUtils.getResourceURI(projectDescFile);
		IMetamodelRegistryProvider.IRepositoryContext ctx = CompilerUtils.createContext(projectDescURI);
		return ctx;
	}
	
	@Override
	@After
	public void tearDown() throws Exception {
        myProject.delete();
	}
	
	@Test
	public void testProjectContextRegistration() throws Exception {
        IMetamodelRegistryProvider.IRepositoryContext ctx = createContext();

        IMetamodelDesc metamodelDesc = new ProjectMetamodelRegistryProvider()
        	.getRegistry(ctx).getMetamodelDesc(METAMODEL_ID);
        assertNotNull(metamodelDesc);
        
        EPackage ePackage = metamodelDesc.getModel();
        assertEquals(ePackage.eResource().getURI(), testEcoreFileURI);
    }
	
	@Test
	public void testGlobalContextRegistration() throws Exception {
		String knownID = EcorePackage.eINSTANCE.getNsURI();
        IMetamodelDesc metamodelDesc = metamodelRegistry.getMetamodelDesc(knownID);
        assertNotNull(metamodelDesc);
        assertSame(EcorePackage.eINSTANCE, metamodelDesc.getModel());
    }
	
	@Test
	public void testNestedPackageRegistration() throws Exception {
		IMetamodelRegistryProvider.IRepositoryContext ctx = createContext();
		
        IMetamodelDesc metamodelDesc = new ProjectMetamodelRegistryProvider()
        	.getRegistry(ctx).getMetamodelDesc(METAMODEL_ID + "." + NESTED_PACKAGE_NAME);
        assertNotNull(metamodelDesc);
        
        EPackage ePackage = metamodelDesc.getModel();
                
        assertEquals(ePackage.getName(), NESTED_PACKAGE_NAME);
    }
	
	@Test
	public void testBug376644PackageRegistryFallback() throws Exception {
		IMetamodelRegistryProvider.IRepositoryContext ctx = createContext();

        IMetamodelDesc metamodelDesc = new ProjectMetamodelRegistryProvider()
        	.getRegistry(ctx).getMetamodelDesc(EcorePackage.eNS_URI);
        assertNotNull(metamodelDesc);
        assertTrue(EmfUtilPlugin.isSuccess(metamodelDesc.getLoadStatus()));
        
        EPackage ePackage = metamodelDesc.getModel();
        assertSame(EcorePackage.eINSTANCE, ePackage);
	}
	
	@Test
	public void testBug441094DelegatePackageRegistry() {
		EPackage myEPackage = EcoreFactory.eINSTANCE.createEPackage();
		
		final String ID = "myPackageID";
		
		EPackage.Registry delegateRegistry = new EPackageRegistryImpl();
		delegateRegistry.put(ID, myEPackage);
		EPackage.Registry packageRegistry = new EPackageRegistryImpl(delegateRegistry);
		
		MetamodelRegistry metaRegistry = new MetamodelRegistry(packageRegistry);
				
		EPackage result = metaRegistry.toEPackageRegistry().getEPackage(ID);
		assertSame(myEPackage, result);
	}
	
	@Test
	public void testBug326651UpdateMetamodel() throws Exception {
		
		final String ID = "myPackageID";
		EPackage p1 = EcoreFactory.eINSTANCE.createEPackage();
		EPackage p2 = EcoreFactory.eINSTANCE.createEPackage();
		
		EPackage.Registry packageRegistry = new EPackageRegistryImpl();
		packageRegistry.put(ID, p1);
		
		MetamodelRegistry registry = new MetamodelRegistry(packageRegistry);
		
		IMetamodelDesc desc = registry.getMetamodelDesc(ID);
		assertSame(p1, desc.getModel());
		
		packageRegistry.put(ID, p2);
		
		desc = registry.getMetamodelDesc(ID);
		assertSame(p2, desc.getModel());
		
	}
	
	@Test
	public void testBug435699IllegalRegistration() throws Exception {
		
		final String ID = "myPackageID";
		
		EPackage.Descriptor descriptor = new EPackage.Descriptor() {
			
			public EPackage getEPackage() {
				throw new UnsupportedOperationException();
			}
			
			public EFactory getEFactory() {
				return null;
			}
		};
		
		EPackage.Registry packageRegistry = new EPackageRegistryImpl();
		packageRegistry.put(ID, descriptor);
		
		MetamodelRegistry registry = new MetamodelRegistry(packageRegistry);
		
		IMetamodelDesc desc = registry.getMetamodelDesc(ID);
				
		assertNotNull(desc);
		assertTrue(desc.getLoadStatus().getSeverity() == Diagnostic.ERROR);
		
		try {
			registry.getMetamodelDesc("unregisteredID");
			fail();
		}
		catch(EmfException e) {
			// succeed;
		}
		
	}
	
	private URI prepareTestMetamodel() throws IOException {
		IFile ecoreFile = myProject.project.getFile("javaless.ecore"); //$NON-NLS-1$
        URI uri = URI.createPlatformResourceURI(ecoreFile.getFullPath().toString(), false);
		
        Resource testMetamodelUri = new ResourceSetImpl().getResource(platformTestModelURI, true);
		testMetamodelUri.setURI(uri);
		testMetamodelUri.save(null);
		
		return uri;
	}	
}
