/*******************************************************************************
 *  Copyright (c) 2010  Oracle. 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: 
 *  	Oracle - initial API and implementation
 *******************************************************************************/
package org.eclipse.jpt.jaxb.core.tests.internal;

import java.io.ByteArrayInputStream;
import java.util.List;
import java.util.Vector;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.Path;
import org.eclipse.jpt.jaxb.core.xsd.XsdSchema;



public class SchemaLibraryTests
		extends JaxbTestCase {
	
	public SchemaLibraryTests(String name) {
		super(name);
	}
	
	// tests schema for namespace that is set in catalog, but not in project properties
	public void testUnsetNamespace() {
		String namespace = "http://www.w3.org/2001/XInclude";
		
		// test initial load
		XsdSchema schema = getJaxbProject().getSchemaLibrary().getSchema(namespace);
		assertNotNull(schema);
		
		// test cached load
		schema = getJaxbProject().getSchemaLibrary().getSchema(namespace);
		assertNotNull(schema);
		
		// test unload/reload
		schema.getXSDComponent().eResource().unload();
		schema = getJaxbProject().getSchemaLibrary().getSchema(namespace);
		assertNotNull(schema);
	}
	
	// tests schema for registered uri that is set in project properties (namespace not registered in catalog)
	public void testSetRegisteredUriUnregisteredNamespace() {
		String namespace = "http://java.sun.com/xml/ns/persistence/orm";
		
		// set namespace in project properties\
		List<String> schemaLocations = new Vector<String>();
		schemaLocations.add("http://java.sun.com/xml/ns/persistence/orm_2_0.xsd");
		getJaxbProject().getSchemaLibrary().setSchemaLocations(schemaLocations);
		
		// test initial load
		XsdSchema schema = getJaxbProject().getSchemaLibrary().getSchema(namespace);
		assertNotNull(schema);
		
		// test cached load
		schema = getJaxbProject().getSchemaLibrary().getSchema(namespace);
		assertNotNull(schema);
		
		// test unload/reload
		schema.getXSDComponent().eResource().unload();
		schema = getJaxbProject().getSchemaLibrary().getSchema(namespace);
		assertNotNull(schema);
	}
	
	// tests schema for registerd uri that is set in project properties (namespace already registered in catalog)
	public void testSetRegisteredUriRegisteredNamespace() {
		String namespace = "http://www.eclipse.org/eclipselink/xsds/persistence/orm";
		
		// set namespace in project properties\
		List<String> schemaLocations = new Vector<String>();
		schemaLocations.add("http://www.eclipse.org/eclipselink/xsds/eclipselink_orm_1_0.xsd");
		getJaxbProject().getSchemaLibrary().setSchemaLocations(schemaLocations);
		
		// test initial load
		XsdSchema schema = getJaxbProject().getSchemaLibrary().getSchema(namespace);
		assertNotNull(schema);
		
		// test cached load
		schema = getJaxbProject().getSchemaLibrary().getSchema(namespace);
		assertNotNull(schema);
		
		// test unload/reload
		schema.getXSDComponent().eResource().unload();
		schema = getJaxbProject().getSchemaLibrary().getSchema(namespace);
		assertNotNull(schema);
	}
	
	// tests schema for unregistered uri that is set in project properties (local file)
	public void testSetUnregisterdUri() throws Exception {
		IFile schemaFile = getJaxbProject().getProject().getFile(new Path("customer.xsd"));
		String contents = 
				"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
				+ "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\""
				+ " targetNamespace=\"http://www.example.org/customer-example\">"
				+ "</xs:schema>";
		schemaFile.create(new ByteArrayInputStream(contents.getBytes()), true, null);
		
		String namespace = "http://www.example.org/customer-example";
		
		// set namespace in project properties\
		List<String> schemaLocations = new Vector<String>();
		schemaLocations.add("platform:/resource/" + BASE_PROJECT_NAME + "/customer.xsd");
		getJaxbProject().getSchemaLibrary().setSchemaLocations(schemaLocations);
		
		// test initial load
		XsdSchema schema = getJaxbProject().getSchemaLibrary().getSchema(namespace);
		assertNotNull(schema);
		
		// test cached load
		schema = getJaxbProject().getSchemaLibrary().getSchema(namespace);
		assertNotNull(schema);
		
		// test unload/reload
		schema.getXSDComponent().eResource().unload();
		schema = getJaxbProject().getSchemaLibrary().getSchema(namespace);
		assertNotNull(schema);
	}
}
