/*
* 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.utils.xml;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.onecmdb.core.IRFC;
import org.onecmdb.core.internal.ccb.rfc.RFCAddAttribute;
import org.onecmdb.core.internal.ccb.rfc.RFCDestroy;
import org.onecmdb.core.internal.ccb.rfc.RFCModifyAttributeValue;
import org.onecmdb.core.internal.ccb.rfc.RFCModifyDerivedAttributeValue;
import org.onecmdb.core.internal.ccb.rfc.RFCNewAttribute;
import org.onecmdb.core.internal.ccb.rfc.RFCNewCi;
import org.onecmdb.core.internal.model.ItemId;
import org.onecmdb.core.utils.bean.AttributeBean;
import org.onecmdb.core.utils.bean.CiBean;
import org.onecmdb.core.utils.bean.ValueBean;
/**
* Old comparer.
*
* @deprecated use BeanCompare
*
*/
public class BeanToRfcWorker {
private Log log = LogFactory.getLog(this.getClass());
private boolean noUpdate;
/**
* If true on new ci wil be created.
* @param noUpdate
*/
public void setNoUpdate(boolean noUpdate) {
this.noUpdate = noUpdate;
}
public void cmpBean(CiBean remoteBean, CiBean localBean, BeanScope scope, RfcContainer rfcContainer) {
// Handle correct sequence!
if (localBean != null) {
// Skip root object.
if (localBean.getDerivedFrom() == null || localBean.getDerivedFrom().equals("null")) {
return;
}
scope.processBean(localBean.getDerivedFrom());
}
// DELETE
if (remoteBean != null && localBean == null) {
RFCDestroy destoryRfc = new RFCDestroy();
destoryRfc.setTargetAlias(remoteBean.getAlias());
rfcContainer.addDestory(destoryRfc);
return;
}
// NEW
if (remoteBean == null) {
// Set Status on bean.
RFCNewCi newRfc = new RFCNewCi();
if (localBean.getDerivedFrom() == null) {
throw new IllegalArgumentException("No derived from set on alias=�'" + localBean.getAlias() +"'");
}
newRfc.setTargetAlias(localBean.getDerivedFrom());
if (localBean.getAlias() == null) {
throw new IllegalArgumentException("No alias set on (derivedFrom='" + localBean.getDerivedFrom() +"')");
}
newRfc.setAlias(localBean.getAlias());
if (localBean.getDisplayNameExpression() != null) {
newRfc.setDisplayNameExpression(localBean.getDisplayNameExpression());
}
newRfc.setIsBlueprint(localBean.isTemplate());
if (localBean.getDescription() != null) {
newRfc.setDescription(localBean.getDescription());
}
if (localBean.isTemplate()) {
for (AttributeBean aBean : localBean.getAttributes()) {
if (aBean.isDerived()) {
continue;
}
IRFC rfc = newAttribute(aBean, localBean, scope);
//rfc.setTargetAlias(newBean.getAlias());
rfcContainer.addNewAttribute(rfc);
// need to add attributes last, to handel cyclic dependecies.
//newRfc.add(newAttribute(aBean, scope));
}
}
for (String name : localBean.fetchAttributeValueAliases()) {
int index = 0;
List<IRFC> rfcs = new ArrayList<IRFC>();
for (ValueBean vBean : localBean.fetchAttributeValueBeans(name)) {
AttributeBean aBean = localBean.getAttribute(name);
rfcs.add(setValue(vBean, index, localBean, scope));
//rfc.setTargetAlias(newBean.getAlias());
index++;
}
if (localBean.isTemplate()) {
rfcContainer.addNewTemplateValues(rfcs);
} else {
rfcContainer.addNewInstanceValues(rfcs);
}
}
if (localBean.isTemplate()) {
rfcContainer.addNewTemplate(newRfc);
} else {
rfcContainer.addNewInstance(newRfc);
}
//return (newRfc);
return;
}
if (noUpdate) {
return;
}
// For now can only modify value.
for (String name : localBean.fetchAttributeValueAliases()) {
int index = 0;
// doCmpLog(newBean, oldBean, name);
for (ValueBean newVBean : localBean.fetchAttributeValueBeans(name)) {
boolean doUpdate = true;
int oldValues = 0;
// Check if value already set!.
for (ValueBean oldVBean : remoteBean.fetchAttributeValueBeans(name)) {
oldValues++;
if (newVBean.isComplexValue()) {
if (newVBean.getValue().equals(oldVBean.getValue())) {
doUpdate = false;
break;
}
} else {
if (newVBean.getValue().equals(oldVBean.getValue())) {
doUpdate = false;
break;
}
}
}
if (!doUpdate) {
continue;
}
log.debug("Modify alias '" + newVBean.getAlias() + "' index=" + index + ", value '" + newVBean.getValue() + "'");
List<IRFC> rfcs = new ArrayList<IRFC>();
AttributeBean aBean = remoteBean.getAttribute(name);
if (aBean != null && aBean.fetchMaxOccursAsInt() == 1) {
// Do update on one attribute
IRFC rfc = setValue(newVBean, aBean.getId(), scope);
rfc.setTargetAlias(localBean.getAlias());
rfcs.add(rfc);
} else {
// Add value
rfcs.add(addValue(newVBean, localBean, scope));
}
if (localBean.isTemplate()) {
rfcContainer.addNewTemplateValues(rfcs);
} else {
rfcContainer.addNewInstanceValues(rfcs);
}
}
}
}
private void doCmpLog(CiBean newBean, CiBean oldBean, String name) {
List<ValueBean> newValueBeans = newBean.fetchAttributeValueBeans(name);
List<ValueBean> oldValueBeans = oldBean.fetchAttributeValueBeans(name);
System.out.println(newBean.getAlias() + "." + name + "[" + newValueBeans.size() +"] <--> [" + oldValueBeans.size() + "]");
for (ValueBean v : newValueBeans) {
System.out.println("\tNEW - " + v);
}
for (ValueBean v : oldValueBeans) {
System.out.println("\tOLD - " + v);
}
}
public IRFC setValue(ValueBean vBean, Long aId, BeanScope scope) {
log.debug("Set Value '" + vBean.getAlias() +
"' value='" + vBean.getValue()
+ "' id '" + aId);
RFCModifyAttributeValue mod = new RFCModifyAttributeValue();
mod.setTargetId(aId);
if (vBean.isComplexValue()) {
String aliasName = vBean.getValue();
scope.referenceBean(null, "", aliasName);
mod.setNewValueAsAlias(aliasName);
} else {
mod.setNewValue(vBean.getValue());
}
return(mod);
}
public IRFC addValue(ValueBean vBean, CiBean bean, BeanScope scope) {
log.debug("Add Value '" + vBean.getAlias() +
(vBean.isComplexValue() ?
"' aliasValue='" + vBean.getValue() :
"' value='" + vBean.getValue())
+ "' on ci '" + bean.getAlias());
RFCAddAttribute add = new RFCAddAttribute();
add.setAlias(vBean.getAlias());
add.setTargetAlias(bean.getAlias());
RFCModifyAttributeValue mod = new RFCModifyAttributeValue();
add.add(mod);
if (vBean.isComplexValue()) {
String aliasName = vBean.getValue();
scope.referenceBean(null, "", aliasName);
mod.setNewValueAsAlias(aliasName);
} else {
mod.setNewValue(vBean.getValue());
}
return(add);
}
public IRFC setValue(ValueBean vBean, int index, CiBean bean, BeanScope scope) {
RFCModifyDerivedAttributeValue modify = new RFCModifyDerivedAttributeValue();
modify.setTargetAlias(bean.getAlias());
if (vBean.isComplexValue()) {
String aliasName = vBean.getValue();
scope.referenceBean(bean, "", aliasName);
modify.setValueAsAlias(aliasName);
} else {
modify.setValue(vBean.getValue());
}
modify.setIndex(index);
modify.setAlias(vBean.getAlias());
return (modify);
}
public IRFC newAttribute(AttributeBean aBean, CiBean bean, BeanScope scope) {
// Make sure that the type bean is created first.
log.debug("NEW Attribute '" + aBean.getAlias() + "' on ci '" + bean.getAlias());
scope.referenceBean(bean, "Type", aBean.getType());
if (aBean.getRefType() != null) {
scope.referenceBean(bean, "ReferenceType", aBean.getRefType());
}
RFCNewAttribute newRfc = new RFCNewAttribute();
newRfc.setTargetAlias(bean.getAlias());
if (aBean.getDisplayName() != null) {
newRfc.setDisplayNameExpression(aBean.getDisplayName());
}
newRfc.setAlias(aBean.getAlias());
if (aBean.getDescription() != null) {
newRfc.setDescription(aBean.getDescription());
}
newRfc.setValueTypeAlias(aBean.getType());
if (aBean.getRefType() != null) {
newRfc.setReferenceTypeAlias(aBean.getRefType());
}
if (aBean.getMaxOccurs() != null) {
newRfc.setMaxOccurs(aBean.fetchMaxOccursAsInt());
} else {
newRfc.setMaxOccurs(1);
}
if (aBean.getMinOccurs() != null) {
newRfc.setMinOccurs(aBean.fetchMinOccursAsInt());
} else {
newRfc.setMinOccurs(1);
}
return (newRfc);
}
}