/*
* 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.transform;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.onecmdb.core.utils.IBeanProvider;
import org.onecmdb.core.utils.MemoryBeanProvider;
import org.onecmdb.core.utils.bean.BeanClassInjector;
import org.onecmdb.core.utils.bean.CiBean;
import org.onecmdb.core.utils.wsdl.IOneCMDBWebService;
public class TransformBeanProvider implements IBeanProvider {
private IDataSource dataSource;
private IBeanProvider transformProvider;
private String name;
private IBeanProvider resultProvider = null;
private HashMap<String, String> valueMap;
private IOneCMDBWebService webService;
private String token;
private boolean validate = true;
private int queryCount;
TransformEngine engine = new TransformEngine();
Log log = LogFactory.getLog(this.getClass());
//private MemoryBeanProvider memProvider = new MemoryBeanProvider();
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public IOneCMDBWebService getWebService() {
return webService;
}
/**
* set this if validation to a cmdb is to be performed.
*
* @param webService
*/
public void setWebService(IOneCMDBWebService webService) {
this.webService = webService;
}
public IDataSource getDataSource() {
return dataSource;
}
public void setDataSource(IDataSource dataSource) {
this.dataSource = dataSource;
}
public IBeanProvider getTransformProvider() {
return transformProvider;
}
public void setTransformProvider(IBeanProvider transformProvider) {
this.transformProvider = transformProvider;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public CiBean getBean(String alias) {
if (resultProvider == null) {
try {
transform();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return(null);
}
}
return(transformProvider.getBean(alias));
}
public List<CiBean> getBeans() {
if (resultProvider == null) {
try {
transform();
} catch (IOException e) {
throw new IllegalArgumentException("Error: " + e.getMessage(), e);
//return(Collections.EMPTY_LIST);
}
}
return(resultProvider.getBeans());
}
protected void transform() throws IOException {
// Setup engine...
engine.setWebService(webService);
engine.setToken(token);
engine.setValidate(this.validate);
resultProvider = new MemoryBeanProvider();
if (this.name == null) {
this.name = "primary-forward";
}
if (this.name != null) {
CiBean bean = transformProvider.getBean(this.name);
if (bean == null) {
// Try the primary-forward...
bean = transformProvider.getBean("primary-forward");
if (bean == null) {
throw new IOException("Data Set name <" + this.name + "> not found!");
}
}
process((MemoryBeanProvider)resultProvider, bean);
} else {
for (CiBean bean : transformProvider.getBeans()) {
process((MemoryBeanProvider)resultProvider, bean);
}
}
}
protected void process(MemoryBeanProvider result, CiBean bean) throws IOException {
if (!bean.getDerivedFrom().startsWith("DataSet")) {
return;
}
BeanClassInjector injector = new BeanClassInjector();
injector.setBeanProvider(transformProvider);
injector.setValueMap(this.valueMap);
Object o = injector.beanToObject(bean);
if (o instanceof DataSet) {
DataSet dataSet = (DataSet)o;
dataSet.setDataSource(dataSource);
//TransformEngine engine = new TransformEngine();
IBeanProvider partResult = engine.transform(transformProvider, (DataSet)o);
List<CiBean> beans = partResult.getBeans();
log.info(dataSet.getName() + " --> " + beans.size());
for (CiBean rBean : beans) {
result.addBean(rBean);
}
this.queryCount += engine.getQueryCount();
}
}
public int getQueryCount() {
return queryCount;
}
public Set<CiBean> getBeansForDataSet(String dsName) {
return(engine.getBeansForDataSet("DataSet-" + dsName));
}
public void setValueMap(HashMap<String, String> valueMap) {
this.valueMap = valueMap;
}
public void setValidate(boolean value) {
this.validate = value;
}
}