autolookupdirectory.java

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

JAVA
193
字号
// AutoLookupDirectory.java// $Id: AutoLookupDirectory.java,v 1.11 2000/08/16 21:37:33 ylafon Exp $// (c) COPYRIGHT MIT and INRIA, 1996.// Please first read the full copyright statement in file COPYRIGHT.htmlpackage org.w3c.jigedit.resources ;import java.io.File;import org.w3c.cvs.CVS;import org.w3c.cvs.CvsDirectory;import org.w3c.cvs.CvsException;import org.w3c.tools.resources.Attribute;import org.w3c.tools.resources.AttributeHolder;import org.w3c.tools.resources.AttributeRegistry;import org.w3c.tools.resources.BooleanAttribute;import org.w3c.tools.resources.LookupResult;import org.w3c.tools.resources.LookupState;import org.w3c.tools.resources.ProtocolException;import org.w3c.tools.resources.Resource;import org.w3c.tools.resources.ResourceReference;import org.w3c.tools.resources.ServerInterface;import org.w3c.www.http.HttpRequestMessage;import org.w3c.jigsaw.http.Request;import org.w3c.jigedit.cvs.CvsModule;import org.w3c.jigedit.cvs.CvsRootDirectory;/** * A special version of DirectoryResource that can fetch a file * from CVS directly if it is not already here. * It can alos do an automatic update, depending on a flag */public class AutoLookupDirectory extends CvsRootDirectory {    private CvsDirectory cvs = null ;    /**     * Attribute index, tell if we must update the resource everytime it is     * acceded (not recommended as it generates many cvs commands)     */    private static int ATTR_AUTOUPDATE = -1;    /**     * Attribute index, tell if we must add into cvs new puted directories.     */    private static int ATTR_EXTENSIBLE = -1;    static {	Attribute   a = null ;	Class     cls = null;	try {	    cls = 	      Class.forName("org.w3c.jigedit.resources.AutoLookupDirectory") ;	} catch (Exception ex) {	    ex.printStackTrace() ;	    System.exit(1) ;	}	// The browsable flag:	a = new BooleanAttribute("autoupdate",				 Boolean.FALSE,				 Attribute.EDITABLE) ;	ATTR_AUTOUPDATE = AttributeRegistry.registerAttribute(cls, a) ;        // The browsable flag:	a = new BooleanAttribute("cvs-extensible",				 Boolean.FALSE,				 Attribute.EDITABLE) ;	ATTR_EXTENSIBLE = AttributeRegistry.registerAttribute(cls, a) ;    }    /**     * Get the appropriate CVS manager for the directory we handle.     * @return A CvsDirectory instance.     * @exception CvsException If we couldn't get the manager.     */    protected synchronized CvsDirectory getCvsManager() 	throws CvsException    {	if ( cvs == null ) {	    cvs = CvsModule.getCvsManager(getDirectory(),					  getContext(),					  getServer().getProperties());	}	return cvs;    }	        /**     * tell if we must always do an update.     */    public boolean isAutoUpdatable() {	return getBoolean(ATTR_AUTOUPDATE, false);    }    /**     * tell if we must add in cvs the new puted documents.     */    public boolean isCvsExtensible() {	return getBoolean(ATTR_EXTENSIBLE, false);    }    /**     * Create a DirectoryResource and the physical directory too.     * Add the new directory in the CVS repository.     * @param name the name of the resource.     * @return A ResourceReference instance.     */    public ResourceReference createDirectoryResource(String name) {	ResourceReference newdir = super.createDirectoryResource(name);	if ((newdir != null) && isCvsExtensible()) {	    String names[] = new String[1];	    names[0] = name;	    try {		getCvsManager().add(names);	    } catch (CvsException ex) {		getServer().errlog(this, ex.getMessage());	    }	}	return newdir;    }    /**     * Lookup the next component of this lookup state in here.     * @param ls The current lookup state.     * @param lr The lookup result under construction.     * @exception ProtocolException If an error occurs.     * @return A boolean, <strong>true</strong> if lookup has completed,      * <strong>false</strong> if it should be continued by the caller.     */    public boolean lookup(LookupState ls, LookupResult lr) 	throws ProtocolException    {	Request request = (Request) ls.getRequest();	if ((request != null) && (request.getMethod().equals("PUT"))) {	    if ( ls.hasMoreComponents() ) {		String name = null;		try {		    name = ls.peekNextComponent();		    File dir = new File(getDirectory(), name);		    if (dir.isDirectory()) {			CvsDirectory cvs = getCvsManager();			if (cvs.getDirectoryStatus(name, false) == CVS.DIR_Q) {			    String names[] = { name };			    cvs.add(names);			}		    }		} catch (CvsException ex) {		    String msg = "cvs add \""+name+"\" failed.";		    getServer().errlog(this, msg);		}	    }	}	return super.lookup(ls,lr);    }    /**     * Lookup the resource having the given name in this directory.     * if the resource is not present, it will try to fetch it from     * the Cvs repository.     * @param name The name of the resource.     * @return A ResourceReference instance, or <strong>null</strong>.     */    public ResourceReference lookup(String name) {	ResourceReference rr = super.lookup(name);	if (rr == null) {	    // This may be an unchecked out directory:	    try {		CvsDirectory cvs = getCvsManager();		if ( cvs.getDirectoryStatus(name) == CVS.DIR_NCO )		    cvs.updateDirectory(name);	    } catch (CvsException ex) {		String msg = "cvs update -d \""+name+"\" failed.";		getServer().errlog(this, msg);		return null;	    }	    // Checking out the directory succeeded, retry lookup:	    return super.lookup(name);	} else {	    return rr;	}    }}

⌨️ 快捷键说明

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