/*
* Copyright 2014 by SCSK Corporation.
*
* This file is part of PrimeCloud Controller(TM).
*
* PrimeCloud Controller(TM) 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.
*
* PrimeCloud Controller(TM) 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 PrimeCloud Controller(TM). If not, see <http://www.gnu.org/licenses/>.
*/
package jp.primecloud.auto.ui;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import jp.primecloud.auto.config.Config;
import jp.primecloud.auto.service.FarmService;
import jp.primecloud.auto.service.dto.ComponentDto;
import jp.primecloud.auto.service.dto.ComponentInstanceDto;
import jp.primecloud.auto.service.dto.FarmDto;
import jp.primecloud.auto.service.dto.InstanceDto;
import jp.primecloud.auto.service.dto.LoadBalancerDto;
import jp.primecloud.auto.ui.util.BeanContext;
import jp.primecloud.auto.ui.util.Icons;
import jp.primecloud.auto.ui.util.ViewContext;
import jp.primecloud.auto.ui.util.ViewProperties;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.vaadin.henrik.refresher.Refresher;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.Panel;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.TabSheet.SelectedTabChangeEvent;
import com.vaadin.ui.TabSheet.SelectedTabChangeListener;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import com.vaadin.ui.Window.CloseEvent;
import com.vaadin.ui.themes.Reindeer;
/**
* <p>
* メイン画面を生成します。
* </p>
*
*/
@SuppressWarnings("serial")
public class MainView extends VerticalLayout {
protected Log log = LogFactory.getLog(MainView.class);
private TopBar topBar;
private TextField myCloudField;
private Button reloadButton;
TabSheet tab;
ServicePanel servicePanel;
ServerPanel serverPanel;
LoadBalancerPanel loadBalancerPanel;
@Override
public void attach() {
setSizeFull();
addStyleName("mycloud-panel");
setMargin(false);
setSpacing(false);
// 画面上部のバー
topBar = new TopBar(this);
addComponent(topBar);
// タブの上のバー
CssLayout topLayout = new CssLayout();
topLayout.setWidth("100%");
topLayout.setHeight("28px");
topLayout.addStyleName("mycloud-name");
topLayout.setMargin(true);
addComponent(topLayout);
// myCloud名
myCloudField = new TextField();
myCloudField.setWidth("80%");
myCloudField.addStyleName("mycloud-label");
myCloudField.setEnabled(false);
myCloudField.setReadOnly(true);
topLayout.addComponent(myCloudField);
// Reloadボタン
reloadButton = new Button(ViewProperties.getCaption("button.reload"));
reloadButton.setDescription(ViewProperties.getCaption("description.reload"));
reloadButton.addStyleName("sync-button");
reloadButton.addStyleName("borderless");
reloadButton.setIcon(Icons.SYNC.resource());
reloadButton.setEnabled(false);
reloadButton.addListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
refresh();
}
});
topLayout.addComponent(reloadButton);
// myCloud本体
VerticalLayout mainLayout = new VerticalLayout();
mainLayout.setSizeFull();
mainLayout.setSpacing(false);
mainLayout.setMargin(false);
Panel mainPanel = new Panel(mainLayout);
mainPanel.setSizeFull();
mainPanel.addStyleName(Reindeer.PANEL_LIGHT);
addComponent(mainPanel);
setExpandRatio(mainPanel, 100);
// タブ
tab = new TabSheet();
tab.setSizeFull();
tab.setEnabled(false);
tab.addStyleName(Reindeer.TABSHEET_BORDERLESS);
mainLayout.addComponent(tab);
mainLayout.setExpandRatio(tab, 100);
// サービスタブ
String enableService = Config.getProperty("ui.enableService");
if (enableService == null || BooleanUtils.toBoolean(enableService)) {
servicePanel = new ServicePanel(this);
tab.addTab(servicePanel, ViewProperties.getCaption("tab.service"), Icons.SERVICETAB.resource());
}
// サーバタブ
serverPanel = new ServerPanel(this);
tab.addTab(serverPanel, ViewProperties.getCaption("tab.server"), Icons.SERVERTAB.resource());
// ロードバランサタブ
String enableLoadBalancer = Config.getProperty("ui.enableLoadBalancer");
if (enableLoadBalancer == null || BooleanUtils.toBoolean(enableLoadBalancer)) {
loadBalancerPanel = new LoadBalancerPanel(this);
tab.addTab(loadBalancerPanel, ViewProperties.getCaption("tab.loadbalancer"),
Icons.LOADBALANCER_TAB.resource());
}
// 選択されたタブが変更された場合
tab.addListener(new SelectedTabChangeListener() {
@Override
public void selectedTabChange(SelectedTabChangeEvent event) {
MainView.this.selectedTabChange(event);
}
});
// 自動更新用のタイマー
Refresher timer = new Refresher();
timer.setRefreshInterval(15 * 1000); //更新間隔(msec)
timer.addListener(new Refresher.RefreshListener() {
@Override
public void refresh(Refresher source) {
if (needsRefresh()) {
refreshTableOnly();
}
}
});
mainLayout.addComponent(timer);
// ログイン画面を表示
showLogin();
}
public void showLogin() {
WinLogin winLogin = new WinLogin();
winLogin.addListener(new Window.CloseListener() {
@Override
public void windowClose(CloseEvent e) {
// ログインに成功した場合
Long userNo = ViewContext.getUserNo();
if (userNo != null) {
topBar.loginSuccess();
}
}
});
getApplication().getMainWindow().addWindow(winLogin);
}
public void refresh() {
// myCloud情報を取得
FarmDto dto = null;
Long farmNo = ViewContext.getFarmNo();
if (farmNo != null) {
FarmService farmService = BeanContext.getBean(FarmService.class);
dto = farmService.getFarm(farmNo);
}
if (dto != null) {
String mycloud = dto.getFarm().getFarmName() + " [ " + dto.getFarm().getDomainName() + " ]";
if (StringUtils.isNotEmpty(dto.getFarm().getComment())) {
mycloud = mycloud + " - " + dto.getFarm().getComment();
}
myCloudField.setReadOnly(false);
myCloudField.setValue(mycloud);
myCloudField.setReadOnly(true);
refreshTable();
tab.setEnabled(true);
reloadButton.setEnabled(true);
} else {
myCloudField.setReadOnly(false);
myCloudField.setValue("");
myCloudField.setReadOnly(true);
refreshTable();
tab.setEnabled(false);
reloadButton.setEnabled(false);
}
}
public ComponentDto getComponent(Long componentNo) {
if (servicePanel == null) {
return null;
}
for (ComponentDto component : (Collection<ComponentDto>) servicePanel.serviceTable.getItemIds()) {
if (componentNo.equals(component.getComponent().getComponentNo())) {
return component;
}
}
return null;
}
public List<ComponentDto> getComponents(List<ComponentInstanceDto> componentInstances) {
List<ComponentDto> components = new ArrayList<ComponentDto>();
if (servicePanel == null) {
return components;
}
for (ComponentDto component : (Collection<ComponentDto>) servicePanel.serviceTable.getItemIds()) {
for (ComponentInstanceDto componentInstance : componentInstances) {
if (componentInstance.getComponentInstance().getComponentNo()
.equals(component.getComponent().getComponentNo())) {
if (!components.contains(component)) {
components.add(component);
}
break;
}
}
}
return components;
}
public List<InstanceDto> getInstances() {
List<InstanceDto> instances = new ArrayList<InstanceDto>();
instances.addAll((Collection<InstanceDto>) serverPanel.serverTable.getItemIds());
return instances;
}
public List<InstanceDto> getInstances(List<ComponentInstanceDto> componentInstances) {
List<InstanceDto> instances = new ArrayList<InstanceDto>();
for (InstanceDto instance : (Collection<InstanceDto>) serverPanel.serverTable.getItemIds()) {
for (ComponentInstanceDto componentInstance : componentInstances) {
if (componentInstance.getComponentInstance().getInstanceNo()
.equals(instance.getInstance().getInstanceNo())) {
if (!instances.contains(instance)) {
instances.add(instance);
}
break;
}
}
}
return instances;
}
public List<LoadBalancerDto> getLoadBalancers(Long componentNo) {
List<LoadBalancerDto> loadBalancers = new ArrayList<LoadBalancerDto>();
if (loadBalancerPanel == null) {
return loadBalancers;
}
for (LoadBalancerDto loadBalancer : (Collection<LoadBalancerDto>) loadBalancerPanel.loadBalancerTable
.getItemIds()) {
if (componentNo.equals(loadBalancer.getLoadBalancer().getComponentNo())) {
loadBalancers.add(loadBalancer);
}
}
return loadBalancers;
}
public void initialize() {
if (servicePanel != null) {
servicePanel.initialize();
}
serverPanel.initialize();
if (loadBalancerPanel != null) {
loadBalancerPanel.initialize();
}
}
public void refreshTable() {
if (servicePanel != null) {
servicePanel.refreshTable();
}
serverPanel.refreshTable();
if (loadBalancerPanel != null) {
loadBalancerPanel.refreshTable();
}
}
public void refreshTableOnly() {
if (servicePanel != null) {
servicePanel.serviceTable.refreshData();
}
serverPanel.serverTable.refreshData();
if (loadBalancerPanel != null) {
loadBalancerPanel.loadBalancerTable.refreshData();
}
}
private boolean needsRefresh() {
if (ViewContext.getFarmNo() == null) {
return false;
}
if (servicePanel != null) {
if (servicePanel.needsRefresh()) {
return true;
}
}
if (serverPanel.needsRefresh()) {
return true;
}
if (loadBalancerPanel != null) {
if (loadBalancerPanel.needsRefresh()) {
return true;
}
}
return false;
}
private void selectedTabChange(SelectedTabChangeEvent event) {
if (tab.getSelectedTab() == servicePanel) {
servicePanel.refreshDesc();
} else if (tab.getSelectedTab() == serverPanel) {
serverPanel.refreshDesc();
} else if (tab.getSelectedTab() == loadBalancerPanel) {
loadBalancerPanel.refreshDesc();
}
}
}