📄 xmlpackagereader.java
字号:
* @see org.xml.sax.ContentHandler
*/
public void endElement(final String uri,
final String localName,
final String qname) throws SAXException {
final Handler handler = getHandler( localName );
if ( (handler != null) && (!this.parents.isEmpty() && this.parents.getLast() instanceof RuleDescr) ) {
this.inHandledRuleSubElement = false;
}
if ( handler == null ) {
if ( this.configurationStack.size() >= 1 ) {
endConfiguration();
}
return;
}
this.current = getParent( handler.generateNodeFor() );
final Object node = handler.end( uri,
localName );
// next
if ( node != null && !this.lastWasEndElement ) {
this.peer = node;
}
// up or no children
else if ( this.lastWasEndElement || (this.parents.getLast()).getClass().isInstance( this.current ) ) {
this.peer = this.parents.removeLast();
}
this.lastWasEndElement = true;
}
private void validate(final String uri,
final String localName,
final Handler handler) throws SAXParseException {
boolean validParent = false;
boolean validPeer = false;
boolean invalidNesting = false;
final Set validParents = handler.getValidParents();
final Set validPeers = handler.getValidPeers();
boolean allowNesting = handler.allowNesting();
// get parent
Object parent;
if ( this.parents.size() != 0 ) {
parent = this.parents.getLast();
} else {
parent = null;
}
// check valid parents
// null parent means localname is rule-set
// dont process if elements are the same
// instead check for allowed nesting
final Class nodeClass = getHandler( localName ).generateNodeFor();
if ( !nodeClass.isInstance( parent ) ) {
Object allowedParent;
final Iterator it = validParents.iterator();
while ( !validParent && it.hasNext() ) {
allowedParent = it.next();
if ( parent == null && allowedParent == null ) {
validParent = true;
} else if ( allowedParent != null && ((Class) allowedParent).isInstance( parent ) ) {
validParent = true;
}
}
if ( !validParent ) {
throw new SAXParseException( "<" + localName + "> has an invalid parent element [" + parent + "]",
getLocator() );
}
}
// check valid peers
// null peer means localname is rule-set
final Object peer = this.peer;
Object allowedPeer;
Iterator it = validPeers.iterator();
while ( !validPeer && it.hasNext() ) {
allowedPeer = it.next();
if ( peer == null && allowedPeer == null ) {
validPeer = true;
} else if ( allowedPeer != null && ((Class) allowedPeer).isInstance( peer ) ) {
validPeer = true;
}
}
if ( !validPeer ) {
throw new SAXParseException( "<" + localName + "> is after an invalid element",
getLocator() );
}
if ( !allowNesting ) {
it = this.parents.iterator();
while ( !invalidNesting && it.hasNext() ) {
if ( nodeClass.isInstance( it.next() ) ) {
invalidNesting = true;
}
}
}
if ( invalidNesting ) {
throw new SAXParseException( "<" + localName + "> may not be nested",
getLocator() );
}
}
/**
* Start a configuration node.
*
* @param name
* Tag name.
* @param attrs
* Tag attributes.
*/
protected void startConfiguration(final String name,
final Attributes attrs) {
this.characters = new StringBuffer();
final DefaultConfiguration config = new DefaultConfiguration( name );
final int numAttrs = attrs.getLength();
for ( int i = 0; i < numAttrs; ++i ) {
config.setAttribute( attrs.getLocalName( i ),
attrs.getValue( i ) );
}
// lets add the namespaces as attributes
for ( final Iterator iter = this.namespaces.entrySet().iterator(); iter.hasNext(); ) {
final Map.Entry entry = (Map.Entry) iter.next();
String ns = (String) entry.getKey();
final String value = (String) entry.getValue();
if ( ns == null || ns.length() == 0 ) {
ns = "xmlns";
} else {
ns = "xmlns:" + ns;
}
config.setAttribute( ns,
value );
}
if ( this.configurationStack.isEmpty() ) {
this.configurationStack.addLast( config );
} else {
((DefaultConfiguration) this.configurationStack.getLast()).addChild( config );
this.configurationStack.addLast( config );
}
}
Handler getHandler(final String localName) {
return (Handler) this.handlers.get( localName );
}
/**
* @param chars
* @param start
* @param len
* @see org.xml.sax.ContentHandler
*/
public void characters(final char[] chars,
final int start,
final int len) {
if ( this.characters != null ) {
this.characters.append( chars,
start,
len );
}
}
/**
* End a configuration node.
*
* @return The configuration.
*/
protected Configuration endConfiguration() {
final DefaultConfiguration config = (DefaultConfiguration) this.configurationStack.removeLast();
if ( this.characters != null ) {
config.setText( this.characters.toString() );
}
this.characters = null;
return config;
}
LinkedList getParents() {
return this.parents;
}
Object getParent(final Class parent) {
final ListIterator it = this.parents.listIterator( this.parents.size() );
Object node = null;
while ( it.hasPrevious() ) {
node = it.previous();
if ( parent.isInstance( node ) ) {
break;
}
}
return node;
}
Object getPeer() {
return this.peer;
}
Object getCurrent() {
return this.current;
}
public InputSource resolveEntity(final String publicId,
final String systemId) throws SAXException {
try {
final InputSource inputSource = resolveSchema( publicId,
systemId );
if ( inputSource != null ) {
return inputSource;
}
if ( this.entityResolver != null ) {
return this.entityResolver.resolveEntity( publicId,
systemId );
}
} catch ( final IOException ioe ) {
}
return null;
}
public void startPrefixMapping(final String prefix,
final String uri) throws SAXException {
super.startPrefixMapping( prefix,
uri );
this.namespaces.put( prefix,
uri );
}
public void endPrefixMapping(final String prefix) throws SAXException {
super.endPrefixMapping( prefix );
this.namespaces.remove( prefix );
}
private void print(final SAXParseException x) {
final String msg = this.message.format( new Object[]{x.getSystemId(), new Integer( x.getLineNumber() ), new Integer( x.getColumnNumber() ), x.getMessage()} );
System.out.println( msg );
}
public void warning(final SAXParseException x) {
print( x );
}
public void error(final SAXParseException x) {
print( x );
}
public void fatalError(final SAXParseException x) throws SAXParseException {
print( x );
throw x;
}
private InputSource resolveSchema(final String publicId,
final String systemId) throws SAXException,
IOException {
// Schema files must end with xsd
if ( !systemId.toLowerCase().endsWith( "xsd" ) ) {
return null;
}
// try the actual location given by systemId
try {
final URL url = new URL( systemId );
return new InputSource( url.openStream() );
} catch ( final Exception e ) {
}
// Try and get the index for the filename, else return null
String xsd;
int index = systemId.lastIndexOf( "/" );
if ( index == -1 ) {
index = systemId.lastIndexOf( "\\" );
}
if ( index != -1 ) {
xsd = systemId.substring( index + 1 );
} else {
xsd = systemId;
}
ClassLoader cl = Thread.currentThread().getContextClassLoader();
if ( cl == null ) {
cl = XmlPackageReader.class.getClassLoader();
}
// Try looking in META-INF
{
final InputStream is = cl.getResourceAsStream( "META-INF/" + xsd );
if ( is != null ) {
return new InputSource( is );
}
}
// Try looking in /META-INF
{
final InputStream is = cl.getResourceAsStream( "/META-INF/" + xsd );
if ( is != null ) {
return new InputSource( is );
}
}
// Try looking at root of classpath
{
final InputStream is = cl.getResourceAsStream( "/" + xsd );
if ( is != null ) {
return new InputSource( is );
}
}
// Try current working directory
{
final File file = new File( xsd );
if ( file.exists() ) {
return new InputSource( new BufferedInputStream( new FileInputStream( file ) ) );
}
}
cl = ClassLoader.getSystemClassLoader();
// Try looking in META-INF
{
final InputStream is = cl.getResourceAsStream( "META-INF/" + xsd );
if ( is != null ) {
return new InputSource( is );
}
}
// Try looking in /META-INF
{
final InputStream is = cl.getResourceAsStream( "/META-INF/" + xsd );
if ( is != null ) {
return new InputSource( is );
}
}
// Try looking at root of classpath
{
final InputStream is = cl.getResourceAsStream( "/" + xsd );
if ( is != null ) {
return new InputSource( is );
}
}
return null;
}
/**
* Intializes EntityResolver that is configured via system property ENTITY_RESOLVER_PROPERTY_NAME.
*/
private void initEntityResolver() {
final String entityResolveClazzName = System.getProperty( XmlPackageReader.ENTITY_RESOLVER_PROPERTY_NAME );
if ( entityResolveClazzName != null && entityResolveClazzName.length() > 0 ) {
try {
final Class entityResolverClazz = Thread.currentThread().getContextClassLoader().loadClass( entityResolveClazzName );
this.entityResolver = (EntityResolver) entityResolverClazz.newInstance();
} catch ( final Exception ignoreIt ) {
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -