/*
* 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.core.tests.graph;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Assert;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.onecmdb.core.IModelService;
import org.onecmdb.core.IRfcResult;
import org.onecmdb.core.internal.storage.hibernate.PageInfo;
import org.onecmdb.core.tests.AbstractOneCmdbTestCase;
import org.onecmdb.core.tests.OneCMDBTestConfig;
import org.onecmdb.core.utils.bean.AttributeBean;
import org.onecmdb.core.utils.bean.CiBean;
import org.onecmdb.core.utils.bean.ValueBean;
import org.onecmdb.core.utils.graph.handler.QueryHandler;
import org.onecmdb.core.utils.graph.query.GraphQuery;
import org.onecmdb.core.utils.graph.query.constraint.AttributeValueConstraint;
import org.onecmdb.core.utils.graph.query.constraint.ItemAndGroupConstraint;
import org.onecmdb.core.utils.graph.query.constraint.ItemIdConstraint;
import org.onecmdb.core.utils.graph.query.constraint.ItemOrGroupConstraint;
import org.onecmdb.core.utils.graph.query.constraint.ItemSecurityConstraint;
import org.onecmdb.core.utils.graph.query.constraint.RFCTargetConstraint;
import org.onecmdb.core.utils.graph.query.constraint.RelationConstraint;
import org.onecmdb.core.utils.graph.query.selector.ItemAliasSelector;
import org.onecmdb.core.utils.graph.query.selector.ItemOffspringSelector;
import org.onecmdb.core.utils.graph.query.selector.ItemRFCSelector;
import org.onecmdb.core.utils.graph.query.selector.ItemRelationSelector;
import org.onecmdb.core.utils.graph.query.selector.ItemTransactionSelector;
import org.onecmdb.core.utils.graph.query.selector.RFCItemRelationSelector;
import org.onecmdb.core.utils.graph.query.selector.TransactionRelationSelector;
import org.onecmdb.core.utils.graph.result.Graph;
import org.onecmdb.core.utils.graph.result.Template;
import org.onecmdb.core.utils.wsdl.IOneCMDBWebService;
import org.onecmdb.core.utils.wsdl.OneCMDBWebServiceImpl;
import org.onecmdb.core.utils.wsdl.RFCBean;
import org.onecmdb.core.utils.wsdl.TransactionBean;
import org.onecmdb.core.utils.xml.XmlParser;
public class GraphTest extends AbstractOneCmdbTestCase {
private IOneCMDBWebService cmdbService;
private String token;
@Override
protected String getDatasourceResource() {
return("org/onecmdb/core/tests/graph/mysql-update-cygate-datasource.xml");
//return(OneCMDBTestConfig.MYSQL_UPDATE_DATASOURCE);
//return(OneCMDBTestConfig.SQLSERVER2005_CREATE_DROP_DATASOURCE);
//return(OneCMDBTestConfig.HSQL_SERVER_CREATE_DROP_DATASOURCE);
}
public void setUp() {
if (true) {
Service serviceModel = new ObjectServiceFactory().create(IOneCMDBWebService.class);
try {
String remoteURL = "http://localhost:8888/onecmdb/webservice/onecmdb";
cmdbService = (IOneCMDBWebService) new XFireProxyFactory().create(serviceModel, remoteURL);
} catch (MalformedURLException e) {
e.printStackTrace();
fail("Can't connect to remote WebService ");
}
} else {
super.setUp();
OneCMDBWebServiceImpl impl = new OneCMDBWebServiceImpl();
impl.setOneCmdb(getCmdbContext());
cmdbService = impl;
}
try {
//token = cmdbService.auth("niklas", "G8sig�t1");
//token = cmdbService.auth("support", "1Qaz1qaz");
token = cmdbService.auth("admin", "123");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void xtestImport() {
List<String> result = importModel(new String[] {
"file:D:/home/niklas/prjs/cygate/cygate-cmdb/Distribution/cygate/model/Cygate_CI_Template.xml",
"classpath:models/OneCMDB_Reference_Templates.xml",
"file:D:/home/niklas/prjs/cygate/cygate-cmdb/Distribution/cygate/model/CygateModel.xml",
"file:D:/home/niklas/prjs/cygate/cygate-cmdb/DataSources/SuperOffice/result/SO_utdrag.xml",
"file:D:/home/niklas/prjs/cygate/cygate-cmdb/DataSources/Netcool/result/SLL-Node-IF-JDBC.xml",
"file:D:/home/niklas/prjs/cygate/cygate-cmdb/DataSources/XLS/result/WANAccess-Connection-Mapped-JDBC.xml"
});
System.out.println("=======================================================");
for (String msg : result) {
System.out.println(msg);
}
System.out.println("=======================================================");
}
public void xtestImportModified() {
List<String> result = importModel(new String[] {
"file:D:/home/niklas/eclipse-ws/org.onecmdb.model.cygate/src/resource/CygateAnslStatus.xml",
"file:D:/home/niklas/eclipse-ws/org.onecmdb.model.cygate/src/resource/CygateModel.xml",
"file:D:/home/niklas/eclipse-ws/org.onecmdb.model.cygate/src/resource/CygateSecurityModel.xml",
});
System.out.println("=======================================================");
for (String msg : result) {
System.out.println(msg);
}
System.out.println("=======================================================");
}
public void xtestRFCQuery4() {
GraphQuery q = new GraphQuery();
ItemOffspringSelector brukare = new ItemOffspringSelector("brukare", "Brukare");
brukare.setPageInfo(new PageInfo(0, 5));
brukare.setPrimary(true);
q.addSelector(brukare);
Graph result = cmdbService.queryGraph(token, q);
Template t = result.fetchNode("brukare");
for (CiBean bean : t.getOffsprings()) {
System.out.println("BEAN: " + bean.toString());
// Fetch RFC for an attribute....
ValueBean v = bean.fetchAttributeValueBean("name", 0);
ItemRFCSelector rfc = new ItemRFCSelector("rfc", "Any");
rfc.applyConstraint(new RFCTargetConstraint(v.getId()));
GraphQuery rfcq = new GraphQuery();
rfc.setPrimary(true);
rfcq.addSelector(rfc);
Graph r2 = cmdbService.queryGraph(token, rfcq);
Template rfcs = r2.fetchNode("rfc");
for (RFCBean r : rfcs.getRFC()) {
System.out.println("\t" + r.toString());
}
}
}
public void xtestTransactionQuery1() {
ItemTransactionSelector trans = new ItemTransactionSelector("trans", null);
trans.setPrimary(true);
trans.setPageInfo(new PageInfo(0, 1));
GraphQuery q1 = new GraphQuery();
q1.addSelector(trans);
Graph result = cmdbService.queryGraph(token, q1);
Template t = result.fetchNode("trans");
TransactionBean tx = t.getTransactions().get(0);
GraphQuery q = new GraphQuery();
ItemOffspringSelector offspring = new ItemOffspringSelector("ci", null);
offspring.setPrimary(true);
ItemTransactionSelector t2 = new ItemTransactionSelector("trans", null);
t2.setTxId(tx.getId());
ItemRFCSelector rfc = new ItemRFCSelector("rfc", null);
rfc.setTxId(tx.getId());
RFCItemRelationSelector b2rfc = new RFCItemRelationSelector("b2rfc", RFCItemRelationSelector.META_RELATION_RFC, offspring.getId(), rfc.getId());
TransactionRelationSelector rfc2trans = new TransactionRelationSelector("rfc2trans", TransactionRelationSelector.META_RELATION_TRANSACTION, t2.getId(), rfc.getId());
q.addSelector(offspring);
q.addSelector(rfc);
//q.addSelector(t2);
q.addSelector(b2rfc);
//q.addSelector(rfc2trans);
Graph r2 = cmdbService.queryGraph(token, q);
System.out.println("Result:" + result.toString());
}
public void xtestRFCQuery3() {
CiBean bBean = null;
{
GraphQuery q = new GraphQuery();
ItemOffspringSelector brukare = new ItemOffspringSelector("brukare", "Brukare");
brukare.setPageInfo(new PageInfo(0, 1));
brukare.setPrimary(true);
q.addSelector(brukare);
Graph result = cmdbService.queryGraph(token, q);
Template t = result.fetchNode("brukare");
bBean = t.getOffsprings().get(0);
}
{
GraphQuery q = new GraphQuery();
ValueBean vName = bBean.fetchAttributeValueBean("name", 0);
ItemRFCSelector rfc = new ItemRFCSelector("rfc-brukare", ItemRFCSelector.RFC_MODIFY_VALUE_TYPE);
rfc.setPageInfo(new PageInfo(0, 20));
rfc.applyConstraint(new RFCTargetConstraint(vName.getId()));
rfc.setPrimary(true);
q.addSelector(rfc);
Graph result = cmdbService.queryGraph(token, q);
System.out.println(result);
Template t = result.fetchNode("rfc-brukare");
for (RFCBean bean : t.getRFC()) {
System.out.println("RFCS: " + bean.toString());
}
}
}
public void testIdConstraint() {
ItemOrGroupConstraint or = new ItemOrGroupConstraint();
{
GraphQuery q = new GraphQuery();
ItemOffspringSelector brukare = new ItemOffspringSelector("brukare", "Brukare");
brukare.setPageInfo(new PageInfo(0, 5));
brukare.setPrimary(true);
q.addSelector(brukare);
Graph result = cmdbService.queryGraph(token, q);
Template t = result.fetchNode("brukare");
for (CiBean b : t.getOffsprings()) {
ItemIdConstraint idCon = new ItemIdConstraint();
idCon.setId(b.getId());
or.add(idCon);
}
}
{
GraphQuery q = new GraphQuery();
ItemOffspringSelector brukare = new ItemOffspringSelector("brukare", "Brukare");
brukare.applyConstraint(or);
brukare.setPrimary(true);
q.addSelector(brukare);
Graph result = cmdbService.queryGraph(token, q);
System.out.println(result.toString());
}
}
public void xtestRFCQuery2() {
GraphQuery q = new GraphQuery();
ItemAliasSelector brukare = new ItemAliasSelector("brukare", "Brukare");
brukare.setAlias("Brukare-1226815730");
brukare.setPageInfo(new PageInfo(0, 5));
brukare.setPrimary(true);
ItemRFCSelector rfc = new ItemRFCSelector("rfc-brukare", ItemRFCSelector.TEMPLATE_RFC);
rfc.setPageInfo(new PageInfo(0, 20));
RFCItemRelationSelector b2rfc = new RFCItemRelationSelector("b2rfc", RFCItemRelationSelector.META_RELATION_RFC, brukare.getId(), rfc.getId());
q.addSelector(brukare);
q.addSelector(rfc);
q.addSelector(b2rfc);
Graph result = cmdbService.queryGraph(token, q);
Template t = result.fetchNode("rfc-brukare");
for (RFCBean bean : t.getRFC()) {
System.out.println("RFCS: " + bean.toString());
}
}
public void xtestNextGraph() {
GraphQuery query = new GraphQuery();
ItemOffspringSelector brukare = new ItemOffspringSelector("brukare", "Brukare");
ItemOffspringSelector access = new ItemOffspringSelector("access", "WANAccess");
ItemOffspringSelector conn = new ItemOffspringSelector("connection", "NetworkConnection");
ItemRelationSelector a2b = new ItemRelationSelector("a2b", "Reference", brukare.getId(), access.getId());
ItemRelationSelector a2c = new ItemRelationSelector("a2c", "Reference", conn.getId(), access.getId());
ItemAliasSelector status = new ItemAliasSelector("connectionStatus", "NetworkConnectionStatus");
status.setAlias("Production");
ItemRelationSelector c2g = new ItemRelationSelector("c2g", "PointsTo", status.getId(), conn.getId());
ItemSecurityConstraint security = new ItemSecurityConstraint();
security.setGroupName("SLLNetSecurityGroup");
access.applyConstraint(security);
brukare.applyConstraint(security);
//conn.applyConstraint(security);
AttributeValueConstraint vConstraint = new
AttributeValueConstraint("name",
AttributeValueConstraint.LIKE, "A%");
access.setPrimary(true);
access.setPageInfo(new PageInfo(0, 10));
a2b.setMandatory(false);
query.addSelector(access);
query.addSelector(brukare);
query.addSelector(conn);
query.addSelector(a2b);
query.addSelector(a2c);
//query.addSelector(status);
//query.addSelector(c2g);
QueryHandler handler = new QueryHandler(session);
Graph result = handler.execute3(query);
//Graph result = cmdbService.queryGraph(token, query);
System.out.println(result.toString());
}
public void xtestRFCQuery() {
GraphQuery q = new GraphQuery();
ItemOffspringSelector brukare = new ItemOffspringSelector("brukare", "Brukare");
brukare.setPageInfo(new PageInfo(0, 5));
brukare.setPrimary(true);
ItemRFCSelector rfc = new ItemRFCSelector("rfc-brukare", ItemRFCSelector.TEMPLATE_RFC);
rfc.setPageInfo(new PageInfo(0, 20));
RFCItemRelationSelector b2rfc = new RFCItemRelationSelector("b2rfc", RFCItemRelationSelector.META_RELATION_RFC, brukare.getId(), rfc.getId());
q.addSelector(brukare);
q.addSelector(rfc);
q.addSelector(b2rfc);
Graph result = cmdbService.queryGraph(token, q);
result.buildMap();
Template t = result.fetchNode("brukare");
for (CiBean bean : t.getOffsprings()) {
List<RFCBean> rfcs = result.fetchRFCs(bean);
System.out.println("BEAN:" + bean);
System.out.println("RFCS: " + rfcs.size());
}
}
public void xtestLatestRFCQuery() {
GraphQuery q = new GraphQuery();
ItemOffspringSelector brukare = new ItemOffspringSelector("brukare", "Brukare");
ItemRFCSelector rfc = new ItemRFCSelector("rfc-brukare", ItemRFCSelector.TEMPLATE_RFC);
rfc.setPageInfo(new PageInfo(0, 20));
rfc.setPrimary(true);
RFCItemRelationSelector b2rfc = new RFCItemRelationSelector("b2rfc", RFCItemRelationSelector.META_RELATION_RFC, brukare.getId(), rfc.getId());
q.addSelector(brukare);
q.addSelector(rfc);
q.addSelector(b2rfc);
Graph result = cmdbService.queryGraph(token, q);
result.buildMap();
Template t = result.fetchNode("rfc-brukare");
for (RFCBean bean : t.getRFC()) {
System.out.println("RFCS: " + bean.toString());
}
Template t2 = result.fetchNode("brukare");
for (CiBean bean : t2.getOffsprings()) {
System.out.println("Bean: " + bean.toString());
}
}
public void xtestNextQuery() {
GraphQuery q = new GraphQuery();
ItemOffspringSelector brukare = new ItemOffspringSelector("brukare", "Brukare");
ItemOffspringSelector access = new ItemOffspringSelector("access", "WANAccess");
ItemOffspringSelector conn = new ItemOffspringSelector("ansl", "NetworkConnection");
ItemRelationSelector a2b = new ItemRelationSelector("a2b", "Reference", brukare.getId(), access.getId());
ItemRelationSelector a2c = new ItemRelationSelector("a2c", "Reference", conn.getId(), access.getId());
brukare.applyConstraint(new AttributeValueConstraint("name", AttributeValueConstraint.LIKE, "A%"));
//conn.applyConstraint(new AttributeValueConstraint("node", AttributeValueConstraint.LIKE, "%sos%"));
ItemAliasSelector status = new ItemAliasSelector("connectionStatus", "NetworkConnectionStatus");
status.setAlias("Production");
ItemRelationSelector c2g = new ItemRelationSelector("c2g", "PointsTo", status.getId(), conn.getId());
//q.addSelector(c2g);
//q.addSelector(status);
access.setPageInfo(new PageInfo(0, 25));
access.setPrimary(true);
q.addSelector(access);
q.addSelector(brukare);
q.addSelector(conn);
q.addSelector(a2b);
q.addSelector(a2c);
Graph result = cmdbService.queryGraph(token, q);
/*
QueryHandler handler = new QueryHandler(session);
Graph result = handler.execute2(q);
result.buildMap();
*/
result.buildMap();
Template aTemplate = result.fetchNode("access");
for (CiBean a : aTemplate.getOffsprings()) {
Template con = result.fetchReference(a, RelationConstraint.SOURCE, "a2c");
Template bruk = result.fetchReference(a, RelationConstraint.SOURCE, "a2b");
System.out.println(aTemplate.getId() + ":" + a.getAlias());
if (con != null) {
System.out.println("\t" + con.getId() + ":" + showAlias(con.getOffsprings()) + "[" +con.getOffsprings().size() +"]" );
} else {
System.out.println("NO Connection");
}
if (bruk != null) {
System.out.println("\t" + bruk.getId() + ":" + showAlias(bruk.getOffsprings()) + "[" + bruk.getOffsprings().size() + "]");
} else {
System.out.println("NO BRUK");
}
}
}
private String showAlias(List<CiBean> beans) {
StringBuffer b = new StringBuffer();
b.append("{");
for (CiBean bean : beans) {
b.append(bean.getAlias() + ", ");
}
b.append("}");
return(b.toString());
}
/**
* Query brukare where name starts with a.
* Return a Tree of this type.
* WANAccess
* --> Brukare.
* --> Anslutning.
*/
public void xtestSimpleGraph() {
//org.acegisecurity.providers.ldap.LdapAuthenticationProvider
ItemOffspringSelector brukare = new ItemOffspringSelector("brukare", "Brukare");
ItemOffspringSelector access = new ItemOffspringSelector("access", "WANAccess");
ItemOffspringSelector conn = new ItemOffspringSelector("ansl", "NetworkConnection");
ItemRelationSelector a2b = new ItemRelationSelector("a2b", "Reference", brukare.getId(), access.getId());
ItemRelationSelector a2c = new ItemRelationSelector("a2c", "Reference", conn.getId(), access.getId());
ItemAndGroupConstraint bConstraint = new ItemAndGroupConstraint();
bConstraint.add(new AttributeValueConstraint("name", AttributeValueConstraint.LIKE, "A%"));
brukare.applyConstraint(bConstraint);
ItemAndGroupConstraint con1 = new ItemAndGroupConstraint();
con1.add(new RelationConstraint(RelationConstraint.SOURCE, a2b.getId()));
access.applyConstraint(con1);
ItemAndGroupConstraint con2 = new ItemAndGroupConstraint();
con2.add(new RelationConstraint(RelationConstraint.TARGET, a2b.getId()));
conn.applyConstraint(con2);
GraphQuery query = new GraphQuery();
access.setPageInfo(new PageInfo(0, 20));
query.addSelector(access);
query.addSelector(brukare);
query.addSelector(a2b);
query.addSelector(conn);
query.addSelector(a2c);
IModelService mservice = (IModelService)session.getService(IModelService.class);
QueryHandler handler = new QueryHandler(session);
long start = System.currentTimeMillis();
Graph result = null;//handler.execute(query);
result.buildMap();
for (Template node: result.getNodes()) {
System.out.println("Template id=" + node.getId() + ", count " + node.getOffsprings().size() + "(" + node.getTotalCount() +")");
}
for (Template node: result.getEdges()) {
System.out.println("Edge id=" + node.getId() + ", count " + node.getOffsprings().size() + "(" + node.getTotalCount() +")");
}
Template t = result.fetchNode("access");
for (CiBean b : t.getOffsprings()) {
Template brukResult = result.fetchReference(b, RelationConstraint.SOURCE, "b2a");
Template anslResult = result.fetchReference(b, RelationConstraint.SOURCE, "a2c");
System.out.print(t.getId() + ":" + b.toString());
System.out.print(";" + brukResult.getId() + ":" + brukResult.getOffsprings().size());
System.out.println(";" + anslResult.getId() + ":" + anslResult.getOffsprings().size());
}
long stop = System.currentTimeMillis();
System.out.println("Query: " + (stop-start) + "ms");
}
private List<String> importModel(String urls[]) {
List<String> report = new ArrayList<String>();
for (String url : urls) {
long start = System.currentTimeMillis();
XmlParser parser = new XmlParser();
parser.addURL(url);
CiBean beans[] = parser.getBeans().toArray(new CiBean[0]);
IRfcResult result = cmdbService.update(token, beans, null);
long stop = System.currentTimeMillis();
Assert.assertEquals(null, result.getRejectCause());
long dt = stop-start;
long msPci = dt / beans.length;
String msg = "IMPORT: [" + url + "] ci's [" + beans.length + "] time=" + dt + "ms, " + msPci + "ms/ci";
report.add(msg);
System.out.println(msg);
}
return(report);
}
private void deleteModel() {
CiBean bruk = new CiBean("Ci", "Brukare", true);
CiBean access = new CiBean("Ci", "WANAccess", true);
CiBean conn = new CiBean("Ci", "NetworkConnection", true);
cmdbService.update(token, null, new CiBean[] {bruk, access, conn});
}
private void createModel() {
List beans = new ArrayList();
CiBean bruk = new CiBean("Ci", "Brukare", true);
bruk.addAttribute(new AttributeBean("name", "xs:string",null, false));
CiBean access = new CiBean("Ci", "WANAccess", true);
access.addAttribute(new AttributeBean("brukare", "Brukare", "Reference", true));
access.addAttribute(new AttributeBean("networkConnection", "NetworkConnection", "Reference", true));
CiBean conn = new CiBean("Ci", "NetworkConnection", true);
conn.addAttribute(new AttributeBean("lanIF", "xs:string", null, false));
beans.add(bruk);
beans.add(access);
beans.add(conn);
for (int i = 0; i < 5000; i++) {
CiBean ib = new CiBean("Brukare", "b-" + i, false);
CiBean ia = new CiBean("WANAccess", "a-" + i, false);
CiBean ic = new CiBean("NetworkConnection", "c-" + i, false);
ia.addAttributeValue(new ValueBean("brukare", ib.getAlias(), true));
ia.addAttributeValue(new ValueBean("networkConnection", ic.getAlias(), true));
Character a = new Character('A');
int c = a.charValue();
int offset = (i % 25);
System.out.println("c=" + c + "offset=" + offset);
Character t = new Character((char)(c + offset));
String name = t.toString() + "Brukare XXXX";
System.out.println("Name=" + name);
ib.addAttributeValue(new ValueBean("name",name, false));
beans.add(ib);
beans.add(ia);
beans.add(ic);
}
cmdbService.update(token, (CiBean[])beans.toArray(new CiBean[0]), null);
}
}