thredds.catalog.InvCatalogFactory Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of netcdf Show documentation
Show all versions of netcdf Show documentation
The NetCDF-Java Library is a Java interface to NetCDF files,
as well as to many other types of scientific data formats.
The newest version!
/*
* Copyright 1998-2009 University Corporation for Atmospheric Research/Unidata
*
* Portions of this software were developed by the Unidata Program at the
* University Corporation for Atmospheric Research.
*
* Access and use of this software shall impose the following obligations
* and understandings on the user. The user is granted the right, without
* any fee or cost, to use, copy, modify, alter, enhance and distribute
* this software, and any derivative works thereof, and its supporting
* documentation for any purpose whatsoever, provided that this entire
* notice appears in all copies of the software, derivative works and
* supporting documentation. Further, UCAR requests that the user credit
* UCAR/Unidata in any publications that result from the use of this
* software or in any product that includes this software. The names UCAR
* and/or Unidata, however, may not be used in any advertising or publicity
* to endorse or promote any products or commercial entity unless specific
* written permission is obtained from UCAR/Unidata. The user also
* understands that UCAR/Unidata is not obligated to provide the user with
* any support, consulting, training or assistance of any kind with regard
* to the use, operation and performance of this software nor to provide
* the user with any updates, revisions, new versions or "bug fixes."
*
* THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL,
* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
* WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE.
*/
package thredds.catalog;
import org.jdom2.*;
import org.jdom2.input.SAXBuilder;
import java.io.*;
import java.net.*;
import java.util.*;
import ucar.nc2.util.IO;
import thredds.util.PathAliasReplacement;
import thredds.catalog.parser.jdom.InvCatalogFactory10;
/**
* Reads an XML document and constructs thredds.catalog object.
*
* Example of normal use:
*
*
* InvCatalogFactory factory = new InvCatalogFactory("default", validate);
* InvCatalogImpl catalog = (InvCatalogImpl) factory.readXML( catalogURI);
* StringBuilder buff = new StringBuilder();
* if (!catalog.check( buff)) {
* javax.swing.JOptionPane.showMessageDialog(this, "Invalid catalog <"+ catalogURI+">\n"+
* buff.toString());
* }
*
*
* To write out a catalog to XML:
*
*
* // write out catalog to String
* try {
* System.out.println("\Catalog in XML=\n" + factory.writeXML( catalog));
* } catch (IOException e) {
* e.printStackTrace();
* }
*
* // write out catalog to a file
* if (!factory.writeXML( catalog, filename))
* System.out.println("Catalog failed to write to file=" + filename);
*
* // write out catalog to a stream, catch exceptions
* try {
* BufferedOutputStream os = new BufferedOutputStream (new FileOutputStream(filename));
* factory.writeXML( catalog, os);
* os.close();
* } catch (IOException e) {
* e.printStackTrace();
* }
*
*
* Implementation details: Uses JDOM to read XML documents.
* Uses a pluggable InvCatalogConvertIF to transform the JDOM tree to the thredds.catalog objects.
* The converters are registered based on the namespace used. We are supporting:
* - the older "0.6" spec, namespace "http://www.unidata.ucar.edu/thredds"
*
- the current 1.0/1.1 spec, namespace "http://www.unidata.ucar.edu/namespaces/thredds/InvCatalog/v1.0"
*
* The schemas are read from a local resource, see XMLEntityResolver
*
* @author John Caron
*/
public class InvCatalogFactory {
static private org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(InvCatalogFactory.class);
public static boolean debugURL = false, debugOpen = false, debugVersion = false;
public static boolean showParsedXML = false, showStackTrace = false;
public static boolean debugXML = false, debugDBurl = false;
public static boolean debugXMLopen = false, showCatalogXML = false;
/**
* Get new Factory for reading and writing catalogs.
* For multithreading, get seperate InvCatalogFactory for each thread.
*
* @param validate : do XML validation or not.
* @return default factory
*/
public static InvCatalogFactory getDefaultFactory(boolean validate) {
return new InvCatalogFactory("default", validate);
}
public static InvCatalogConvertIF getDefaultConverter() {
return new thredds.catalog.parser.jdom.InvCatalogFactory10();
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* An InvCatalogFactory may have a name, in case you need to manage several of them.
*
* @return name of factory
*/
public String getName() {
return (this.name);
}
private String name;
private InvCatalogConvertIF defaultConverter;
private SAXBuilder saxBuilder;
private StringBuilder warnMessages, errMessages, fatalMessages;
private Map converters = new HashMap(10);
private Map metadataConverters = new HashMap(10);
/**
* Constructor.
* Can use this to read as many catalogs as you want, but only use in single thread.
*
* @param name : optional name to keep track of factories
* @param validate : do XML validation or not.
*/
public InvCatalogFactory(String name, boolean validate) {
this.name = name;
XMLEntityResolver xml = new XMLEntityResolver(validate);
saxBuilder = xml.getSAXBuilder();
warnMessages = xml.getWarningMessages();
errMessages = xml.getErrorMessages();
fatalMessages = xml.getFatalMessages();
setDefaults();
}
private List dataRootLocAliasExpanders = Collections.emptyList();
public void setDataRootLocationAliasExpanders( List dataRootLocAliasExpanders )
{
if ( dataRootLocAliasExpanders == null )
this.dataRootLocAliasExpanders = Collections.emptyList();
else
this.dataRootLocAliasExpanders = new ArrayList( dataRootLocAliasExpanders );
for ( InvCatalogConvertIF catConv : this.converters.values())
{
// LOOK! ToDo Should be more generic (add setter to InvCatalogConvertIF?)
if ( catConv instanceof InvCatalogFactory10 )
((InvCatalogFactory10) catConv).setDataRootLocationAliasExpanders( this.dataRootLocAliasExpanders );
}
}
public List getDataRootLocationAliasExpanders()
{
return Collections.unmodifiableList( this.dataRootLocAliasExpanders );
}
private void setDefaults() {
try {
/* Class fac6 = Class.forName("thredds.catalog.parser.jdom.InvCatalogFactory6");
Object fac6o = fac6.newInstance();
registerCatalogConverter(XMLEntityResolver.CATALOG_NAMESPACE_06, (InvCatalogConvertIF) fac6o); */
Class fac1 = Class.forName("thredds.catalog.parser.jdom.InvCatalogFactory10");
Object fac1o = fac1.newInstance();
defaultConverter = (InvCatalogConvertIF) fac1o;
registerCatalogConverter(XMLEntityResolver.CATALOG_NAMESPACE_10, (InvCatalogConvertIF) fac1o);
// registerMetadataConverter( JaxpFactory.CATALOG_NAMESPACE_10, (MetadataConverterIF) fac1o);
// registerMetadataConverter( MetadataType.THREDDS, new ThreddsMetadata.Parser());
} catch (ClassNotFoundException e) {
throw new RuntimeException("InvCatalogFactory: no implementing class found: " + e.getMessage());
} catch (InstantiationException e) {
throw new RuntimeException("InvCatalogFactory: instantition failed: " + e.getMessage());
} catch (IllegalAccessException e) {
throw new RuntimeException("InvCatalogFactory: access failed: " + e.getMessage());
}
}
/**
* Register converters for creating InvCatalogs from specific catalog XML namespaces.
* This allows the user to add to or override the way catalogs are made.
*
* @param namespace : namespace of catalog; acts as the version
* @param converter : use this factory for this version
*/
public void registerCatalogConverter(String namespace, InvCatalogConvertIF converter) {
converters.put(namespace, converter);
}
/**
* Find the InvCatalogConvertIF registered for this namespace.
* @param namespace : find InvCatalogConvertIF for this namespace
* @return the InvCatalogConvertIF registered for this namespace, or null
*/
public InvCatalogConvertIF getCatalogConverter(String namespace) {
return converters.get(namespace);
}
/*
* Find the InvCatalogConvertIF registered for this namespace, and set it into the catalog.
* @param cat set InvCatalogConvertIF on this catalog
* @param namespace find InvCatalogConvertIF for this namespace
*
public void setCatalogConverter(InvCatalogImpl cat, String namespace) {
cat.setCatalogConverter(getCatalogConverter(namespace));
} */
/**
* Register metadata converters for reading metadata objects of a certain type or namespace.
* This allows allows extensible metadata processing.
*
* @param key : namespace or metadata type string
* @param converter : use this MetadataConverterIF for the given key
* @see InvMetadata
*/
public void registerMetadataConverter(String key, MetadataConverterIF converter) {
metadataConverters.put(key, converter);
}
/**
* This allows the possibility of reading a catalog in another thread. The default
* implementation does not do that, but a subclass may override and implement.
* If the catalog is read successfully, it is passed on to the callback.
*
* @param uriString : read this catalog.
* @param callback : call this if successfully read.
* @see CatalogSetCallback
*/
public void readXMLasynch(String uriString, CatalogSetCallback callback) {
InvCatalogImpl cat = readXML(uriString);
callback.setCatalog(cat);
}
/**
* Create an InvCatalog from an XML document at a named URI.
* Failures and exceptions are handled
* by causing validate() to fail. Therefore, be sure to call validate() before trying
* to use the InvCatalog object.
*
* @param uriString : the URI name that the XML doc is at. May start with a "file:"
* @return an InvCatalogImpl object
*/
public InvCatalogImpl readXML(String uriString) {
URI uri;
try {
uri = new URI(uriString);
} catch (URISyntaxException e) {
InvCatalogImpl cat = new InvCatalogImpl(uriString, null, null);
cat.appendErrorMessage("**Fatal: InvCatalogFactory.readXML URISyntaxException on URL (" +
uriString + ") " + e.getMessage() + "\n", true);
return cat;
}
/* if (uriString.startsWith("file:")) {
String filename = uriString.substring(5);
File f = new File(filename);
if (f.exists()) {
try {
return readXML(new FileInputStream(f), uri);
} catch (Exception e) {
InvCatalogImpl cat = new InvCatalogImpl(uriString, null, null);
cat.appendErrorMessage("**Fatal: InvCatalogFactory.readXML error (" +
uriString + ") " + e.getMessage() + "\n", true);
}
}
} */
return readXML(uri);
}
/**
* Read an InvCatalog from an a URI.
* Failures and exceptions are handled
* by causing validate() to fail. Therefore, be sure to call validate() before trying
* to use the InvCatalog object.
*
* @param uri : the URI of the document, used for resolving reletive references.
* @return an InvCatalogImpl object
*/
public InvCatalogImpl readXML(URI uri) {
// get ready for XML parsing
warnMessages.setLength(0);
errMessages.setLength(0);
fatalMessages.setLength(0);
org.jdom2.Document jdomDoc;
InputStream is = null;
try {
jdomDoc = saxBuilder.build(uri.toURL());
// HttpUriResolver httpUriResolver = HttpUriResolver.newDefaultUriResolver();
// String s = httpUriResolver.getString( url );
// //StringReader
// is = new BufferedInputStream( httpUriResolver.getInputStream( url ), 1000000 );
// jdomDoc = saxBuilder.build( is );
} catch (Exception e) {
InvCatalogImpl cat = new InvCatalogImpl(uri.toString(), null, null);
cat.appendErrorMessage("**Fatal: InvCatalogFactory.readXML failed"
+ "\n Exception= " + e.getClass().getName() + " " + e.getMessage()
+ "\n fatalMessages= " + fatalMessages.toString()
+ "\n errMessages= " + errMessages.toString()
+ "\n warnMessages= " + warnMessages.toString() + "\n", true);
return cat;
}
finally
{
if ( is != null) try
{
is.close();
}
catch ( IOException e )
{
log.warn( "Failed to close input stream [" + uri.toString() + "]." );
}
}
if (fatalMessages.length() > 0) {
InvCatalogImpl cat = new InvCatalogImpl(uri.toString(), null, null);
cat.appendErrorMessage("**Fatal: InvCatalogFactory.readXML XML Fatal error(s) =\n" +
fatalMessages.toString() + "\n", true);
return cat;
}
return readXML(jdomDoc, uri);
}
/**
* Create an InvCatalog by reading catalog XML from a String.
*
* Failures and exceptions are handled by causing validate() to
* fail. Therefore, be sure to call validate() before trying to use
* the InvCatalog object.
*
* @param catAsString : the String from which to read the catalog.
* @param baseUri : the base URI of the document, used for resolving reletive references.
* @return an InvCatalogImpl object
*/
public InvCatalogImpl readXML( String catAsString, URI baseUri )
{
return readXML( new StringReader( catAsString ), baseUri );
}
/**
* Create an InvCatalog by reading catalog XML from a StringReader.
*
* Failures and exceptions are handled by causing validate() to
* fail. Therefore, be sure to call validate() before trying to use
* the InvCatalog object.
*
* @param catAsStringReader : the StreamReader from which to read the catalog.
* @param baseUri : the base URI of the document, used for resolving reletive references.
* @return an InvCatalogImpl object
*/
public InvCatalogImpl readXML( StringReader catAsStringReader, URI baseUri )
{
XMLEntityResolver resolver = new XMLEntityResolver( false );
SAXBuilder builder = resolver.getSAXBuilder();
Document inDoc;
try
{
inDoc = builder.build( catAsStringReader );
}
catch ( Exception e )
{
InvCatalogImpl cat = new InvCatalogImpl( baseUri.toString(), null, null );
cat.appendErrorMessage( "**Fatal: InvCatalogFactory.readXML(String catAsString, URI url) failed:"
+ "\n Exception= " + e.getClass().getName() + " " + e.getMessage()
+ "\n fatalMessages= " + fatalMessages.toString()
+ "\n errMessages= " + errMessages.toString()
+ "\n warnMessages= " + warnMessages.toString() + "\n", true );
return cat;
}
return readXML( inDoc, baseUri );
}
/**
* Create an InvCatalog from an InputStream.
* Failures and exceptions are handled
* by causing validate() to fail. Therefore, be sure to call validate() before trying
* to use the InvCatalog object.
*
* @param docIs : the InputStream to read from
* @param uri : the URI of the document, used for resolving reletive references.
* @return an InvCatalogImpl object
*/
public InvCatalogImpl readXML(InputStream docIs, URI uri) {
// get ready for XML parsing
warnMessages.setLength(0);
errMessages.setLength(0);
fatalMessages.setLength(0);
org.jdom2.Document jdomDoc;
try {
jdomDoc = saxBuilder.build(docIs);
} catch (Exception e) {
InvCatalogImpl cat = new InvCatalogImpl(uri.toString(), null, uri);
cat.appendErrorMessage("**Fatal: InvCatalogFactory.readXML failed"
+ "\n Exception= " + e.getClass().getName() + " " + e.getMessage()
+ "\n fatalMessages= " + fatalMessages.toString()
+ "\n errMessages= " + errMessages.toString()
+ "\n warnMessages= " + warnMessages.toString() + "\n", true);
return cat;
}
if (fatalMessages.length() > 0) {
InvCatalogImpl cat = new InvCatalogImpl(uri.toString(), null, uri);
cat.appendErrorMessage("**Fatal: InvCatalogFactory.readXML XML Fatal error(s) =\n" +
fatalMessages.toString() + "\n", true);
return cat;
}
return readXML(jdomDoc, uri);
}
/**
* Create an InvCatalog from a JDOM document.
* Failures and exceptions are handled
* by causing validate() to fail. Therefore, be sure to call validate() before trying
* to use the InvCatalog object.
*
* @param jdomDoc a parsed JDOM Document
* @param uri : the URI of the document, used for resolving reletive references.
* @return an InvCatalogImpl object
*/
public InvCatalogImpl readXML(org.jdom2.Document jdomDoc, URI uri) {
// decide on converter based on namespace
Element root = jdomDoc.getRootElement();
if (!root.getName().equalsIgnoreCase("catalog")) {
throw new IllegalArgumentException("not a catalog");
}
String namespace = root.getNamespaceURI();
InvCatalogConvertIF fac = converters.get(namespace);
if (fac == null) {
fac = defaultConverter; // LOOK
if (debugVersion)
System.out.println("use default converter " + fac.getClass().getName() + "; no namespace " + namespace);
} else if (debugVersion)
System.out.println("use converter " + fac.getClass().getName() + " based on namespace " + namespace);
InvCatalogImpl cat = fac.parseXML(this, jdomDoc, uri);
cat.setCreateFrom(uri.toString());
// cat.setCatalogFactory(this);
//cat.setCatalogConverter(fac);
cat.finish();
/* if (showCatalogXML) {
System.out.println("*** catalog/showCatalogXML");
try {
writeXML(cat, System.out);
}
catch (IOException ex) {
log.warn("Error writing catalog for debugging", ex);
}
} */
if (fatalMessages.length() > 0)
cat.appendErrorMessage(fatalMessages.toString(), true); // makes it invalid
if (errMessages.length() > 0)
cat.appendErrorMessage(errMessages.toString(), false); // doesnt make it invalid
if (warnMessages.length() > 0)
cat.appendErrorMessage(warnMessages.toString(), false); // doesnt make it invalid
return cat;
}
/* public org.w3c.dom.Element readOtherXML( URI url) {
Document doc;
try {
doc = builder.parse(url.toString());
} catch (Exception e) {
errMessages.append( "**Error: InvCatalogFactory.readOtherXML failed on "+ url+
"\n Exception= "+e.getClass().getName()+" "+e.getMessage()+"\n");
return null;
}
return doc.getDocumentElement();
} */
/*
* Write the catalog as an XML document to the specified stream.
*
* @param catalog write this catalog
* @param os write to this OutputStream
* @throws IOException on an error.
*
public void writeXML(InvCatalogImpl catalog, OutputStream os) throws IOException {
InvCatalogConvertIF fac = catalog.getCatalogConverter();
if (fac == null) fac = defaultConverter;
fac.writeXML(catalog, os);
}
/*
* Write the catalog as an XML document to the specified stream.
*
* @param catalog write this catalog
* @param os write to this OutputStream
* @param raw set true for "server side" catalogs, false is default, shows "client side" catalogs
* @throws IOException on an error.
*
public void writeXML(InvCatalogImpl catalog, OutputStream os, boolean raw) throws IOException {
InvCatalogConvertIF fac = catalog.getCatalogConverter();
if (fac == null) fac = defaultConverter;
fac.writeXML(catalog, os, raw);
}
/**
* Write the InvCatalogImpl as a InvCatalog 1.0 XML document to a String.
*
* @param catalog - the catalog to be written
* @return a String containing the XML representation
* @throws IOException when the OutputStream can't be written
* @throws IllegalStateException when the factory doesn't know how to write a 1.0 document.
*
public String writeXML_1_0(InvCatalogImpl catalog)
throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream(10000);
writeXML_1_0(catalog, os);
return os.toString();
}
/*
* Write the InvCatalogImpl as a InvCatalog 0.6 XML document to a String.
*
* @param catalog - the catalog to be written
* @return a String containing the XML representation
* @throws IOException when the OutputStream can't be written
* @throws IllegalStateException when the factory doesn't know how to write a 0.6 document.
*
public String writeXML_0_6(InvCatalogImpl catalog)
throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream(10000);
writeXML_0_6(catalog, os);
return os.toString();
} */
/**
* Write the InvCatalogImpl to the OutputStream as a InvCatalog 1.0 document.
*
* @param catalog - the catalog to be written
* @param os - the OutputStream to write to
* @param raw if true, write raw, vs converted
* @throws IOException when the OutputStream can't be written
* @throws IllegalStateException when the factory doesn't know how to write a 1.0 document.
*/
public void writeXML(InvCatalogImpl catalog, OutputStream os, boolean raw) throws IOException {
InvCatalogConvertIF converter = this.getCatalogConverter(XMLEntityResolver.CATALOG_NAMESPACE_10);
converter.writeXML(catalog, os, raw);
}
/**
* Write the InvCatalogImpl to the OutputStream as a InvCatalog 1.0 document.
*
* @param catalog - the catalog to be written
* @param os - the OutputStream to write to
* @throws IOException when the OutputStream can't be written
* @throws IllegalStateException when the factory doesn't know how to write a 1.0 document.
*/
public void writeXML(InvCatalogImpl catalog, OutputStream os) throws IOException {
writeXML(catalog, os, false);
}
/*
* Write the catalog as an XML document to the specified filename.
*
* @param catalog write this catalog
* @param filename write to this filename
* @throws IOException on an error.
*/
public void writeXML(InvCatalogImpl catalog, String filename) throws IOException {
BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(filename));
writeXML(catalog, os, false);
os.close();
}
/**
* Write the catalog as an XML document to a String.
*
* @param catalog write this catalog
* @return string containing XML representation
* @throws IOException on write error
*/
public String writeXML(InvCatalogImpl catalog) throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream(10000);
writeXML(catalog, os, false);
return os.toString();
}
/*
* Write the InvCatalogImpl to the OutputStream as a InvCatalog 0.6 document.
*
* @param catalog - the catalog to be written
* @param os - the OutputStream to write to
* @throws IOException when the OutputStream can't be written
* @throws IllegalStateException when the factory doesn't know how to write a 0.6 document.
*
public void writeXML_0_6(InvCatalogImpl catalog, OutputStream os)
throws IOException {
this.writeXML_ver(XMLEntityResolver.CATALOG_NAMESPACE_06, catalog, os);
} */
/*
* Write an InvCatalogImpl to an OutputStream as an InvCatalog document using the given namespace.
*
* @param namespace - the namespace of the version of InvCatalog document to be written
* @param catalog - the catalog to be written
* @param os - the OutputStream to write to
* @throws IOException when the OutputStream can't be written
* @throws IllegalStateException when the factory doesn't know how to write the version of document requested.
*
private void writeXML_ver(String namespace, InvCatalogImpl catalog, OutputStream os)
throws IOException {
InvCatalogConvertIF converter = this.getCatalogConverter(namespace);
if (converter == null) {
String tmpMsg = "This Factory <" + this.getName() + "> does not have a converter for the requested namespace <" + namespace + ">.";
throw new IllegalStateException(tmpMsg);
}
converter.writeXML(catalog, os);
} */
/**
* append an error message. Used by the InvCatalogConvertIF
* @param err append this error message
*/
public void appendErr(String err) {
errMessages.append(err);
}
/**
* append a fatal error message
* @param err append this error message
*/
public void appendFatalErr(String err) {
fatalMessages.append(err);
}
/**
* append a warning message
* @param err append this error message
*/
public void appendWarning(String err) {
warnMessages.append(err);
}
/**
* Find the MetadataConverterIF registered for this key
* @param key search on this key
* @return MetadataConverterIF else null
*/
public MetadataConverterIF getMetadataConverter(String key) {
if (key == null) return null;
return metadataConverters.get(key);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
// testing
private static InvCatalogImpl doOne(InvCatalogFactory fac, String urlString, boolean show) {
System.out.println("***read " + urlString);
if (show) System.out.println(" original catalog=\n" + IO.readURLcontents(urlString));
try {
InvCatalogImpl cat = fac.readXML(new URI(urlString));
StringBuilder buff = new StringBuilder();
boolean isValid = cat.check(buff, false);
System.out.println("catalog <" + cat.getName() + "> " + (isValid ? "is" : "is not") + " valid");
System.out.println(" validation output=\n" + buff);
// if (show) System.out.println(" parsed catalog=\n" + fac.writeXML(cat));
//System.out.println(" -----\n"+cat.dump());
return cat;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* testing
*/
public static void main(String[] args) throws Exception {
InvCatalogFactory catFactory = InvCatalogFactory.getDefaultFactory(false);
//doOne(catFactory, "http://www.unidata.ucar.edu/georesources/idvcatalog.xml", true);
doOne(catFactory, "file:C:/data/work/maurer/atm_mod.xml", true);
}
}
/*
* Default catalog parsing
*
* InvCatalogFactory allows parsers that handle different catalog versions to be registered
* by the application. These factories may also use different XML parsers. Usually you call
* InvCatalogFactory.getDefaultFactory(), which already has the default factories for catalog
* versions. The default factories validate the catalog XML, and require jdom.jar and a validating
* parser like the one that ships with jdk1.4.
*
* Nonvalidating catalog parsing
* To use a nonvalidating, small parser that does not need jdom.jar or any external parser do the
* following before you make any other InvCatalogFactory calls:
*
InvCatalogFactory myFactory = new InvCatalogFactory();
myFactory.registerCatalogFactory("0.6", new thredds.catalog.parser.nano.Catalog6());
InvCatalogFactory.setDefaultFactory( myFactory);
*
*
* Custom catalog parsing
* You may also instantiate an InvCatalogFactory and register your
* own factories, for example:
*
InvCatalogFactory myFactory = new InvCatalogFactory();
myFactory.registerCatalogFactory("0.6", new MyInvCatalogFactory());
InvCatalogFactory.setDefaultFactory( myFactory);
*
* Custom metadata parsing
* InvCatalogFactory also allows you to register parsers for specialized metadata elements that
* appear in the catalog.xml. These parsers are called "metadata factories" and must implement
* the InvMetadataFactoryIF interface.
* Example:
*
InvCatalogFactory catFactory = InvCatalogFactory.getDefaultFactory();
catFactory.registerMetadataFactory(MetadataType.WMS, new myWMSFactory());
* In this example, any metadata element of type MetadataType.WMS will be passed
* to your factory when the catalog is parsed. myWMSFactory will turn it into an
* Object, which will be available through the InvMetadata.getContentObject() call.
*/