/*
* JBoss, Home of Professional Open Source
* Copyright 2011 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @author tags. All rights reserved.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* 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,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package org.jboss.as.console.client.shared.deployment;
import com.google.gwt.user.client.ui.DeckPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.SingleSelectionModel;
import com.google.web.bindery.autobean.shared.AutoBean;
import com.google.web.bindery.autobean.shared.AutoBeanUtils;
import org.jboss.as.console.client.shared.deployment.model.DeployedEjb;
import org.jboss.as.console.client.shared.deployment.model.DeployedEndpoint;
import org.jboss.as.console.client.shared.deployment.model.DeployedPersistenceUnit;
import org.jboss.as.console.client.shared.deployment.model.DeployedServlet;
import org.jboss.as.console.client.shared.deployment.model.DeploymentData;
import org.jboss.as.console.client.shared.deployment.model.DeploymentEjbSubsystem;
import org.jboss.as.console.client.shared.deployment.model.DeploymentJpaSubsystem;
import org.jboss.as.console.client.shared.deployment.model.DeploymentRecord;
import org.jboss.as.console.client.shared.deployment.model.DeploymentWebSubsystem;
import org.jboss.as.console.client.shared.deployment.model.DeploymentWebserviceSubsystem;
import org.jboss.as.console.client.shared.help.FormHelpPanel;
import org.jboss.as.console.client.widgets.browser.DefaultCellBrowser;
import org.jboss.ballroom.client.widgets.forms.CheckBoxItem;
import org.jboss.ballroom.client.widgets.forms.Form;
import org.jboss.ballroom.client.widgets.forms.FormItem;
import org.jboss.ballroom.client.widgets.forms.ListItem;
import org.jboss.ballroom.client.widgets.forms.TextAreaItem;
import org.jboss.ballroom.client.widgets.forms.TextBoxItem;
import org.jboss.dmr.client.ModelNode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Harald Pehl
* @date 12/04/2012
*/
public class DeploymentBrowser
{
private final DeploymentTreeModel deploymentTreeModel;
private final SingleSelectionModel<DeploymentRecord> selectionModel;
private final DefaultCellBrowser cellBrowser;
private final DeploymentBreadcrumb breadcrumb;
private final DeckPanel contextPanel;
private final Map<String, Form<DeploymentData>> forms;
private final Map<String, Integer> indexes;
private DeploymentBrowser.HelpCallback helpCallback;
public DeploymentBrowser(final DeploymentStore deploymentStore,
final SingleSelectionModel<DeploymentRecord> selectionModel)
{
forms = new HashMap<String, Form<DeploymentData>>();
indexes = new HashMap<String, Integer>();
this.selectionModel = selectionModel;
deploymentTreeModel = new DeploymentTreeModel(this, deploymentStore, this.selectionModel);
cellBrowser = new DefaultCellBrowser.Builder(deploymentTreeModel, null).build();
breadcrumb = new DeploymentBreadcrumb();
breadcrumb.getElement().setAttribute("style", "margin-top:30px;");
int index = 0;
this.contextPanel = new DeckPanel();
this.helpCallback = new HelpCallback();
Label noInfo = new Label("No deployments available.");
noInfo.getElement().addClassName("console-DeploymentBreadcrumb-noinfo");
noInfo.getElement().addClassName("console-DeploymentBreadcrumb-context");
this.contextPanel.add(noInfo);
index++;
addContext(DeploymentRecord.class, index++,
new TextAreaItem("name", "Name"),
new TextAreaItem("runtimeName", "Runtime Name")
);
addContext(DeploymentEjbSubsystem.class, index++);
addContext(DeploymentJpaSubsystem.class, index++,
new TextAreaItem("name", "Name"),
new TextBoxItem("defaultDataSource", "Default Datasource"),
new TextBoxItem("defaultInheritance", "Default Inheritance"));
addContext(DeploymentWebSubsystem.class, index++,
new TextAreaItem("name", "Name"),
new TextBoxItem("contextRoot", "Context Root"),
new TextBoxItem("virtualHost", "Virtual Host"));
addContext(DeploymentWebserviceSubsystem.class, index++);
addContext(DeployedEjb.class, index++,
new TextAreaItem("name", "Name"),
new TextBoxItem("componentClassname", "Component Classname"),
new ListItem("declaredRoles", "Declared Roles"),
new TextBoxItem("runAsRole", "Run As Role"),
new TextBoxItem("securityDomain", "Security Domain"));
addContext(DeployedPersistenceUnit.class, index++,
new TextAreaItem("name", "Name"),
new CheckBoxItem("enabled", "Statistics Enabled"));
addContext(DeployedServlet.class, index++,
new TextAreaItem("name", "Name"),
new TextBoxItem("servletClass", "Servlet Class"));
addContext(DeployedEndpoint.class, index++,
new TextAreaItem("name", "Name"),
new TextBoxItem("classname", "Classname"),
new TextBoxItem("context", "Context"),
new TextBoxItem("endpointType", "Type"),
new TextBoxItem("wsdl", "WSDL"));
}
@SuppressWarnings("unchecked")
private <T extends DeploymentData> void addContext(Class<T> clazz, int index, FormItem... formItems)
{
Widget widget;
String classname = clazz.getName();
if (formItems != null && formItems.length > 0)
{
Form<T> form = new Form<T>(clazz);
form.setNumColumns(1);
form.setEnabled(false);
form.setFields(formItems);
FormHelpPanel helpPanel = new FormHelpPanel(helpCallback, form);
forms.put(classname, (Form<DeploymentData>) form);
VerticalPanel wrapper = new VerticalPanel();
wrapper.setStyleName("fill-layout-width");
wrapper.add(helpPanel.asWidget());
wrapper.add(form.asWidget());
widget = wrapper;
}
else
{
widget = new Label("No information available.");
widget.getElement().addClassName("console-DeploymentBreadcrumb-noinfo");
}
widget.getElement().addClassName("console-DeploymentBreadcrumb-context");
indexes.put(classname, index);
contextPanel.add(widget);
}
/**
* Updates the list of deployments, selects the first deployment in the browser and shows the relevant context view.
* If the list is empty a special context view is displayed.
*
* @param deployments the deployments - can be empty, must not be null
*/
public void updateDeployments(List<DeploymentRecord> deployments)
{
deploymentTreeModel.updateDeployments(deployments);
if (deployments.isEmpty())
{
breadcrumb.empty();
contextPanel.showWidget(0);
}
else
{
DeploymentRecord firstDeployment = deployments.get(0);
selectionModel.setSelected(firstDeployment, true);
updateContext(firstDeployment);
}
}
@SuppressWarnings("unchecked")
public <T extends DeploymentData> void updateContext(final T selectedContext)
{
breadcrumb.setDeploymentData(selectedContext);
AutoBean<T> autoBean = AutoBeanUtils.getAutoBean(selectedContext);
String classname = autoBean.getType().getName();
Integer index = indexes.get(classname);
if (index != null && index > 0 && index < contextPanel.getWidgetCount())
{
Form<DeploymentData> form = forms.get(classname);
if (form != null)
{
helpCallback.setSelection(selectedContext);
form.edit(selectedContext);
}
contextPanel.showWidget(index);
}
}
public DefaultCellBrowser getCellBrowser()
{
return cellBrowser;
}
public DeploymentBreadcrumb getBreadcrumb()
{
return breadcrumb;
}
public DeckPanel getContextPanel()
{
return contextPanel;
}
class HelpCallback<T extends DeploymentData> implements FormHelpPanel.AddressCallback
{
private T selection;
@Override
public ModelNode getAddress()
{
ModelNode address = new ModelNode();
address.setEmptyList();
if (selection != null)
{
address = selection.getAddress();
}
return address;
}
public void setSelection(final T selection)
{
this.selection = selection;
}
}
}