/*
* OneCMDB, an open source configuration management project.
* Copyright 2007, Lokomo Systems AB, and individual contributors
* as indicated by the @authors tag. See the copyright.txt in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.onecmdb.ui.gwt.modeller.client.view.screen;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.gwtiger.client.widget.HoverGridWidget;
import org.onecmdb.ui.gwt.modeller.client.OneCMDBModelCreator;
import org.onecmdb.ui.gwt.modeller.client.model.TemplateCache;
import org.onecmdb.ui.gwt.toolkit.client.control.AttributeComparator;
import org.onecmdb.ui.gwt.toolkit.client.control.OneCMDBConnector;
import org.onecmdb.ui.gwt.toolkit.client.control.OneCMDBSession;
import org.onecmdb.ui.gwt.toolkit.client.model.onecmdb.GWT_AttributeBean;
import org.onecmdb.ui.gwt.toolkit.client.model.onecmdb.GWT_CiBean;
import org.onecmdb.ui.gwt.toolkit.client.model.onecmdb.GWT_RfcResult;
import org.onecmdb.ui.gwt.toolkit.client.model.onecmdb.GWT_ValueBean;
import org.onecmdb.ui.gwt.toolkit.client.view.ci.CIIconDisplayNameWidget;
import org.onecmdb.ui.gwt.toolkit.client.view.screen.OneCMDBBaseScreen;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.SourcesTableEvents;
import com.google.gwt.user.client.ui.TableListener;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
public class ListAttributeScreen extends OneCMDBBaseScreen {
private static final int NAME_COL = 0;
private static final int ALIAS_COL = 1;
private static final int TYPE_COL = 2;
private static final int REF_TYPE_COL = 3;
private static final int DERIVED_COL = 4;
private static final int MIN_COL = 5;
private static final int MAX_COL = 6;
private static final int DEFAULT_VALUE_COL = 7;
private GWT_CiBean currentTemplate;
private VerticalPanel vPanel = new VerticalPanel();
private HashMap rowMap = new HashMap();
public ListAttributeScreen() {
super();
dockPanel.add(vPanel, DockPanel.CENTER);
dockPanel.setCellHeight(vPanel, "100%");
initWidget(dockPanel);
}
public void setTemplate(GWT_CiBean template) {
this.currentTemplate = template;
}
public void load(String objectType, Long objectId) {
TemplateCache.load(objectType, new AsyncCallback() {
public void onFailure(Throwable caught) {
setErrorText("ERROR:" + caught);
}
public void onSuccess(Object result) {
if (result instanceof GWT_CiBean) {
setTemplate((GWT_CiBean)result);
load();
return;
}
}
});
}
public void load() {
if (this.currentTemplate == null) {
setErrorText("No Template to show!");
return;
}
setErrorText("");
setTitleText("Attributes for ");
setTitleWidget(new CIIconDisplayNameWidget(this.currentTemplate));
vPanel.clear();
HTML add = new HTML("[<a href='javascript:;'>new</a>]");
add.setTitle("Add a new attribute to this template");
add.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
OneCMDBModelCreator.get().showScreen(OneCMDBModelCreator.ADD_ATTRIBUTE_SCREEN, currentTemplate.getAlias(), new Long(0));
}
});
HorizontalPanel hPanel = new HorizontalPanel();
hPanel.add(add);
hPanel.setCellHorizontalAlignment(add, HorizontalPanel.ALIGN_RIGHT);
hPanel.setWidth("100%");
vPanel.add(hPanel);
vPanel.add(getAttributeTable());
}
private Widget getAttributeTable() {
HoverGridWidget widget = new HoverGridWidget();
widget.addTableListener(new TableListener() {
public void onCellClicked(SourcesTableEvents sender, int row, int cell) {
Object o = rowMap.get(new Integer(row));
if (o instanceof GWT_AttributeBean) {
GWT_AttributeBean aBean = (GWT_AttributeBean)o;
if (!aBean.isDerived()) {
// Edit this.
OneCMDBModelCreator.get().showScreen(
OneCMDBModelCreator.EDIT_ATTRIBUTE_SCREEN,
currentTemplate.getAlias() + "." + aBean.getAlias(), new Long(0));
} else {
Window.alert("Only attributes defined on this CI may be editable!");
}
}
}
});
widget.addHeader(NAME_COL, "Name");
widget.addHeader(ALIAS_COL, "Alias");
widget.addHeader(TYPE_COL, "Type");
widget.addHeader(REF_TYPE_COL, "Reference Type");
widget.addHeader(DERIVED_COL, "Derived");
widget.addHeader(MIN_COL, "Min");
widget.addHeader(MAX_COL, "Max");
widget.addHeader(DEFAULT_VALUE_COL, "Default");
ArrayList derivedSet = new ArrayList();
ArrayList localSet = new ArrayList();
for (Iterator iter = this.currentTemplate.getAttributes().iterator(); iter.hasNext();) {
GWT_AttributeBean aBean = (GWT_AttributeBean)iter.next();
if (aBean.isDerived()) {
derivedSet.add(aBean);
} else {
localSet.add(aBean);
}
}
Collections.sort(derivedSet, getAttributeComparator());
Collections.sort(localSet, getAttributeComparator());
int row = 1;
for (Iterator iter = derivedSet.iterator(); iter.hasNext();) {
GWT_AttributeBean aBean = (GWT_AttributeBean)iter.next();
addAttributeRow(widget, row, aBean);
row++;
}
for (Iterator iter = localSet.iterator(); iter.hasNext();) {
GWT_AttributeBean aBean = (GWT_AttributeBean)iter.next();
addAttributeRow(widget, row, aBean);
row++;
}
return(widget);
}
private Comparator getAttributeComparator() {
return(new AttributeComparator());
}
private void addAttributeRow(HoverGridWidget widget, int row, final GWT_AttributeBean aBean) {
widget.setText(row, NAME_COL, aBean.getDisplayName());
widget.setText(row, ALIAS_COL, aBean.getAlias());
widget.setWidget(row, TYPE_COL, new Hyperlink(aBean.getType(), null));
widget.setText(row, REF_TYPE_COL, aBean.getRefType());
widget.setText(row, DERIVED_COL, aBean.isDerived() ? "*" : " ");
widget.setText(row, MIN_COL, aBean.getMinOccurs());
widget.setText(row, MAX_COL, aBean.getMaxOccurs());
List values = currentTemplate.fetchAttributeValueBeans(aBean.getAlias());
if (values != null && values.size() > 0) {
GWT_ValueBean value = (GWT_ValueBean) values.get(0);
widget.setText(row, DEFAULT_VALUE_COL, value.getValue());
} else {
widget.setText(row, DEFAULT_VALUE_COL, "");
}
if (!aBean.isDerived()) {
Image delete = new Image("images/trashcan16.gif");
delete.setTitle("Delete attribute " + aBean.getDisplayName());
delete.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
delete(aBean);
}
});
widget.setWidget(row, DEFAULT_VALUE_COL+1, delete);
}
rowMap.put(new Integer(row), aBean);
}
protected void delete(GWT_AttributeBean bean) {
if (Window.confirm("Delete attribute " + bean.getDisplayName() + "?")) {
GWT_CiBean copy = this.currentTemplate.copy();
copy.removeAttribute(bean.getAlias());
// Invalidate cache...
TemplateCache.add(this.currentTemplate.getAlias(), null);
// Call update of attribute.
OneCMDBConnector.getInstance().update(OneCMDBSession.getAuthToken(),
new GWT_CiBean[] {copy},
new GWT_CiBean[] {this.currentTemplate},
new AsyncCallback() {
public void onFailure(Throwable caught) {
setErrorText("ERROR:" + caught);
}
public void onSuccess(Object result) {
if (result instanceof GWT_RfcResult) {
GWT_RfcResult rfcResult = (GWT_RfcResult)result;
if (!rfcResult.isRejected()) {
String alias = currentTemplate.getAlias();
currentTemplate = null;
TemplateCache.remove(alias);
load(alias, new Long(0));
return;
}
setErrorText(rfcResult.getRejectCause());
return;
}
setErrorText("Unknown result object!");
}
}
);
}
}
}