resourceframe.java
来自「很棒的web服务器源代码」· Java 代码 · 共 349 行
JAVA
349 行
// ResourceFrame.java// $Id: ResourceFrame.java,v 1.18 2002/06/26 17:27:43 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.util.Hashtable;import org.w3c.tools.resources.event.AttributeChangedEvent;import org.w3c.tools.resources.event.AttributeChangedListener;import org.w3c.tools.resources.event.Events;import org.w3c.tools.resources.event.FrameEvent;import org.w3c.tools.resources.event.FrameEventListener;import org.w3c.tools.resources.event.ResourceEvent;import org.w3c.tools.resources.event.ResourceEventMulticaster;/** * The resource frame class. A ResourceFrame can be attached to a * resource. */public class ResourceFrame extends FramedResource implements AttributeChangedListener{ /** * The special class of filter. */ protected static Class filterClass = null; /** * Our FrameEventListener. */ protected transient FrameEventListener frameListener = null; /** * Our target resource. */ protected FramedResource resource = null; static { try { filterClass = Class.forName("org.w3c.tools.resources.ResourceFilter"); } catch (Exception ex) { throw new RuntimeException("No ResourceFilter class found."); } } protected boolean eventDisabled() { if (resource != null) return (event_disabled || resource.eventDisabled()); return event_disabled; } /** * Get the file part of the URL this resource is attached to. * @return An URL object specifying the location in the information * space of this resource. */ public String getURLPath() { return getString(ATTR_URL, getResource().getURLPath()) ; } /** * Get the space entry for that resource. This Object is use to * retrieve the resource in the resource space. * A ResourceFrame has no SpaceEntry. * @return always null. */ protected SpaceEntry getSpaceEntry() { return null; } private ResourceReference self = null; /** * Get The FrameReference of this frame, or <strong>null</strong> * if this frame is not registered. * @return A ResourceReference instance. */ public ResourceReference getFrameReference() { if ((self == null) && (resource != null)) { self = resource.getFrameReference(this); } return self; } public ResourceReference getResourceReference() { return getFrameReference(); } /** * If our target resource has some children, we could have * some attribute to give to them. * @param attrs A Hashtable. */ protected void updateDefaultChildAttributes(Hashtable attrs) { //nothing here } /** * Check if this kind of request can be perform by this resource. * @param request A RequestInterface instance * @return a boolean. */ public boolean checkRequest(RequestInterface request) { return true; } /** * Perform the request * @param request the incomming request * @exception ProtocolException If an error relative to the protocol occurs * @exception ResourceException If an error not relative to the * protocol occurs */ public ReplyInterface perform(RequestInterface request) throws ProtocolException, ResourceException { return super.perform(request); } /** * lookup only filters. * @exception ProtocolException If an error relative to the protocol occurs */ protected boolean lookupFilters(LookupState ls, LookupResult lr) throws ProtocolException { ResourceFilter filters[] = getFilters(); if ( filters != null ) { // Mark filters, for them to be called at outgoing time: lr.addFilters(filters); // Some clever filter around ? for (int i = 0 ; i < filters.length ; i++) { if ( filters[i] == null ) continue; if ( filters[i].lookup(ls, lr) ) return true; } } return false; } /** * lookup frames excluding filters. * @exception ProtocolException If an error relative to the protocol occurs */ protected boolean lookupFrames(LookupState ls, LookupResult lr) throws ProtocolException { ResourceFrame frames[] = getFrames(); if (frames != null) { for (int i = 0 ; i < frames.length ; i++) { if ((frames[i] == null) || (frames[i] instanceof ResourceFilter)) continue; if (frames[i].lookup(ls,lr)) return true; } } return false; } /** * Lookup the target resource. * @param ls The current lookup state * @param lr The result * @exception ProtocolException If an error relative to the protocol occurs */ public boolean lookup(LookupState ls, LookupResult lr) throws ProtocolException { if (lookupFrames(ls,lr)) return true; if ( ls.hasMoreComponents() ) { // We are not a container resource, and we don't have children: lr.setTarget(null); return false; } else { // We are done ! lr.setTarget(resource.getResourceReference()); return true; } } public void processEvent(ResourceEvent evt) { if (evt instanceof FrameEvent) { fireFrameEvent((FrameEvent)evt); } else if (evt instanceof AttributeChangedEvent) { fireAttributeChangeEvent((AttributeChangedEvent)evt); } } /** * Add a frame event listener. * @param l The new frame event listener. */ public void addFrameEventListener(FrameEventListener l) { frameListener = ResourceEventMulticaster.add(frameListener, l); } /** * Remove a frame event listener. * @param l The listener to remove. */ public void removeFrameEventListener (FrameEventListener l) { frameListener = ResourceEventMulticaster.remove(frameListener, l); } /** * Post a frameEvent. * @param the frame event type. */ protected void postFrameEvent(int type) { if (frameListener != null) { FrameEvent evt = new FrameEvent(this, type); postEvent(evt); } } /** * Fire a frameEvent. * @param the frame event type. */ protected void fireFrameEvent(FrameEvent evt) { if (frameListener != null) { int type = evt.getID(); switch (type) { case Events.FRAME_ADDED : frameListener.frameAdded(evt); break; case Events.FRAME_MODIFIED : frameListener.frameModified(evt); break; case Events.FRAME_REMOVED : frameListener.frameRemoved(evt); break; } } } /** * Listen its resource. */ public void attributeChanged(AttributeChangedEvent evt) { if (debugEvent) displayEvent( this, evt ); if (! isUnloaded()) setValue(ATTR_LAST_MODIFIED, new Long(System.currentTimeMillis())); } /** * This handles the <code>FRAME_MODIFIED</code> kind of events. * @param evt The event describing the change. */ public void frameModified(FrameEvent evt) { if (debugEvent) displayEvent( this, evt ); if (! isUnloaded()) { markModified(); postFrameEvent(evt.getID()); } } /** * We overide setValue, to fire event. * @param idx The index of the attribute to modify. * @param value The new attribute value. */ public synchronized void setValue(int idx, Object value) { super.setValue(idx,value); if (idx != ATTR_LAST_MODIFIED) postFrameEvent(Events.FRAME_MODIFIED); } /** * Get the target resource. * @return a resource instance. */ public FramedResource getResource() { return resource; } /** * Register a target resource. Called after initialize, * set the context. getServer() can be call only after * this method call. * @parame resource The resource to register. */ public void registerResource(FramedResource resource) { this.resource = resource; postFrameEvent(Events.FRAME_ADDED); setValue(ATTR_CONTEXT, resource.getContext()); } /** * Register a target resource. * @parame resource The resource to register. */ public void unregisterResource(Resource resource) { //FIXME (can we have more than one resource? ) this.resource = null; postFrameEvent(Events.FRAME_REMOVED); } // // Filtered part // /** * Get our whole list of filters. */ public synchronized ResourceFilter[] getFilters() { ResourceFrame frames[] = collectFrames(filterClass); if ( frames != null ) { // FIXME Normally a simple cast should suffice (?) ResourceFilter f[] = new ResourceFilter[frames.length]; for (int i = 0 ; i < frames.length ; i++) f[i] = (ResourceFilter) frames[i]; return f; } return null; } /** * Get the list of filters of this class. * @param cls The class of filters requested. * @return An array of filters, which are instances of the given class. */ public synchronized ResourceFilter[] getFilters(Class cls) { ResourceFrame frames[] = collectFrames(cls); if ( frames != null ) { // FIXME Normally a simple cast should suffice (?) ResourceFilter f[] = new ResourceFilter[frames.length]; for (int i = 0 ; i < frames.length ; i++) f[i] = (ResourceFilter) frames[i]; return f; } return null; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?