/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.catalina.storeconfig; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.digester.Digester; import org.xml.sax.SAXException; /** * XML Format * *
* {@code
*
*
*
*
*
*
*
*
*
* ...
*
* }
*
*
*
* Convention:
* Digester instance used to parse registry descriptors.
*/
protected static final Digester digester = createDigester();
private StoreRegistry registry;
private URL registryResource ;
/**
* @return Returns the registry.
*/
public StoreRegistry getRegistry() {
return registry;
}
/**
* @param registry
* The registry to set.
*/
public void setRegistry(StoreRegistry registry) {
this.registry = registry;
}
/**
* Create and configure the Digester we will be using for setup store
* registry.
* @return the XML digester that will be used to parse the configuration
*/
protected static Digester createDigester() {
long t1 = System.currentTimeMillis();
// Initialize the digester
Digester digester = new Digester();
digester.setValidating(false);
digester.setClassLoader(StoreRegistry.class.getClassLoader());
// Configure the actions we will be using
digester.addObjectCreate("Registry",
"org.apache.catalina.storeconfig.StoreRegistry", "className");
digester.addSetProperties("Registry");
digester
.addObjectCreate("Registry/Description",
"org.apache.catalina.storeconfig.StoreDescription",
"className");
digester.addSetProperties("Registry/Description");
digester.addRule("Registry/Description", new StoreFactoryRule(
"org.apache.catalina.storeconfig.StoreFactoryBase",
"storeFactoryClass",
"org.apache.catalina.storeconfig.StoreAppender",
"storeAppenderClass"));
digester.addSetNext("Registry/Description", "registerDescription",
"org.apache.catalina.storeconfig.StoreDescription");
digester.addCallMethod("Registry/Description/TransientAttribute",
"addTransientAttribute", 0);
digester.addCallMethod("Registry/Description/TransientChild",
"addTransientChild", 0);
long t2 = System.currentTimeMillis();
if (log.isDebugEnabled())
log.debug("Digester for server-registry.xml created " + (t2 - t1));
return digester;
}
/**
* Find main configuration file.
* @param aFile File name, absolute or relative
* to ${catalina.base}/conf, if not specified
* server-registry.xml is used
* @return The file
*/
protected File serverFile(String aFile) {
if (aFile == null || aFile.length() < 1)
aFile = "server-registry.xml";
File file = new File(aFile);
if (!file.isAbsolute())
file = new File(System.getProperty("catalina.base") + "/conf",
aFile);
try {
file = file.getCanonicalFile();
} catch (IOException e) {
log.error(e);
}
return file;
}
/**
* Load main configuration file from external source.
*
* @param aURL URL to the configuration file
*/
public void load(String aURL) {
synchronized (digester) {
File aRegistryFile = serverFile(aURL);
try {
registry = (StoreRegistry) digester.parse(aRegistryFile);
registryResource = aRegistryFile.toURI().toURL();
} catch (IOException e) {
log.error(e);
} catch (SAXException e) {
log.error(e);
}
}
}
/**
* Load from defaults
*