toolslisterframe.java

来自「很棒的web服务器源代码」· Java 代码 · 共 362 行

JAVA
362
字号
// ToolsListerFrame.java// $Id: ToolsListerFrame.java,v 1.11 2001/03/13 14:07:22 ylafon Exp $// (c) COPYRIGHT MIT and INRIA, 1998.// Please first read the full copyright statement in file COPYRIGHT.htmlpackage org.w3c.jigedit.tools ;import java.io.File;import java.io.PrintStream;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Enumeration;import java.util.TimeZone;import java.util.Vector;import org.w3c.tools.resources.AbstractContainer;import org.w3c.tools.resources.DirectoryResource;import org.w3c.tools.resources.FramedResource;import org.w3c.tools.resources.InvalidResourceException;import org.w3c.tools.resources.ProtocolException;import org.w3c.tools.resources.Resource;import org.w3c.tools.resources.ResourceException;import org.w3c.tools.resources.ResourceFrame;import org.w3c.tools.resources.ResourceReference;import org.w3c.tools.sorter.Sorter;import org.w3c.jigsaw.forms.URLDecoder;import org.w3c.jigsaw.http.HTTPException;import org.w3c.jigsaw.http.Reply;import org.w3c.jigsaw.http.Request;import org.w3c.jigsaw.html.HtmlGenerator;import org.w3c.jigsaw.frames.HTTPFrame;import org.w3c.jigsaw.frames.PostableFrame;import org.w3c.jigedit.cvs.CvsFrame;import org.w3c.www.http.HTTP;import org.w3c.www.http.HttpEntityMessage;import org.w3c.www.http.HttpRequestMessage;import org.w3c.tools.resources.event.StructureChangedEvent;import org.w3c.tools.resources.event.StructureChangedListener;/** * Emit the content of its parent directory. */public class ToolsListerFrame extends PostableFrame                               implements StructureChangedListener {    private static final boolean debug = true;    private boolean invalid = true;    private ResourceReference dirResourceRef = null;    protected ResourceReference getDirResourceRef() {	if (invalid || (dirResourceRef == null)) {	    dirResourceRef = getResource().getParent();	}	return dirResourceRef;    }    public void registerResource(FramedResource resource) {	super.registerOtherResource(resource);	dirResourceRef = resource.getParent();	try {	    FramedResource fres = (FramedResource)dirResourceRef.lock();	    // register us as a listener 	    fres.addStructureChangedListener(this);	} catch(InvalidResourceException ex) {	    ex.printStackTrace();	} finally {	    dirResourceRef.unlock();	}	invalid = false;    }    /**     * Unused here.     */    public void resourceModified(StructureChangedEvent evt) { }    /**     * Unused here.     */    public void resourceCreated(StructureChangedEvent evt) { }    public void resourceUnloaded(StructureChangedEvent evt){ }    /**     * A resource is about to be removed     * This handles the <code>RESOURCE_REMOVED</code> kind of events.     * @param evt The event describing the change.     */    public void resourceRemoved(StructureChangedEvent evt) {	invalid = true;    }    protected Class httpClass = null;    private String getResourceLine(ResourceReference rr, String name, 				  boolean even) {	if (httpClass == null) {	    try {		httpClass=Class.forName("org.w3c.jigsaw.frames.HTTPFrame");	    } catch (ClassNotFoundException ex) {		httpClass = null;	    }	}	// get the right date formatter	SimpleDateFormat df;	df = new SimpleDateFormat ("yyyy MMM dd - HH:mm:ss zzz");	df.setTimeZone(TimeZone.getTimeZone("GMT"));	StringBuffer buffer = new StringBuffer(100);	try {	    FramedResource resource = (FramedResource) rr.lock();	    if (name == null)		name = resource.getIdentifier();	    if (even) {		buffer.append("<tr class=\"evenlist\" align=\"left\" "			      + "valign=\"bottom\">");	    } else {		buffer.append("<tr class=\"oddlist\" align=\"left\" "			      + "valign=\"bottom\">");		    }	    HTTPFrame itsframe = null;	    if (httpClass != null)		itsframe = (HTTPFrame)resource.getFrame(httpClass);	    if (itsframe instanceof CvsFrame) {		buffer.append("<td></td>");	    } else {		buffer.append("<td>");		buffer.append("<INPUT TYPE=\"CHECKBOX\" NAME=\"" + name			      + "\"> ");		buffer.append("</td>");	    }	    buffer.append("<td>");	    if (itsframe != null) {		String icon = itsframe.getIcon() ;		if ( icon != null ) 		    buffer.append("<IMG SRC=\""+				  getIconDirectory() +"/" + icon+				  "\">");		// Resource's name with link:		buffer.append("<A HREF=\""+resource.getURLPath()+			      "\">"+name+"</A>");		// resource's title, if any:		String title = itsframe.getTitle();		if (title != null) {		    buffer.append("</td><td>"+title);		} else {		   buffer.append("</td><td>");		}		int clength = itsframe.getContentLength();		if (clength != -1) {		    int kcl = clength / 1024;		    buffer.append("</td><td>[ " + kcl + " kB ]");		} else {		    buffer.append("</td><td>-");		}		long clm = itsframe.getLastModified();		if (clm != -1) {		    buffer.append("</td><td>"+ df.format(new Date(clm)));		} else {		    buffer.append("</td><td>-");		}	    } else {		// Resource's name with link:		buffer.append("<A HREF=\""+resource.getURLPath()+			      "\">"+name+"</A>"+" Not available via HTTP");		buffer.append("</td><td></td><td></td><td>\n");	    }	    buffer.append("</td></tr>\n");	} catch (InvalidResourceException ex) {	    buffer.append("<td> "+name);	    buffer.append("cannot be loaded (server misconfigured)");	    buffer.append("<BR>");	    buffer.append("</td></tr>\n");	} finally {	    rr.unlock();	}	return buffer.toString();    }    /**     * Get the directory listing.     * @param request the incomming request.     * @exception ProtocolException if a protocol error occurs     * @exception ResourceException if a server error occurs     */    public synchronized Reply getDirectoryListing(Request request)	throws ProtocolException, ResourceException    {	DirectoryResource dirResource = null;	try {	    dirResource = (DirectoryResource) getDirResourceRef().lock();	    if (dirResource == null) 		throw new ResourceException("parent is NOT a "+					    "DirectoryResource. ("+					    resource.getIdentifier()+")");	    if (! dirResource.verify()) {		// the directory was deleted, but we can't delete it here		// (Multiple Locks)		// 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) 		|| (dirResource.getDirectory().lastModified() > listing_stamp)		|| (dirResource.getLastModified() > listing_stamp)		|| (getLastModified() > listing_stamp)) {				Enumeration enum = dirResource.enumerateResourceIdentifiers() ;		Vector        resources = Sorter.sortStringEnumeration(enum) ;		HtmlGenerator g = new HtmlGenerator("Directory listing of "+						  dirResource.getIdentifier());		// Add style link		addStyleSheet(g);		g.append("<H1>Directory listing of ",			 dirResource.getIdentifier(),			 "</H1>");		// Link to the parent, when possible:		if ( dirResource.getParent() != null )		    g.append("<P><A HREF=\"..\">Parent</A><BR>");		g.append("\n<FORM METHOD=\"POST\" ACTION=\""+request.getURL()			 +"\">\n");		String listername = getResource().getIdentifier();		// List the children:		g.append("<table border=\"0\">\n");		ResourceReference rr       = null;		FramedResource    resource = null;		String            name     = null;		//ugly hack to put CVS link first		rr = dirResource.lookup("CVS");		if (rr != null) {		    g.append(getResourceLine(rr, "CVS", false));		}		boolean even = true;		for (int i = 0 ; i < resources.size() ; i++) {		    name = (String) resources.elementAt(i);		    if ( name.equals(listername) || name.equals("CVS"))			continue;		    rr = dirResource.lookup(name);		    g.append(getResourceLine(rr, name, even));		    even = !even;		}		g.append("</table>\n");		g.append("<P><INPUT TYPE=\"SUBMIT\" NAME=\"SUBMIT\" VALUE=\""+			 "Delete file from  publishing space\"></FORM>\n");		g.close() ;		listing_stamp = getLastModified() ;		listing       = g ;	    } else if ( checkIfModifiedSince(request) == COND_FAILED ) {		// Is it an IMS request ?		return createDefaultReply(request, HTTP.NOT_MODIFIED) ;	    }	} catch (InvalidResourceException ex) {	    return createDefaultReply(request, HTTP.INTERNAL_SERVER_ERROR);	} finally {	    getDirResourceRef().unlock();	}	// New content or need update:	Reply reply = createDefaultReply(request, HTTP.OK) ;	reply.setLastModified(listing_stamp) ;	reply.setStream(listing) ;	return reply ;    }    /**     * @exception org.w3c.tools.resources.ProtocolException      * if a protocol error occurs     * @exception org.w3c.tools.resources.ResourceException      * if a server error occurs     */    protected Reply getOtherResource (Request request) 	throws ProtocolException, ResourceException      {	return getDirectoryListing(request);    }    /**     * Handle the form submission, after posted data parsing.     * <p>This method ought to be abstract, but for reasonable reason, it     * will just dump (parsed) the form content back to the client, so that it     * can be used for debugging.     * @param request The request proper.     * @param data The parsed data content.     * @exception ProtocolException If form data processing failed.     * @see org.w3c.jigsaw.forms.URLDecoder     */    public Reply handle (Request request, URLDecoder data)	throws ProtocolException    {	Reply r;	Enumeration   e = data.keys() ;	while ( e.hasMoreElements () ) {	    String name = (String) e.nextElement() ;	    if (name.equals("SUBMIT"))		continue;	    // delete file now... avoit deleting CVS and lister	    // (should be in an attribute)	    synchronized (this) {		DirectoryResource dr;		Resource toDeleteRes;		ResourceReference rr;		File dir, toDeleteFile;		try {		    dr = (DirectoryResource) getDirResourceRef().lock();		    dir = dr.getDirectory();		    if (debug)			System.out.println("Deleting " + name);		    rr = dr.lookup(name);		    if (rr != null) {			try {			    toDeleteFile = new File(dir, name);			    toDeleteFile.delete();			} catch (Exception ex) {			    // fancy message. file not present			    // Or security manager forbiding deletion.			}			// and now, at least remove the resource			try {			    toDeleteRes = (Resource) rr.lock();			    toDeleteRes.delete();			} catch (Exception ex) {			    // some other locks... or pb with the resource			} finally {			    rr.unlock();			}		    }		} catch (Exception ex) {		    // some other locks... abort		} finally {		    getDirResourceRef().unlock();		}	    }	}	try {	    r = getDirectoryListing(request);	} catch (ResourceException ex) {	    r = createDefaultReply(request, HTTP.INTERNAL_SERVER_ERROR);	}	return r;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?