/*
* 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.ui.gwt.desktop.server.service.model.mdr;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.onecmdb.core.utils.bean.CiBean;
import org.onecmdb.ui.gwt.desktop.client.service.model.AttributeModel;
import org.onecmdb.ui.gwt.desktop.client.service.model.CIModel;
import org.onecmdb.ui.gwt.desktop.client.service.model.mdr.transform.AttributeSelectorModel;
import org.onecmdb.ui.gwt.desktop.client.service.model.mdr.transform.DataSetModel;
import org.onecmdb.ui.gwt.desktop.client.service.model.mdr.transform.TransformModel;
import org.onecmdb.ui.gwt.desktop.server.service.change.ICIMDR;
import org.onecmdb.ui.gwt.desktop.server.service.model.Transform;
public class AutoResolveRelation {
private ICIMDR mdr;
private String token;
HashMap<String, CIModel> map = new HashMap<String, CIModel>();
Transform tr = new Transform();
public AutoResolveRelation(ICIMDR mdr, String token) {
this.mdr = mdr;
this.token = token;
}
public TransformModel autoResolve(TransformModel model) {
// Need all templates....
for (DataSetModel ds : model.getDataSets()) {
resolveOutgoingRelation(ds, model);
}
return(model);
}
private void resolveOutgoingRelation(DataSetModel ds, TransformModel model) {
// Find outgoing relations...
if (ds.getTemplate() == null) {
return;
}
for (AttributeModel am : ds.getTemplate().getAttributes()) {
if (!am.isComplex()) {
continue;
}
CIModel toType = am.getComplexType();
if (toType == null) {
continue;
}
List<DataSetModel> matched = matchTemplate(model, toType);
// Update model...
for (DataSetModel relDS : matched) {
AttributeSelectorModel sel = new AttributeSelectorModel();
sel.setAttribute(am);
sel.setSelector(relDS.getName());
System.out.println("Relation: " + ds.getName() + "-->" + relDS.getName());
// Don't connect to ourselfs..
if (ds.getName().equals(relDS.getName())) {
continue;
}
// Check that we don't alread have this.
if (notASNotExists(ds, sel)) {
ds.addAttributeSelector(sel);
}
}
}
}
private boolean notASNotExists(DataSetModel ds, AttributeSelectorModel sel) {
for (AttributeSelectorModel v : ds.getAttributeSelector()) {
if (v.getAttribute().getAlias().equals(sel.getAttribute().getAlias())) {
return(false);
}
}
return(true);
}
private List<DataSetModel> matchTemplate(TransformModel model, CIModel target) {
List<DataSetModel> list = new ArrayList<DataSetModel>();
for (DataSetModel ds : model.getDataSets()) {
if (isInherited(target, ds.getTemplate())) {
list.add(ds);
}
}
return(list);
}
private boolean isInherited(CIModel model, CIModel parent) {
if (parent == null || model == null) {
return(false);
}
if (parent.getAlias().equals(model.getAlias())) {
return(true);
}
String parentName = parent.getDerivedFrom();
// Find parent...
if (parentName == null) {
return(false);
}
CIModel p = map.get(parentName);
if (p == null) {
CiBean bean = mdr.getCI(token, parentName);
p = tr.convert(mdr, token, bean, bean);
map.put(p.getAlias(), p);
}
return(isInherited(model,p));
}
protected String getDerivedPath(CIModel ci) {
if (ci.getDerivedFrom() == null) {
return("/" + ci.getAlias() + "/");
}
CiBean parent = mdr.getCI(token, ci.getDerivedFrom());
Transform tr = new Transform();
CIModel p = tr.convert(mdr, token, parent, parent);
return(getDerivedPath(p) + "" + ci.getAlias() + "/");
}
}