Revert 'OPENJPA-1993:Deadlock Potential with ORM XML Processing' rev-1099630

git-svn-id: https://svn.apache.org/repos/asf/openjpa/branches/1.0.x@1176532 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jody Grassel 2011-09-27 19:06:19 +00:00
parent 7770243a21
commit 39d11fa4b1
5 changed files with 23 additions and 105 deletions

View File

@ -31,7 +31,6 @@ public class Compatibility {
private boolean _quotedNumbers = false;
private boolean _nonOptimisticVersionCheck = false;
private boolean _flushBeforeDetach = true;
private boolean _overrideContextClassloader = false;
/**
* Whether to require exact identity value types when creating object
@ -193,22 +192,4 @@ public class Compatibility {
_flushBeforeDetach = beforeDetach;
}
/**
* Whether to temporally override the thread's Context Classloader when processing
* ORM XML documents to avoid deadlock potential with certain Classloader hierarchy
* configurations. Defaults to false.
*/
public boolean getOverrideContextClassloader() {
return _overrideContextClassloader;
}
/**
* Whether to temporally override the thread's Context Classloader when processing
* ORM XML documents to avoid deadlock potential with certain Classloader hierarchy
* configurations. Defaults to false.
*/
public void setOverrideContextClassloader(boolean overrideContextClassloader) {
_overrideContextClassloader = overrideContextClassloader;
}
}

View File

@ -105,16 +105,6 @@ public abstract class XMLMetaDataParser extends DefaultHandler
private LexicalHandler _lh = null;
private int _depth = -1;
private int _ignore = Integer.MAX_VALUE;
private boolean _overrideContextClassloader = false;
public boolean getOverrideContextClassloader() {
return _overrideContextClassloader;
}
public void setOverrideContextClassloader(boolean overrideCCL) {
_overrideContextClassloader = overrideCCL;
}
/**
* Whether to parse element text.
@ -359,61 +349,36 @@ public abstract class XMLMetaDataParser extends DefaultHandler
// parse the metadata with a SAX parser
try {
_sourceName = sourceName;
SAXParser parser = null;
ClassLoader oldLoader = null;
SAXParser parser = XMLFactory.getSAXParser(validating, true);
Object schema = null;
if (validating) {
schema = schemaSource;
if (schema == null && getDocType() != null)
xml = new DocTypeReader(xml, getDocType());
}
try {
if (_overrideContextClassloader == true) {
oldLoader = (ClassLoader) AccessController.doPrivileged(
J2DoPrivHelper.getContextClassLoaderAction());
AccessController.doPrivileged(J2DoPrivHelper.setContextClassLoaderAction(
XMLMetaDataParser.class.getClassLoader()));
}
parser = XMLFactory.getSAXParser(validating, true);
Object schema = null;
if (validating) {
schema = schemaSource;
if (schema == null && getDocType() != null)
xml = new DocTypeReader(xml, getDocType());
}
if (_parseComments || _lh != null)
parser.setProperty
if (_parseComments || _lh != null)
parser.setProperty
("http://xml.org/sax/properties/lexical-handler", this);
if (schema != null) {
parser.setProperty
if (schema != null) {
parser.setProperty
("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
parser.setProperty
"http://www.w3.org/2001/XMLSchema");
parser.setProperty
("http://java.sun.com/xml/jaxp/properties/schemaSource",
schema);
}
InputSource is = new InputSource(xml);
if (_systemId && sourceName != null)
is.setSystemId(sourceName);
parser.parse(is, this);
finish();
} catch (SAXException se) {
IOException ioe = new IOException(se.toString());
JavaVersions.initCause(ioe, se);
throw ioe;
} finally {
if (_overrideContextClassloader == true && oldLoader != null) {
// Restore the old ContextClassloader
try {
AccessController.doPrivileged(J2DoPrivHelper.setContextClassLoaderAction(oldLoader));
} catch (Throwable t) {
if (_log != null && _log.isTraceEnabled()) {
_log.trace(_loc.get("restore-contextclassloader-failed"));
}
}
}
}
InputSource is = new InputSource(xml);
if (_systemId && sourceName != null)
is.setSystemId(sourceName);
parser.parse(is, this);
finish();
} catch (SAXException se) {
IOException ioe = new IOException(se.toString());
JavaVersions.initCause(ioe, se);
throw ioe;
} finally {
reset();
}

View File

@ -788,24 +788,6 @@ public abstract class J2DoPrivHelper {
}
};
}
/**
* Return a PrivilegeAction object for Thread.currentThread
* .setContextClassLoader().
*
* Requires security policy:
* 'permission java.lang.RuntimePermission "setContextClassLoader";'
*
* @return ClassLoader
*/
public static final PrivilegedAction setContextClassLoaderAction(final ClassLoader loader) {
return new PrivilegedAction() {
public Object run() {
Thread.currentThread().setContextClassLoader(loader);
return Boolean.TRUE;
}
};
}
/**
* Return a PrivilegedAction object for new Thread().

View File

@ -25,8 +25,6 @@ cant-diff-elems: Unable to differentiate between given package and class \
elements for class arg parsing. No element can be a complete prefix of \
another.
class-arg: Error extracting class information from "{0}".
restore-contextclassloader-failed: An error occurred restoring the Thread's \
context classloader.
parse-error: An error was encountered while parsing element "{0}". Make sure \
the metadata file is correctly formatted.
no-file: No source file found for "{0}".

View File

@ -235,14 +235,6 @@ public class XMLPersistenceMetaDataParser
if (repos != null
&& (repos.getValidate() & repos.VALIDATE_RUNTIME) != 0)
setParseComments(false);
if (repos != null) {
// Determine if the Thread Context Classloader needs to be temporally overridden to the Classloader
// that loaded the OpenJPA classes, to avoid a potential deadlock issue with the way Xerces
// handles parsers and classloaders.
this.setOverrideContextClassloader(repos.getConfiguration().getCompatibilityInstance().
getOverrideContextClassloader());
}
}
/**