Further cleanup in TypeManager.

Zip files are now very close to work just like unzipped files: They can add to existing
type.properties, and the files they contain are removed from Prototypes when
the zip files are removed.
This commit is contained in:
hns 2002-10-01 15:56:28 +00:00
parent 2ce2f6fd0c
commit 67c03ca7ae
2 changed files with 46 additions and 54 deletions

View file

@ -61,17 +61,12 @@ public final class TypeManager {
*/
public void createPrototypes () {
// create standard prototypes.
registerPrototype ("root", new File (appDir, "root"),
new Prototype ("root", app));
registerPrototype ("user", new File (appDir, "user"),
new Prototype ("user", app));
// hopobject prototype is special in that we keep a reference
// to it, since we need it regularly when setting parent prototypes.
hopobjectProto = new Prototype ("hopobject", app);
registerPrototype ("hopobject", new File (appDir, "hopobject"), hopobjectProto);
// same with global prototype
globalProto = new Prototype ("global", app);
registerPrototype ("global", new File (appDir, "global"), globalProto);
createPrototype ("root");
createPrototype ("user");
// get references to hopobject and global protos,
// since we need it regularly when setting parent prototypes.
hopobjectProto = createPrototype ("hopobject");
globalProto = createPrototype ("global");
// loop through directories and create prototypes
checkFiles ();
}
@ -122,8 +117,7 @@ public final class TypeManager {
File f = new File (appDir, list[i]);
if (f.isDirectory ()) {
// create new prototype
proto = new Prototype (list[i], app);
registerPrototype (list[i], f, proto);
createPrototype (list[i], f);
}
}
}
@ -159,6 +153,17 @@ public final class TypeManager {
}
protected void removeZipFile (String zipname) {
zipfiles.remove (zipname);
for (Iterator i=prototypes.values().iterator(); i.hasNext(); ) {
Prototype proto = (Prototype) i.next ();
// update prototype's type mapping
DbMapping dbmap = proto.getDbMapping ();
SystemProperties props = dbmap.getProperties();
props.removeProps (zipname);
}
}
private boolean isValidTypeName (String str) {
if (str == null)
@ -183,33 +188,26 @@ public final class TypeManager {
* caller (e.g. ZippedAppFile).
*/
public Prototype createPrototype (String typename) {
Prototype p = getPrototype (typename);
if (p == null) {
p = new Prototype (typename, app);
prototypes.put (typename, p);
}
return p;
return createPrototype (typename, new File (appDir, typename));
}
/**
* Create a prototype from a directory containing scripts and other stuff
*/
public void registerPrototype (String name, File dir, Prototype proto) {
// System.err.println ("REGISTER PROTO: "+app.getName()+"/"+name);
// app.logEvent ("registering prototype "+name);
// Create and register type properties file
File propfile = new File (dir, "type.properties");
SystemProperties props = new SystemProperties (propfile.getAbsolutePath ());
DbMapping dbmap = new DbMapping (app, name, props);
// we don't need to put the DbMapping into proto.updatables, because
// dbmappings are checked separately in checkFiles for each request
// proto.updatables.put ("type.properties", dbmap);
proto.setDbMapping (dbmap);
// put the prototype into our map
prototypes.put (name, proto);
public Prototype createPrototype (String typename, File dir) {
Prototype proto = new Prototype (typename, app);
// Create and register type properties file
File propfile = new File (dir, "type.properties");
SystemProperties props = new SystemProperties (propfile.getAbsolutePath ());
DbMapping dbmap = new DbMapping (app, typename, props);
// we don't need to put the DbMapping into proto.updatables, because
// dbmappings are checked separately in checkFiles for each request
// proto.updatables.put ("type.properties", dbmap);
proto.setDbMapping (dbmap);
// put the prototype into our map
prototypes.put (typename, proto);
return proto;
}

View file

@ -22,6 +22,7 @@ public class ZippedAppFile implements Updatable {
Application app;
File file;
long lastmod;
Set updatables;
public ZippedAppFile (File file, Application app) {
@ -55,6 +56,7 @@ public class ZippedAppFile implements Updatable {
lastmod = file.lastModified ();
// System.err.println ("UPDATING ZIP FILE "+this);
zip = new ZipFile (file);
updatables = new HashSet ();
for (Enumeration en = zip.entries (); en.hasMoreElements (); ) {
ZipEntry entry = (ZipEntry) en.nextElement ();
String ename = entry.getName ();
@ -74,6 +76,7 @@ public class ZippedAppFile implements Updatable {
// System.err.println ("["+content+"]");
ActionFile act = new ActionFile (content, name, proto);
proto.actions.put (name, act);
updatables.add (act);
// mark prototype as updated
proto.markUpdated ();
}
@ -83,6 +86,7 @@ public class ZippedAppFile implements Updatable {
// System.err.println ("["+content+"]");
Template tmp = new Template (content, name, proto);
proto.templates.put (name, tmp);
updatables.add (tmp);
// mark prototype as updated
proto.markUpdated ();
}
@ -92,6 +96,7 @@ public class ZippedAppFile implements Updatable {
// System.err.println ("["+content+"]");
SkinFile skin = new SkinFile (content, name, proto);
proto.skins.put (name, skin);
updatables.add (skin);
}
else if (fname.endsWith (".js")) {
String name = fname.substring (0, fname.lastIndexOf ("."));
@ -99,35 +104,20 @@ public class ZippedAppFile implements Updatable {
// System.err.println ("["+content+"]");
FunctionFile ff = new FunctionFile (content, name, proto);
proto.functions.put (name, ff);
updatables.add (ff);
// mark prototype as updated
proto.markUpdated ();
}
else if ("type.properties".equalsIgnoreCase (fname)) {
String name = fname.substring (0, fname.lastIndexOf ("."));
DbMapping dbmap = proto.getDbMapping ();
if (dbmap == null) {
SystemProperties props = new SystemProperties (zip.getInputStream (entry));
dbmap = new DbMapping (app, proto.getName (), props);
proto.setDbMapping (dbmap);
} else {
// FIXME: provide a way to let zip files add to
// type.properties files of existing prototypes.
// SystemProperties props = dbmap.getProperties ();
// props.add (zip.getInputStream (entry));
}
SystemProperties props = dbmap.getProperties ();
props.addProps (file.getName(), zip.getInputStream (entry));
// mark prototype as updated
proto.markUpdated ();
}
}
}
for (Iterator it = newPrototypes.iterator (); it.hasNext (); ) {
Prototype proto = (Prototype) it.next ();
if (proto.getDbMapping() == null) {
// DbMapping doesn't exist, we still need to create one
SystemProperties props = new SystemProperties ();
proto.setDbMapping (new DbMapping (app, proto.getName (), props));
}
}
} catch (Throwable x) {
System.err.println ("Error updating ZipFile: "+x);
} finally {
@ -139,8 +129,12 @@ public class ZippedAppFile implements Updatable {
}
void remove () {
app.typemgr.zipfiles.remove (file.getName());
public void remove () {
if (updatables != null) {
for (Iterator it = updatables.iterator(); it.hasNext(); )
((Updatable) it.next()).remove ();
}
app.typemgr.removeZipFile (file.getName());
// System.err.println ("REMOVING ZIP FILE "+this);
}