- From: Roland Mainz <Roland.Mainz@informatik.med.uni-giessen.de>
- Date: Sun, 10 Oct 1999 18:12:09 +0200
- To: W3 Jigsaw Mailinglist <www-jigsaw@w3.org>, "jigsaw@w3.org" <jigsaw@w3.org>
Hi ! ---- Yesterday I digged out a problem with jigsaw: It seems that directory listings contains file (resources) which have been removed long-long ago, wasting the database. I wrote a small fix in HTTPFrame.java's getDirectoryListing(Request); which removes non-existing file resources (removing other resources may be tricky - servlets for example may exists only as a "virtual" HTTP name and not on disk at that location...). Better would be to find a genernal way of automatic cleanup (which should be enabled as default). The following solution only keeps the directory listing clean&&valid: -- snip -- public synchronized Reply getDirectoryListing(Request request) throws ProtocolException, ResourceException { if (dresource == null) throw new ResourceException("this frame is not attached to a "+ "DirectoryResource. ("+ resource.getIdentifier()+")"); // delete us if the directory was deleted if (! dresource.getDirectory().exists()) { //delete us and emit an error String msg = dresource.getIdentifier()+ ": deleted, removing the DirectoryResource"; getServer().errlog(dresource, msg); try { dresource.delete(); } catch (MultipleLockException ex) { } // Emit an error back: Reply error = request.makeReply(HTTP.NOT_FOUND) ; error.setContent ("<h1>Document not found</h1>"+ "<p>The document "+ request.getURL()+ " is indexed but not available."+ "<p>The server is misconfigured.") ; throw new HTTPException (error) ; } // Have we already an up-to-date computed a listing ? if ((listing == null) || (dresource.getDirectory().lastModified() > listing_stamp) || (dresource.getLastModified() > listing_stamp) || (getLastModified() > listing_stamp)) { Class http_class = null; try { http_class = Class.forName("org.w3c.jigsaw.frames.HTTPFrame"); } catch (ClassNotFoundException ex) { http_class = null; } Enumeration enum = dresource.enumerateResourceIdentifiers() ; Vector resources = Sorter.sortStringEnumeration(enum) ; HtmlGenerator g = new HtmlGenerator("Directory of "+ dresource.getIdentifier()); // Add style link addStyleSheet(g); g.append("<h1>"+dresource.getIdentifier()+"</h1>"); // Link to the parent, when possible: if ( dresource.getParent() != null ) g.append("<p><a href=\"..\">Parent</a><br>"); // List the children: for (int i = 0 ; i < resources.size() ; i++) { String name = (String) resources.elementAt(i); ResourceReference rr = null; rr = dresource.lookup(name); FramedResource resource = null; if (rr != null) { try { resource = (FramedResource) rr.lock(); // Cleanup added by gisburn 10.10.1999: Remove non-existing file resources here if( resource instanceof FileResource ) { FileResource fr = (FileResource)resource; if( !fr.getFile().exists() ) { try { System.err.println( "deleting resource " + fr.getFile() + "." ); fr.delete(); } catch (MultipleLockException ex) {} continue; } } HTTPFrame itsframe = null; if (http_class != null) itsframe = (HTTPFrame) resource.getFrame(http_class); if (itsframe != null) { // Icon first, if available String icon = itsframe.getIcon() ; if ( icon != null ) g.append("<img src=\""+ getIconDirectory() +"/" + icon+ "\">"); // Resource's name with link: g.append("<a href=\"" , URLEncoder.encode(name) , "\">"+name+"</a>"); // resource's title, if any: String title = itsframe.getTitle(); if ( title != null ) g.append(" "+title); g.append("<br>\n"); } else { // Resource's name with link: g.append(name+" (<i>Not available via HTTP.</i>)"); g.append("<br>\n"); } } catch (InvalidResourceException ex) { g.append(name+ " cannot be loaded (server misconfigured)"); g.append("<br>\n"); continue; } finally { rr.unlock(); } } } g.close() ; listing_stamp = getLastModified() ; listing = g ; } else if ( checkIfModifiedSince(request) == COND_FAILED ) { // Is it an IMS request ? Reply reply = createDefaultReply(request, HTTP.NOT_MODIFIED) ; reply.setContentMD5(null); return reply; } // New content or need update: Reply reply = createDefaultReply(request, HTTP.OK) ; reply.setLastModified(listing_stamp) ; reply.setStream(listing) ; // check MD5 return reply ; } -- snip -- ---- Bye, Roland -- __ . . __ (o.\ \/ /.o) Roland.Mainz@informatik.med.uni-giessen.de \__\/\/__/ gisburn@informatik.med.uni-giessen.de /O /==\ O\ MPEG specialist, C&&JAVA&&Sun&&Unix programmer (;O/ \/ \O;) TEL +49 (0) 641/99-13193 FAX +49 (0) 641/99-41359
Received on Sunday, 10 October 1999 12:12:38 UTC