/* * 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.WindowFactory; import org.onecmdb.ui.gwt.desktop.client.action.CloseTextToolItem; 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.content.Config; import org.onecmdb.ui.gwt.desktop.client.service.content.ContentData; import org.onecmdb.ui.gwt.desktop.client.service.content.ContentFile; 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.ColumnFilter; import org.onecmdb.ui.gwt.desktop.client.service.model.ModelServiceFactory; import org.onecmdb.ui.gwt.desktop.client.service.model.ValueListModel; import org.onecmdb.ui.gwt.desktop.client.service.model.ValueModel; import org.onecmdb.ui.gwt.desktop.client.service.model.grid.CIModelCollection; import org.onecmdb.ui.gwt.desktop.client.service.model.grid.GridModelConfig; import org.onecmdb.ui.gwt.desktop.client.service.model.mdr.MDRHistoryState; import org.onecmdb.ui.gwt.desktop.client.utils.CIModelUtils; import org.onecmdb.ui.gwt.desktop.client.utils.PermissionMenu; import org.onecmdb.ui.gwt.desktop.client.widget.CompareGridWidget; import org.onecmdb.ui.gwt.desktop.client.widget.grid.EditableCIInstanceGrid; import org.onecmdb.ui.gwt.desktop.client.widget.grid.INewInstance; import org.onecmdb.ui.gwt.desktop.client.widget.grid.InstanceList; import org.onecmdb.ui.gwt.desktop.client.widget.mdr.MDRStartWindow; import org.onecmdb.ui.gwt.desktop.client.window.CMDBAbstractWidget; import org.onecmdb.ui.gwt.desktop.client.window.WidgetDescription; import com.extjs.gxt.ui.client.Events; import com.extjs.gxt.ui.client.Style.LayoutRegion; import com.extjs.gxt.ui.client.Style.SelectionMode; import com.extjs.gxt.ui.client.binding.FormBinding; import com.extjs.gxt.ui.client.data.BaseModel; 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.SelectionChangedEvent; import com.extjs.gxt.ui.client.event.SelectionListener; import com.extjs.gxt.ui.client.event.ToolBarEvent; import com.extjs.gxt.ui.client.util.Margins; 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.Window; import com.extjs.gxt.ui.client.widget.Window.CloseAction; 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.form.FormPanel; import com.extjs.gxt.ui.client.widget.form.RadioGroup; import com.extjs.gxt.ui.client.widget.form.TextField; import com.extjs.gxt.ui.client.widget.layout.BorderLayout; import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData; import com.extjs.gxt.ui.client.widget.layout.FitLayout; import com.extjs.gxt.ui.client.widget.layout.FormData; 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; public class MDRDetailWindow extends CMDBAbstractWidget { public static final String ID = "cmdb-mdr-view"; private ContentPanel center; private ContentFile mdr; private LayoutContainer configPanel; private ContentPanel historyPanel; private TextToolItem startTool; private TextToolItem configTool; //private TextToolItem historyTool; private List selectedItems; private TextToolItem compare; protected CIModel selectedHistoryModel; protected CIModel selectedMDRConfig; protected CIModel selectedMDR; private EditableCIInstanceGrid historyGrid; private InstanceList list; public MDRDetailWindow(CMDBDesktopWindowItem item) { super(item); } @Override protected void onRender(Element parent, int index) { super.onRender(parent, index); setLayout(new BorderLayout()); mdr = new ContentFile(); String mdrConf = item.getParams().get("mdrConfig"); if (mdrConf == null) { mdrConf = CMDBSession.get().getConfig().get(Config.OneCMDBWebService); } mdr.setPath(mdrConf); String mdrTableName = (String)item.getParams().get("mdrTable"); ContentFile mdrTableFile = new ContentFile(); if (mdrTableName == null) { mdrTableFile.set("template", "MDR_Repository"); } else { mdrTableFile.setPath(mdrTableName); } // Check if we have excludePattern List<String> excludes = item.getParams().get("excludeMDR"); List<String> includes = item.getParams().get("includeMDR"); // Left panel is holding the defined MDR(s) ContentPanel left = new ContentPanel(); left.setHeading("Available MDRs"); left.setLayout(new FitLayout()); list = new InstanceList(mdr, mdrTableFile, "Name"); list.setPermissions(permissions); if (excludes != null) { list.setFilterPatterns(excludes); list.setFilterExclude(true); } if (includes != null) { list.setFilterPatterns(includes); list.setFilterExclude(false); } list.setSelectionListener(getConfigSelectionListener()); left.add(list); left.getHeader().addTool(new ToolButton("x-tool-refresh", new SelectionListener<ComponentEvent>() { @Override public void componentSelected(ComponentEvent ce) { reloadMDRs(); } })); ToolBar top = new ToolBar(); TextToolItem add = new TextToolItem("Add MDR", "add-icon"); add.addSelectionListener(new SelectionListener<ComponentEvent>() { @Override public void componentSelected(ComponentEvent ce) { new AddMDRDialog(permissions, new Listener<BaseEvent>() { public void handleEvent(BaseEvent be) { reloadMDRs(); } }).show(); } }); top.add(new FillToolItem()); top.add(add); left.setTopComponent(top); center = new ContentPanel(); center.setHeading("Available configurations of "); center.setLayout(new BorderLayout()); startTool = new TextToolItem("Execute", "mdr-config-open-icon"); startTool.setToolTip("Excute selected MDR configs"); startTool.setEnabled(false); startTool.addSelectionListener(getStartSelectionListener()); configTool = new TextToolItem("Configure", "config-icon"); configTool.setToolTip("Configure MDR"); configTool.setEnabled(false); configTool.addSelectionListener(getConfigureSelectionListener()); PermissionMenu permMenu = new PermissionMenu(permissions, PermissionMenu.READONLY_MASK|PermissionMenu.EDIT_MASK|PermissionMenu.DELETE_MASK); /* historyTool = new TextToolItem("Show History", "history-icon"); historyTool.setEnabled(false); historyTool.addSelectionListener(getHistorySelectionListener()); */ ToolBar bar = new ToolBar(); bar.add(startTool); bar.add(configTool); bar.add(new FillToolItem()); bar.add(permMenu); //bar.add(historyTool); center.setTopComponent(bar); BorderLayoutData centerCenterData = new BorderLayoutData(LayoutRegion.CENTER); centerCenterData.setMargins(new Margins(5, 0, 5, 0)); BorderLayoutData centerSouthData = new BorderLayoutData(LayoutRegion.SOUTH, 200); centerSouthData.setSplit(true); centerSouthData.setCollapsible(true); centerSouthData.setMargins(new Margins(5)); configPanel = new LayoutContainer(); configPanel.setLayout(new FitLayout()); ToolBar historyBar = new ToolBar(); historyBar.add(new FillToolItem()); compare = new TextToolItem("Open", "compare-icon"); compare.setToolTip("Compare this data to the <br>previous data comitted to cmdb"); compare.setEnabled(false); compare.addSelectionListener(new SelectionListener<ComponentEvent>() { @Override public void componentSelected(ComponentEvent ce) { if (selectedHistoryModel == null) { return; } CompareGridWidget widget = new CompareGridWidget(); List<ContentData> files = new ArrayList<ContentData>(); ValueModel value = selectedHistoryModel.getValue("files"); if (value instanceof ValueListModel) { for (ValueModel vModel : ((ValueListModel)value).getValues()) { if (vModel.getValue() != null) { ContentFile file = new ContentFile(vModel.getValue()); files.add(file); } } } else { if (value.getValue() != null) { ContentFile file = new ContentFile(value.getValue()); files.add(file); } } Window w = WindowFactory.getWindow("Compare selected data with previously imported data", widget); /* Window w = new Window(); w.setSize(600, 400); w.setLayout(new FitLayout()); w.add(widget); */ w.addListener(Events.Close, new Listener<BaseEvent>() { public void handleEvent(BaseEvent be) { reloadHistory(); } }); w.setCloseAction(CloseAction.CLOSE); w.show(); widget.setModels(selectedMDR, selectedMDRConfig, selectedHistoryModel); } }); historyBar.add(compare); /* TextToolItem close = new TextToolItem("Close", "close-icon"); close.setToolTip("Close this window"); close.addSelectionListener(new SelectionListener<ComponentEvent>() { @Override public void componentSelected(ComponentEvent ce) { if (getParent() instanceof Window) { ((Window)getParent()).close(); } } }); */ historyBar.add(new CloseTextToolItem(this)); historyPanel = new ContentPanel(); historyPanel.setLayout(new FitLayout()); historyPanel.setBottomComponent(historyBar); center.add(configPanel, centerCenterData); center.add(historyPanel, centerSouthData); BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER); centerData.setMargins(new Margins(5, 0, 5, 0)); BorderLayoutData westData = new BorderLayoutData(LayoutRegion.WEST, 200); westData.setSplit(true); westData.setCollapsible(true); westData.setMargins(new Margins(5)); add(left, westData); add(center, centerData); layout(); permMenu.addListener(CMDBEvents.PERMISSION_CHANGED, new Listener<BaseEvent>() { public void handleEvent(BaseEvent be) { reloadConfigPanel(); } }); } private SelectionListener getConfigureSelectionListener() { return(new SelectionListener<ToolBarEvent>() { @Override public void componentSelected(ToolBarEvent ce) { if (selectedItems == null || selectedItems.size() == 0) { return; } // Open Window... MDRConfigureWindow config = new MDRConfigureWindow(permissions, selectedMDR, selectedMDRConfig); Window w = WindowFactory.getWindow("MDR Configuration", config); w.setSize(800, 600); w.show(); w.layout(); w.toFront(); } }); } protected void reloadMDRs() { list.getLoader().load(); } private SelectionListener getStartSelectionListener() { return(new SelectionListener<ToolBarEvent>() { @Override public void componentSelected(ToolBarEvent ce) { if (selectedItems == null || selectedItems.size() == 0) { return; } MDRStartWindow start = new MDRStartWindow(selectedMDR, selectedItems); start.setCloseAction(CloseAction.CLOSE); start.addListener(Events.Close, new Listener<BaseEvent>() { public void handleEvent(BaseEvent be) { reloadHistory(); } }); start.show(); } }); } private void reloadHistory() { if (historyGrid != null) { historyGrid.reload(); } } private Listener<SelectionChangedEvent> getConfigSelectionListener() { return(new Listener<SelectionChangedEvent>() { public void handleEvent(SelectionChangedEvent be) { List selected = be.getSelection(); CIModelCollection col = (CIModelCollection) selected.get(0); selectedMDR = col.getCIModels().get(0); reloadConfigPanel(); } }); } private void reloadConfigPanel() { center.setHeading("Available configurations for MDR " + selectedMDR.getDisplayName()); ContentData cd = new ContentData(); String configTemplate = selectedMDR.getValueAsString("configAlias"); cd.set("template", configTemplate); EditableCIInstanceGrid grid = new EditableCIInstanceGrid(mdr, cd, "Config entries for "); grid.setPermissions(permissions); grid.setRootCI("Root"); BaseModel tableConfig = item.getParams().get("mdrConfigTable"); if (tableConfig != null) { grid.setColumnFilter(new ColumnFilter((BaseModel)tableConfig.get("columnFilter"))); } grid.setNewInstanceCallback(new INewInstance() { public CIModelCollection createInstance(GridModelConfig ctrl) { CIModelCollection model = ctrl.createNewInstance(); // Connect config to mdr. CIModel config = model.getCIModels().get(0); String derivedFrom = selectedMDR.getValueAsString("configAlias"); if (derivedFrom != null && derivedFrom.length() > 0) { config.setDerivedFrom(derivedFrom); } CIModelUtils.updateModel(config, "mdrRepository", selectedMDR.getAlias(), true); return(model); } }); grid.setHeaderVisible(false); grid.setSelectable(true); grid.setSelectionMode(SelectionMode.MULTI); grid.setQuery(getConfigQuery(selectedMDR)); grid.setSelectionListener(new Listener<SelectionChangedEvent>() { public void handleEvent(SelectionChangedEvent be) { if (be.getSelection().size() == 1) { CIModelCollection col = (CIModelCollection) be.getSelection().get(0); CIModel config = col.getCIModels().get(0); selectedItems = new ArrayList(); selectedItems.add(config); boolean redraw = true; if (config.equals(selectedMDRConfig)) { redraw = false; } selectedMDRConfig = config; if (redraw) { showHistory(selectedMDRConfig); } //historyTool.setEnabled(true); startTool.setEnabled(true); configTool.setEnabled(true); } else if (be.getSelection().size() > 0) { hideHistory(); configTool.setEnabled(false); startTool.setEnabled(true); selectedItems = be.getSelection(); selectedMDRConfig = null; //historyTool.setEnabled(false); } else { hideHistory(); selectedItems = null; startTool.setEnabled(false); selectedMDRConfig = null; //historyTool.setEnabled(false); } } }); configPanel.removeAll(); configPanel.add(grid); configPanel.layout(); } private String getConfigQuery(CIModel selectedMDR) { StringBuffer b = new StringBuffer(); String configTemplate = selectedMDR.getValueAsString("configAlias"); b.append("<?xml version=\"1.0\" ?>"); b.append("<GraphQuery>"); b.append("<ItemOffspringSelector id=\"offspring\" template=\"" + configTemplate + "\" primary=\"true\">"); b.append("</ItemOffspringSelector>"); b.append("<ItemAliasSelector id=\"mdr\" template=\"MDR_Repository\" >"); b.append("<alias>" + selectedMDR.getAlias() + "</alias>"); b.append("<excludeInResult>true</excludeInResult>"); b.append("</ItemAliasSelector>"); b.append("<ItemRelationSelector id=\"config2mdr\" template=\"Reference\">"); b.append("<target>mdr</target>"); b.append("<source>offspring</source>"); b.append("</ItemRelationSelector>"); b.append("</GraphQuery>"); return(b.toString()); } private String getHistoryQuery(CIModel selectedConfig) { StringBuffer b = new StringBuffer(); b.append("<?xml version=\"1.0\" ?>"); b.append("<GraphQuery>"); b.append("<ItemOffspringSelector id=\"offspring\" template=\"" + MDRHistoryState.getHistoryTemplate() +"\" primary=\"true\">"); b.append("</ItemOffspringSelector>"); b.append("<ItemAliasSelector id=\"mdr\" template=\"MDR_ConfigEntry\" >"); b.append("<alias>" + selectedConfig.getAlias() + "</alias>"); b.append("<excludeInResult>true</excludeInResult>"); b.append("</ItemAliasSelector>"); b.append("<ItemRelationSelector id=\"config2mdr\" template=\"Reference\">"); b.append("<target>mdr</target>"); b.append("<source>offspring</source>"); b.append("</ItemRelationSelector>"); b.append("</GraphQuery>"); return(b.toString()); } private void hideHistory() { this.selectedMDRConfig = null; historyPanel.removeAll(); historyPanel.layout(); } private void showHistory(CIModel mdrConfig) { this.selectedMDRConfig = mdrConfig; ContentData cd = new ContentData(); cd.set("template", MDRHistoryState.getHistoryTemplate()); historyGrid = new EditableCIInstanceGrid(mdr, cd, "Config entries for "); historyGrid.setRootCI("Root"); historyGrid.setPermissions(new CMDBPermissions(CMDBPermissions.PermissionState.READONLY)); historyGrid.setQuery(getHistoryQuery(mdrConfig)); BaseModel tableConfig = item.getParams().get("mdrHistoryTable"); if (tableConfig != null) { historyGrid.setColumnFilter(new ColumnFilter((BaseModel)tableConfig.get("columnFilter"))); } historyGrid.setHeaderVisible(false); historyGrid.setSelectable(true); historyGrid.setSelectionMode(SelectionMode.SINGLE); historyGrid.setSelectionListener(new Listener<SelectionChangedEvent>() { public void handleEvent(SelectionChangedEvent be) { if (be.getSelection().size() == 1) { compare.setEnabled(true); CIModelCollection col = (CIModelCollection) be.getSelection().get(0); selectedHistoryModel = col.getCIModels().get(0); } else { selectedHistoryModel = null; compare.setEnabled(false); } } }); //grid.setContextMenuItem(getHistoryMenuItem()); historyPanel.removeAll(); historyPanel.setHeading("Execution result for " + mdrConfig.getDisplayName()); historyPanel.add(historyGrid); historyPanel.layout(); } private SelectionListener<ToolBarEvent> getHistorySelectionListener() { return(new SelectionListener<ToolBarEvent>() { @Override public void componentSelected(ToolBarEvent ce) { showHistory(selectedMDRConfig); /* ContentData cd = new ContentData(); cd.set("template", MDRHistoryState.getHistoryTemplate()); final EditableCIInstanceGrid grid = new EditableCIInstanceGrid(mdr, cd, "Config entries for "); grid.setReadonly(true); grid.setHeaderVisible(false); grid.setSelectable(true); grid.setSelectionMode(SelectionMode.SINGLE); grid.setSelectionListener(new Listener<SelectionEvent>() { public void handleEvent(SelectionEvent be) { System.out.println("Selected ..."); if (be.selection.size() == 1) { compare.setEnabled(true); CIModelCollection col = (CIModelCollection) be.selection.get(0); selectedHistoryModel = col.getCIModels().get(0); } else { selectedHistoryModel = null; startTool.setEnabled(false); } } }); //grid.setContextMenuItem(getHistoryMenuItem()); historyPanel.removeAll(); historyPanel.add(grid); historyPanel.layout(); */ } }); } @Override public WidgetDescription getDescription() { WidgetDescription desc = new WidgetDescription(); desc.setId(ID); desc.setName("OneCMDB MDR View"); desc.setDescription("A Widget that views all defined MDR(s). It's also possiable to start importing from MDR."); desc.addParameter("<li>excludeMDR - Exclude MDR names, must be simpleList=true</li>"); desc.addParameter("<li>includeMDR - Include MDR names, must be simpleList=true</li>"); return(desc); } }