/* * 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.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import jp.primecloud.auto.common.constant.PCCConstant; import jp.primecloud.auto.common.status.LoadBalancerListenerStatus; import jp.primecloud.auto.common.status.LoadBalancerStatus; import jp.primecloud.auto.entity.crud.LoadBalancerListener; import jp.primecloud.auto.service.AwsDescribeService; import jp.primecloud.auto.service.LoadBalancerService; import jp.primecloud.auto.service.ProcessService; import jp.primecloud.auto.service.dto.ComponentDto; import jp.primecloud.auto.service.dto.LoadBalancerDto; import jp.primecloud.auto.ui.DialogConfirm.Buttons; import jp.primecloud.auto.ui.DialogConfirm.Result; import jp.primecloud.auto.ui.util.BeanContext; import jp.primecloud.auto.ui.util.IconUtils; import jp.primecloud.auto.ui.util.Icons; import jp.primecloud.auto.ui.util.OperationLogger; import jp.primecloud.auto.ui.util.ViewContext; import jp.primecloud.auto.ui.util.ViewMessages; import jp.primecloud.auto.ui.util.ViewProperties; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; import com.amazonaws.services.ec2.model.Subnet; import com.vaadin.data.util.BeanItemContainer; import com.vaadin.event.ItemClickEvent; import com.vaadin.event.ItemClickEvent.ItemClickListener; import com.vaadin.terminal.ExternalResource; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.CheckBox; import com.vaadin.ui.Component; import com.vaadin.ui.GridLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Link; import com.vaadin.ui.Panel; import com.vaadin.ui.Table; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import com.vaadin.ui.themes.Reindeer; /** * <p> * ロードバランサ画面下部の基本情報の生成を行います。 * </p> * */ @SuppressWarnings("serial") public class LoadBalancerDescBasic extends Panel { private MainView sender; private BasicInfo basicInfo; private AttachServiceTable attachServiceTable; private LoadbalancerServiceOperation loadBalancerOpe; private LoadBalancerDto loadBalancer; public LoadBalancerDescBasic(MainView sender) { this.sender = sender; } @Override public void attach() { addStyleName(Reindeer.PANEL_LIGHT); setHeight("100%"); HorizontalLayout layout = new HorizontalLayout(); layout.setWidth("100%"); layout.setHeight("100%"); layout.setMargin(true); layout.setSpacing(true); layout.addStyleName("loadbalancer-desc-basic"); setContent(layout); // ロードバランサ基本情報 basicInfo = new BasicInfo(); basicInfo.setWidth("100%"); layout.addComponent(basicInfo); // 表同士の間隔をあける Label padding = new Label(" "); padding.setWidth("7px"); padding.setHeight("99%"); padding.addStyleName("desc-padding"); layout.addComponent(padding); Label padding2 = new Label(""); padding2.setWidth("1px"); layout.addComponent(padding2); // ロードバランサリスナ一覧 VerticalLayout rightLayout = new VerticalLayout(); rightLayout.setWidth("100%"); rightLayout.setHeight("100%"); rightLayout.setMargin(false); rightLayout.setSpacing(false); attachServiceTable = new AttachServiceTable(); attachServiceTable.setWidth("100%"); rightLayout.addComponent(attachServiceTable); loadBalancerOpe = new LoadbalancerServiceOperation(); rightLayout.addComponent(loadBalancerOpe); rightLayout.setExpandRatio(attachServiceTable, 100); layout.addComponent(rightLayout); layout.setExpandRatio(basicInfo, 43); layout.setExpandRatio(rightLayout, 57); } public void initialize() { this.loadBalancer = null; basicInfo.initialize(); attachServiceTable.getContainerDataSource().removeAllItems(); loadBalancerOpe.initialize(); } public void show(LoadBalancerDto loadBalancer, boolean clearCheckBox) { this.loadBalancer = loadBalancer; basicInfo.show(loadBalancer); attachServiceTable.refresh(loadBalancer.getLoadBalancerListeners(), clearCheckBox); loadBalancerOpe.show(loadBalancer); } private void refreshTable() { // 選択されているロードバランサを保持する Long selectedLoadBalancerNo = null; if (sender.loadBalancerPanel.loadBalancerTable.getValue() != null) { LoadBalancerDto loadBalancer = (LoadBalancerDto) sender.loadBalancerPanel.loadBalancerTable.getValue(); selectedLoadBalancerNo = loadBalancer.getLoadBalancer().getLoadBalancerNo(); } int index = sender.loadBalancerPanel.loadBalancerTable.getCurrentPageFirstItemIndex(); // 表示を更新 sender.refreshTable(); // 選択されていたサーバを選択し直す if (selectedLoadBalancerNo != null) { for (Object itemId : sender.loadBalancerPanel.loadBalancerTable.getItemIds()) { LoadBalancerDto loadBalancer = (LoadBalancerDto) itemId; if (selectedLoadBalancerNo.equals(loadBalancer.getLoadBalancer().getLoadBalancerNo())) { sender.loadBalancerPanel.loadBalancerTable.select(itemId); sender.loadBalancerPanel.loadBalancerTable.setCurrentPageFirstItemIndex(index); break; } } } } private class BasicInfo extends Panel { private final String COLUMN_HEIGHT = "30px"; private GridLayout gridLayout; @Override public void attach() { setCaption(ViewProperties.getCaption("table.loadBalancerBasicInfo")); setHeight("95%"); setStyleName("loadbalancer-desc-basic-panel"); VerticalLayout layout = (VerticalLayout) getContent(); layout.setStyleName("loadbalancer-desc-basic-panel"); layout.setMargin(true); gridLayout = new GridLayout(2, 9); gridLayout.setWidth("100%"); gridLayout.setStyleName("loadbalancer-desc-basic-info"); gridLayout.setColumnExpandRatio(0, 40); gridLayout.setColumnExpandRatio(1, 60); layout.addComponent(gridLayout); int line = 0; // ロードバランサ名 { Label label = new Label(ViewProperties.getCaption("field.loadBalancerName"), Label.CONTENT_XHTML); label.setHeight(COLUMN_HEIGHT); gridLayout.addComponent(label, 0, line++); } // 割り当てサービス { Label label = new Label(ViewProperties.getCaption("field.loadBalancerService"), Label.CONTENT_XHTML); label.setHeight(COLUMN_HEIGHT); gridLayout.addComponent(label, 0, line++); } // FQDN { Label label = new Label(ViewProperties.getCaption("field.fqdn"), Label.CONTENT_XHTML); label.setHeight(COLUMN_HEIGHT); gridLayout.addComponent(label, 0, line++); } // ホスト名 { Label label = new Label(ViewProperties.getCaption("field.loadBalancerHostname"), Label.CONTENT_XHTML); label.setHeight(COLUMN_HEIGHT); gridLayout.addComponent(label, 0, line++); } // ステータス { Label label = new Label(ViewProperties.getCaption("field.status"), Label.CONTENT_XHTML); label.setHeight(COLUMN_HEIGHT); gridLayout.addComponent(label, 0, line++); } // プラットフォーム { Label label = new Label(ViewProperties.getCaption("field.platform"), Label.CONTENT_XHTML); label.setHeight(COLUMN_HEIGHT); gridLayout.addComponent(label, 0, line++); } // ロードバランサ種別 { Label label = new Label(ViewProperties.getCaption("field.loadBalancerType"), Label.CONTENT_XHTML); label.setHeight(COLUMN_HEIGHT); gridLayout.addComponent(label, 0, line++); } // サブネット { Label label = new Label(ViewProperties.getCaption("field.subnet"), Label.CONTENT_XHTML); label.setHeight(COLUMN_HEIGHT); gridLayout.addComponent(label, 0, line++); } // コメント { Label label = new Label(ViewProperties.getCaption("field.comment"), Label.CONTENT_XHTML); label.setHeight(COLUMN_HEIGHT); gridLayout.addComponent(label, 0, line++); } } public void initialize() { int line = 0; // ロードバランサ名 { Label label = new Label("", Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } // 割り当てサービス { Label label = new Label("", Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } // FQDN { Label label = new Label("", Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } // ホスト名 { Label label = new Label("", Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } // ステータス { Label label = new Label("", Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } // プラットフォーム { Label label = new Label("", Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } // ロードバランサ種別 { Label label = new Label("", Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } // サブネット { Label label = new Label("", Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } // コメント { Label label = new Label("", Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } } public void show(LoadBalancerDto loadBalancer) { int line = 0; // ロードバランサ名 { Label label = new Label(loadBalancer.getLoadBalancer().getLoadBalancerName(), Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } // 割り当てサービス { ComponentDto component = sender.getComponent(loadBalancer.getLoadBalancer().getComponentNo()); String name; if (StringUtils.isEmpty(component.getComponent().getComment())) { name = component.getComponent().getComponentName(); } else { name = component.getComponent().getComment() + " [" + component.getComponent().getComponentName() + "]"; } Icons icon = Icons.fromName(component.getComponentType().getComponentTypeName()); Label label = new Label(IconUtils.createImageTag(getApplication(), icon, name), Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } // FQDN { Label label = new Label(loadBalancer.getLoadBalancer().getFqdn(), Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } // ホスト名 { Label label = new Label(loadBalancer.getLoadBalancer().getCanonicalName(), Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } // ステータス { LoadBalancerStatus status = LoadBalancerStatus.fromStatus(loadBalancer.getLoadBalancer().getStatus()); Icons icon; if (status == LoadBalancerStatus.RUNNING && loadBalancer.getLoadBalancerListeners().size() == 0) { // ステータスがRUNNINGでもリスナーが存在しない場合はアイコンを変える icon = Icons.RUN_WARNING; } else { icon = Icons.fromName(status.name()); } String statusString = status.name().substring(0, 1).toUpperCase() + status.name().substring(1).toLowerCase(); Label label = new Label(IconUtils.createImageTag(getApplication(), icon, statusString), Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } // プラットフォーム { Icons icon = IconUtils.getPlatformIcon(loadBalancer.getPlatform()); String description = loadBalancer.getPlatform().getPlatform().getPlatformNameDisp(); Label label = new Label(IconUtils.createImageTag(getApplication(), icon, description), Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } // ロードバランサ種別 { String type = ""; ; if (StringUtils.isNotEmpty(loadBalancer.getLoadBalancer().getType())) { type = ViewProperties.getLoadBalancerType(loadBalancer.getLoadBalancer().getType()); } Label label = new Label(type, Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } // サブネット { StringBuilder sb = new StringBuilder(); if (PCCConstant.LOAD_BALANCER_ELB.equals(loadBalancer.getLoadBalancer().getType())) { if (BooleanUtils.isTrue(loadBalancer.getPlatform().getPlatformAws().getVpc()) && StringUtils.isNotEmpty(loadBalancer.getAwsLoadBalancer().getSubnetId())) { List<String> subnetIds = new ArrayList<String>(); for (String subnetId : loadBalancer.getAwsLoadBalancer().getSubnetId().split(",")) { subnetIds.add(subnetId.trim()); } AwsDescribeService awsDescribeService = BeanContext.getBean(AwsDescribeService.class); List<Subnet> subnets = awsDescribeService.getSubnets(ViewContext.getUserNo(), loadBalancer .getLoadBalancer().getPlatformNo()); for (Subnet subnet : subnets) { if (subnetIds.contains(subnet.getSubnetId())) { if (sb.length() > 0) { sb.append("<br>"); } sb.append(subnet.getCidrBlock()); } } } } Label label = new Label(sb.toString(), Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } // コメント { Label label = new Label(loadBalancer.getLoadBalancer().getComment(), Label.CONTENT_XHTML); gridLayout.removeComponent(1, line); gridLayout.addComponent(label, 1, line++); } } } // ロードバランサリスナ一覧 private class AttachServiceTable extends Table { private final String COLUMN_HEIGHT = "28px"; //項目名 private final String[] COLNAME = { null, ViewProperties.getCaption("field.loadBalancerPort"), ViewProperties.getCaption("field.loadBalancerServicePort"), ViewProperties.getCaption("field.loadBalancerProtocol"), ViewProperties.getCaption("field.loadBalancerServiceStatus"), ViewProperties.getCaption("field.editLoadBalancerListener"), }; private final String[] VISIBLE_COLNAME = { "check", "loadBalancerPort", "servicePort", "protocol", "status", "edit", }; private Map<Integer, CheckBox> checkBoxes = new HashMap<Integer, CheckBox>(); @Override public void attach() { setIcon(Icons.LISTENER_MINI.resource()); setColumnHeaderMode(Table.COLUMN_HEADER_MODE_EXPLICIT); addStyleName("loadbalancer-desc-basic-listener"); setCaption(ViewProperties.getCaption("table.loadBalancerListener")); setHeight("100%"); setSortDisabled(true); setImmediate(true); setVisible(true); addGeneratedColumn("check", new ColumnGenerator() { @Override public Component generateCell(Table source, Object itemId, Object columnId) { LoadBalancerListener listener = (LoadBalancerListener) itemId; CheckBox check; if (checkBoxes.containsKey(listener.getLoadBalancerPort())) { check = checkBoxes.get(listener.getLoadBalancerPort()); } else { check = new CheckBox(); checkBoxes.put(listener.getLoadBalancerPort(), check); } check.setImmediate(true); check.addListener(new ValueChangeListener() { @Override public void valueChange(com.vaadin.data.Property.ValueChangeEvent event) { requestRepaint(); } }); return check; } }); addGeneratedColumn("edit", new ColumnGenerator() { @Override public Component generateCell(Table source, Object itemId, Object columnId) { LoadBalancerListener listener = (LoadBalancerListener) itemId; Button editButton = new Button(ViewProperties.getCaption("button.editLoadBalancerListener")); editButton.setDescription(ViewProperties.getCaption("description.editLoadBalancerListener")); editButton.addStyleName("borderless"); editButton.setIcon(Icons.EDITMINI.resource()); editButton.setData(listener); LoadBalancerListenerStatus status = LoadBalancerListenerStatus.fromStatus(listener.getStatus()); if (status == LoadBalancerListenerStatus.STOPPED) { editButton.addListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { editButtonClick(event); } }); } else { editButton.setEnabled(false); } return editButton; } }); addGeneratedColumn("status", new ColumnGenerator() { @Override public Component generateCell(Table source, Object itemId, Object columnId) { LoadBalancerListener listener = (LoadBalancerListener) itemId; LoadBalancerListenerStatus status = LoadBalancerListenerStatus.fromStatus(listener.getStatus()); Icons icon = Icons.fromName(status.name()); String statusString; if (status == LoadBalancerListenerStatus.STOPPED) { statusString = "DISABLE"; } else if (status == LoadBalancerListenerStatus.RUNNING) { statusString = "ENABLE"; } else if (status == LoadBalancerListenerStatus.STARTING || status == LoadBalancerListenerStatus.STOPPING) { statusString = "CONFIGURING"; } else { statusString = status.name(); } statusString = statusString.substring(0, 1).toUpperCase() + statusString.substring(1).toLowerCase(); Label label = new Label(IconUtils.createImageTag(getApplication(), icon, statusString), Label.CONTENT_XHTML); label.setHeight(COLUMN_HEIGHT); return label; } }); addGeneratedColumn("loadBalancerPort", new ColumnGenerator() { @Override public Component generateCell(Table source, Object itemId, Object columnId) { LoadBalancerListener listener = (LoadBalancerListener) itemId; String protocol = listener.getProtocol(); // HTTP, HTTPSでないときは通常のラベル if (!"HTTP".equals(protocol) && !"HTTPS".equals(protocol)) { return new Label(listener.getLoadBalancerPort().toString()); } // ホスト名を取得 String hostName = loadBalancer.getLoadBalancer().getCanonicalName(); if (loadBalancer.getComponentLoadBalancerDto() != null) { hostName = loadBalancer.getComponentLoadBalancerDto().getIpAddress(); } // ホスト名が空の場合は通常のラベル if (StringUtils.isEmpty(hostName)) { return new Label(listener.getLoadBalancerPort().toString()); } String url = protocol.toLowerCase() + "://" + hostName + ":" + listener.getLoadBalancerPort().toString() + "/"; Link link = new Link(listener.getLoadBalancerPort().toString(), new ExternalResource(url)); link.setTargetName("_blank"); link.setIcon(Icons.SHORTCUT.resource()); link.setDescription(url); return link; } }); addGeneratedColumn("servicePort", new ColumnGenerator() { @Override public Component generateCell(Table source, Object itemId, Object columnId) { LoadBalancerListener listener = (LoadBalancerListener) itemId; Label label = new Label(listener.getServicePort().toString()); return label; } }); addGeneratedColumn("protocol", new ColumnGenerator() { @Override public Component generateCell(Table source, Object itemId, Object columnId) { LoadBalancerListener listener = (LoadBalancerListener) itemId; Label label = new Label(listener.getProtocol()); return label; } }); setColumnExpandRatio("status", 100); //テーブルのカラムに対してStyleNameを設定 setCellStyleGenerator(new StandardCellStyleGenerator() { @Override public String getStyle(Object itemId, Object propertyId) { LoadBalancerListener listener = (LoadBalancerListener) itemId; String style = super.getStyle(itemId, propertyId); if (propertyId != null) { Integer no = listener.getLoadBalancerPort(); if (checkBoxes.containsKey(no) && (Boolean) checkBoxes.get(no).getValue()) { style += " v-selected"; } } return style; } }); addListener(new ItemClickListener() { @Override public void itemClick(ItemClickEvent event) { LoadBalancerListener listener = (LoadBalancerListener) event.getItemId(); if (checkBoxes.containsKey(listener.getLoadBalancerPort())) { CheckBox checkBox = checkBoxes.get(listener.getLoadBalancerPort()); checkBox.setValue(!((Boolean) checkBox.getValue()).booleanValue()); } } }); } public void refresh(Collection<LoadBalancerListener> listeners, boolean clearCheckBox) { if (clearCheckBox) { checkBoxes.clear(); } setContainerDataSource(new LoadBalancerListenerContainer(listeners)); setVisibleColumns(VISIBLE_COLNAME); if (listeners.size() > 0) { setColumnHeaders(COLNAME); } } private class LoadBalancerListenerContainer extends BeanItemContainer<LoadBalancerListener> { public LoadBalancerListenerContainer(Collection<LoadBalancerListener> listeners) { super(LoadBalancerListener.class); for (LoadBalancerListener listener : listeners) { addItem(listener); } } } private void editButtonClick(Button.ClickEvent event) { LoadBalancerListener listener = (LoadBalancerListener) event.getButton().getData(); WinLoadBalancerConfigListener win = new WinLoadBalancerConfigListener(listener.getLoadBalancerNo(), listener.getLoadBalancerPort()); win.addListener(new Window.CloseListener() { @Override public void windowClose(Window.CloseEvent e) { refreshTable(); } }); getWindow().addWindow(win); } } private class LoadbalancerServiceOperation extends HorizontalLayout { private final String BUTTON_WIDTH = "90px"; private Button checkAllButton; private Button addButton; private Button deleteButton; private Button enableButton; private Button disableButton; @Override public void attach() { addStyleName("loadbalancer-service-operation-buttons"); setHeight("35px"); setWidth("100%"); setSpacing(true); checkAllButton = new Button(ViewProperties.getCaption("button.checkAll")); checkAllButton.setDescription(ViewProperties.getCaption("description.checkAll")); checkAllButton.addStyleName("borderless"); checkAllButton.addStyleName("checkall"); checkAllButton.setEnabled(false); checkAllButton.setIcon(Icons.CHECKON.resource()); checkAllButton.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { checkAllButtonClick(event); } }); addComponent(checkAllButton); addButton = new Button(ViewProperties.getCaption("button.addLoadBalancerListener")); addButton.setDescription(ViewProperties.getCaption("description.addLoadBalancerListener")); addButton.setWidth(BUTTON_WIDTH); addButton.setIcon(Icons.ATTACH_MINI.resource()); addButton.setEnabled(false); addButton.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { addButtonClick(event); } }); addComponent(addButton); deleteButton = new Button(ViewProperties.getCaption("button.delLoadBalancerListener")); deleteButton.setDescription(ViewProperties.getCaption("description.delLoadBalancerListener")); deleteButton.setWidth(BUTTON_WIDTH); deleteButton.setIcon(Icons.DETACH_MINI.resource()); deleteButton.setEnabled(false); deleteButton.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { deleteButtonClick(event); } }); addComponent(deleteButton); enableButton = new Button(ViewProperties.getCaption("button.enableLoadBalancerListener")); enableButton.setDescription(ViewProperties.getCaption("description.enableLoadBalancerListener")); enableButton.setWidth(BUTTON_WIDTH); enableButton.setIcon(Icons.ENABLE_MINI.resource()); enableButton.setEnabled(false); enableButton.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { enableButtonClick(event); } }); addComponent(enableButton); disableButton = new Button(ViewProperties.getCaption("button.disableLoadBalancerListener")); disableButton.setDescription(ViewProperties.getCaption("description.disableLoadBalancerListener")); disableButton.setWidth(BUTTON_WIDTH); disableButton.setIcon(Icons.DISABLE_MINI.resource()); disableButton.setEnabled(false); disableButton.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { disableButtonClick(event); } }); addComponent(disableButton); setComponentAlignment(checkAllButton, Alignment.MIDDLE_LEFT); setComponentAlignment(addButton, Alignment.BOTTOM_LEFT); setComponentAlignment(deleteButton, Alignment.BOTTOM_LEFT); setComponentAlignment(enableButton, Alignment.BOTTOM_LEFT); setComponentAlignment(disableButton, Alignment.BOTTOM_LEFT); setExpandRatio(checkAllButton, 1f); setExpandRatio(deleteButton, 10f); setExpandRatio(disableButton, 10f); } public void initialize() { checkAllButton.setEnabled(false); addButton.setEnabled(false); deleteButton.setEnabled(false); enableButton.setEnabled(false); disableButton.setEnabled(false); } public void show(LoadBalancerDto loadBalancer) { // CloudStackの場合、リスナーを利用できない if (PCCConstant.LOAD_BALANCER_CLOUDSTACK.equals(loadBalancer.getLoadBalancer().getType())) { checkAllButton.setEnabled(false); addButton.setEnabled(false); deleteButton.setEnabled(false); enableButton.setEnabled(false); disableButton.setEnabled(false); } else { checkAllButton.setEnabled(true); addButton.setEnabled(true); deleteButton.setEnabled(true); enableButton.setEnabled(true); disableButton.setEnabled(true); } } private void checkAllButtonClick(Button.ClickEvent event) { // 全てチェックされていれば全てオフ、それ以外は全てオンにする boolean checkAll = true; for (CheckBox checkBox : attachServiceTable.checkBoxes.values()) { if (BooleanUtils.isNotTrue((Boolean) checkBox.getValue())) { checkAll = false; break; } } for (CheckBox checkBox : attachServiceTable.checkBoxes.values()) { checkBox.setValue(!checkAll); } } private void addButtonClick(Button.ClickEvent event) { WinLoadBalancerConfigListener win = new WinLoadBalancerConfigListener(loadBalancer.getLoadBalancer() .getLoadBalancerNo(), null); win.addListener(new Window.CloseListener() { @Override public void windowClose(Window.CloseEvent e) { refreshTable(); } }); getWindow().addWindow(win); } private void deleteButtonClick(Button.ClickEvent event) { // 選択されているリスナーを取得 List<LoadBalancerListener> listeners = new ArrayList<LoadBalancerListener>(); for (Entry<Integer, CheckBox> entry : attachServiceTable.checkBoxes.entrySet()) { if (entry.getValue().booleanValue()) { for (LoadBalancerListener listener : loadBalancer.getLoadBalancerListeners()) { if (listener.getLoadBalancerPort().equals(entry.getKey())) { listeners.add(listener); break; } } } } if (listeners.size() != 1) { // リスナーが選択されていない、または複数選択されている場合 String message = ViewMessages.getMessage("IUI-000078"); DialogConfirm dialog = new DialogConfirm(ViewProperties.getCaption("dialog.confirm"), message); getApplication().getMainWindow().addWindow(dialog); return; } final LoadBalancerListener listener = listeners.get(0); LoadBalancerListenerStatus status = LoadBalancerListenerStatus.fromStatus(listener.getStatus()); if (status != LoadBalancerListenerStatus.STOPPED) { // リスナーが停止していない場合 String message = ViewMessages.getMessage("IUI-000079"); DialogConfirm dialog = new DialogConfirm(ViewProperties.getCaption("dialog.confirm"), message); getApplication().getMainWindow().addWindow(dialog); return; } // 確認ダイアログを表示 String message = ViewMessages.getMessage("IUI-000080", listener.getLoadBalancerPort()); DialogConfirm dialog = new DialogConfirm(ViewProperties.getCaption("dialog.confirm"), message, Buttons.OKCancel); dialog.setCallback(new DialogConfirm.Callback() { @Override public void onDialogResult(Result result) { if (result != Result.OK) { return; } delete(listener); } }); getApplication().getMainWindow().addWindow(dialog); } private void delete(LoadBalancerListener listener) { // オペレーションログ OperationLogger.writeLoadBalancer("LOAD_BALANCER", "Detach LB_Listener", listener.getLoadBalancerNo(), String.valueOf(listener.getLoadBalancerPort())); // リスナーの削除 LoadBalancerService loadBalancerService = BeanContext.getBean(LoadBalancerService.class); loadBalancerService.deleteListener(loadBalancer.getLoadBalancer().getLoadBalancerNo(), listener.getLoadBalancerPort()); // 表示の更新 refreshTable(); } private void enableButtonClick(Button.ClickEvent event) { // 選択されているリスナーを取得 final List<LoadBalancerListener> listeners = new ArrayList<LoadBalancerListener>(); for (Entry<Integer, CheckBox> entry : attachServiceTable.checkBoxes.entrySet()) { if (entry.getValue().booleanValue()) { for (LoadBalancerListener listener : loadBalancer.getLoadBalancerListeners()) { if (listener.getLoadBalancerPort().equals(entry.getKey())) { listeners.add(listener); break; } } } } if (listeners.isEmpty()) { // リスナーが選択されていない場合 String message = ViewMessages.getMessage("IUI-000077"); DialogConfirm dialog = new DialogConfirm(ViewProperties.getCaption("dialog.confirm"), message); getApplication().getMainWindow().addWindow(dialog); return; } for (LoadBalancerListener listener : listeners) { LoadBalancerListenerStatus status = LoadBalancerListenerStatus.fromStatus(listener.getStatus()); if (status == LoadBalancerListenerStatus.STARTING || status == LoadBalancerListenerStatus.CONFIGURING || status == LoadBalancerListenerStatus.STOPPING || status == LoadBalancerListenerStatus.WARNING) { // リスナーを有効にできないステータスの場合 String status2; if (status == LoadBalancerListenerStatus.STOPPED) { status2 = "DISABLE"; } else if (status == LoadBalancerListenerStatus.RUNNING) { status2 = "ENABLE"; } else if (status == LoadBalancerListenerStatus.STARTING || status == LoadBalancerListenerStatus.STOPPING) { status2 = "CONFIGURING"; } else { status2 = status.toString(); } status2 = status2.substring(0, 1).toUpperCase() + status2.substring(1).toLowerCase(); String message = ViewMessages.getMessage("IUI-000087", status2); DialogConfirm dialog = new DialogConfirm(ViewProperties.getCaption("dialog.confirm"), message); getApplication().getMainWindow().addWindow(dialog); return; } } // 確認ダイアログを表示 StringBuilder sb = new StringBuilder(); for (LoadBalancerListener listener : listeners) { if (sb.length() > 0) { sb.append(","); } sb.append(listener.getLoadBalancerPort()); } String message = ViewMessages.getMessage("IUI-000081", sb.toString()); DialogConfirm dialog = new DialogConfirm(ViewProperties.getCaption("dialog.confirm"), message, Buttons.OKCancel); dialog.setCallback(new DialogConfirm.Callback() { @Override public void onDialogResult(Result result) { if (result != Result.OK) { return; } enable(listeners); } }); getApplication().getMainWindow().addWindow(dialog); } private void enable(List<LoadBalancerListener> listeners) { // オペレーションログ OperationLogger.writeLoadBalancer("LOAD_BALANCER", "Enable LB_Listener", loadBalancer.getLoadBalancer() .getLoadBalancerNo(), String.valueOf(listeners.size())); // リスナーの有効化 List<Integer> loadBalancerPorts = new ArrayList<Integer>(); for (LoadBalancerListener listener : listeners) { loadBalancerPorts.add(listener.getLoadBalancerPort()); } ProcessService processService = BeanContext.getBean(ProcessService.class); processService.startLoadBalancerListeners(loadBalancer.getLoadBalancer().getFarmNo(), loadBalancer .getLoadBalancer().getLoadBalancerNo(), loadBalancerPorts); // 表示の更新 refreshTable(); } private void disableButtonClick(Button.ClickEvent event) { // 選択されているリスナーを取得 final List<LoadBalancerListener> listeners = new ArrayList<LoadBalancerListener>(); for (Entry<Integer, CheckBox> entry : attachServiceTable.checkBoxes.entrySet()) { if (entry.getValue().booleanValue()) { for (LoadBalancerListener listener : loadBalancer.getLoadBalancerListeners()) { if (listener.getLoadBalancerPort().equals(entry.getKey())) { listeners.add(listener); break; } } } } if (listeners.isEmpty()) { // リスナーが選択されていない場合 String message = ViewMessages.getMessage("IUI-000077"); DialogConfirm dialog = new DialogConfirm(ViewProperties.getCaption("dialog.confirm"), message); getApplication().getMainWindow().addWindow(dialog); return; } for (LoadBalancerListener listener : listeners) { LoadBalancerListenerStatus status = LoadBalancerListenerStatus.fromStatus(listener.getStatus()); if (status == LoadBalancerListenerStatus.STARTING || status == LoadBalancerListenerStatus.CONFIGURING || status == LoadBalancerListenerStatus.STOPPING) { // リスナーを無効有効にできないステータスの場合 String status2; if (status == LoadBalancerListenerStatus.STOPPED) { status2 = "DISABLE"; } else if (status == LoadBalancerListenerStatus.RUNNING) { status2 = "ENABLE"; } else if (status == LoadBalancerListenerStatus.STARTING || status == LoadBalancerListenerStatus.STOPPING) { status2 = "CONFIGURING"; } else { status2 = status.toString(); } status2 = status2.substring(0, 1).toUpperCase() + status2.substring(1).toLowerCase(); String message = ViewMessages.getMessage("IUI-000088", status2); DialogConfirm dialog = new DialogConfirm(ViewProperties.getCaption("dialog.confirm"), message); getApplication().getMainWindow().addWindow(dialog); return; } } // 確認ダイアログを表示 StringBuilder sb = new StringBuilder(); for (LoadBalancerListener listener : listeners) { if (sb.length() > 0) { sb.append(","); } sb.append(listener.getLoadBalancerPort()); } String message = ViewMessages.getMessage("IUI-000082", sb.toString()); DialogConfirm dialog = new DialogConfirm(ViewProperties.getCaption("dialog.confirm"), message, Buttons.OKCancel); dialog.setCallback(new DialogConfirm.Callback() { @Override public void onDialogResult(Result result) { if (result != Result.OK) { return; } disable(listeners); } }); getApplication().getMainWindow().addWindow(dialog); } private void disable(List<LoadBalancerListener> listeners) { // オペレーションログ OperationLogger.writeLoadBalancer("LOAD_BALANCER", "Disable LB_Listener", loadBalancer.getLoadBalancer() .getLoadBalancerNo(), String.valueOf(listeners.size())); // リスナーの無効化 List<Integer> loadBalancerPorts = new ArrayList<Integer>(); for (LoadBalancerListener listener : listeners) { loadBalancerPorts.add(listener.getLoadBalancerPort()); } ProcessService processService = BeanContext.getBean(ProcessService.class); processService.stopLoadBalancerListeners(loadBalancer.getLoadBalancer().getFarmNo(), loadBalancer .getLoadBalancer().getLoadBalancerNo(), loadBalancerPorts); // 表示の更新 refreshTable(); } } }