Rewrote getSkin to be able to handle more than one skin manager.
This commit is contained in:
parent
ac9db121db
commit
c7dc65a7ed
1 changed files with 57 additions and 42 deletions
|
@ -77,7 +77,8 @@ public class RequestEvaluator implements Runnable {
|
||||||
static final int XMLRPC = 2; // via XML-RPC
|
static final int XMLRPC = 2; // via XML-RPC
|
||||||
static final int INTERNAL = 3; // generic function call, e.g. by scheduler
|
static final int INTERNAL = 3; // generic function call, e.g. by scheduler
|
||||||
|
|
||||||
INode root, userroot, currentNode, skinManager;
|
INode root, userroot, currentNode;
|
||||||
|
INode[] skinmanagers;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build a RenderContext from a RequestTrans. Checks if the path is the user home node ("user")
|
* Build a RenderContext from a RequestTrans. Checks if the path is the user home node ("user")
|
||||||
|
@ -141,7 +142,7 @@ public class RequestEvaluator implements Runnable {
|
||||||
|
|
||||||
// app.logEvent ("got request "+reqtype);
|
// app.logEvent ("got request "+reqtype);
|
||||||
// reset skinManager
|
// reset skinManager
|
||||||
skinManager = null;
|
skinmanagers = null;
|
||||||
|
|
||||||
switch (reqtype) {
|
switch (reqtype) {
|
||||||
case HTTP:
|
case HTTP:
|
||||||
|
@ -737,50 +738,39 @@ public class RequestEvaluator implements Runnable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Skin getSkin (ESObject thisObject, String skinname) {
|
public Skin getSkin (ESObject thisObject, String skinname) {
|
||||||
INode n = null;
|
|
||||||
Prototype proto = null;
|
Prototype proto = null;
|
||||||
Skin skin = null;
|
if (thisObject == null)
|
||||||
// FIXME: we can't do that, because if no db skinmanager exists we'll query over and over again
|
|
||||||
if (skinManager == null) {
|
|
||||||
skinManager = currentNode == null ? null : currentNode.getNode ("skinmanager", true);
|
|
||||||
// System.err.println ("SKINMGR: "+skinManager);
|
|
||||||
// mark as null
|
|
||||||
if (skinManager == null)
|
|
||||||
skinManager = new Node ("dummy");
|
|
||||||
}
|
|
||||||
if (thisObject != null && thisObject instanceof ESNode) {
|
|
||||||
n = ((ESNode) thisObject).getNode ();
|
|
||||||
// System.err.println ("GOT SKINMGR "+skinNode+" FROM "+n);
|
|
||||||
if (skinManager != null && !"dummy".equals (skinManager.getName())) {
|
|
||||||
skin = getSkinFromNode (skinManager, n.getPrototype (), skinname);
|
|
||||||
if (skin != null)
|
|
||||||
return skin;
|
|
||||||
}
|
|
||||||
proto = app.getPrototype (n);
|
|
||||||
// not found in node manager for this prototype.
|
|
||||||
// the next step is to look if it is defined as skin file for this prototype
|
|
||||||
if (proto != null) {
|
|
||||||
skin = proto.getSkin (skinname);
|
|
||||||
// if we have a thisObject and didn't find the skin, try in parent prototype
|
|
||||||
if (skin == null && n != null) {
|
|
||||||
proto = proto.getPrototype ();
|
|
||||||
if (proto != null)
|
|
||||||
skin = proto.getSkin (skinname);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// the requested skin is global - start from currentNode (=end of request path) for app skin retrieval
|
|
||||||
if (skinManager != null) {
|
|
||||||
skin = getSkinFromNode (skinManager, "global", skinname);
|
|
||||||
if (skin != null)
|
|
||||||
return skin;
|
|
||||||
}
|
|
||||||
proto = app.typemgr.getPrototype ("global");
|
proto = app.typemgr.getPrototype ("global");
|
||||||
skin = proto.getSkin (skinname);
|
else
|
||||||
}
|
proto = app.getPrototype (((ESNode) thisObject).getNode ());
|
||||||
return skin;
|
return getSkin (proto, skinname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Skin getSkin (Prototype proto, String skinname) {
|
||||||
|
if (proto == null)
|
||||||
|
return null;
|
||||||
|
if (skinmanagers == null)
|
||||||
|
getSkinManagers ();
|
||||||
|
do {
|
||||||
|
for (int i=0; i<skinmanagers.length; i++) {
|
||||||
|
Skin skin = getSkinFromNode (skinmanagers[i], proto.getName (), skinname);
|
||||||
|
if (skin != null)
|
||||||
|
return skin;
|
||||||
|
}
|
||||||
|
// not found in node managers for this prototype.
|
||||||
|
// the next step is to look if it is defined as skin file for this prototype
|
||||||
|
Skin skin = proto.getSkin (skinname);
|
||||||
|
if (skin != null)
|
||||||
|
return skin;
|
||||||
|
// still not found. See if there is a parent prototype which might define the skin
|
||||||
|
proto = proto.getPrototype ();
|
||||||
|
} while (proto != null);
|
||||||
|
// looked every where, nothing to be found
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private Skin getSkinFromNode (INode node, String prototype, String skinname) {
|
private Skin getSkinFromNode (INode node, String prototype, String skinname) {
|
||||||
if (prototype == null)
|
if (prototype == null)
|
||||||
return null;
|
return null;
|
||||||
|
@ -804,6 +794,31 @@ public class RequestEvaluator implements Runnable {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an array of skin managers for a request path so it is retrieved ony once per request
|
||||||
|
*/
|
||||||
|
private void getSkinManagers () {
|
||||||
|
Vector v = new Vector ();
|
||||||
|
for (int i=reqPath.size()-1; i>=0; i--) try {
|
||||||
|
ESNode esn = (ESNode) reqPath.getProperty (i);
|
||||||
|
INode n = esn.getNode ();
|
||||||
|
DbMapping dbm = n.getDbMapping ();
|
||||||
|
if (dbm == null)
|
||||||
|
continue;
|
||||||
|
String[] skinmgr = dbm.getSkinManagers();
|
||||||
|
if (skinmgr == null)
|
||||||
|
continue;
|
||||||
|
for (int j=0; j<skinmgr.length; j++) {
|
||||||
|
INode sm = n.getNode (skinmgr[j], false);
|
||||||
|
if (sm != null)
|
||||||
|
v.addElement (sm);
|
||||||
|
}
|
||||||
|
} catch (Exception ignore) { }
|
||||||
|
skinmanagers = new INode[v.size()];
|
||||||
|
v.copyInto (skinmanagers);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a node wrapper only if it already exists in the cache table. This is used
|
* Returns a node wrapper only if it already exists in the cache table. This is used
|
||||||
* in those places when wrappers have to be updated if they already exist.
|
* in those places when wrappers have to be updated if they already exist.
|
||||||
|
|
Loading…
Add table
Reference in a new issue