Листинг 7.39. Метод loadXML осуществляет анализ документа XML (DOMIibrary.java)
private synchronized void loadXML(File xmlFile, String src ) { //File xmlFile = new File( src ) ; try { long timestamp = xmlFile.lastModified(); InputSource input = Resolver.createInputSource( xmlFile ); // ... the "false" flag says not to validate (faster) // XmlDocument is in the com.sun.xml.tree package Document doc = XmlDocument.createXmlDocument (input, false); domHash.put( src, doc ); trackerHash.put( src, new DomTracker( timestamp ) ); }catch(SAXParseException spe ){ StringBuffer sb = new StringBuffer( spe.toString() ); sb.append("\n Line number: " + spe.getLineNumber()); sb.append("\nColumn number: " + spe.getColumnNumber() ); sb.append("\n Public ID: " + spe.getPublicId() ); sb.append("\n System ID: " + spe.getSystemId() + "\n"); lastErr = sb.toString(); System.out.print( lastErr ); }catch( SAXException se ){ lastErr = se.toString(); System.out.println("loadXML threw " + lastErr ); domHash.put( src, lastErr ); se.printStackTrace( System.out ); }catch( IOException ie ){ lastErr = ie.toString(); System.out.println("loadXML threw " + lastErr + " trying to read " + src ); domHash.put( src, lastErr ); } } // end loadXML
Когда сервлетам требуется получить документ, они вызывают метод getDOM, показанный в листинге 7.40. Если при создании документа возникают какие-либо проблемы, то вместо ссылки на документ этот метод возвращает null. Каждый раз, когда в хэш-таблице обнаруживается требуемый документ, в ассоциированном объекте DomTracker обновляется значение времени последнего использования, которое заменяется текущим временем. Заметим, что в нескольких местах создаются выходные сообщения, которые записываются в объект System.out и служат для отладки. Мы советует закомментировать их после того, как система заработает.