blob: 332d49b479de6f9b64879f2d71ed456371f6b14c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2009 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
* Jesper Steen Moeller - Added XML Catalogs 1.1 support
*
*******************************************************************************/
package org.eclipse.wst.xml.core.tests.contentmodel;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.MalformedURLException;
import junit.framework.TestCase;
import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
import org.eclipse.wst.xml.core.internal.catalog.provisional.IDelegateCatalog;
import org.eclipse.wst.xml.core.internal.catalog.provisional.IRewriteEntry;
import org.eclipse.wst.xml.core.internal.catalog.provisional.ISuffixEntry;
import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
import org.eclipse.wst.xml.core.internal.contentmodel.ContentModelManager;
import org.eclipse.wst.xml.core.internal.modelquery.XMLCatalogIdResolver;
import org.eclipse.wst.xml.core.tests.util.FileUtil;
public class TestCatalogRetrivalAndModelCreation extends TestCase {
/**
* Test that a known error case returns null.
*
* @throws MalformedURLException
* @throws IOException
*/
public void testKnownNotExist() throws MalformedURLException, IOException {
String JUNK_STRING = "doesNotExistTest";
ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
String resolved = xmlCatalog.resolvePublic(JUNK_STRING, null);
assertNull("expected no match for " + JUNK_STRING, resolved);
}
public void removedtestWAPFORUM() throws MalformedURLException, IOException {
doTest("-//WAPFORUM//DTD WML 1.1//EN");
}
public void testXHTML10() throws MalformedURLException, IOException {
doTest("-//W3C//DTD XHTML 1.0 Strict//EN");
}
public void testXHTML10T() throws MalformedURLException, IOException {
doTest("-//W3C//DTD XHTML 1.0 Transitional//EN");
}
public void testXHTML10F() throws MalformedURLException, IOException {
doTest("-//W3C//DTD XHTML 1.0 Frameset//EN");
}
public void testXHTML10B() throws MalformedURLException, IOException {
doTest("-//W3C//DTD XHTML Basic 1.0//EN");
}
public void testXHTML11() throws MalformedURLException, IOException {
doTest("-//W3C//DTD XHTML 1.1//EN");
}
/**
* We expect the XMLCatalogResolver and XMLCatalogIdResolver
* to resolve to the same URI given a public id in our catalog.
*
* @throws MalformedURLException
* @throws IOException
*/
public void testXHTML11_xmlresolver() throws MalformedURLException, IOException {
String EXPECTED_PUBLICID = "-//W3C//DTD XHTML 1.1//EN";
// bug 117424, here ewe make up a base location to satisfy the resolver API
// that expects a non-null base location
String baseLocation = "http://www.example.org/testXHTML11.xml";
XMLCatalogIdResolver resolver = new XMLCatalogIdResolver(baseLocation, null);
String resolvedXML_Id = resolver.resolve(baseLocation, EXPECTED_PUBLICID, null);
ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
String resolvedXL_Cat = xmlCatalog.resolvePublic(EXPECTED_PUBLICID, null);
assertEquals(resolvedXL_Cat, resolvedXML_Id);
}
public void testCMXHTML11() throws MalformedURLException, IOException {
doCMTest("-//W3C//DTD XHTML 1.1//EN");
}
public void removedtestXHTML10M() throws MalformedURLException, IOException {
doTest("-//WAPFORUM//DTD XHTML Mobile 1.0//EN");
}
public void removedtestWAP13() throws MalformedURLException, IOException {
doTest("-//WAPFORUM//DTD WML 1.3//EN");
}
public void test2001Schema() throws MalformedURLException, IOException {
doURITest("http://www.w3.org/2001/XMLSchema");
}
/**
* Tests if dtd NOT in our catalog can have a content model
* created.
*
* @throws MalformedURLException
* @throws IOException
*/
public void testExternalDTD() throws MalformedURLException, IOException {
doCM_directURITest("http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd");
}
public void test2001SchemaCMDirect() throws MalformedURLException, IOException {
doCM_directURITest("http://www.w3.org/2001/XMLSchema.xsd");
}
public void test2001SchemaCMCatalog() throws MalformedURLException, IOException {
doURI_CMTest("http://www.w3.org/2001/XMLSchema");
}
public void testInvoiceRemote() throws MalformedURLException, IOException {
doCM_directURITest_checkElementCount("http://www.eclipse.org/webtools/wst/components/xsd/tests/dtd-references/Invoice.dtd", 18);
}
public void testInvoiceRemoteIndirect() throws MalformedURLException, IOException {
doCM_directURITest_checkElementCount("http://www.eclipse.org/webtools/wst/components/xsd/tests/dtd-references/IndirectInvoice.dtd", 18);
}
public final static String LOCAL_SCHEMA_FILE = "file:///usr/tmp/mySchemaSchema.xsd";
public final static String LOCAL_SCHEMA_DIR = "file:///usr/tmp/schemas/";
public final static String LOCAL_SCHEMA_DIR_REWRITTEN = "file:///usr/tmp/schemas/example.dtd";
public void testCatalog11SystemSuffix() throws MalformedURLException, IOException {
ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
ISuffixEntry systemSuffix = (ISuffixEntry)xmlCatalog.createCatalogElement(ISuffixEntry.SUFFIX_TYPE_SYSTEM);
systemSuffix.setSuffix("XMLSchema.xsd");
systemSuffix.setURI(LOCAL_SCHEMA_FILE);
xmlCatalog.addCatalogElement(systemSuffix);
try {
String resolved = xmlCatalog.resolveSystem("http://www.w3.org/2001/XMLSchema.xsd");
assertEquals(LOCAL_SCHEMA_FILE, resolved);
} finally {
xmlCatalog.removeCatalogElement(systemSuffix);
}
}
public void testCatalog11UriSuffix() throws MalformedURLException, IOException {
ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
ISuffixEntry uriSuffix = (ISuffixEntry)xmlCatalog.createCatalogElement(ISuffixEntry.SUFFIX_TYPE_URI);
uriSuffix.setSuffix("XMLSchema.xsd");
uriSuffix.setURI(LOCAL_SCHEMA_FILE);
xmlCatalog.addCatalogElement(uriSuffix);
try {
String resolved = xmlCatalog.resolveURI("http://www.w3.org/2001/XMLSchema.xsd");
assertEquals(LOCAL_SCHEMA_FILE, resolved);
} finally {
xmlCatalog.removeCatalogElement(uriSuffix);
}
}
public void testCatalog11RewriteSystem() throws MalformedURLException, IOException {
ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
IRewriteEntry systemSuffix = (IRewriteEntry)xmlCatalog.createCatalogElement(IRewriteEntry.REWRITE_TYPE_SYSTEM);
systemSuffix.setStartString("http://www.example.org/dtds/");
systemSuffix.setRewritePrefix(LOCAL_SCHEMA_DIR);
xmlCatalog.addCatalogElement(systemSuffix);
try {
String resolved = xmlCatalog.resolveSystem("http://www.example.org/dtds/example.dtd");
assertEquals(LOCAL_SCHEMA_DIR_REWRITTEN, resolved);
} finally {
xmlCatalog.removeCatalogElement(systemSuffix);
}
}
public void testCatalog11RewriteUri() throws MalformedURLException, IOException {
ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
IRewriteEntry uriSuffix = (IRewriteEntry)xmlCatalog.createCatalogElement(IRewriteEntry.REWRITE_TYPE_URI);
uriSuffix.setStartString("urn:fisk:");
uriSuffix.setRewritePrefix(LOCAL_SCHEMA_DIR);
xmlCatalog.addCatalogElement(uriSuffix);
try {
String resolved = xmlCatalog.resolveURI("urn:fisk:example.dtd");
assertEquals(LOCAL_SCHEMA_DIR_REWRITTEN, resolved);
} finally {
xmlCatalog.removeCatalogElement(uriSuffix);
}
}
public void testCatalog11DelegatePublic() throws MalformedURLException, IOException {
ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
IDelegateCatalog publicDelegate = (IDelegateCatalog)xmlCatalog.createCatalogElement(IDelegateCatalog.DELEGATE_TYPE_PUBLIC);
// Ironically, we don't use WTP's Resolver when loading the catalog XML.
// Adding <!DOCTYPE catalog PUBLIC "-//OASIS//DTD XML Catalogs V1.1//EN" "http://www.example.org/dtd/catalog.dtd">
// to the catalog below will make the loading fail...
File delegateCat = makeTempFile("delegatePublic", "<catalog xmlns=\"urn:oasis:names:tc:entity:xmlns:xml:catalog\"\r\n" +
" prefer=\"public\">\r\n" +
" <public publicId=\"-//Example//an example V1.0.0//EN\"\r\n" +
" uri=\"file:///example.dtd\"/>\r\n" +
"</catalog>");
publicDelegate.setStartString("-//Example//");
publicDelegate.setCatalogLocation(delegateCat.toURI().toString());
xmlCatalog.addCatalogElement(publicDelegate);
try {
String resolved = xmlCatalog.resolvePublic("-//Example//an example V1.0.0//EN", "example.dtd");
assertEquals("file:///example.dtd", resolved);
} finally {
xmlCatalog.removeCatalogElement(publicDelegate);
}
}
public void testCatalog11DelegateSystem() throws MalformedURLException, IOException {
ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
IDelegateCatalog systemDelegate = (IDelegateCatalog)xmlCatalog.createCatalogElement(IDelegateCatalog.DELEGATE_TYPE_SYSTEM);
File delegateCat = makeTempFile("delegateSystem", "<catalog xmlns=\"urn:oasis:names:tc:entity:xmlns:xml:catalog\">\r\n" +
" <system systemId=\"http://funky.org/dog\" uri=\"file:///funky-dog.dtd\"/>\r\n" +
" <systemSuffix systemIdSuffix=\"/cat.dtd\" uri=\"file:///smellycat.xsd\"/>\r\n" +
" <rewriteSystem systemIdStartString=\"http://funky.org/parrots/\" rewritePrefix=\"file:///dtds/parrots/\"/>\r\n" +
"</catalog>");
systemDelegate.setStartString("http://funky.org/");
systemDelegate.setCatalogLocation(delegateCat.toURI().toString());
xmlCatalog.addCatalogElement(systemDelegate);
try {
assertEquals("try systemId entry", "file:///funky-dog.dtd", xmlCatalog.resolveSystem("http://funky.org/dog"));
assertEquals("try systemSuffix entry", "file:///smellycat.xsd", xmlCatalog.resolveSystem("http://funky.org/some/cat.dtd"));
assertEquals("try rewriteSystem entry", "file:///dtds/parrots/macaw.xsd", xmlCatalog.resolveSystem("http://funky.org/parrots/macaw.xsd"));
} finally {
xmlCatalog.removeCatalogElement(systemDelegate);
}
}
public void testCatalog11DelegateUri() throws MalformedURLException, IOException {
ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
IDelegateCatalog uriDelegate = (IDelegateCatalog)xmlCatalog.createCatalogElement(IDelegateCatalog.DELEGATE_TYPE_URI);
File delegateCat = makeTempFile("delegateUri", "<catalog xmlns=\"urn:oasis:names:tc:entity:xmlns:xml:catalog\">\r\n" +
" <uri name=\"urn:funky:dog\" uri=\"file:///funky-dog.dtd\"/>\r\n" +
" <uriSuffix uriSuffix=\":cat\" uri=\"file:///smellycat.dtd\"/>\r\n" +
" <rewriteURI uriStartString=\"urn:funky:fish:\" rewritePrefix=\"file:///dtds/\"/>\r\n" +
"</catalog>");
uriDelegate.setStartString("urn:funky:");
uriDelegate.setCatalogLocation(delegateCat.toURI().toString());
xmlCatalog.addCatalogElement(uriDelegate);
try {
assertEquals("uri entry", "file:///funky-dog.dtd", xmlCatalog.resolveURI("urn:funky:dog"));
assertEquals("uriSuffix entry", "file:///smellycat.dtd", xmlCatalog.resolveURI("urn:funky:where-is-my:cat"));
assertEquals("rewriteUri entry", "file:///dtds/parrot.dtd", xmlCatalog.resolveURI("urn:funky:fish:parrot.dtd"));
} finally {
xmlCatalog.removeCatalogElement(uriDelegate);
}
}
private File makeTempFile(String name, String contents) throws IOException {
File delegateCat = FileUtil.makeFileFor("catalogs", name, "cat");
FileWriter fw = new FileWriter(delegateCat);
fw.write(contents);
fw.close();
return delegateCat;
}
private void doTest(String EXPECTED_PUBLICID) throws MalformedURLException, IOException {
ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
String resolved = xmlCatalog.resolvePublic(EXPECTED_PUBLICID, null);
assertNotNull("expected to find " + EXPECTED_PUBLICID, resolved);
}
private void doCMTest(String EXPECTED_PUBLICID) throws MalformedURLException, IOException {
ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
String resolved = xmlCatalog.resolvePublic(EXPECTED_PUBLICID, null);
ContentModelManager contentModelManager = ContentModelManager.getInstance();
CMDocument contentModel = contentModelManager.createCMDocument(resolved, null);
assertNotNull("expected to create content model for " + EXPECTED_PUBLICID, contentModel);
}
private void doCM_directURITest(String EXPECTED_URI) throws MalformedURLException, IOException {
ContentModelManager contentModelManager = ContentModelManager.getInstance();
CMDocument contentModel = contentModelManager.createCMDocument(EXPECTED_URI, null);
assertNotNull("expected to create content model for " + EXPECTED_URI, contentModel);
}
private void doCM_directURITest_checkElementCount(String EXPECTED_URI, int count) throws MalformedURLException, IOException {
ContentModelManager contentModelManager = ContentModelManager.getInstance();
CMDocument contentModel = contentModelManager.createCMDocument(EXPECTED_URI, null);
assertNotNull("expected to create content model for " + EXPECTED_URI, contentModel);
int actualCount = contentModel.getElements().getLength();
assertEquals("count of element declarations found for content model create from " + EXPECTED_URI, contentModel.getElements().getLength(), actualCount);
}
private void doURITest(String EXPECTED_URI) throws MalformedURLException, IOException {
ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
String resolved = xmlCatalog.resolveURI(EXPECTED_URI);
assertNotNull("expected to find " + EXPECTED_URI, resolved);
}
void doURI_CMTest(String EXPECTED_URI) throws MalformedURLException, IOException {
ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
String resolved = xmlCatalog.resolveURI(EXPECTED_URI);
assertNotNull("expected to find " + EXPECTED_URI, resolved);
ContentModelManager contentModelManager = ContentModelManager.getInstance();
CMDocument contentModel = contentModelManager.createCMDocument(resolved, null);
assertNotNull("expected to create content model for " + EXPECTED_URI, contentModel);
}
}