/*
* 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.client.window.mdr;
import java.util.ArrayList;
import java.util.List;
import org.onecmdb.ui.gwt.desktop.client.mvc.CMDBEvents;
import org.onecmdb.ui.gwt.desktop.client.service.CMDBAsyncCallback;
import org.onecmdb.ui.gwt.desktop.client.service.model.CIModel;
import org.onecmdb.ui.gwt.desktop.client.service.model.CMDBDesktopWindowItem;
import org.onecmdb.ui.gwt.desktop.client.service.model.CMDBPermissions;
import org.onecmdb.ui.gwt.desktop.client.service.model.CMDBSession;
import org.onecmdb.ui.gwt.desktop.client.service.model.ModelServiceFactory;
import org.onecmdb.ui.gwt.desktop.client.service.model.grid.AttributeColumnConfig;
import org.onecmdb.ui.gwt.desktop.client.service.model.grid.GridModelConfig;
import org.onecmdb.ui.gwt.desktop.client.service.model.mdr.TransformConfig;
import org.onecmdb.ui.gwt.desktop.client.widget.CompareGridWidget;
import org.onecmdb.ui.gwt.desktop.client.widget.form.InputFormWidget;
import org.onecmdb.ui.gwt.desktop.client.widget.help.HelpInfo;
import org.onecmdb.ui.gwt.desktop.client.widget.help.TabWizardBar;
import org.onecmdb.ui.gwt.desktop.client.widget.mdr.MDRDataSourceConfig;
import org.onecmdb.ui.gwt.desktop.client.widget.mdr.MDRStartWidget;
import org.onecmdb.ui.gwt.desktop.client.widget.mdr.MDRTransformFinished;
import org.onecmdb.ui.gwt.desktop.client.widget.mdr.MDRTransformTableConfigurator;
import org.onecmdb.ui.gwt.desktop.client.widget.mdr.PreviewTableWidget;
import org.onecmdb.ui.gwt.desktop.client.window.CMDBAbstractWidget;
import org.onecmdb.ui.gwt.desktop.client.window.WidgetDescription;
import org.onecmdb.ui.gwt.desktop.client.window.model.CMDBModelDesignerView;
import com.extjs.gxt.ui.client.Events;
import com.extjs.gxt.ui.client.data.BaseModel;
import com.extjs.gxt.ui.client.data.ChangeEvent;
import com.extjs.gxt.ui.client.data.ChangeListener;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.event.WindowEvent;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.TabItem;
import com.extjs.gxt.ui.client.widget.TabPanel;
import com.extjs.gxt.ui.client.widget.Window;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.button.ToolButton;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.TextToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.Widget;
public class MDRConfigureWindow extends CMDBAbstractWidget {
public static final String ID = "cmdb-mdr-config";
protected CIModel mdr;
protected CIModel mdrConfig;
protected TransformConfig transformConfig = new TransformConfig();
private String mdrName;
private String mdrConfigName;
private TextArea dataSourceArea;
//private MDRTransformConfigurator transformPanel;
private MDRTransformTableConfigurator transformPanel;
private boolean doClose = false;
private PreviewTableWidget preview;
private boolean modelChanged;
public MDRConfigureWindow(CMDBDesktopWindowItem item) {
super(item);
}
public MDRConfigureWindow(CMDBPermissions permissions, CIModel mdr,
CIModel mdrConfig) {
super(null);
this.permissions = permissions;
setMdr(mdr);
setMdrConfig(mdrConfig);
}
public CIModel getMdr() {
return mdr;
}
public void setMdr(CIModel mdr) {
this.mdr = mdr;
this.mdrName = mdr.getValue("name").getValue();
}
public CIModel getMdrConfig() {
return mdrConfig;
}
public void setMdrConfig(CIModel mdrConfig) {
this.mdrConfig = mdrConfig;
this.mdrConfigName = mdr.getValue("name").getValue();
}
@Override
protected void onRender(Element parent, int index) {
super.onRender(parent, index);
ModelServiceFactory.get().loadTransformConfig(CMDBSession.get().getToken(), CMDBSession.get().getDefaultCMDB_MDR(), mdr, mdrConfig, new CMDBAsyncCallback<TransformConfig>() {
@Override
public void onSuccess(TransformConfig arg0) {
transformConfig = arg0;
initUI();
}
});
}
protected void initUI() {
if (transformConfig.getDataSourceType().equals("xml") || !transformConfig.isConfigurabe()) {
MessageBox.alert("Alert", "This MDR is not currently configurable!", new Listener<WindowEvent>() {
public void handleEvent(WindowEvent be) {
// Close window...
if (getParent() instanceof Window) {
((Window)getParent()).close();
}
}
});
return;
}
TabPanel tab = new TabPanel();
// Listen on changes.
this.transformConfig.addChangeListener(new ChangeListener() {
public void modelChanged(ChangeEvent event) {
modelChanged = true;
}
});
TabItem tabItem1 = new TabItem("1. Data Source");
tabItem1.setLayout(new FitLayout());
TabItem tabItem2 = new TabItem("2. Data Source Preview");
tabItem2.setLayout(new FitLayout());
TabItem tabItem3 = new TabItem("3. Transform Setup");
tabItem3.setLayout(new FitLayout());
TabItem tabItem4 = new TabItem("4. Transform Execute");
tabItem4.setLayout(new FitLayout());
TabItem tabItem5 = new TabItem("5. Execution Result");
tabItem5.setLayout(new FitLayout());
tabItem1.add(new MDRDataSourceConfig(this.mdrName, transformConfig));
tab.add(tabItem1);
tabItem1.addListener(Events.Select, new Listener<BaseEvent>() {
public void handleEvent(BaseEvent be) {
HelpInfo.show("help/mdr/help-mdr-datasource.html");
}
});
final ContentPanel previewPanel = getDataSourcePreviewTab();
tabItem2.add(previewPanel);
tabItem2.addListener(Events.Select, new Listener<BaseEvent>() {
public void handleEvent(BaseEvent be) {
HelpInfo.show("help/mdr/help-mdr-datasource-preview.html");
reloadPreview(previewPanel);
}
});
tab.add(tabItem2);
/*
tabItem = new TabItem("3. OneCMDB Model");
tabItem.setLayout(new FitLayout());
final CMDBModelDesignerView modelWidget = getCMDBModelPanel();
tabItem.add(modelWidget);
tabItem.setLayoutOnChange(true);
tab.add(tabItem);
*/
final MDRTransformTableConfigurator transform = getTransformPanel();
tabItem3.add(transform);
tabItem3.addListener(Events.Select, new Listener<BaseEvent>() {
public void handleEvent(BaseEvent be) {
transform.update();
}
});
tab.add(tabItem3);
/*
tabItem4.add(getTransformExecutePanel());
tabItem4.addListener(Events.Select, new Listener<BaseEvent>() {
public void handleEvent(BaseEvent be) {
HelpInfo.show("help/mdr/help-mdr-execute.html");
if (modelChanged()) {
MessageBox.confirm("Save!","Save Configuration before execution?", new Listener<WindowEvent>() {
public void handleEvent(WindowEvent be) {
Button b = be.buttonClicked;
if (b.getItemId().equals(Dialog.YES)) {
storeConfig(false);
}
}
});
}
}
});
tab.add(tabItem4);
*/
/*
final CompareGridWidget cmp = getTransformPreviewPanel();
tabItem5.add(cmp);
tabItem5.addListener(Events.Select, new Listener<BaseEvent>() {
public void handleEvent(BaseEvent be) {
HelpInfo.show("help/mdr/help-mdr-execute-result.html");
// Find lateset history....
ModelServiceFactory.get().getLatsetMDRConfigHistory(CMDBSession.get().getToken(),
CMDBSession.get().getDefaultCMDB_MDR(),
mdrConfig,
new CMDBAsyncCallback<CIModel>() {
@Override
public void onSuccess(CIModel arg0) {
if (arg0 == null) {
MessageBox.alert("Problem", "Can't find any history", null);
return;
}
String status = arg0.getValueAsString("status");
if (!status.equals("READY")) {
MessageBox.alert("Problem", "Not ready to preview, run execute first", null);
return;
}
cmp.setModels(mdr, mdrConfig, arg0);
}
});
}
});
tab.add(tabItem5);
*/
ToolBar bar = new ToolBar();
//bar.add(new FillToolItem());
TextToolItem save = new TextToolItem("Save", "save-icon");
save.addSelectionListener(new SelectionListener<ComponentEvent>() {
@Override
public void componentSelected(ComponentEvent ce) {
storeConfig(false);
}
});
//bar.add(save);
//bar.add(new FillToolItem());
TextToolItem close = new TextToolItem("Finish", "close-icon");
close.addSelectionListener(new SelectionListener<ComponentEvent>() {
@Override
public void componentSelected(ComponentEvent ce) {
if (getParent() instanceof Window) {
((Window)getParent()).close();
}
}
});
//bar.add(close);
TabItem finishTab = new TabItem("4. Finish");
finishTab.setLayout(new FitLayout());
finishTab.add(new MDRTransformFinished(save, close));
tab.add(finishTab);
setLayout(new FitLayout());
ContentPanel panel = new ContentPanel();
panel.setLayout(new FitLayout());
panel.setHeaderVisible(false);
//panel.setTopComponent(bar);
panel.add(tab);
add(panel);
layout();
// Add dialog close warning about saving....
if (getParent() instanceof Window) {
final Window parent = (Window)getParent();
parent.addListener(Events.BeforeClose, new Listener<BaseEvent>() {
public void handleEvent(BaseEvent be) {
if (doClose) {
return;
}
if (!modelChanged()) {
return;
}
be.doit = false;
MessageBox.confirm("Save!","Save Transform Configuration?", new Listener<WindowEvent>() {
public void handleEvent(WindowEvent be) {
Button b = be.buttonClicked;
if (b.getItemId().equals(Dialog.YES)) {
storeConfig(true);
return;
}
doClose = true;
parent.close();
}
});
}
});
}
}
/**
* Need to know if something changed.
*
* @return
*/
protected boolean modelChanged() {
return(this.modelChanged);
}
protected void storeConfig(final boolean close) {
ModelServiceFactory.get().storeTransformConfig(CMDBSession.get().getToken(),
CMDBSession.get().getDefaultCMDB_MDR(),
mdr,
mdrConfig,
transformConfig,
new CMDBAsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean arg0) {
modelChanged = false;
MessageBox.info("Saved", "Transform Configuration Saved", new Listener<WindowEvent>() {
public void handleEvent(WindowEvent be) {
if (close) {
if (getParent() instanceof Window) {
doClose = true;
((Window)getParent()).close();
}
}
}
});
}
});
}
private CompareGridWidget getTransformPreviewPanel() {
CompareGridWidget widget = new CompareGridWidget();
return(widget);
}
private Widget getTransformExecutePanel() {
List<CIModel> configs = new ArrayList<CIModel>();
configs.add(mdrConfig);
return(new MDRStartWidget(mdr, configs));
}
private CMDBModelDesignerView getCMDBModelPanel() {
CMDBDesktopWindowItem item = new CMDBDesktopWindowItem();
BaseModel params = new BaseModel();
params.set("rootCI", "Ci");
params.set("rootReferenceType", "Reference");
item.setParams(params);
CMDBPermissions perm = new CMDBPermissions();
perm.setCurrentState(CMDBPermissions.PermissionState.READONLY);
BaseModel allowed = new BaseModel();
allowed.set("readony", true);
allowed.set("editable", true);
allowed.set("deletable", false);
allowed.set("clasify", false);
perm.setLocalPermission(allowed);
CMDBModelDesignerView view = new CMDBModelDesignerView(item);
return(view);
}
private MDRTransformTableConfigurator getTransformPanel() {
//transformPandel = new MDRTransformConfigurator(transformConfig);
transformPanel = new MDRTransformTableConfigurator(transformConfig);
return(transformPanel);
}
/*
protected LayoutContainer getDataSourcePanel() {
TabItem confTab = new TabItem("DataSource");
confTab.setLayout(new FitLayout());
confTab.add(getDataSourceConfigTab());
TabItem previewTab = new TabItem("Preview");
previewTab.setLayout(new FitLayout());
previewTab.add(getDataSourcePreviewTab());
TabPanel tab = new TabPanel();
tab.add(confTab);
tab.add(previewTab);
LayoutContainer container = new LayoutContainer();
container.setLayout(new FitLayout());
container.add(tab);
return(container);
}
*/
private ContentPanel getDataSourcePreviewTab() {
final ContentPanel panel = new ContentPanel();
panel.setLayout(new FitLayout());
panel.getHeader().addTool(new ToolButton("x-tool-refresh", new SelectionListener<ComponentEvent>() {
@Override
public void componentSelected(ComponentEvent ce) {
reloadPreview(panel);
}
}));
preview = new PreviewTableWidget(transformConfig);
/*
preview.addListener(CMDBEvents.MDR_GRID_AVAILIABLE, new Listener<BaseEvent>() {
public void handleEvent(BaseEvent be) {
if (be.source instanceof GridModelConfig) {
setSourceColumns((GridModelConfig)be.source);
}
}
});
*/
panel.add(preview);
return(panel);
/*
LayoutContainer container = new LayoutContainer();
container.setLayout(new FitLayout());
container.add(new WidgetComponent(new TextArea()));
return(container);
*/
}
protected void reloadPreview(final ContentPanel panel) {
panel.removeAll();
PreviewTableWidget preview = new PreviewTableWidget(transformConfig);
/*
preview.addListener(CMDBEvents.MDR_GRID_AVAILIABLE, new Listener<BaseEvent>() {
public void handleEvent(BaseEvent be) {
if (be.source instanceof GridModelConfig) {
setSourceColumns((GridModelConfig)be.source);
}
}
});
*/
panel.add(preview);
panel.layout();
}
private void setSourceColumns(GridModelConfig source) {
/*
if (transformPanel != null) {
transformPanel.setSourceGridConfig(source);
}
*/
}
/*
private List<AttributeColumnConfig> getDataSourceConfig() {
AttributeColumnConfig type = new AttributeColumnConfig();
type.setType("xs:radiogroup");
type.setId("sourceType");
type.setName("Type");
type.addRadio("csv");
type.addRadio("excel");
type.addRadio("jdbc");
type.addRadio("xml");
type.set("csv", getDataSourceCSVConfig());
type.set("excel", getDataSourceExcelConfig());
type.set("jdbc", getDataSourceJDBCConfig());
//type.set("xml", getDataSourceXMLConfig());
List<AttributeColumnConfig> list = new ArrayList<AttributeColumnConfig>();
list.add(type);
return(list);
}
private List<AttributeColumnConfig> getDataSourceExcelConfig() {
AttributeColumnConfig url = new AttributeColumnConfig();
url.setType("xs:content");
url.setId("excel.url");
url.setContentRoot("/MDR/" + mdrName);
url.setName("Excel File");
url.setTooltip("The excel file, must be located in the MDR repository directory on the server");
AttributeColumnConfig sheet = new AttributeColumnConfig();
sheet.setType("xs:string");
sheet.setId("excel.sheet");
sheet.setName("Sheet");
sheet.setTooltip("The name of the sheet or the index of the sheet starting from 0");
AttributeColumnConfig nHeaders = new AttributeColumnConfig();
nHeaders.setType("xs:integer");
nHeaders.setId("excel.headerLines");
nHeaders.setName("Data Start Row");
nHeaders.setTooltip("The first row in the excel sheet that should be regarded as data");
AttributeColumnConfig nHeaderRow = new AttributeColumnConfig();
nHeaderRow.setType("xs:integer");
nHeaderRow.setId("excel.headerRow");
nHeaderRow.setName("Header Row");
nHeaderRow.setTooltip("Which row should be used for column headers");
List<AttributeColumnConfig> list = new ArrayList<AttributeColumnConfig>();
list.add(url);
list.add(sheet);
list.add(nHeaderRow);
list.add(nHeaders);
return(list);
}
private List<AttributeColumnConfig> getDataSourceJDBCConfig() {
List<AttributeColumnConfig> list = new ArrayList<AttributeColumnConfig>();
AttributeColumnConfig col = new AttributeColumnConfig();
col.setType("xs:content");
col.setId("jdbc.lib");
col.setContentRoot("MDR/" + mdrName);
col.setName("JDBC Lib");
col.setTooltip("The jar-file containing the hdbc driver for the database");
list.add(col);
col = new AttributeColumnConfig();
col.setType("xs:string");
col.setId("jdbc.url");
col.setName("DB URL");
col.setTooltip("The url to connect to the database");
list.add(col);
col = new AttributeColumnConfig();
col.setType("xs:string");
col.setId("jdbc.driverClass");
col.setName("DB Driver Class");
col.setTooltip("The driver in the driver jar to use");
list.add(col);
col = new AttributeColumnConfig();
col.setType("xs:string");
col.setId("jdbc.user");
col.setName("User");
col.setTooltip("The username to use when connecting to the database");
list.add(col);
col = new AttributeColumnConfig();
col.setType("xs:password");
col.setId("jdbc.password");
col.setName("Password");
col.setTooltip("The password to use when connecting to the database");
list.add(col);
col = new AttributeColumnConfig();
col.setType("xs:textarea");
col.setId("jdbc.query");
col.setName("SQL Query");
col.setTooltip("Specifies the SQL query to retrive data from the database");
list.add(col);
return(list);
}
private List<AttributeColumnConfig> getDataSourceCSVConfig() {
List<AttributeColumnConfig> list = new ArrayList<AttributeColumnConfig>();
AttributeColumnConfig url = new AttributeColumnConfig();
url.setType("xs:content");
url.setId("csv.url");
url.setName("CSV File");
url.setTooltip("The csv file, must be located in the MDR repository directory on the server");
list.add(url);
AttributeColumnConfig nHeaderRow = new AttributeColumnConfig();
nHeaderRow.setType("xs:integer");
nHeaderRow.setId("csv.headerRow");
nHeaderRow.setName("Header Row");
nHeaderRow.setTooltip("Which row should be used for column headers");
list.add(nHeaderRow);
AttributeColumnConfig nHeaders = new AttributeColumnConfig();
nHeaders.setType("xs:integer");
nHeaders.setId("csv.headerLines");
nHeaders.setName("Data Start Row");
nHeaders.setTooltip("The first row in the csv file that should be regarded as data");
list.add(nHeaders);
AttributeColumnConfig col = new AttributeColumnConfig();
col.setType("xs:string");
col.setId("csv.colDel");
col.setName("Column Delimiter");
list.add(col);
return(list);
}
private List<AttributeColumnConfig> getDataSourceXMLConfig() {
List<AttributeColumnConfig> list = new ArrayList<AttributeColumnConfig>();
AttributeColumnConfig url = new AttributeColumnConfig();
url.setType("xs:content");
url.setId("xml.url");
url.setName("URL");
list.add(url);
return(list);
}
private Widget getDataSourceConfigTab(TabItem next) {
ContentPanel cp = new ContentPanel();
cp.setHeaderVisible(false);
cp.setLayout(new FitLayout());
TabWizardBar bar = new TabWizardBar(next);
cp.setTopComponent(bar);
InputFormWidget input = new InputFormWidget(transformConfig, getDataSourceConfig());
input.setFieldWidth(300);
input.setLabelWidth(100);
cp.add(input);
return(cp);
}
*/
@Override
public WidgetDescription getDescription() {
WidgetDescription desc = new WidgetDescription();
desc.setId(ID);
desc.setName("OneCMDB MDR Configuratior");
desc.setDescription("A Widget that views all defined MDR(s). It's also possiable to start importing from MDR.");
desc.addParameter("<li>MDR - MDR</li>");
desc.addParameter("<li>MDR config</li>");
return(desc);
}
}