- From: bpm <bpm@terraweb.com>
- Date: Mon, 11 Nov 1996 13:24:31 -0600
- To: www-jigsaw@w3.org
Yep, my mind has turned to a large mushy melon! I'm working on
creating a CGIDirectoryResource and a PassCGIDirectory that will work
as the equivalent of NCSA ScriptAlias directive. So far, it is going
well. I have created a CGIDirectoryResource which extends the
DirectoryResource. I rewrote/shadowed the createDefaultResource
method to create a new CGIDirectoryResource or a new CgiResource. It
works just great! I can create the PassCGIDirectory and have it point
to my old cgi-bin directory and all of the CGIs are usable.
So you ask "What's the problem?". The current way is that in
DirectoryResource there is a method 'createDefaultResource'. In it,
indexer.createResource is invoked. indexer.createResource checks to
see if the new file is a directory or a file. If it is a directory,
then createDirectoryResource is called. If it is a file, then
createFileResource is called. createFileResource creates a new
resource by matching the filename extension with existing defined
extensions. (Shouldn't that be a hash lookup instead of a for loop?)
When it matches, it gets a template of the resource matching the
extension and clones the template into a nice resource.
Well the manor that I am creating the CGIResource is a lobotamized
version of the createFileResource method which creates a new file
resource based on the extension of the file. I have added a "cgi"
extension that is a template for the CgiResource. If the "cgi"
extension does not exist, then I get a null returned (Duhh). I want
to be able to create a new CgiResource, but I can not find the
constructor for the CgiResource class. Is the compiler creating one
by default? Should I be doing this some other way? I just KNOW that
the way that I am doing it is not the best way. Below is the code
that I wrote.
Any help will be gratefully accepted.
----
// CGIDirectoryResource.java
package w3c.jigsaw.resources ;
import java.io.* ;
import java.util.* ;
import w3c.tools.sorter.*;
import w3c.jigsaw.http.* ;
import w3c.jigsaw.indexer.* ;
import w3c.jigsaw.html.* ;
import w3c.jigsaw.resources.* ;
import w3c.www.http.*;
/**
* A simple, and reasonably efficient CGI directory resource.
* This directory resource embeds its own resource store object to keep
* track of its next children (wich might themselves be CGIDirectoryResource). It
* is reasonably efficient in the sense that it won't overload the memory with
* unused informations. However, stay tuned for a <em>really</em> efficient
* file based directory resource (tuned to serve only files).
*/
public class CGIDirectoryResource extends DirectoryResource
{
/**
* Return the class (if any) that our store defines for given extension.
* @param ext The extension we want a class for.
* @return A Class instance, or <strong>null</strong>.
*/
protected HTTPResource getTemplateFor(String ext) {
// Try building a default resource for it:
ResourceIndexer indexer = getServer().getIndexer() ;
HTTPResource template = indexer.loadExtension(ext) ;
if ( template != null ) {
HTTPResource check = new HTTPResource();
if (template.getClass() == check.getClass())
template = null;
}
return template;
}
/**
* Merge the attributes this extension defines, with the provided ones.
* @param attrs The attributes we want to fill with default values.
* @param ext The extension name.
* @param into The already built set of default values.
* @return A Hashtable, containing the augmented set of default attribute
* values.
*/
protected Hashtable mergeDefaultAttributes(HTTPResource template
, String ext
, Hashtable into) {
// Try building a default resource for it:
ResourceIndexer indexer = getServer().getIndexer() ;
Attribute attrs[] = template.getAttributes();
HTTPResource e = indexer.loadExtension(ext) ;
if ( e != null ) {
for (int i = 0 ; i < attrs.length ; i++) {
if ( ! template.definesAttribute(i) ) {
int idx = e.lookupAttribute(attrs[i].getName());
if ( idx >= 0 ) {
Object value = e.getValue(idx, null);
if ( value != null )
into.put(attrs[i].getName(), value) ;
}
}
}
}
return into ;
}
/**
* Create a default CGI file resource for this file (that exists).
* @param directory The directory of the file.
* @param name The name of the file.
* @param defs A set of default attribute values.
* @return An instance of HTTPResource, or <strong>null</strong> if
* we were unable to create it.
*/
protected HTTPResource createCGIFileResource(File directory
, String name
, Hashtable defs) {
File file = new File(directory, name) ;
HTTPResource template = null;
String file_type = "cgi";
template = getTemplateFor(file_type);
if ( template == null )
return null ;
// Create the runtime-time default values for attributes.
if ( defs == null )
defs = new Hashtable(5) ;
defs.put("directory", directory) ;
defs.put("identifier", name) ;
// Merge with values defined by the extension:
defs = mergeDefaultAttributes(template, file_type, defs) ;
// Create, initialize and return the new resouce
try {
return (HTTPResource) template.getClone(defs);
} catch (Exception ex) {
ex.printStackTrace() ;
return null ;
}
}
/**
* Try creating a default resource having the given name.
* This method will make its best effort to create a default resource
* having this name in the directory. If a file with this name exists,
* it will check the pre-defined admin extensions and look for a match.
* If a directory with this name exists, and admin allows to do so, it
* will create a sub-directory resource.
* @param name The name of the resource to try to create.
* @return A Resource instance, if possible, <strong>null</strong>
* otherwise.
*/
public synchronized HTTPResource createDefaultResource(String name) {
HTTPResource resource;
// Don't automagically create resources of name '..' or '.'
if (name.equals("..") || name.equals("."))
return null ;
// Try building a default resource for it:
ResourceIndexer indexer = getServer().getIndexer() ;
// Is there a file with such a name ?
File file = new File(getDirectory(), name) ;
if ( ! file.exists() )
return null ;
// If the file system is not case sensitive, emulate it :-(
if ( getServer().checkFileSystemSensitivity() ) {
File directory = getDirectory();
if ( directory == null )
return null;
String files[] = directory.list();
boolean found = false;
for (int i = 0 ; i < files.length ; i++) {
if (found = files[i].equals(name))
break;
}
if ( ! found )
return null;
}
// Prepare a set of default parameters for the resource:
acquireChildren() ;
Hashtable defs = new Hashtable(10) ;
defs.put("parent", this);
defs.put("resource-store", children) ;
defs.put("server", getServer()) ;
defs.put("url", getURL() + name);
// Okay, dispatch on wether it is a file or a directory.
if ( file.isDirectory() )
resource = indexer.createResource(getDirectory(), name, defs) ;
else
resource = createCGIFileResource(getDirectory(), name, defs) ;
if ( resource != null ) {
// Register this child in our store:
children.addResource(resource) ;
// Update or create any relevant negotiable resource:
if ( getNegotiableFlag() )
updateNegotiableResource(name) ;
markModified() ;
}
return resource ;
}
}
--
---
Brian Millett
Technology Applications Inc. "Heaven can not exist,
(314) 530-1981 If the family is not eternal"
bpm@techapp.com F. Ballard Washburn
Received on Monday, 11 November 1996 14:22:56 UTC