- switched logging ot application where possible
- implemented new _parent spec, including virtual nodes - removed some rarely-used property settings for apps and db directory
This commit is contained in:
parent
9e05814d90
commit
7904cf2bca
10 changed files with 114 additions and 134 deletions
|
@ -25,8 +25,8 @@ public class DbMapping {
|
||||||
DbSource source;
|
DbSource source;
|
||||||
String table;
|
String table;
|
||||||
|
|
||||||
String[] parent; // list of properties to try for parent
|
ParentInfo[] parent; // list of properties to try for parent
|
||||||
Boolean[] anonymous; // are parent relations anonymous or not?
|
|
||||||
DbMapping subnodes;
|
DbMapping subnodes;
|
||||||
DbMapping properties;
|
DbMapping properties;
|
||||||
private Relation subnodesRel;
|
private Relation subnodesRel;
|
||||||
|
@ -110,6 +110,16 @@ public class DbMapping {
|
||||||
|
|
||||||
nameField = props.getProperty ("_name");
|
nameField = props.getProperty ("_name");
|
||||||
|
|
||||||
|
String parentMapping = props.getProperty ("_parent");
|
||||||
|
if (parentMapping != null) {
|
||||||
|
// comma-separated list of properties to be used as parent
|
||||||
|
StringTokenizer st = new StringTokenizer (parentMapping, ",;");
|
||||||
|
parent = new ParentInfo[st.countTokens()];
|
||||||
|
for (int i=0; i<parent.length; i++)
|
||||||
|
parent[i] = new ParentInfo (st.nextToken().trim());
|
||||||
|
} else
|
||||||
|
parent = null;
|
||||||
|
|
||||||
lastTypeChange = lastmod;
|
lastTypeChange = lastmod;
|
||||||
// set the cached schema & keydef to null so it's rebuilt the next time around
|
// set the cached schema & keydef to null so it's rebuilt the next time around
|
||||||
schema = null;
|
schema = null;
|
||||||
|
@ -124,7 +134,7 @@ public class DbMapping {
|
||||||
public synchronized void rewire () {
|
public synchronized void rewire () {
|
||||||
|
|
||||||
// if (table != null && source != null) {
|
// if (table != null && source != null) {
|
||||||
// IServer.getLogger().log ("set data source for "+typename+" to "+source);
|
// app.logEvent ("set data source for "+typename+" to "+source);
|
||||||
Hashtable p2d = new Hashtable ();
|
Hashtable p2d = new Hashtable ();
|
||||||
Hashtable d2p = new Hashtable ();
|
Hashtable d2p = new Hashtable ();
|
||||||
|
|
||||||
|
@ -138,36 +148,16 @@ public class DbMapping {
|
||||||
p2d.put (propName, rel);
|
p2d.put (propName, rel);
|
||||||
if (rel.localField != null)
|
if (rel.localField != null)
|
||||||
d2p.put (rel.localField, rel);
|
d2p.put (rel.localField, rel);
|
||||||
// IServer.getLogger().log ("Mapping "+propName+" -> "+dbField);
|
// app.logEvent ("Mapping "+propName+" -> "+dbField);
|
||||||
}
|
}
|
||||||
} catch (Exception x) {
|
} catch (Exception x) {
|
||||||
IServer.getLogger ().log ("Error in type.properties: "+x.getMessage ());
|
app.logEvent ("Error in type.properties: "+x.getMessage ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
prop2db = p2d;
|
prop2db = p2d;
|
||||||
db2prop = d2p;
|
db2prop = d2p;
|
||||||
|
|
||||||
String ano = props.getProperty ("_anonymous");
|
|
||||||
if (ano != null) {
|
|
||||||
// comma-separated list of true/false values
|
|
||||||
StringTokenizer st = new StringTokenizer (ano, ",; ");
|
|
||||||
anonymous = new Boolean[st.countTokens()];
|
|
||||||
for (int i=0; i<anonymous.length; i++)
|
|
||||||
anonymous[i] = "false".equalsIgnoreCase (st.nextToken().trim()) ? Boolean.FALSE : Boolean.TRUE;
|
|
||||||
} else
|
|
||||||
anonymous = null;
|
|
||||||
|
|
||||||
String parentMapping = props.getProperty ("_parent");
|
|
||||||
if (parentMapping != null) {
|
|
||||||
// comma-separated list of properties to be used as parent
|
|
||||||
StringTokenizer st = new StringTokenizer (parentMapping, ",; ");
|
|
||||||
parent = new String[st.countTokens()];
|
|
||||||
for (int i=0; i<parent.length; i++)
|
|
||||||
parent[i] = st.nextToken().trim();
|
|
||||||
} else
|
|
||||||
parent = null;
|
|
||||||
|
|
||||||
String subnodeMapping = props.getProperty ("_subnodes");
|
String subnodeMapping = props.getProperty ("_subnodes");
|
||||||
if (subnodeMapping != null) {
|
if (subnodeMapping != null) {
|
||||||
try {
|
try {
|
||||||
|
@ -177,7 +167,7 @@ public class DbMapping {
|
||||||
else
|
else
|
||||||
subnodes = (DbMapping) app.getDbMapping (subnodeMapping);
|
subnodes = (DbMapping) app.getDbMapping (subnodeMapping);
|
||||||
} catch (Exception x) {
|
} catch (Exception x) {
|
||||||
IServer.getLogger ().log ("Error in type.properties: "+x.getMessage ());
|
app.logEvent ("Error in type.properties: "+x.getMessage ());
|
||||||
subnodesRel = null;
|
subnodesRel = null;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
|
@ -195,13 +185,13 @@ public class DbMapping {
|
||||||
if (propertiesRel.subnodesAreProperties && subnodesRel != null)
|
if (propertiesRel.subnodesAreProperties && subnodesRel != null)
|
||||||
propertiesRel.groupby = subnodesRel.groupby;
|
propertiesRel.groupby = subnodesRel.groupby;
|
||||||
} catch (Exception x) {
|
} catch (Exception x) {
|
||||||
IServer.getLogger ().log ("Error in type.properties: "+x.getMessage ());
|
app.logEvent ("Error in type.properties: "+x.getMessage ());
|
||||||
propertiesRel = null;
|
propertiesRel = null;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
propertiesRel = null;
|
propertiesRel = null;
|
||||||
|
|
||||||
IServer.getLogger().log ("rewiring: "+this);
|
app.logEvent ("rewiring: "+this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -264,13 +254,13 @@ public class DbMapping {
|
||||||
return (Relation) prop2db.get (propName);
|
return (Relation) prop2db.get (propName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized String[] getParentPropNames () {
|
public synchronized ParentInfo[] getParentInfo () {
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized Boolean[] getAnonymous () {
|
/* public synchronized Boolean[] getAnonymous () {
|
||||||
return anonymous;
|
return anonymous;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
public DbMapping getSubnodeMapping () {
|
public DbMapping getSubnodeMapping () {
|
||||||
return subnodes;
|
return subnodes;
|
||||||
|
@ -383,6 +373,7 @@ public class DbMapping {
|
||||||
return lastTypeChange;
|
return lastTypeChange;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ public abstract class IServer {
|
||||||
public static SystemProperties sysProps, dbProps;
|
public static SystemProperties sysProps, dbProps;
|
||||||
public static Hashtable dbSources;
|
public static Hashtable dbSources;
|
||||||
|
|
||||||
protected static String hopHome = null;
|
protected static File hopHome = null;
|
||||||
|
|
||||||
private static Logger logger;
|
private static Logger logger;
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ public abstract class IServer {
|
||||||
return logger;
|
return logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getHopHome () {
|
public static File getHopHome () {
|
||||||
return hopHome;
|
return hopHome;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,15 +24,14 @@ public class ApplicationManager {
|
||||||
|
|
||||||
private Hashtable applications;
|
private Hashtable applications;
|
||||||
private int port;
|
private int port;
|
||||||
private File appHome, dbHome;
|
private File hopHome;
|
||||||
private SystemProperties props;
|
private SystemProperties props;
|
||||||
private Server server;
|
private Server server;
|
||||||
private long lastModified;
|
private long lastModified;
|
||||||
|
|
||||||
public ApplicationManager (int port, File appHome, File dbHome, SystemProperties props, Server server) {
|
public ApplicationManager (int port, File hopHome, SystemProperties props, Server server) {
|
||||||
this.port = port;
|
this.port = port;
|
||||||
this.appHome = appHome;
|
this.hopHome = hopHome;
|
||||||
this.dbHome = dbHome;
|
|
||||||
this.props = props;
|
this.props = props;
|
||||||
this.server = server;
|
this.server = server;
|
||||||
applications = new Hashtable ();
|
applications = new Hashtable ();
|
||||||
|
@ -70,7 +69,7 @@ public class ApplicationManager {
|
||||||
private void start (String appName) {
|
private void start (String appName) {
|
||||||
IServer.getLogger().log ("Building application "+appName);
|
IServer.getLogger().log ("Building application "+appName);
|
||||||
try {
|
try {
|
||||||
Application app = new Application (appName, dbHome, appHome);
|
Application app = new Application (appName, Server.sysProps, hopHome);
|
||||||
applications.put (appName, app);
|
applications.put (appName, app);
|
||||||
// if we're running with the embedded web server, set app base uri to /appname
|
// if we're running with the embedded web server, set app base uri to /appname
|
||||||
if (server.websrv != null)
|
if (server.websrv != null)
|
||||||
|
|
|
@ -24,13 +24,15 @@ public class DbWrapper {
|
||||||
volatile long txncount=0;
|
volatile long txncount=0;
|
||||||
|
|
||||||
private File dbBaseDir;
|
private File dbBaseDir;
|
||||||
|
private NodeManager nmgr;
|
||||||
private String dbHome;
|
private String dbHome;
|
||||||
|
|
||||||
public DbWrapper (String dbHome, String dbFilename, boolean useTx) throws DbException {
|
public DbWrapper (String dbHome, String dbFilename, NodeManager nmgr, boolean useTx) throws DbException {
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
this.dbHome = dbHome;
|
this.dbHome = dbHome;
|
||||||
|
this.nmgr = nmgr;
|
||||||
|
|
||||||
|
try {
|
||||||
dbBaseDir = new File (dbHome);
|
dbBaseDir = new File (dbHome);
|
||||||
if (!dbBaseDir.exists())
|
if (!dbBaseDir.exists())
|
||||||
dbBaseDir.mkdirs();
|
dbBaseDir.mkdirs();
|
||||||
|
@ -71,12 +73,12 @@ public class DbWrapper {
|
||||||
loaded = true;
|
loaded = true;
|
||||||
|
|
||||||
} catch (NoClassDefFoundError noclass) {
|
} catch (NoClassDefFoundError noclass) {
|
||||||
Server.getLogger().log ("Warning: Using internal file based db as fallback.");
|
nmgr.app.logEvent ("Warning: Using internal file based db as fallback.");
|
||||||
Server.getLogger().log ("Reason: "+noclass);
|
nmgr.app.logEvent ("Reason: "+noclass);
|
||||||
loaded = false;
|
loaded = false;
|
||||||
} catch (UnsatisfiedLinkError nolib) {
|
} catch (UnsatisfiedLinkError nolib) {
|
||||||
Server.getLogger().log ("Warning: Using internal file based db as fallback.");
|
nmgr.app.logEvent ("Warning: Using internal file based db as fallback.");
|
||||||
Server.getLogger().log ("Reason: "+nolib);
|
nmgr.app.logEvent ("Reason: "+nolib);
|
||||||
loaded = false;
|
loaded = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +91,7 @@ public class DbWrapper {
|
||||||
// closing the dbenv leads to segfault when app is restarted
|
// closing the dbenv leads to segfault when app is restarted
|
||||||
// dbenv.close (0);
|
// dbenv.close (0);
|
||||||
// dbenv.remove (dbHome, Db.DB_FORCE);
|
// dbenv.remove (dbHome, Db.DB_FORCE);
|
||||||
Server.getLogger ().log ("Closed Berkeley DB");
|
nmgr.app.logEvent ("Closed Berkeley DB");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,7 +128,7 @@ public class DbWrapper {
|
||||||
dbenv.txn_checkpoint (0, 0, 0); // for berkeley 3.0, remove third 0 parameter
|
dbenv.txn_checkpoint (0, 0, 0); // for berkeley 3.0, remove third 0 parameter
|
||||||
txncount = 0;
|
txncount = 0;
|
||||||
lastCheckpoint = now;
|
lastCheckpoint = now;
|
||||||
Server.getLogger().log ("Spent "+(System.currentTimeMillis()-now)+" in checkpoint");
|
nmgr.app.logEvent ("Spent "+(System.currentTimeMillis()-now)+" in checkpoint");
|
||||||
}
|
}
|
||||||
|
|
||||||
public IDGenerator getIDGenerator (DbTxn txn, String kstr) throws Exception {
|
public IDGenerator getIDGenerator (DbTxn txn, String kstr) throws Exception {
|
||||||
|
@ -220,7 +222,7 @@ public class DbWrapper {
|
||||||
value.set_size (vbuf.length);
|
value.set_size (vbuf.length);
|
||||||
|
|
||||||
db.put (txn, key, value, 0);
|
db.put (txn, key, value, 0);
|
||||||
// IServer.getLogger().log ("saved "+obj+", size = "+vbuf.length);
|
// nmgr.app.logEvent ("saved "+obj+", size = "+vbuf.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void deleteFromDB (DbTxn txn, String kstr) throws Exception {
|
private void deleteFromDB (DbTxn txn, String kstr) throws Exception {
|
||||||
|
|
|
@ -325,12 +325,12 @@ public class Node implements INode, Serializable {
|
||||||
if (!current.isActive ())
|
if (!current.isActive ())
|
||||||
throw new helma.framework.TimeoutException ();
|
throw new helma.framework.TimeoutException ();
|
||||||
if (state == INVALID) {
|
if (state == INVALID) {
|
||||||
IServer.getLogger().log ("Got Invalid Node: "+this);
|
nmgr.logEvent ("Got Invalid Node: "+this);
|
||||||
Thread.dumpStack ();
|
Thread.dumpStack ();
|
||||||
throw new ConcurrencyException ("Node "+this+" was invalidated by another thread.");
|
throw new ConcurrencyException ("Node "+this+" was invalidated by another thread.");
|
||||||
}
|
}
|
||||||
if (lock != null && lock != current && lock.isAlive () && lock.isActive ()) {
|
if (lock != null && lock != current && lock.isAlive () && lock.isActive ()) {
|
||||||
IServer.getLogger().log ("Concurrency conflict for "+this+", lock held by "+lock);
|
nmgr.logEvent ("Concurrency conflict for "+this+", lock held by "+lock);
|
||||||
throw new ConcurrencyException ("Tried to modify "+this+" from two threads at the same time.");
|
throw new ConcurrencyException ("Tried to modify "+this+" from two threads at the same time.");
|
||||||
}
|
}
|
||||||
current.visitNode (this);
|
current.visitNode (this);
|
||||||
|
@ -593,19 +593,23 @@ public class Node implements INode, Serializable {
|
||||||
public INode getParent () {
|
public INode getParent () {
|
||||||
|
|
||||||
// check what's specified in the type.properties for this node.
|
// check what's specified in the type.properties for this node.
|
||||||
String[] parentProps = null;
|
ParentInfo[] parentInfo = null;
|
||||||
if (dbmap != null && dbmap.isRelational ())
|
if (dbmap != null && dbmap.isRelational ())
|
||||||
parentProps = dbmap.getParentPropNames ();
|
parentInfo = dbmap.getParentInfo ();
|
||||||
|
|
||||||
// check if current parent candidate matches presciption, if not, try to get it
|
// check if current parent candidate matches presciption, if not, try to get it
|
||||||
if (parentProps != null) {
|
if (parentInfo != null) {
|
||||||
for (int i=0; i<parentProps.length; i++) {
|
for (int i=0; i<parentInfo.length; i++) {
|
||||||
INode pn = getNode (parentProps[i], false);
|
ParentInfo pinfo = parentInfo[i];
|
||||||
|
INode pn = getNode (pinfo.propname, false);
|
||||||
|
if (pinfo.isroot && pn == null)
|
||||||
|
pn = nmgr.getNode ("0", nmgr.getDbMapping ("root"));
|
||||||
if (pn != null) {
|
if (pn != null) {
|
||||||
// see if dbmapping specifies anonymity for this node
|
// see if dbmapping specifies anonymity for this node
|
||||||
Boolean[] ano = dbmap.getAnonymous ();
|
anonymous = !pinfo.named;
|
||||||
if (ano != null && ano.length > i)
|
if (pinfo.virtualname != null)
|
||||||
anonymous = ano[i].booleanValue();
|
pn = pn.getNode (pinfo.virtualname, false);
|
||||||
|
if (pn != null)
|
||||||
return pn;
|
return pn;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -895,7 +899,7 @@ public class Node implements INode, Serializable {
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
} catch (Exception noluck) {
|
} catch (Exception noluck) {
|
||||||
IServer.getLogger ().log ("Error creating group-by node for "+sid+": "+noluck);
|
nmgr.logEvent ("Error creating group-by node for "+sid+": "+noluck);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -911,7 +915,7 @@ public class Node implements INode, Serializable {
|
||||||
|
|
||||||
|
|
||||||
public void removeNode (INode node) {
|
public void removeNode (INode node) {
|
||||||
IServer.getLogger().log ("removing: "+ node);
|
nmgr.logEvent ("removing: "+ node);
|
||||||
Node n = (Node) node;
|
Node n = (Node) node;
|
||||||
checkWriteLock ();
|
checkWriteLock ();
|
||||||
n.checkWriteLock ();
|
n.checkWriteLock ();
|
||||||
|
@ -969,7 +973,7 @@ public class Node implements INode, Serializable {
|
||||||
// Server.throwNodeEvent (new NodeEvent (node, NodeEvent.NODE_REMOVED));
|
// Server.throwNodeEvent (new NodeEvent (node, NodeEvent.NODE_REMOVED));
|
||||||
// Server.throwNodeEvent (new NodeEvent (this, NodeEvent.SUBNODE_REMOVED, node));
|
// Server.throwNodeEvent (new NodeEvent (this, NodeEvent.SUBNODE_REMOVED, node));
|
||||||
lastmodified = System.currentTimeMillis ();
|
lastmodified = System.currentTimeMillis ();
|
||||||
// IServer.getLogger().log ("released node "+node +" from "+this+" oldobj = "+what);
|
// nmgr.logEvent ("released node "+node +" from "+this+" oldobj = "+what);
|
||||||
if (state == CLEAN) markAs (MODIFIED);
|
if (state == CLEAN) markAs (MODIFIED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -994,7 +998,7 @@ public class Node implements INode, Serializable {
|
||||||
String pid = (String) e1.nextElement ();
|
String pid = (String) e1.nextElement ();
|
||||||
Node pnode = nmgr.getNode (pid, null);
|
Node pnode = nmgr.getNode (pid, null);
|
||||||
if (pnode != null) {
|
if (pnode != null) {
|
||||||
IServer.getLogger().log("Warning: Can't unset node property of "+pnode.getFullName ());
|
nmgr.logEvent("Warning: Can't unset node property of "+pnode.getFullName ());
|
||||||
}
|
}
|
||||||
} catch (Exception ignore) {}
|
} catch (Exception ignore) {}
|
||||||
}
|
}
|
||||||
|
@ -1163,7 +1167,7 @@ public class Node implements INode, Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Property getProperty (String propname, boolean inherit) {
|
protected Property getProperty (String propname, boolean inherit) {
|
||||||
// IServer.getLogger().log ("GETTING PROPERTY: "+propname);
|
// nmgr.logEvent ("GETTING PROPERTY: "+propname);
|
||||||
if (propname == null)
|
if (propname == null)
|
||||||
return null;
|
return null;
|
||||||
Property prop = propMap == null ? null : (Property) propMap.get (propname.toLowerCase ());
|
Property prop = propMap == null ? null : (Property) propMap.get (propname.toLowerCase ());
|
||||||
|
@ -1275,7 +1279,7 @@ public class Node implements INode, Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setString (String propname, String value) {
|
public void setString (String propname, String value) {
|
||||||
// IServer.getLogger().log ("setting String prop");
|
// nmgr.logEvent ("setting String prop");
|
||||||
checkWriteLock ();
|
checkWriteLock ();
|
||||||
|
|
||||||
if (propMap == null)
|
if (propMap == null)
|
||||||
|
@ -1337,7 +1341,7 @@ public class Node implements INode, Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setInteger (String propname, long value) {
|
public void setInteger (String propname, long value) {
|
||||||
// IServer.getLogger().log ("setting bool prop");
|
// nmgr.logEvent ("setting bool prop");
|
||||||
checkWriteLock ();
|
checkWriteLock ();
|
||||||
|
|
||||||
if (propMap == null)
|
if (propMap == null)
|
||||||
|
@ -1360,7 +1364,7 @@ public class Node implements INode, Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFloat (String propname, double value) {
|
public void setFloat (String propname, double value) {
|
||||||
// IServer.getLogger().log ("setting bool prop");
|
// nmgr.logEvent ("setting bool prop");
|
||||||
checkWriteLock ();
|
checkWriteLock ();
|
||||||
|
|
||||||
if (propMap == null)
|
if (propMap == null)
|
||||||
|
@ -1383,7 +1387,7 @@ public class Node implements INode, Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBoolean (String propname, boolean value) {
|
public void setBoolean (String propname, boolean value) {
|
||||||
// IServer.getLogger().log ("setting bool prop");
|
// nmgr.logEvent ("setting bool prop");
|
||||||
checkWriteLock ();
|
checkWriteLock ();
|
||||||
|
|
||||||
if (propMap == null)
|
if (propMap == null)
|
||||||
|
@ -1407,7 +1411,7 @@ public class Node implements INode, Serializable {
|
||||||
|
|
||||||
|
|
||||||
public void setDate (String propname, Date value) {
|
public void setDate (String propname, Date value) {
|
||||||
// IServer.getLogger().log ("setting date prop");
|
// nmgr.logEvent ("setting date prop");
|
||||||
checkWriteLock ();
|
checkWriteLock ();
|
||||||
|
|
||||||
if (propMap == null)
|
if (propMap == null)
|
||||||
|
@ -1430,7 +1434,7 @@ public class Node implements INode, Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setJavaObject (String propname, Object value) {
|
public void setJavaObject (String propname, Object value) {
|
||||||
// IServer.getLogger().log ("setting jobject prop");
|
// nmgr.logEvent ("setting jobject prop");
|
||||||
checkWriteLock ();
|
checkWriteLock ();
|
||||||
|
|
||||||
if (propMap == null)
|
if (propMap == null)
|
||||||
|
@ -1453,7 +1457,7 @@ public class Node implements INode, Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setNode (String propname, INode value) {
|
public void setNode (String propname, INode value) {
|
||||||
// IServer.getLogger().log ("setting node prop");
|
// nmgr.logEvent ("setting node prop");
|
||||||
checkWriteLock ();
|
checkWriteLock ();
|
||||||
|
|
||||||
Node n = null;
|
Node n = null;
|
||||||
|
@ -1473,8 +1477,8 @@ public class Node implements INode, Serializable {
|
||||||
n.setParent (this);
|
n.setParent (this);
|
||||||
n.name = propname;
|
n.name = propname;
|
||||||
n.anonymous = false;
|
n.anonymous = false;
|
||||||
// IServer.getLogger().log ("adopted named node: "+n.getFullName ());
|
// nmgr.logEvent ("adopted named node: "+n.getFullName ());
|
||||||
} // else IServer.getLogger().log ("not adopted: "+n.getFullName ());
|
} // else nmgr.logEvent ("not adopted: "+n.getFullName ());
|
||||||
|
|
||||||
if (propMap == null)
|
if (propMap == null)
|
||||||
propMap = new Hashtable ();
|
propMap = new Hashtable ();
|
||||||
|
@ -1689,7 +1693,7 @@ public class Node implements INode, Serializable {
|
||||||
|
|
||||||
byte retval[] = new byte[content.length];
|
byte retval[] = new byte[content.length];
|
||||||
System.arraycopy (content, 0, retval, 0, content.length);
|
System.arraycopy (content, 0, retval, 0, content.length);
|
||||||
// IServer.getLogger().log ("copied "+retval.length+ " bytes");
|
// nmgr.logEvent ("copied "+retval.length+ " bytes");
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ public final class NodeManager {
|
||||||
// Make actual cache size bigger, since we use it only up to the threshold
|
// Make actual cache size bigger, since we use it only up to the threshold
|
||||||
// cache = new CacheMap ((int) Math.ceil (cacheSize/0.75f), 0.75f);
|
// cache = new CacheMap ((int) Math.ceil (cacheSize/0.75f), 0.75f);
|
||||||
cache = new CacheMap (cacheSize, 0.75f);
|
cache = new CacheMap (cacheSize, 0.75f);
|
||||||
IServer.getLogger().log ("set up node cache ("+cacheSize+")");
|
app.logEvent ("set up node cache ("+cacheSize+")");
|
||||||
|
|
||||||
safe = new WrappedNodeManager (this);
|
safe = new WrappedNodeManager (this);
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ public final class NodeManager {
|
||||||
idBaseValue = Math.max (1l, idBaseValue); // 0 and 1 are reserved for root nodes
|
idBaseValue = Math.max (1l, idBaseValue); // 0 and 1 are reserved for root nodes
|
||||||
} catch (NumberFormatException ignore) {}
|
} catch (NumberFormatException ignore) {}
|
||||||
|
|
||||||
db = new DbWrapper (dbHome, Server.dbFilename, Server.useTransactions);
|
db = new DbWrapper (dbHome, Server.dbFilename, this, Server.useTransactions);
|
||||||
initDb ();
|
initDb ();
|
||||||
|
|
||||||
logSql = "true".equalsIgnoreCase(props.getProperty ("logsql"));
|
logSql = "true".equalsIgnoreCase(props.getProperty ("logsql"));
|
||||||
|
@ -287,7 +287,7 @@ public final class NodeManager {
|
||||||
if (dbm == null || !dbm.isRelational ()) {
|
if (dbm == null || !dbm.isRelational ()) {
|
||||||
db.save (txn, node.getID (), node);
|
db.save (txn, node.getID (), node);
|
||||||
} else {
|
} else {
|
||||||
IServer.getLogger().log ("inserting relational node: "+node.getID ());
|
app.logEvent ("inserting relational node: "+node.getID ());
|
||||||
TableDataSet tds = null;
|
TableDataSet tds = null;
|
||||||
try {
|
try {
|
||||||
tds = new TableDataSet (dbm.getConnection (), dbm.getSchema (), dbm.getKeyDef ());
|
tds = new TableDataSet (dbm.getConnection (), dbm.getSchema (), dbm.getKeyDef ());
|
||||||
|
@ -553,7 +553,7 @@ public final class NodeManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (logSql)
|
if (logSql)
|
||||||
IServer.getLogger().log ("### getNodeIDs: "+qds.getSelectString());
|
app.logEvent ("### getNodeIDs: "+qds.getSelectString());
|
||||||
|
|
||||||
qds.fetchRecords ();
|
qds.fetchRecords ();
|
||||||
for (int i=0; i<qds.size (); i++) {
|
for (int i=0; i<qds.size (); i++) {
|
||||||
|
@ -610,7 +610,7 @@ public final class NodeManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (logSql)
|
if (logSql)
|
||||||
IServer.getLogger().log ("### getNodes: "+tds.getSelectString());
|
app.logEvent ("### getNodes: "+tds.getSelectString());
|
||||||
|
|
||||||
tds.fetchRecords ();
|
tds.fetchRecords ();
|
||||||
for (int i=0; i<tds.size (); i++) {
|
for (int i=0; i<tds.size (); i++) {
|
||||||
|
@ -668,7 +668,7 @@ public final class NodeManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (logSql)
|
if (logSql)
|
||||||
IServer.getLogger().log ("### countNodes: "+qds.getSelectString());
|
app.logEvent ("### countNodes: "+qds.getSelectString());
|
||||||
|
|
||||||
qds.fetchRecords ();
|
qds.fetchRecords ();
|
||||||
if (qds.size () == 0)
|
if (qds.size () == 0)
|
||||||
|
@ -712,7 +712,7 @@ public final class NodeManager {
|
||||||
qds = new QueryDataSet (con, q);
|
qds = new QueryDataSet (con, q);
|
||||||
|
|
||||||
if (logSql)
|
if (logSql)
|
||||||
IServer.getLogger().log ("### getPropertyNames: "+qds.getSelectString());
|
app.logEvent ("### getPropertyNames: "+qds.getSelectString());
|
||||||
|
|
||||||
qds.fetchRecords ();
|
qds.fetchRecords ();
|
||||||
for (int i=0; i<qds.size (); i++) {
|
for (int i=0; i<qds.size (); i++) {
|
||||||
|
@ -751,7 +751,7 @@ public final class NodeManager {
|
||||||
tds.where (dbm.getIDField ()+" = '"+kstr+"'");
|
tds.where (dbm.getIDField ()+" = '"+kstr+"'");
|
||||||
|
|
||||||
if (logSql)
|
if (logSql)
|
||||||
IServer.getLogger().log ("### getNodeByKey: "+tds.getSelectString());
|
app.logEvent ("### getNodeByKey: "+tds.getSelectString());
|
||||||
|
|
||||||
tds.fetchRecords ();
|
tds.fetchRecords ();
|
||||||
|
|
||||||
|
@ -858,7 +858,7 @@ public final class NodeManager {
|
||||||
tds.where (where.toString ());
|
tds.where (where.toString ());
|
||||||
|
|
||||||
if (logSql)
|
if (logSql)
|
||||||
IServer.getLogger().log ("### getNodeByRelation: "+tds.getSelectString());
|
app.logEvent ("### getNodeByRelation: "+tds.getSelectString());
|
||||||
|
|
||||||
tds.fetchRecords ();
|
tds.fetchRecords ();
|
||||||
|
|
||||||
|
|
|
@ -152,7 +152,7 @@ public final class Property implements IProperty, Serializable, Cloneable {
|
||||||
this.lvalue = date.getTime ();
|
this.lvalue = date.getTime ();
|
||||||
return;
|
return;
|
||||||
} catch (ParseException nodate) {
|
} catch (ParseException nodate) {
|
||||||
IServer.getLogger().log ("Couldn't parse date: was expecting something like "+dateformat.format (new Date()));
|
node.nmgr.logEvent ("Couldn't parse date: was expecting something like "+dateformat.format (new Date()));
|
||||||
// store as plain string
|
// store as plain string
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,6 @@ import com.sleepycat.db.*;
|
||||||
static String dbPropfile = "db.properties";
|
static String dbPropfile = "db.properties";
|
||||||
static String appsPropfile = "apps.properties";
|
static String appsPropfile = "apps.properties";
|
||||||
static SystemProperties appsProps;
|
static SystemProperties appsProps;
|
||||||
static String dbDir = null;
|
|
||||||
static int port = 5055;
|
static int port = 5055;
|
||||||
static int webport = 0;
|
static int webport = 0;
|
||||||
|
|
||||||
|
@ -47,9 +46,11 @@ import com.sleepycat.db.*;
|
||||||
|
|
||||||
useTransactions = true;
|
useTransactions = true;
|
||||||
|
|
||||||
|
String homeDir = null;
|
||||||
|
|
||||||
for (int i=0; i<args.length; i++) {
|
for (int i=0; i<args.length; i++) {
|
||||||
if (args[i].equals ("-h") && i+1<args.length)
|
if (args[i].equals ("-h") && i+1<args.length)
|
||||||
hopHome = args[++i];
|
homeDir = args[++i];
|
||||||
else if (args[i].equals ("-f") && i+1<args.length)
|
else if (args[i].equals ("-f") && i+1<args.length)
|
||||||
propfile = args[++i];
|
propfile = args[++i];
|
||||||
else if (args[i].equals ("-t"))
|
else if (args[i].equals ("-t"))
|
||||||
|
@ -73,17 +74,21 @@ import com.sleepycat.db.*;
|
||||||
// get main property file from home dir or vice versa, depending on what we have.
|
// get main property file from home dir or vice versa, depending on what we have.
|
||||||
// get property file from hopHome
|
// get property file from hopHome
|
||||||
if (propfile == null) {
|
if (propfile == null) {
|
||||||
if (hopHome != null)
|
if (homeDir != null)
|
||||||
propfile = new File (hopHome, "server.properties").getAbsolutePath ();
|
propfile = new File (homeDir, "server.properties").getAbsolutePath ();
|
||||||
else
|
else
|
||||||
propfile = new File ("server.properties").getAbsolutePath ();
|
propfile = new File ("server.properties").getAbsolutePath ();
|
||||||
}
|
}
|
||||||
|
|
||||||
sysProps = new SystemProperties (propfile);
|
sysProps = new SystemProperties (propfile);
|
||||||
// get hopHome from property file
|
// get hopHome from property file
|
||||||
if (hopHome == null)
|
if (homeDir == null)
|
||||||
hopHome = sysProps.getProperty ("hophome");
|
homeDir = sysProps.getProperty ("hophome");
|
||||||
if (hopHome == null)
|
if (homeDir == null)
|
||||||
hopHome = new File (propfile).getParent ();
|
homeDir = new File (propfile).getParent ();
|
||||||
|
|
||||||
|
// create hopHome File object
|
||||||
|
hopHome = new File (homeDir);
|
||||||
|
|
||||||
getLogger().log ("propfile = "+propfile);
|
getLogger().log ("propfile = "+propfile);
|
||||||
getLogger().log ("hopHome = "+hopHome);
|
getLogger().log ("hopHome = "+hopHome);
|
||||||
|
@ -99,35 +104,14 @@ import com.sleepycat.db.*;
|
||||||
System.exit (0);
|
System.exit (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
dbDir = sysProps.getProperty ("dbhome", "db");
|
File helper = new File (hopHome, "db.properties");
|
||||||
File helper = new File (dbDir);
|
|
||||||
if (hopHome != null && !helper.isAbsolute ())
|
|
||||||
helper = new File (hopHome, dbDir);
|
|
||||||
dbDir = helper.getAbsolutePath ();
|
|
||||||
getLogger().log ("dbHome = "+dbDir);
|
|
||||||
|
|
||||||
dbPropfile = sysProps.getProperty ("dbpropfile", "db.properties");
|
|
||||||
helper = new File (dbPropfile);
|
|
||||||
if (hopHome != null && !helper.isAbsolute ())
|
|
||||||
helper = new File (hopHome, dbPropfile);
|
|
||||||
dbPropfile = helper.getAbsolutePath ();
|
dbPropfile = helper.getAbsolutePath ();
|
||||||
getLogger().log ("dbPropfile = "+dbPropfile);
|
getLogger().log ("dbPropfile = "+dbPropfile);
|
||||||
|
|
||||||
appsPropfile = sysProps.getProperty ("appspropfile", "apps.properties");
|
helper = new File (hopHome, "apps.properties");
|
||||||
helper = new File (appsPropfile);
|
|
||||||
if (hopHome != null && !helper.isAbsolute ())
|
|
||||||
helper = new File (hopHome, appsPropfile);
|
|
||||||
appsPropfile = helper.getAbsolutePath ();
|
appsPropfile = helper.getAbsolutePath ();
|
||||||
getLogger().log ("appsPropfile = "+appsPropfile);
|
getLogger().log ("appsPropfile = "+appsPropfile);
|
||||||
|
|
||||||
File libdir = new File (hopHome, "lib");
|
|
||||||
Properties p = System.getProperties ();
|
|
||||||
String libpath = p.getProperty ("java.library.path");
|
|
||||||
if (libpath != null && libpath.length () > 0)
|
|
||||||
p.put ("java.library.path", libpath+System.getProperty("path.separator")+libdir.getCanonicalPath());
|
|
||||||
else
|
|
||||||
p.put ("java.library.path", libdir.getCanonicalPath());
|
|
||||||
|
|
||||||
paranoid = "true".equalsIgnoreCase (sysProps.getProperty ("paranoid"));
|
paranoid = "true".equalsIgnoreCase (sysProps.getProperty ("paranoid"));
|
||||||
|
|
||||||
String language = sysProps.getProperty ("language");
|
String language = sysProps.getProperty ("language");
|
||||||
|
@ -225,21 +209,13 @@ import com.sleepycat.db.*;
|
||||||
|
|
||||||
|
|
||||||
// start application framework
|
// start application framework
|
||||||
String appDir = sysProps.getProperty ("apphome", "apps");
|
|
||||||
File appHome = new File (appDir);
|
|
||||||
if (hopHome != null && !appHome.isAbsolute())
|
|
||||||
appHome = new File (hopHome, appDir);
|
|
||||||
appsProps = new SystemProperties (appsPropfile);
|
appsProps = new SystemProperties (appsPropfile);
|
||||||
File dbHome = new File (dbDir);
|
appManager = new ApplicationManager (port, hopHome, appsProps, this);
|
||||||
appManager = new ApplicationManager (port, appHome, dbHome, appsProps, this);
|
|
||||||
|
|
||||||
|
|
||||||
} catch (Exception gx) {
|
} catch (Exception gx) {
|
||||||
getLogger().log ("Error initializing embedded database: "+gx);
|
getLogger().log ("Error initializing embedded database: "+gx);
|
||||||
gx.printStackTrace ();
|
gx.printStackTrace ();
|
||||||
/* try {
|
|
||||||
transactor.abort ();
|
|
||||||
} catch (Exception ignore) {} */
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -137,19 +137,19 @@ public class Transactor extends Thread {
|
||||||
nmgr.insertNode (nmgr.db, txn, node);
|
nmgr.insertNode (nmgr.db, txn, node);
|
||||||
node.setState (Node.CLEAN);
|
node.setState (Node.CLEAN);
|
||||||
ins++;
|
ins++;
|
||||||
IServer.getLogger().log ("inserted: Node "+node.getName ()+"/"+node.getID ());
|
nmgr.app.logEvent ("inserted: Node "+node.getName ()+"/"+node.getID ());
|
||||||
} else if (nstate == Node.MODIFIED) {
|
} else if (nstate == Node.MODIFIED) {
|
||||||
nmgr.updateNode (nmgr.db, txn, node);
|
nmgr.updateNode (nmgr.db, txn, node);
|
||||||
node.setState (Node.CLEAN);
|
node.setState (Node.CLEAN);
|
||||||
upd++;
|
upd++;
|
||||||
IServer.getLogger().log ("updated: Node "+node.getName ()+"/"+node.getID ());
|
nmgr.app.logEvent ("updated: Node "+node.getName ()+"/"+node.getID ());
|
||||||
} else if (nstate == Node.DELETED) {
|
} else if (nstate == Node.DELETED) {
|
||||||
// IServer.getLogger().log ("deleted: "+node.getFullName ()+" ("+node.getName ()+")");
|
// nmgr.app.logEvent ("deleted: "+node.getFullName ()+" ("+node.getName ()+")");
|
||||||
nmgr.deleteNode (nmgr.db, txn, node);
|
nmgr.deleteNode (nmgr.db, txn, node);
|
||||||
nmgr.evictNode (node);
|
nmgr.evictNode (node);
|
||||||
dlt++;
|
dlt++;
|
||||||
} else {
|
} else {
|
||||||
// IServer.getLogger().log ("noop: "+node.getFullName ());
|
// nmgr.app.logEvent ("noop: "+node.getFullName ());
|
||||||
}
|
}
|
||||||
node.clearWriteLock ();
|
node.clearWriteLock ();
|
||||||
}
|
}
|
||||||
|
@ -168,7 +168,7 @@ public class Transactor extends Thread {
|
||||||
txn = null;
|
txn = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
IServer.getLogger().log (tname+" "+l+" marked, "+ins+" inserted, "+upd+" updated, "+dlt+" deleted in "+(System.currentTimeMillis()-tstart)+" millis");
|
nmgr.app.logAccess (tname+" "+l+" marked, "+ins+" inserted, "+upd+" updated, "+dlt+" deleted in "+(System.currentTimeMillis()-tstart)+" millis");
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void abort () throws Exception {
|
public synchronized void abort () throws Exception {
|
||||||
|
@ -191,7 +191,7 @@ public class Transactor extends Thread {
|
||||||
nmgr.db.abortTransaction (txn);
|
nmgr.db.abortTransaction (txn);
|
||||||
txn = null;
|
txn = null;
|
||||||
}
|
}
|
||||||
IServer.getLogger().log (tname+" aborted after "+(System.currentTimeMillis()-tstart)+" millis");
|
nmgr.app.logEvent (tname+" aborted after "+(System.currentTimeMillis()-tstart)+" millis");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,13 +214,13 @@ public class Transactor extends Thread {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void closeConnections () {
|
public void closeConnections () {
|
||||||
// IServer.getLogger().log("Cleaning up Transactor thread");
|
// nmgr.app.logEvent("Cleaning up Transactor thread");
|
||||||
if (sqlCon != null) {
|
if (sqlCon != null) {
|
||||||
for (Iterator i=sqlCon.values().iterator(); i.hasNext(); ) {
|
for (Iterator i=sqlCon.values().iterator(); i.hasNext(); ) {
|
||||||
try {
|
try {
|
||||||
Connection con = (Connection) i.next();
|
Connection con = (Connection) i.next();
|
||||||
con.close ();
|
con.close ();
|
||||||
IServer.getLogger ().log ("Closing DB connection: "+con);
|
nmgr.app.logEvent ("Closing DB connection: "+con);
|
||||||
} catch (Exception ignore) {}
|
} catch (Exception ignore) {}
|
||||||
}
|
}
|
||||||
sqlCon.clear ();
|
sqlCon.clear ();
|
||||||
|
|
|
@ -27,7 +27,7 @@ import java.util.Vector;
|
||||||
} catch (ObjectNotFoundException x) {
|
} catch (ObjectNotFoundException x) {
|
||||||
return null;
|
return null;
|
||||||
} catch (Exception x) {
|
} catch (Exception x) {
|
||||||
Server.getLogger().log ("Error retrieving Node via DbMapping: "+x.getMessage ());
|
nmgr.app.logEvent ("Error retrieving Node via DbMapping: "+x.getMessage ());
|
||||||
if ("true".equalsIgnoreCase (Server.sysProps.getProperty("debug")))
|
if ("true".equalsIgnoreCase (Server.sysProps.getProperty("debug")))
|
||||||
x.printStackTrace();
|
x.printStackTrace();
|
||||||
throw new RuntimeException ("Error retrieving Node: "+x.getMessage ());
|
throw new RuntimeException ("Error retrieving Node: "+x.getMessage ());
|
||||||
|
@ -40,7 +40,7 @@ import java.util.Vector;
|
||||||
} catch (ObjectNotFoundException x) {
|
} catch (ObjectNotFoundException x) {
|
||||||
return null;
|
return null;
|
||||||
} catch (Exception x) {
|
} catch (Exception x) {
|
||||||
Server.getLogger().log ("Error retrieving Node \""+id+"\" from "+home+": "+x.getMessage ());
|
nmgr.app.logEvent ("Error retrieving Node \""+id+"\" from "+home+": "+x.getMessage ());
|
||||||
if ("true".equalsIgnoreCase (Server.sysProps.getProperty("debug")))
|
if ("true".equalsIgnoreCase (Server.sysProps.getProperty("debug")))
|
||||||
x.printStackTrace();
|
x.printStackTrace();
|
||||||
throw new RuntimeException ("Error retrieving Node: "+x.getMessage ());
|
throw new RuntimeException ("Error retrieving Node: "+x.getMessage ());
|
||||||
|
@ -134,6 +134,14 @@ import java.util.Vector;
|
||||||
return nmgr.getCacheEntries ();
|
return nmgr.getCacheEntries ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void logEvent (String msg) {
|
||||||
|
nmgr.app.logEvent (msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DbMapping getDbMapping (String name) {
|
||||||
|
return nmgr.app.getDbMapping (name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue