passdirectory.java

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

JAVA
126
字号
// PassDirectory.java// $Id: PassDirectory.java,v 1.3 2000/08/16 21:37:53 ylafon Exp $// (c) COPYRIGHT MIT and INRIA, 1996.// Please first read the full copyright statement in file COPYRIGHT.htmlpackage org.w3c.tools.resources ;import java.io.File;/** * A directory resource able to pass (jump) into some non-related directory. * This resource provides something similar to the PASSS rule of the CERN * server: it allows you to export a directory that is not strictly under  * the server physicall space (e.g. none of its parent directory is the server * space directory). * <p>Using this resource means that your exported space is no more * restrained to the server space directory, which can be considered as  * a security problem. */public class PassDirectory extends DirectoryResource {    /**     * Attribute index - The target physicall directory of this resource.     */    protected static int ATTR_PASSTARGET = -1 ;    static {	Attribute a   = null ;	Class     cls = null ;	// Get a pointer to our class.	try {	    cls = Class.forName("org.w3c.tools.resources.PassDirectory") ;	} catch (Exception ex) {	    ex.printStackTrace() ;	    System.exit(1) ;	}	// The directory attribute.	a = new FileAttribute("pass-target"			      , null			      , Attribute.EDITABLE);	ATTR_PASSTARGET = AttributeRegistry.registerAttribute(cls, a) ;    }    /**     * Catch side-effects on pass-target, to absolutize it.     * @param idx The attribute to set.     * @param value The new value.     */    public void setValue(int idx, Object value) {	if ( (idx == ATTR_IDENTIFIER) || (idx == ATTR_PASSTARGET)) {	    try {		deleteChildren();	    } catch (MultipleLockException ex) {		//nothing to do	    }	}	super.setValue(idx, value);	if ( idx == ATTR_IDENTIFIER ) {	    ResourceReference rr = getParent();	    if (rr != null) {		try {		    Resource parent = rr.lock();		    if (parent.definesAttribute("directory")) {			File pdir = (File) parent.getValue("directory", null);			if ( pdir != null ) {			    // Compute and set our directory attribute:			    File dir = new File(pdir, getIdentifier()) ;			    super.setValue(ATTR_DIRECTORY, dir) ;			}		    }		} catch (InvalidResourceException ex) {	  		} finally {		    rr.unlock();		}	    }	    values[ATTR_PASSTARGET] = null;	    values[ATTR_DIRSTAMP]   = new Long(-1);	} else if ( idx == ATTR_PASSTARGET ) {	    File file = (File) value;	    if ( ! file.isAbsolute() ) {		// Make it absolute, relative to the server space.		File abs = new File(getServer().getRootDirectory()				    , file.toString());		values[ATTR_PASSTARGET] = abs;		values[ATTR_DIRECTORY]  = abs;	    } else {		values[ATTR_PASSTARGET] = value;		values[ATTR_DIRECTORY]  = value;	    }	    values[ATTR_DIRSTAMP] = new Long(-1);	}    }    /**     * The getDirectory method now returns the pass-directory.     * @return The pass target location.     */    public File getDirectory() {	File dir = (File) getValue(ATTR_PASSTARGET, null) ;	if (dir == null)	    dir = super.getDirectory();	return dir;    }    /**     * Make the directory attribute default to the target location.     * This is required for classes that rely on the directory attribute to     * compute their own attributes.     * @param values The values we should initialized from.     */    public void initialize(Object values[]) {	super.initialize(values);	disableEvent();	File target = getDirectory();	if ( target != null ) 	    setValue(ATTR_DIRECTORY, target);	enableEvent();    }}

⌨️ 快捷键说明

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