package org.eclipse.wst.xml.catalog.tests.internal;

import java.net.URL;
import java.util.List;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.wst.xml.core.internal.catalog.Catalog;
import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog;

public class CatalogWriterTest extends AbstractCatalogTest {

	protected void setUp() throws Exception {
		super.setUp();
	}

	protected void tearDown() throws Exception {
		super.tearDown();
	}

	public CatalogWriterTest(String name) {
		super(name);
	}

	public final void testWrite() throws Exception {

		// read catalog
		String catalogFile = "/data/catalog1.xml";
		URL catalogUrl = TestPlugin.getDefault().getBundle().getEntry(
				catalogFile);
		assertNotNull(catalogUrl);
		URL resolvedURL = Platform.resolve(catalogUrl);

		Catalog testCatalog = (Catalog) getCatalog("catalog1", resolvedURL
				.toString());
		assertNotNull(testCatalog);
		testCatalog.setBase(resolvedURL.toString());
		// CatalogReader.read(testCatalog, resolvedURL.getFile());
		assertNotNull(testCatalog);

		// write catalog
		URL resultsFolder = TestPlugin.getDefault().getBundle().getEntry(
				"/");
		IPath path = new Path(Platform.resolve(resultsFolder).getFile());
		String resultCatalogFile = path.append("actual_results/catalog1.xml").toFile().toURI().toString();
		testCatalog.setLocation(resultCatalogFile);
		// write catalog
		testCatalog.save();
		
		// read catalog file from the saved location and test its content
		Catalog catalog = (Catalog) getCatalog("catalog2", testCatalog.getLocation());
		assertNotNull(catalog);

		// test saved catalog - catalog1.xml
		assertEquals(3, catalog.getCatalogEntries().length);

		// test public entries
		List entries = CatalogTest.getCatalogEntries(catalog,
				ICatalogEntry.ENTRY_TYPE_PUBLIC);
		assertEquals(1, entries.size());
		ICatalogEntry entry = (ICatalogEntry) entries.get(0);

		assertEquals("./Invoice/Invoice.dtd", entry.getURI());
		assertEquals("InvoiceId_test", entry.getKey());
		assertEquals("http://webURL", entry.getAttributeValue("webURL"));

		// test system entries
		entries = CatalogTest.getCatalogEntries(catalog,
				ICatalogEntry.ENTRY_TYPE_SYSTEM);
		assertEquals(1, entries.size());
		entry = (ICatalogEntry) entries.get(0);
		assertEquals("./Invoice/Invoice.dtd", entry.getURI());
		assertEquals("Invoice.dtd", entry.getKey());
		assertEquals("yes", entry.getAttributeValue("chached"));
		assertEquals("value1", entry.getAttributeValue("property"));

		// test uri entries
		entries = CatalogTest.getCatalogEntries(catalog,
				ICatalogEntry.ENTRY_TYPE_URI);
		assertEquals(1, entries.size());
		entry = (ICatalogEntry) entries.get(0);
		assertEquals("./Invoice/Invoice.dtd", entry.getURI());
		assertEquals("http://www.test.com/Invoice.dtd", entry.getKey());
		assertEquals("no", entry.getAttributeValue("chached"));
		assertEquals("value2", entry.getAttributeValue("property"));

		// test next catalog - catalog2.xml
		INextCatalog[] nextCatalogEntries = catalog.getNextCatalogs();
		assertEquals(1, nextCatalogEntries.length);

		INextCatalog nextCatalogEntry = (INextCatalog) nextCatalogEntries[0];
		assertNotNull(nextCatalogEntry);

		assertEquals("catalog2.xml", nextCatalogEntry.getCatalogLocation());
	}

}
