/* * 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.LinkedHashMap; import java.util.List; import java.util.Map; import jp.primecloud.auto.exception.AutoApplicationException; import jp.primecloud.auto.service.IaasDescribeService; import jp.primecloud.auto.service.dto.InstanceNetworkDto; import jp.primecloud.auto.service.dto.NetworkDto; 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.ViewMessages; import jp.primecloud.auto.ui.util.ViewProperties; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; import com.vaadin.Application; import com.vaadin.data.Item; import com.vaadin.data.Property; import com.vaadin.data.Validator; import com.vaadin.data.util.IndexedContainer; import com.vaadin.data.validator.RegexpValidator; import com.vaadin.event.ShortcutAction.KeyCode; import com.vaadin.ui.AbstractSelect; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.ComboBox; import com.vaadin.ui.Form; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.OptionGroup; import com.vaadin.ui.TextField; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; /** * <p> * ネットワーク追加/編集画面を生成します。 * </p> * */ @SuppressWarnings("serial") public class WinServerNetworkConfig extends Window { Long instanceNo; Long platformNo; InstanceNetworkDto instanceNetworkDto; List<InstanceNetworkDto> instanceNetworkDtos; Application ap; ComboBox networkSelect; ComboBox ipModeSelect; TextField ipAddressField; TextField netmaskField; TextField gateWayField; TextField dns1Field; TextField dns2Field; OptionGroup primaryOpg; static final String CID_NETWORK = "Network"; static final String CID_IP_MODE = "IpMode"; static final String CID_PRIMARY = "Primary"; static final String COMBOBOX_WIDTH = "180px"; Boolean isAddMode; Map<String, NetworkDto> networkMap = new LinkedHashMap<String, NetworkDto>(); WinServerNetworkConfig(Application ap, Long instanceNo, Long platformNo, InstanceNetworkDto instanceNetworkDto, List<InstanceNetworkDto> instanceNetworkDtos) { this.ap = ap; this.instanceNo = instanceNo; this.platformNo = platformNo; this.instanceNetworkDto = instanceNetworkDto; this.isAddMode = (this.instanceNetworkDto == null) ? true : false; this.instanceNetworkDtos = instanceNetworkDtos; // Window if (isAddMode) { //ディスク追加画面 setIcon(Icons.ADD.resource()); setCaption(ViewProperties.getCaption("window.WinServerAddNetwork")); } else { //ディスク編集画面 setIcon(Icons.EDIT.resource()); setCaption(ViewProperties.getCaption("window.WinServerEditNetwork")); } setModal(true); setWidth("380px"); setResizable(false); // Layout VerticalLayout layout = (VerticalLayout) getContent(); layout.setMargin(true); layout.setSpacing(true); // Form Form form = new Form(); //ネットワーク選択 networkSelect = new ComboBox(ViewProperties.getCaption("field.netWork")); networkSelect.setWidth(COMBOBOX_WIDTH); networkSelect.setNullSelectionAllowed(false); networkSelect.setItemCaptionPropertyId(CID_NETWORK); networkSelect.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); networkSelect.setImmediate(true); networkSelect.addListener(new Property.ValueChangeListener() { @Override public void valueChange(Property.ValueChangeEvent event) { changeNetwork(event); } }); //IPモード選択 ipModeSelect = new ComboBox(ViewProperties.getCaption("caption.field.ipMode")); ipModeSelect.setWidth(COMBOBOX_WIDTH); ipModeSelect.setNullSelectionAllowed(false); ipModeSelect.setItemCaptionPropertyId(CID_IP_MODE); ipModeSelect.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); ipModeSelect.setImmediate(true); ipModeSelect.addListener(new Property.ValueChangeListener() { @Override public void valueChange(Property.ValueChangeEvent event) { changeIpMode(event); } }); //IPアドレス ipAddressField = new TextField(ViewProperties.getCaption("field.ipAddress")); ipAddressField.setWidth("100%"); ipAddressField.setImmediate(true); //ネットマスク netmaskField = new TextField(ViewProperties.getCaption("field.netmask")); netmaskField.setWidth("100%"); netmaskField.setReadOnly(true); netmaskField.setImmediate(true); //ゲートウェイ gateWayField = new TextField(ViewProperties.getCaption("field.gateway")); gateWayField.setWidth("100%"); gateWayField.setReadOnly(true); gateWayField.setImmediate(true); //DNS1 dns1Field = new TextField(ViewProperties.getCaption("field.dns1")); dns1Field.setWidth("100%"); dns1Field.setReadOnly(true); dns1Field.setImmediate(true); //DNS2 dns2Field = new TextField(ViewProperties.getCaption("field.dns2")); dns2Field.setWidth("100%"); dns2Field.setReadOnly(true); dns2Field.setImmediate(true); //Primary primaryOpg = new OptionGroup(ViewProperties.getCaption("field.primary")); primaryOpg.addItem(CID_PRIMARY); primaryOpg.setItemCaption(CID_PRIMARY, ""); primaryOpg.setNullSelectionAllowed(false); primaryOpg.setImmediate(true); form.getLayout().addComponent(networkSelect); form.getLayout().addComponent(ipModeSelect); form.getLayout().addComponent(ipAddressField); form.getLayout().addComponent(netmaskField); form.getLayout().addComponent(gateWayField); form.getLayout().addComponent(dns1Field); form.getLayout().addComponent(dns2Field); form.getLayout().addComponent(primaryOpg); layout.addComponent(form); // 下部のバー HorizontalLayout buttonBar = new HorizontalLayout(); buttonBar.setSpacing(true); buttonBar.setMargin(false, true, true, false); layout.addComponent(buttonBar); layout.setComponentAlignment(buttonBar, Alignment.BOTTOM_RIGHT); // OK Button Button btnOk = new Button(ViewProperties.getCaption("button.ok")); btnOk.setDescription(ViewProperties.getCaption("description.ok")); btnOk.addListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { okButtonClick(event); } }); buttonBar.addComponent(btnOk); // [Enter]でOKボタンクリック btnOk.setClickShortcut(KeyCode.ENTER); //Cancel Button Button btnCancel = new Button(ViewProperties.getCaption("button.cancel")); btnCancel.setDescription(ViewProperties.getCaption("description.cancel")); btnCancel.addListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { close(); } }); buttonBar.addComponent(btnCancel); //データ取得 initData(); //データ表示 showData(); // 入力チェックの設定 initValidation(); } private void changeNetwork(Property.ValueChangeEvent event) { NetworkDto network = (NetworkDto) networkSelect.getValue(); if (network != null) { ipModeSelect.setValue("POOL"); netmaskField.setReadOnly(false); netmaskField.setValue(network.getNetmask()); netmaskField.setReadOnly(true); gateWayField.setReadOnly(false); gateWayField.setValue(network.getGateWay()); gateWayField.setReadOnly(true); dns1Field.setReadOnly(false); dns1Field.setValue(network.getDns1()); dns1Field.setReadOnly(true); dns2Field.setReadOnly(false); dns2Field.setValue(network.getDns2()); dns2Field.setReadOnly(true); } else { ipModeSelect.setValue("POOL"); netmaskField.setReadOnly(false); netmaskField.setValue(""); netmaskField.setReadOnly(true); gateWayField.setReadOnly(false); gateWayField.setValue(""); gateWayField.setReadOnly(true); dns1Field.setReadOnly(false); dns1Field.setValue(""); dns1Field.setReadOnly(true); dns2Field.setReadOnly(false); dns2Field.setValue(""); dns2Field.setReadOnly(true); } } private void changeIpMode(Property.ValueChangeEvent event) { String ipMode = (String) ipModeSelect.getValue(); if (StringUtils.isNotEmpty(ipMode)) { if ("MANUAL".equals(ipMode)) { ipAddressField.setReadOnly(false); ipAddressField.setValue(""); ipAddressField.setRequired(true); } else { ipAddressField.setReadOnly(false); ipAddressField.setValue(""); ipAddressField.setReadOnly(true); ipAddressField.setRequired(false); } } } private void initData() { IaasDescribeService describeService = BeanContext.getBean(IaasDescribeService.class); List<NetworkDto> networks = describeService.getNetworks(ViewContext.getUserNo(), platformNo); for (NetworkDto network : networks) { networkMap.put(network.getNetworkName(), network); } } private void showData() { //ネットワーク選択 networkSelect.setContainerDataSource(createNetworkContainer()); if (isAddMode) { if (networkSelect.getItemIds().size() > 0) { NetworkDto networkDto = (NetworkDto) networkSelect.getItemIds().toArray()[0]; networkSelect.select(networkDto); } } else { NetworkDto network = networkMap.get(instanceNetworkDto.getNetworkName()); if (network != null) { networkSelect.select(network); } networkSelect.setReadOnly(true); } //IPモード ipModeSelect.setContainerDataSource(createIpModeContainer()); if (isAddMode) { if (ipModeSelect.getItemIds().size() > 0) { String ipMode = (String) ipModeSelect.getItemIds().toArray()[0]; ipModeSelect.select(ipMode); } } else { ipModeSelect.select(instanceNetworkDto.getIpMode()); } //IPアドレス if (!isAddMode) { String ipMode = (String) ipModeSelect.getValue(); if ("MANUAL".equals(ipMode)) { ipAddressField.setReadOnly(false); ipAddressField.setValue(instanceNetworkDto.getIpAddress()); ipAddressField.setRequired(true); } else { ipAddressField.setReadOnly(false); ipAddressField.setValue(instanceNetworkDto.getIpAddress()); ipAddressField.setReadOnly(true); ipAddressField.setRequired(false); } } //プライマリ if (!isAddMode && BooleanUtils.isTrue(instanceNetworkDto.isPrimary())) { primaryOpg.select(CID_PRIMARY); } } private IndexedContainer createNetworkContainer() { IndexedContainer networkContainer = new IndexedContainer(); networkContainer.addContainerProperty(CID_NETWORK, String.class, null); for (NetworkDto network : networkMap.values()) { //新規追加時に必須ネットワーク(PCC)は表示されない if (isAddMode && network.isPcc()) { continue; } Item item = networkContainer.addItem(network); item.getItemProperty(CID_NETWORK).setValue(network.getNetworkName()); } return networkContainer; } private IndexedContainer createIpModeContainer() { IndexedContainer ipModeContainer = new IndexedContainer(); ipModeContainer.addContainerProperty(CID_IP_MODE, String.class, null); //POOL Item item = ipModeContainer.addItem("POOL"); item.getItemProperty(CID_IP_MODE).setValue(ViewProperties.getCaption("field.ipMode.pool")); //MANUAL item = ipModeContainer.addItem("MANUAL"); item.getItemProperty(CID_IP_MODE).setValue(ViewProperties.getCaption("field.ipMode.manual")); //DHCP item = ipModeContainer.addItem("DHCP"); item.getItemProperty(CID_IP_MODE).setValue(ViewProperties.getCaption("field.ipMode.dhcp")); return ipModeContainer; } private void initValidation() { //ネットワーク選択 String message = ViewMessages.getMessage("IUI-000100"); networkSelect.setRequired(true); networkSelect.setRequiredError(message); //IPモード選択 message = ViewMessages.getMessage("IUI-000126"); ipModeSelect.setRequired(true); ipModeSelect.setRequiredError(message); //IPアドレス message = ViewMessages.getMessage("IUI-000094", ipAddressField.getCaption()); ipAddressField.setRequired(false); ipAddressField.setRequiredError(message); Validator ipAddressFieldValidator = new RegexpValidator( "^(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$", ViewMessages.getMessage("IUI-000095", ipAddressField.getCaption())); ipAddressField.addValidator(ipAddressFieldValidator); } private void okButtonClick(ClickEvent event) { // 入力値を取得 NetworkDto networkDto = (NetworkDto) networkSelect.getValue(); String ipMode = (String) ipModeSelect.getValue(); String ipAddress = (String) ipAddressField.getValue(); // 入力チェック //基本バリデーション networkSelect.validate(); ipModeSelect.validate(); ipAddressField.validate(); //カスタムチェック if ("MANUAL".equals(ipMode)) { IaasDescribeService describeService = BeanContext.getBean(IaasDescribeService.class); String otherInstanceName = describeService.hasIpAddresse(platformNo, instanceNo, ipAddress); if (StringUtils.isNotEmpty(otherInstanceName)) { //すでにIPが同ネットワーク内で割り当てられている場合 throw new AutoApplicationException("IUI-000128", ipAddress, otherInstanceName); } } // 入力値を格納 if (isAddMode) { //追加 instanceNetworkDto = new InstanceNetworkDto(); instanceNetworkDto.setNetworkName(networkDto.getNetworkName()); instanceNetworkDto.setIpMode(ipMode); instanceNetworkDto.setIpAddress(ipAddress); instanceNetworkDto.setPrimary(primaryOpg.isSelected(CID_PRIMARY)); instanceNetworkDto.setNew(true); instanceNetworkDto.setDelete(false); instanceNetworkDto.setRequired(false); instanceNetworkDtos.add(instanceNetworkDto); } else { //変更 instanceNetworkDto.setIpMode(ipMode); instanceNetworkDto.setIpAddress(ipAddress); instanceNetworkDto.setPrimary(primaryOpg.isSelected(CID_PRIMARY)); instanceNetworkDto.setDelete(false); } if (BooleanUtils.isTrue(instanceNetworkDto.isPrimary())) { //プライマリが設定された場合、対象ネットワーク以外のネットワークを非プライマリにする for (InstanceNetworkDto tempDto : instanceNetworkDtos) { if (!instanceNetworkDto.equals(tempDto)) { tempDto.setPrimary(false); } } } // ログイン画面を閉じる close(); } }