All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.graphenee.security.vaadin.GxSecurityPolicyForm Maven / Gradle / Ivy

/*******************************************************************************
 * Copyright (c) 2016, 2018 Farrukh Ijaz
 *
 * 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.
 *******************************************************************************/
package io.graphenee.security.vaadin;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.vaadin.viritin.button.MButton;
import org.vaadin.viritin.fields.MCheckBox;
import org.vaadin.viritin.fields.MTextArea;
import org.vaadin.viritin.fields.MTextField;
import org.vaadin.viritin.layouts.MFormLayout;
import org.vaadin.viritin.layouts.MVerticalLayout;

import com.google.common.base.Strings;
import com.vaadin.data.util.NestedMethodProperty;
import com.vaadin.data.util.converter.Converter;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.FormLayout;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.TwinColSelect;
import com.vaadin.ui.themes.ValoTheme;

import io.graphenee.core.model.api.GxDataService;
import io.graphenee.core.model.bean.GxAccessKeyBean;
import io.graphenee.core.model.bean.GxSecurityGroupBean;
import io.graphenee.core.model.bean.GxSecurityPolicyBean;
import io.graphenee.core.model.bean.GxSecurityPolicyDocumentBean;
import io.graphenee.core.model.bean.GxUserAccountBean;
import io.graphenee.gx.theme.graphenee.GrapheneeTheme;
import io.graphenee.vaadin.TRAbstractForm;
import io.graphenee.vaadin.converter.BeanCollectionFaultToSetConverter;

@SpringComponent
@Scope("prototype")
public class GxSecurityPolicyForm extends TRAbstractForm {

	private static final long serialVersionUID = 1L;

	@Autowired
	GxDataService dataService;

	// ComboBox namespaceFault;
	MTextField securityPolicyName;
	MTextField securityPolicyDescription;
	MTextField priority;
	MCheckBox isActive;
	ComboBox securityPolicyDocumentComboBox;
	MTextArea jsonDocumentTextArea;

	GxSecurityPolicyDocumentBean selectedDocumentBean;
	TwinColSelect accessKeyCollectionFault;

