putfilter.java

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

JAVA
267
字号
// PutFilter.java// $Id: PutFilter.java,v 1.4 2000/08/16 21:37:32 ylafon Exp $// (c) COPYRIGHT MIT and INRIA, 1996.// Please first read the full copyright statement in file COPYRIGHT.htmlpackage org.w3c.jigedit.filters;import java.io.IOException;import org.w3c.tools.resources.Attribute;import org.w3c.tools.resources.AttributeHolder;import org.w3c.tools.resources.AttributeRegistry;import org.w3c.tools.resources.FramedResource;import org.w3c.tools.resources.InvalidResourceException;import org.w3c.tools.resources.LookupResult;import org.w3c.tools.resources.LookupState;import org.w3c.tools.resources.ReplyInterface;import org.w3c.tools.resources.RequestInterface;import org.w3c.tools.resources.Resource;import org.w3c.tools.resources.ResourceFilter;import org.w3c.tools.resources.ResourceFrame;import org.w3c.tools.resources.ResourceReference;import org.w3c.tools.resources.StringAttribute;import org.w3c.www.http.HTTP;import org.w3c.www.http.HttpReplyMessage;import org.w3c.www.http.HttpRequestMessage;import org.w3c.jigsaw.http.Client;import org.w3c.jigsaw.http.Reply;import org.w3c.jigsaw.http.Request;import org.w3c.jigsaw.http.httpd;import org.w3c.jigsaw.html.HtmlGenerator;public class PutFilter extends ResourceFilter {    /**     * Attribute index - The companion PutList resource's URL.     */    protected static int ATTR_PUTLIST = -1;    static {	Class     c = null;	Attribute a = null;	try {	    c = Class.forName("org.w3c.jigedit.filters.PutFilter");	} catch (Exception ex) {	    ex.printStackTrace();	    System.exit(1);	}	// Register the PutList URL attribute:	a = new StringAttribute("put-list"				, null				, Attribute.EDITABLE|Attribute.MANDATORY);	ATTR_PUTLIST = AttributeRegistry.registerAttribute(c, a);    }    /**     * Resolve the companion PutList URL attribute into a resource:     */    private ResourceReference list = null;    protected synchronized ResourceReference resolvePutListResource() {	// Prepare for lookup:	ResourceReference rr_root = null;	rr_root = ((httpd) getServer()).getRootReference();	FramedResource root = null;	root = ((httpd) getServer()).getRoot();	String       u  = getPutListURL();	if ( u == null )	    return null;	// Do the lookup:	ResourceReference r_target = null;	try {	    LookupState  ls = new LookupState(u);	    LookupResult lr = new LookupResult(rr_root);	    root.lookup(ls, lr);	    r_target = lr.getTarget();	} catch (Exception ex) {	    r_target = null;	}	if (r_target != null) {	  try {	    Resource target = r_target.lock();	    if (! (target instanceof PutListResource) )	      r_target = null;	    else	      list = r_target;	  } catch (InvalidResourceException ex) {	    // continue	  } finally {	    r_target.unlock();	  }	}	return r_target;    }    /**     * Get our companion PutListResource's URL.     * @return The URL encoded as a String, or <strong>null</strong> if     * undefined.     */    public String getPutListURL() {	return getString(ATTR_PUTLIST, null);    }    /**     * Catch PUTLIST assignments.     * @param idx The attribute being updated.     * @param value It's new value.     */    public void setValue(int idx, Object value) {	super.setValue(idx, value);	if ( idx == ATTR_PUTLIST ) {	    synchronized(this) {		list = null;	    }	}    }    /**     * Nothing done in the ingoingFilter.     * We wait until the outgoigFilter.     * @param request The request that is about to be processsed.     */    public ReplyInterface ingoingFilter(RequestInterface req) {	Request request = (Request) req;	String expect = request.getExpect();	if (expect != null) {	    if (expect.startsWith("100")) { // expect 100?		Client client = request.getClient();		if (client != null) {		    try {			client.sendContinue();		    } catch (java.io.IOException ex) {		    }		}	    }	}	//register request, but this must be confirmed.	if ( request.getMethod().equals("DELETE") &&	     (request.getTargetResource() != null) ) {	    boolean done = false;	    synchronized (this) {		ResourceReference rr = resolvePutListResource();		PutListResource   l  = null;		if (rr != null) {		    try {			l = (PutListResource) rr.lock();			if ( l != null ) {			    l.registerDeleteRequest(request);			    done = true;			}		    } catch (InvalidResourceException ex) {			done = false;		    } finally {			rr.unlock();		    }		}	    }	    if (! done) {		httpd s = (httpd) getServer();		s.errlog(getClass().getName()+			 ": unable to resolve companion PutListResource at "+			 getPutListURL());	    }	}	return null;    }    protected HtmlGenerator getHtmlGenerator(String title) {	HtmlGenerator g = new HtmlGenerator(title);	g.addStyle("BODY {color: black; background: white; "+		   "font-family: serif; margin-top: 35px }\n");	return g;    }    /**     * Catch successfull PUTs, and keep track of them.     * @param request The original request.     * @param reply The original reply.     * @return Always <strong>null</strong>.     */    public ReplyInterface outgoingFilter(RequestInterface req, 					 ReplyInterface rep)     {        Request request = (Request) req;	Reply   reply   = (Reply) rep;	int     status  = PutListResource.FILE_UC;	boolean put     = false;	// Is this a successfull PUT request ?	if (((put = request.getMethod().equals("PUT")) ||	     request.getMethod().equals("DELETE"))	    && ((reply.getStatus()/100) == 2)) {	    // Cool, keep track of the modified file:	    ResourceReference rr   = null;	    PutListResource   l    = null;	    boolean           done = false;	    synchronized (this) {		rr = resolvePutListResource();		if (rr != null) {		    try {			l = (PutListResource) rr.lock();			if ( l != null ) {			    if (put)				status = l.registerRequest(request);			    else				status = l.confirmDelete(request);			    done = true;			}		    } catch (InvalidResourceException ex) {			done = false;		    } finally {			rr.unlock();		    }		}	    }	    // Make sure we did something:	    if ( !done ) {		httpd s = (httpd) getServer();		s.errlog(getClass().getName()+			 ": unable to resolve companion PutListResource at "+			 getPutListURL());	    } 	    	    switch (status) {	    case PutListResource.FILE_UC:	    case PutListResource.FILE_PB:	    case PutListResource.FILE_DEL:		return null;	    case PutListResource.FILE_MG:		Reply   msg = request.makeReply(HTTP.CONFLICT);		HtmlGenerator g = getHtmlGenerator("Warning");		g.append ("<H1>Warning</H1> The file on publish space has "+			  "been modified directly but attempting to merge "+			  "has succeed.<p>"+			  "You should update the file before editing "+			  "it again.");		msg.setStream(g);		return msg;	    case PutListResource.FILE_CF:		Reply error = request.makeReply(HTTP.CONFLICT);		HtmlGenerator gerr = getHtmlGenerator("Warning");		gerr.append ("<H1>Warning</H1> The file on publish space has "+			     "been modified directly and attempting to merge"+			     " has failed.<p>"+			     "Ask your system administrator.");		error.setStream(gerr);		return error;	    default:		return null;	    }	}	return null;    }    public void initialize(Object values[]) {	super.initialize(values);    }}

⌨️ 快捷键说明

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