package io.eguan.webui;
/*
* #%L
* Project eguan
* %%
* Copyright (C) 2012 - 2017 Oodrive
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import io.eguan.webui.component.VvrAttributesComponent;
import io.eguan.webui.component.VvrOperationComponent;
import io.eguan.webui.component.VvrTreeComponent;
import io.eguan.webui.component.window.VvrCreateWindow;
import io.eguan.webui.component.window.VvrCreateWindow.PostProcessing;
import io.eguan.webui.jmx.JmxHandler;
import io.eguan.webui.model.VvrManagerModel;
import io.eguan.webui.model.VvrModel;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.UUID;
import javax.servlet.annotation.WebServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.ui.AbsoluteLayout;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.HorizontalSplitPanel;
import com.vaadin.ui.Label;
import com.vaadin.ui.ProgressBar;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.TabSheet.SelectedTabChangeEvent;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
/**
* Web UI class. Used for VVRs administration.
*
* @author oodrive
* @author ebredzinski
*
*/
@Theme("mytheme")
@SuppressWarnings("serial")
public class VvrManagerUi extends UI {
@WebServlet(value = { "/*" }, asyncSupported = true)
@VaadinServletConfiguration(productionMode = false, ui = VvrManagerUi.class, widgetset = "com.vaadin.DefaultWidgetSet")
public static class VvrManagerUiServlet extends VaadinServlet {
}
private static final Logger LOGGER = LoggerFactory.getLogger(VvrManagerUi.class);
// Width and Height of layouts
private static final String rootLayoutWidth = "1280px";
private static final int opLayoutHeightInt = 62;
private static final String opLayoutHeight = opLayoutHeightInt + "px";
private static final int labelLayoutHeightInt = 10;
private static final String labelLayoutHeight = labelLayoutHeightInt + "px";
private static final int panelLayoutHeightInt = 700;
private static final String panelLayoutHeight = panelLayoutHeightInt + "px";
// +2 for the line between operation layout and panel.
private static final String lastLayoutHeight = (opLayoutHeightInt + labelLayoutHeightInt + panelLayoutHeightInt + 2)
+ "px";
// Root layout
private final AbsoluteLayout rootLayout = new AbsoluteLayout();
// Middle layout
private final VerticalLayout vvrManagerLayout = new VerticalLayout();
// Tabsheet for each VVR
private TabSheet vvrsTabsheet;
// Map to keep a reference on the tree of each VVR
private final HashMap<UUID, VvrTreeComponent> vvrTreeComponents = new HashMap<>();
// Map to keep a reference on the layout of each VVR
private final HashMap<UUID, VerticalLayout> vvrLayouts = new HashMap<>();
// Map to keep a reference on the VVR model
private final HashMap<UUID, VvrModel> vvrModels = new HashMap<>();
// Handler JMX
private final JmxHandler jmxHandler = new JmxHandler(this);
// Model for VVR Manager
private VvrManagerModel vvrManagerModel;
@Override
protected void init(final VaadinRequest request) {
// Listener to disconnect JMX connection on exit.
addDetachListener(new DetachListener() {
@Override
public void detach(final DetachEvent event) {
jmxHandler.disconnect();
}
});
setPollInterval(1000);
final Label labelLeft = new Label("");
final Label labelRight = new Label("");
labelLeft.setHeight("100%");
labelRight.setHeight("100%");
final HorizontalLayout content = new HorizontalLayout();
content.setSizeFull();
rootLayout.setWidth(rootLayoutWidth);
rootLayout.setImmediate(true);
rootLayout.addComponent(vvrManagerLayout);
vvrManagerLayout.setMargin(false);
vvrManagerLayout.setSpacing(true);
vvrManagerLayout.setWidth(rootLayoutWidth);
content.addComponent(labelLeft);
content.addComponent(rootLayout);
content.addComponent(labelRight);
content.setExpandRatio(labelLeft, 0.5f);
content.setExpandRatio(labelRight, 0.5f);
content.setComponentAlignment(rootLayout, Alignment.TOP_CENTER);
setContent(content);
// Init Jmx Handler
try {
jmxHandler.connect();
// Init ui
initVvrManagerUi(jmxHandler);
}
catch (final Exception e) {
LOGGER.error("Can not connect to JMX", e);
}
}
/**
* Initialize VVRs representation.
*
* @param jmxHandler
*/
private final void initVvrManagerUi(final JmxHandler jmxHandler) {
// Create Model for vvrManager
vvrManagerModel = jmxHandler.createVvrManagerModel();
// Vvr representation
vvrsTabsheet = new TabSheet();
vvrManagerLayout.addComponent(vvrsTabsheet);
// Sheet 0 create new VVR
final VerticalLayout lastLayout = new VerticalLayout();
lastLayout.setWidth("100%");
lastLayout.setHeight(lastLayoutHeight);
vvrsTabsheet.addTab(lastLayout, "+");
// Add a sheet for each vvr
final Set<UUID> vvrUuidList = vvrManagerModel.getVvrs();
for (final UUID vvrUuid : vvrUuidList) {
addVvr(vvrUuid);
}
// Window to create a new vvr (display on the last tabsheet)
final VvrCreateWindow createWindow = new VvrCreateWindow(new PostProcessing() {
@Override
public void execute() {
// After creation select the first tab
vvrsTabsheet.setSelectedTab(0);
}
});
vvrsTabsheet.addSelectedTabChangeListener(new TabSheet.SelectedTabChangeListener() {
@Override
public void selectedTabChange(final SelectedTabChangeEvent event) {
final TabSheet tabsheet = event.getTabSheet();
final String caption = tabsheet.getTab(tabsheet.getSelectedTab()).getCaption();
if (caption.equals("+")) {
createWindow.add(vvrManagerModel);
}
else {
// Remove window if another tab is selected
createWindow.remove();
}
}
});
// If no other tab, display creation window (+ tab can not be selected)
if (vvrUuidList.isEmpty()) {
createWindow.add(vvrManagerModel);
}
}
/**
* Add a progress bar for long task.
*
* @return the layout
*/
public VerticalLayout addProgressBar() {
final VerticalLayout layout = new VerticalLayout();
layout.setSizeFull();
final ProgressBar bar = new ProgressBar();
layout.addComponent(new Label("This operation can take some time. Please wait..."));
bar.setIndeterminate(true);
bar.setImmediate(true);
layout.addComponent(bar);
layout.setComponentAlignment(bar, Alignment.MIDDLE_CENTER);
rootLayout.addComponent(layout, "top: 50%; left: 39%");
vvrManagerLayout.setEnabled(false);
return layout;
}
/**
* Remove the progress bar.
*
* @param layout
*/
public final void removeProgressBar(final VerticalLayout layout) {
rootLayout.removeComponent(layout);
vvrManagerLayout.setEnabled(true);
// Set enabled all the component contained in the VVR manager layout
final Iterator<Component> iterate = vvrManagerLayout.iterator();
while (iterate.hasNext()) {
final Component c = iterate.next();
c.setEnabled(true);
}
}
/**
* Add a VVR user interface.
*
* @param vvrUuid
* the vvr unique identifier
*
*/
public final void addVvr(final UUID vvrUuid) {
// Create a vvr model
final VvrModel vvrModel = jmxHandler.createVvrModel(vvrUuid);
vvrModels.put(vvrUuid, vvrModel);
// Layout for the first component
final VerticalLayout vvrLayout = new VerticalLayout();
vvrLayout.setWidth("100%");
vvrsTabsheet.addTab(vvrLayout, vvrModel.getVvrName(), null, vvrsTabsheet.getComponentCount() - 1);
vvrLayouts.put(vvrUuid, vvrLayout);
// Create component for vvr operations
final VvrOperationComponent op = new VvrOperationComponent(vvrManagerModel);
final AbstractComponent opComponent = op.createComponent(vvrModel, jmxHandler);
opComponent.setHeight(opLayoutHeight);
vvrLayout.addComponent(opComponent);
final Label label = new Label(" ", ContentMode.HTML);
label.setHeight(labelLayoutHeight);
vvrLayout.addComponent(label);
vvrLayout.addComponent(new Label("<hr />", ContentMode.HTML));
// Create Tool tip for attributes
final VvrAttributesComponent attr = new VvrAttributesComponent(vvrUuid);
vvrsTabsheet.getTab(vvrLayout).setDescription(attr.createComponent(vvrModel));
// If there was only the + sheet, select the new vvr sheet
if (vvrsTabsheet.getComponentCount() == 2) {
vvrsTabsheet.setSelectedTab(0);
}
// Create its panel
final HorizontalSplitPanel panel = new HorizontalSplitPanel();
vvrLayout.addComponent(panel);
panel.setWidth("100%");
panel.setHeight(panelLayoutHeight);
panel.setSplitPosition(35);
// Component to display snapshot/device atributes
final VerticalLayout vvrTreeLayout = new VerticalLayout();
final VvrTreeComponent vvrTreeComponent = new VvrTreeComponent(vvrTreeLayout);
panel.setFirstComponent(vvrTreeComponent.createComponent(vvrModel, jmxHandler));
panel.setSecondComponent(vvrTreeLayout);
vvrTreeComponents.put(vvrUuid, vvrTreeComponent);
}
/**
* Remove vvr.
*
* @param vvrUuid
* the VVR unique identifier
*/
public final void removeVvr(final UUID vvrUuid) {
// Remove model
vvrModels.remove(vvrUuid);
// Remove tree
vvrTreeComponents.remove(vvrUuid);
// Remove Split panel
vvrsTabsheet.removeComponent(vvrLayouts.remove(vvrUuid));
}
/**
* Modify VVR name.
*
* @param vvrUuid
* the vvr unique identifier
*
* @param newValue
* the new name of the VVR
*/
public void modifyVvrName(final UUID vvrUuid, final String newValue) {
final VerticalLayout vvrLayout = vvrLayouts.get(vvrUuid);
vvrsTabsheet.getTab(vvrLayout).setCaption(newValue);
}
/**
* Add snapshot user interface.
*
* @param vvrUuid
* the vvr unique identifier
*
* @param snapshotUuid
* the snapshot unique identifier
*
*/
public final void addSnapshot(final UUID vvrUuid, final UUID snapshotUuid) {
final VvrTreeComponent c = vvrTreeComponents.get(vvrUuid);
if (c != null) {
final VvrModel vvr = vvrModels.get(vvrUuid);
c.addSnapshot(jmxHandler.createSnapshotModel(vvr, snapshotUuid));
}
}
/**
* Add snapshot user interface.
*
* @param vvrUuid
* the VVR unique identifier
* @param snapshotUuid
* the snapshot unique identifier
*/
public final void removeSnapshot(final UUID vvrUuid, final UUID snapshotUuid) {
final VvrTreeComponent c = vvrTreeComponents.get(vvrUuid);
if (c != null) {
c.removeSnapshot(snapshotUuid);
}
}
/**
* Modify snapshot name.
*
* @param vvrUuid
* the VVR unique identifier
* @param snapshotUuid
* the snapshot unique identifier
* @param newName
* the new snapshot name
*/
public final void modifySnapshotName(final UUID vvrUuid, final UUID snapshotUuid, final String newName) {
final VvrTreeComponent c = vvrTreeComponents.get(vvrUuid);
if (c != null) {
c.modifySnapshotName(snapshotUuid, newName);
}
}
/**
* Modify snapshot description.
*
* @param vvrUuid
* the VVR unique identifier
* @param snapshotUuid
* the snapshot unique identifier
* @param newDesc
* the new snapshot description
*/
public final void modifySnapshotDescription(final UUID vvrUuid, final UUID snapshotUuid, final String newDesc) {
final VvrTreeComponent c = vvrTreeComponents.get(vvrUuid);
if (c != null) {
c.modifySnapshotDescription(snapshotUuid, newDesc);
}
}
/**
* Add device user interface.
*
* @param vvrUuid
* the VVR unique identifier
* @param deviceUuid
* the device unique identifier
*/
public final void addDevice(final UUID vvrUuid, final UUID deviceUuid) {
final VvrTreeComponent c = vvrTreeComponents.get(vvrUuid);
if (c != null) {
final VvrModel vvr = vvrModels.get(vvrUuid);
c.addDevice(jmxHandler.createDeviceModel(vvr, deviceUuid));
}
}
/**
* Remove device user interface.
*
* @param vvrUuid
* the VVR unique identifier
* @param deviceUuid
* the device unique identifier
*/
public final void removeDevice(final UUID vvrUuid, final UUID deviceUuid) {
final VvrTreeComponent c = vvrTreeComponents.get(vvrUuid);
if (c != null) {
c.removeDevice(deviceUuid);
}
}
/**
* Modify device name.
*
* @param vvrUuid
* the VVR unique identifier
* @param deviceUuid
* the device unique identifier
* @param newName
* the new device name
*/
public final void modifyDeviceName(final UUID vvrUuid, final UUID deviceUuid, final String newName) {
final VvrTreeComponent c = vvrTreeComponents.get(vvrUuid);
if (c != null) {
c.modifyDeviceName(deviceUuid, newName);
}
}
/**
* Modify device description.
*
* @param vvrUuid
* the VVR unique identifier
* @param deviceUuid
* the device unique identifier
* @param newDesc
* the new device description
*/
public final void modifyDeviceDescription(final UUID vvrUuid, final UUID deviceUuid, final String newDesc) {
final VvrTreeComponent c = vvrTreeComponents.get(vvrUuid);
if (c != null) {
c.modifyDeviceDescription(deviceUuid, newDesc);
}
}
}