	TwinColSelect userAccountCollectionFault;
	TwinColSelect securityGroupCollectionFault;

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	protected Component getFormComponent() {
		// detail form
		MVerticalLayout form = new MVerticalLayout().withMargin(true).withSpacing(true);
		// namespaceFault = new ComboBox("Namespace");
		// namespaceFault.setConverter(new
		// BeanFaultToBeanConverter(GxNamespaceBean.class));
		// namespaceFault.setRequired(true);

		securityPolicyName = new MTextField("Policy Name").withRequired(true);
		securityPolicyName.setMaxLength(50);
		securityPolicyDescription = new MTextField("Policy Description");
		securityPolicyDescription.setMaxLength(200);
		priority = new MTextField("Priority").withRequired(true);
		isActive = new MCheckBox("Is Active?");

		MButton createButton = new MButton("Create").withListener(event -> {
			selectedDocumentBean = new GxSecurityPolicyDocumentBean();
			selectedDocumentBean.setIsDefault(false);
			getEntity().getSecurityPolicyDocumentCollectionFault().add(selectedDocumentBean);
			securityPolicyDocumentComboBox.addItem(selectedDocumentBean);
			securityPolicyDocumentComboBox.select(selectedDocumentBean);
			adjustSaveButtonState();
		});
		MButton cloneButton = new MButton("Clone").withListener(event -> {
			if (selectedDocumentBean.getOid() != null) {
				GxSecurityPolicyDocumentBean cloned = new GxSecurityPolicyDocumentBean();
				cloned.setIsDefault(false);
				cloned.setDocumentJson(selectedDocumentBean.getDocumentJson());
				selectedDocumentBean = cloned;
				getEntity().getSecurityPolicyDocumentCollectionFault().add(selectedDocumentBean);
				securityPolicyDocumentComboBox.addItem(selectedDocumentBean);
				securityPolicyDocumentComboBox.select(selectedDocumentBean);
				adjustSaveButtonState();
			}
		});
		MButton deleteButton = new MButton("Delete").withListener(event -> {
			if (selectedDocumentBean != null) {
				getEntity().getSecurityPolicyDocumentCollectionFault().remove(selectedDocumentBean);
				securityPolicyDocumentComboBox.removeItem(selectedDocumentBean);
				securityPolicyDocumentComboBox.select(null);
				selectedDocumentBean = null;
				adjustSaveButtonState();
			}
		});
		MButton makeDefaultButton = new MButton("Make Default").withListener(event -> {
			if (selectedDocumentBean != null) {
				List documents = new ArrayList<>(getEntity().getSecurityPolicyDocumentCollectionFault().getBeans());
				documents.forEach(bean -> {
					bean.setIsDefault(false);
					getEntity().getSecurityPolicyDocumentCollectionFault().update(bean);
				});
				selectedDocumentBean.setIsDefault(true);
				event.getButton().setEnabled(false);
			}
		});

		securityPolicyDocumentComboBox = new ComboBox();
		securityPolicyDocumentComboBox.setWidth("170px");
		createButton.setEnabled(true);
		cloneButton.setEnabled(false);
		makeDefaultButton.setEnabled(false);
		deleteButton.setEnabled(false);
		securityPolicyDocumentComboBox.addValueChangeListener(event -> {
			selectedDocumentBean = (GxSecurityPolicyDocumentBean) securityPolicyDocumentComboBox.getValue();
			if (selectedDocumentBean != null) {
				makeDefaultButton.setEnabled(!selectedDocumentBean.getIsDefault());
				deleteButton.setEnabled(true);
				if (selectedDocumentBean.getOid() != null) {
					cloneButton.setEnabled(true);
				} else {
					cloneButton.setEnabled(false);
				}
				jsonDocumentTextArea.setEnabled(true);
				jsonDocumentTextArea.setRequired(true);
				jsonDocumentTextArea.setValue(selectedDocumentBean.getDocumentJson());
				jsonDocumentTextArea.discard();
				jsonDocumentTextArea.setPropertyDataSource(new NestedMethodProperty<>(selectedDocumentBean, "documentJson"));
				jsonDocumentTextArea.focus();
			} else {
				makeDefaultButton.setEnabled(false);
				cloneButton.setEnabled(false);
				deleteButton.setEnabled(false);
				jsonDocumentTextArea.setEnabled(false);
				jsonDocumentTextArea.discard();
				jsonDocumentTextArea.setPropertyDataSource(null);
				jsonDocumentTextArea.clear();
			}
		});

		CssLayout documentLayout = new CssLayout(securityPolicyDocumentComboBox, createButton, cloneButton, makeDefaultButton, deleteButton);
		documentLayout.setCaption("Policy Document");
		documentLayout.setStyleName(ValoTheme.LAYOUT_COMPONENT_GROUP);
		jsonDocumentTextArea = new MTextArea("Statements");
		jsonDocumentTextArea.setSizeFull();
		jsonDocumentTextArea.addStyleName(GrapheneeTheme.STYLE_CODE);
		jsonDocumentTextArea.setInputPrompt("e.g.\ngrant all on all\nrevoke write on accounts");
		jsonDocumentTextArea.setEnabled(false);
		jsonDocumentTextArea.addValueChangeListener(event -> {
			if (selectedDocumentBean != null) {
				getEntity().getSecurityPolicyDocumentCollectionFault().update(selectedDocumentBean);
			}
			adjustSaveButtonState();
		});

		// form.addComponents(namespaceFault, securityPolicyName, priority,
		// isActive, documentLayout, jsonDocumentTextArea);
		form.addComponents(securityPolicyName, securityPolicyDescription, priority, isActive, documentLayout, jsonDocumentTextArea);
		form.expand(jsonDocumentTextArea);

		// users
		userAccountCollectionFault = new TwinColSelect();
		userAccountCollectionFault.setConverter((Converter) new BeanCollectionFaultToSetConverter());
		userAccountCollectionFault.setSizeFull();
		userAccountCollectionFault.setLeftColumnCaption("Available");
		userAccountCollectionFault.setRightColumnCaption("Applied To");

		// security policies
		securityGroupCollectionFault = new TwinColSelect();
		securityGroupCollectionFault.setConverter((Converter) new BeanCollectionFaultToSetConverter());
		securityGroupCollectionFault.setSizeFull();
		securityGroupCollectionFault.setLeftColumnCaption("Available");
		securityGroupCollectionFault.setRightColumnCaption("Applied To");

		// keys
		accessKeyCollectionFault = new TwinColSelect();
		accessKeyCollectionFault.setConverter((Converter) new BeanCollectionFaultToSetConverter());
		accessKeyCollectionFault.setSizeFull();
		accessKeyCollectionFault.setLeftColumnCaption("Available");
		accessKeyCollectionFault.setRightColumnCaption("Applied To");

		TabSheet mainTabSheet = new TabSheet();
		mainTabSheet.setStyleName(ValoTheme.TABSHEET_PADDED_TABBAR);
		mainTabSheet.setWidth("100%");
		mainTabSheet.setHeight("100%");

		mainTabSheet.addTab(form, "Details");
		mainTabSheet.addTab(new MVerticalLayout(userAccountCollectionFault).withMargin(true).withFullHeight(), "Users");
		mainTabSheet.addTab(new MVerticalLayout(securityGroupCollectionFault).withMargin(true).withFullHeight(), "Security Groups");
		mainTabSheet.addTab(new MVerticalLayout(accessKeyCollectionFault).withMargin(true).withFullHeight(), "Access Keys");

		MVerticalLayout layout = new MVerticalLayout(mainTabSheet);
		layout.setSizeFull();
		return layout;
	}

	@Override
	protected boolean eagerValidationEnabled() {
		return true;
	}

	@Override
	protected String formTitle() {
		return "Security Policy";
	}

	@Override
	protected void postBinding(GxSecurityPolicyBean entity) {
		List userAccounts = dataService.findUserAccountByNamespace(entity.getNamespaceFault().getBean());
		userAccountCollectionFault.addItems(userAccounts);
		List securityGroups = dataService.findSecurityGroupByNamespace(entity.getNamespaceFault().getBean());
		securityGroupCollectionFault.addItems(securityGroups);
		// namespaceFault.addItems(dataService.findNamespace());

		securityPolicyDocumentComboBox.clear();
		jsonDocumentTextArea.clear();
		securityPolicyDocumentComboBox.addItems(entity.getSecurityPolicyDocumentCollectionFault().getBeans());
		securityPolicyDocumentComboBox.select(entity.getDefaultSecurityPolicyDocumentBean());

		List accessKeyBeans = dataService.findAccessKeyByIsActive(true);
		accessKeyCollectionFault.addItems(accessKeyBeans);
	}

	@Override
	public boolean isValid() {
		if (selectedDocumentBean != null && Strings.isNullOrEmpty(selectedDocumentBean.getDocumentJson())) {
			return false;
		}
		return super.isValid();
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy