/*
* Lokomo OneCMDB - An Open Source Software for Configuration
* Management of Datacenter Resources
*
* Copyright (C) 2006 Lokomo Systems AB
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*
* Lokomo Systems AB can be contacted via e-mail: info@lokomo.com or via
* paper mail: Lokomo Systems AB, Sv�rdv�gen 27, SE-182 33
* Danderyd, Sweden.
*
*/
package org.onecmdb.rest.graph.model.prefuse;
import java.util.HashMap;
import java.util.Map;
import org.onecmdb.core.utils.bean.CiBean;
import org.onecmdb.core.utils.graph.query.GraphQuery;
import org.onecmdb.core.utils.graph.query.selector.ItemOffspringSelector;
import org.onecmdb.core.utils.graph.result.Template;
import org.onecmdb.rest.graph.io.OneCMDBConnection;
import org.onecmdb.rest.graph.utils.applet.AppletLogger;
import prefuse.data.Edge;
import prefuse.data.Graph;
import prefuse.data.Node;
public class TemplateModelControl {
private static Map<String, TemplateModelControl> models = new HashMap<String, TemplateModelControl>();
private String root;
private org.onecmdb.core.utils.graph.result.Graph templateResult;
private int totalTemplateCount;
private long loadTemplateTime;
private Graph templateGraph;
private Map<String, CiBean> beanMap = new HashMap<String, CiBean>();
private Map<String, Node> nodeMap = new HashMap<String, Node>();
public TemplateModelControl(String root) {
this.root = root;
}
public void resetData() {
beanMap.clear();
nodeMap.clear();
templateGraph = null;
templateResult = null;
}
public String toString() {
return("TemplateModelControl[" + hashCode() + "]: BeanCache Size=" + beanMap.size());
}
public static void reset() {
for (TemplateModelControl tModel : models.values()) {
tModel.resetData();
System.out.println("Reset:" + tModel.toString());
}
models.clear();
}
public static void reload() {
for (TemplateModelControl tModel : models.values()) {
tModel.update();
}
}
public static TemplateModelControl get(String root) {
TemplateModelControl templateModel = models.get(root);
if (templateModel == null) {
templateModel = new TemplateModelControl(root);
templateModel.update();
models.put(root, templateModel);
}
System.out.println("Request TemplateModelControl for " + root + ": " + templateModel);
return(templateModel);
}
private void update() {
ItemOffspringSelector ci = new ItemOffspringSelector("ci", root);
ci.setMatchTemplate(true);
ci.setPrimary(true);
GraphQuery q = new GraphQuery();
q.addSelector(ci);
AppletLogger.showMessage("Query CMDB (RESTFull)...");
long start = System.currentTimeMillis();
org.onecmdb.core.utils.graph.result.Graph result = OneCMDBConnection.instance().query(q);
long stop = System.currentTimeMillis();
result.buildMap();
totalTemplateCount = result.fetchAllNodeOffsprings().size() + 1;
loadTemplateTime = stop-start;
Template c = result.fetchNode(ci.getId());
templateGraph = new prefuse.data.Graph();
setupModel(templateGraph);
if (c == null || c.getOffsprings() == null || c.getOffsprings().size() == 0) {
Node notFound = templateGraph.addNode();
notFound.set("alias", root);
notFound.set("name", "Empty Model for [" + root + "]");
} else {
for (CiBean ciBean : c.getOffsprings()) {
beanMap.put(ciBean.getAlias(), ciBean);
}
beanMap.put(c.getTemplate().getAlias(), c.getTemplate());
// Add this first...
getNode(root);
AppletLogger.showMessage("Found " + c.getOffsprings().size() + " templates...");
for (CiBean ciBean : c.getOffsprings()) {
Node parent = getNode(ciBean.getDerivedFrom());
Node child = getNode(ciBean.getAlias());
Edge edge = templateGraph.addEdge(parent, child);
}
}
}
private void setupModel(Graph g) {
g.addColumn("alias", String.class);
g.addColumn("type", String.class);
g.addColumn("mark", Boolean.class);
g.addColumn("name", String.class);
g.addColumn("checked", boolean.class);
// On Edge
g.addColumn("springCoefficient", float.class);
g.addColumn("springLength", float.class);
// On Node
g.addColumn("massValue", float.class);
g.addColumn("image", String.class);
}
private Node getNode(String alias) {
Node n = nodeMap.get(alias);
if (n == null) {
n = templateGraph.addNode();
CiBean bean = beanMap.get(alias);
n.set("alias", bean.getAlias());
n.set("name", bean.getDisplayName());
nodeMap.put(alias, n);
}
return(n);
}
public Map<String, CiBean> getBeanMap() {
return(beanMap);
}
public CiBean getBean(String alias) {
return(beanMap.get(alias));
}
public Graph getTemplateGraph() {
return(templateGraph);
}
public String getTemplateInfoAsHTML() {
StringBuffer b = new StringBuffer();
b.append("<html>");
b.append("OneCMDB contains " + totalTemplateCount + " templates<br>");
b.append("<hr size=\"1\">");
b.append("Loaded templates in " + loadTemplateTime + "ms<br>");
b.append("</html>");
return(b.toString());
}
}