📄 standardserver.java
字号:
throw (e);
}
// Store the state of this Server MBean
// (which will recursively store everything
try {
storeServer(writer, 0, this);
} catch (Exception e) {
if (writer != null) {
try {
writer.close();
} catch (Throwable t) {
;
}
}
throw (e);
}
// Flush and close the output file
try {
writer.flush();
} catch (Exception e) {
throw (e);
}
try {
writer.close();
} catch (Exception e) {
throw (e);
}
// Shuffle old->save and new->old
if (configOld.renameTo(configSave)) {
if (configNew.renameTo(configOld)) {
return;
} else {
configSave.renameTo(configOld);
throw new IOException("Cannot rename " +
configNew.getAbsolutePath() + " to " +
configOld.getAbsolutePath());
}
} else {
throw new IOException("Cannot rename " +
configOld.getAbsolutePath() + " to " +
configSave.getAbsolutePath());
}
}
/**
* Write the configuration information for <code>Context</code>
* out to the specified configuration file.
*
* @exception InstanceNotFoundException if the managed resource object
* cannot be found
* @exception MBeanException if the initializer of the object throws
* an exception, or persistence is not supported
* @exception RuntimeOperationsException if an exception is reported
* by the persistence mechanism
*/
public synchronized void storeContext(Context context) throws Exception {
String configFile = context.getConfigFile();
if (configFile != null) {
File config = new File(configFile);
if (!config.isAbsolute()) {
config = new File(System.getProperty("catalina.base"),
configFile);
}
// Open an output writer for the new configuration file
PrintWriter writer = null;
try {
writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(config), "UTF8"));
} catch (IOException e) {
if (writer != null) {
try {
writer.close();
} catch (Throwable t) {
;
}
}
throw (e);
}
writer.println("<?xml version='1.0' encoding='utf-8'?>");
writer.print("<Context");
storeAttributes(writer, context);
writer.println(">");
writer.println("</Context>");
// Flush and close the output file
try {
writer.flush();
} catch (Exception e) {
throw (e);
}
try {
writer.close();
} catch (Exception e) {
throw (e);
}
}
}
// -------------------------------------------------------- Private Methods
/** Given a string, this method replaces all occurrences of
* '<', '>', '&', and '"'.
*/
private String convertStr(String input) {
StringBuffer filtered = new StringBuffer(input.length());
char c;
for(int i=0; i<input.length(); i++) {
c = input.charAt(i);
if (c == '<') {
filtered.append("<");
} else if (c == '>') {
filtered.append(">");
} else if (c == '\'') {
filtered.append("'");
} else if (c == '"') {
filtered.append(""");
} else if (c == '&') {
filtered.append("&");
} else {
filtered.append(c);
}
}
return(filtered.toString());
}
/**
* Is this an instance of the default <code>Loader</code> configuration,
* with all-default properties?
*
* @param loader Loader to be tested
*/
private boolean isDefaultLoader(Loader loader) {
if (!(loader instanceof WebappLoader)) {
return (false);
}
WebappLoader wloader = (WebappLoader) loader;
if ((wloader.getDebug() != 0) ||
(wloader.getDelegate() != false) ||
!wloader.getLoaderClass().equals
("org.apache.catalina.loader.WebappClassLoader")) {
return (false);
}
return (true);
}
/**
* Is this an instance of the default <code>Manager</code> configuration,
* with all-default properties?
*
* @param manager Manager to be tested
*/
private boolean isDefaultManager(Manager manager) {
if (!(manager instanceof StandardManager)) {
return (false);
}
StandardManager smanager = (StandardManager) manager;
if ((smanager.getDebug() != 0) ||
!smanager.getPathname().equals("SESSIONS.ser") ||
!smanager.getRandomClass().equals("java.security.SecureRandom") ||
(smanager.getMaxActiveSessions() != -1) ||
!smanager.getAlgorithm().equals("MD5")) {
return (false);
}
return (true);
}
/**
* Is the specified class name + property name combination an
* exception that should not be persisted?
*
* @param className The class name to check
* @param property The property name to check
*/
private boolean isException(String className, String property) {
for (int i = 0; i < exceptions.length; i++) {
if (className.equals(exceptions[i][0]) &&
property.equals(exceptions[i][1])) {
return (true);
}
}
return (false);
}
/**
* Is the specified property type one for which we should generate
* a persistence attribute?
*
* @param clazz Java class to be tested
*/
private boolean isPersistable(Class clazz) {
for (int i = 0; i < persistables.length; i++) {
if (persistables[i] == clazz) {
return (true);
}
}
return (false);
}
/**
* Is the specified class name one that should be skipped because
* the corresponding component is configured automatically at
* startup time?
*
* @param className Class name to be tested
*/
private boolean isSkippable(String className) {
for (int i = 0; i < skippables.length; i++) {
if (skippables[i].equals(className)) {
return (true);
}
}
return (false);
}
/**
* Store the relevant attributes of the specified JavaBean, plus a
* <code>className</code> attribute defining the fully qualified
* Java class name of the bean.
*
* @param writer PrintWriter to which we are storing
* @param bean Bean whose properties are to be rendered as attributes,
*
* @exception Exception if an exception occurs while storing
*/
private void storeAttributes(PrintWriter writer,
Object bean) throws Exception {
storeAttributes(writer, true, bean);
}
/**
* Store the relevant attributes of the specified JavaBean.
*
* @param writer PrintWriter to which we are storing
* @param include Should we include a <code>className</code> attribute?
* @param bean Bean whose properties are to be rendered as attributes,
*
* @exception Exception if an exception occurs while storing
*/
private void storeAttributes(PrintWriter writer, boolean include,
Object bean) throws Exception {
// Render the relevant properties of this bean
String className = bean.getClass().getName();
// Render a className attribute if requested
if (include) {
for (int i = 0; i < standardImplementations.length; i++) {
if (className.equals(standardImplementations[i])) {
include = false;
}
}
if (include) {
writer.print(" className=\"");
writer.print(bean.getClass().getName());
writer.print("\"");
}
}
// Acquire the list of properties for this bean
PropertyDescriptor descriptors[] =
PropertyUtils.getPropertyDescriptors(bean);
if (descriptors == null) {
descriptors = new PropertyDescriptor[0];
}
// Create blank instance
Object bean2 = bean.getClass().newInstance();
for (int i = 0; i < descriptors.length; i++) {
if (descriptors[i] instanceof IndexedPropertyDescriptor) {
continue; // Indexed properties are not persisted
}
if (!isPersistable(descriptors[i].getPropertyType()) ||
(descriptors[i].getReadMethod() == null) ||
(descriptors[i].getWriteMethod() == null)) {
continue; // Must be a read-write primitive or String
}
Object value =
PropertyUtils.getSimpleProperty(bean,
descriptors[i].getName());
Object value2 =
PropertyUtils.getSimpleProperty(bean2,
descriptors[i].getName());
if (value == null) {
continue; // Null values are not persisted
}
if (isException(className, descriptors[i].getName())) {
continue; // Skip the specified exceptions
}
if (value.equals(value2)) {
// The property has its default value
continue;
}
if (!(value instanceof String)) {
value = value.toString();
}
writer.print(' ');
writer.print(descriptors[i].getName());
writer.print("=\"");
String strValue = convertStr((String) value);
writer.print(strValue);
writer.print("\"");
}
}
/**
* Store the specified Connector properties.
*
* @param writer PrintWriter to which we are storing
* @param indent Number of spaces to indent this element
* @param connector Object whose properties are being stored
*
* @exception Exception if an exception occurs while storing
*/
private void storeConnector(PrintWriter writer, int indent,
Connector connector) throws Exception {
// Store the beginning of this element
for (int i = 0; i < indent; i++) {
writer.print(' ');
}
writer.print("<Connector");
storeAttributes(writer, connector);
writer.println(">");
// Store nested <Factory> element
ServerSocketFactory factory = connector.getFactory();
if (factory != null) {
storeFactory(writer, indent + 2, factory);
}
// Store nested <Listener> elements
if (connector instanceof Lifecycle) {
LifecycleListener listeners[] =
((Lifecycle) connector).findLifecycleListeners();
if (listeners == null) {
listeners = new LifecycleListener[0];
}
for (int i = 0; i < listeners.length; i++) {
if (listeners[i].getClass().getName().equals
(SERVER_LISTENER_CLASS_NAME)) {
continue;
}
storeListener(writer, indent + 2, listeners[i]);
}
}
// Store the ending of this element
for (int i = 0; i < indent; i++) {
writer.print(' ');
}
writer.println("</Connector>");
}
/**
* Store the specified Context properties.
*
* @param writer PrintWriter to which we are storing
* @param indent Number of spaces to indent this element
* @param context Object whose properties are being stored
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -