| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 org.apache.openaz.xacml.admin.view.components; |
| |
| import java.io.Serializable; |
| import java.util.Set; |
| |
| import org.apache.openaz.xacml.admin.XacmlAdminUI; |
| import org.apache.openaz.xacml.admin.jpa.Attribute; |
| import org.apache.openaz.xacml.admin.jpa.Category; |
| import org.apache.openaz.xacml.admin.jpa.Datatype; |
| import org.apache.openaz.xacml.admin.util.JPAUtils; |
| import org.apache.openaz.xacml.admin.util.XACMLConstants; |
| import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventListener; |
| import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventNotifier; |
| import org.apache.openaz.xacml.api.Identifier; |
| import org.apache.openaz.xacml.api.XACML3; |
| import com.vaadin.addon.jpacontainer.JPAContainer; |
| import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider; |
| import com.vaadin.annotations.AutoGenerated; |
| import com.vaadin.data.Property.ValueChangeEvent; |
| import com.vaadin.data.Property.ValueChangeListener; |
| import com.vaadin.data.util.BeanItem; |
| import com.vaadin.data.util.BeanItemContainer; |
| import com.vaadin.ui.AbstractSelect.ItemCaptionMode; |
| import com.vaadin.ui.ComboBox; |
| import com.vaadin.ui.CustomComponent; |
| import com.vaadin.ui.HorizontalLayout; |
| import com.vaadin.ui.Table; |
| import com.vaadin.ui.UI; |
| import com.vaadin.ui.VerticalLayout; |
| |
| public class AttributeStandardSelectorComponent extends CustomComponent implements AttributeChangedEventNotifier { |
| |
| /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ |
| |
| @AutoGenerated |
| private VerticalLayout mainLayout; |
| @AutoGenerated |
| private HorizontalLayout horizontalLayout_2; |
| @AutoGenerated |
| private Table tableDatatypes; |
| @AutoGenerated |
| private Table tableAttributes; |
| @AutoGenerated |
| private ComboBox comboBoxCategories; |
| /** |
| * |
| */ |
| private static final long serialVersionUID = 1L; |
| |
| public class AttributeBean implements Serializable { |
| private static final long serialVersionUID = 1L; |
| private Identifier attributeId; |
| private Identifier categoryId; |
| |
| public AttributeBean(Identifier category, Identifier id) { |
| this.categoryId = category; |
| this.attributeId = id; |
| } |
| public Identifier getAttributeId() { |
| return attributeId; |
| } |
| public void setAttributeId(Identifier attributeId) { |
| this.attributeId = attributeId; |
| } |
| public Identifier getCategoryId() { |
| return categoryId; |
| } |
| public void setCategoryId(Identifier categoryId) { |
| this.categoryId = categoryId; |
| } |
| @Override |
| public String toString() { |
| return this.attributeId.stringValue(); |
| } |
| |
| } |
| private final AttributeStandardSelectorComponent self = this; |
| private final Datatype datatype; |
| private final Attribute attribute; |
| private final BasicNotifier notifier = new BasicNotifier(); |
| private static final JPAContainer<Category> categories = new JPAContainer<Category>(Category.class); |
| private static final JPAContainer<Datatype> datatypes = new JPAContainer<Datatype>(Datatype.class); |
| static { |
| categories.setEntityProvider(new CachingLocalEntityProvider<Category>(Category.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); |
| datatypes.setEntityProvider(new CachingLocalEntityProvider<Datatype>(Datatype.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); |
| categories.sort(new String[]{"xacmlId"}, new boolean[]{true}); |
| datatypes.sort(new String[]{"xacmlId"}, new boolean[]{true}); |
| } |
| private BeanItemContainer<AttributeBean> container = new BeanItemContainer<AttributeBean>(AttributeBean.class); |
| /** |
| * The constructor should first build the main layout, set the |
| * composition root and then do any custom initialization. |
| * |
| * The constructor will not be automatically regenerated by the |
| * visual editor. |
| */ |
| public AttributeStandardSelectorComponent(Datatype datatype, Attribute initialAttribute) { |
| buildMainLayout(); |
| setCompositionRoot(mainLayout); |
| // |
| // Save |
| // |
| this.datatype = datatype; |
| this.attribute = initialAttribute; |
| // |
| // Initialize GUI |
| // |
| this.initializeCategories(); |
| this.initializeAttributes(); |
| this.initializeDatatypes(); |
| // |
| // Initialize focus |
| // |
| this.tableAttributes.focus(); |
| } |
| |
| private void initializeCategories() { |
| // |
| // Remove any filters |
| // |
| AttributeStandardSelectorComponent.categories.removeAllContainerFilters(); |
| // |
| // Initialize data source & GUI properties |
| // |
| this.comboBoxCategories.setContainerDataSource(AttributeStandardSelectorComponent.categories); |
| this.comboBoxCategories.setItemCaptionMode(ItemCaptionMode.PROPERTY); |
| this.comboBoxCategories.setItemCaptionPropertyId("xacmlId"); |
| this.comboBoxCategories.setImmediate(true); |
| this.comboBoxCategories.setNullSelectionAllowed(false); |
| // |
| // Set default selection |
| // |
| Category defaultCategory; |
| if (this.attribute == null || this.attribute.getCategoryBean() == null) { |
| defaultCategory = JPAUtils.findCategory(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT); |
| } else { |
| defaultCategory = this.attribute.getCategoryBean(); |
| } |
| if (defaultCategory != null) { |
| this.comboBoxCategories.select(defaultCategory.getId()); |
| } |
| // |
| // Respond to events |
| // |
| this.comboBoxCategories.addValueChangeListener(new ValueChangeListener() { |
| private static final long serialVersionUID = 1L; |
| |
| @Override |
| public void valueChange(ValueChangeEvent event) { |
| self.setupAttributeIDs(); |
| self.fireAttributeChanged(self.getAttribute()); |
| } |
| }); |
| } |
| |
| private void initializeAttributes() { |
| // |
| // Initialize GUI properties |
| // |
| this.tableAttributes.setImmediate(true); |
| this.tableAttributes.setNullSelectionAllowed(false); |
| this.tableAttributes.setPageLength(10); |
| // |
| // Setup |
| // |
| this.tableAttributes.setContainerDataSource(this.container); |
| this.tableAttributes.setVisibleColumns(new Object[] {"attributeId"}); |
| this.tableAttributes.setColumnHeaders(new String[] {"Attribute Id"}); |
| this.tableAttributes.setSelectable(true); |
| this.setupAttributeIDs(); |
| // |
| // Respond |
| // |
| this.tableAttributes.addValueChangeListener(new ValueChangeListener() { |
| private static final long serialVersionUID = 1L; |
| |
| @Override |
| public void valueChange(ValueChangeEvent event) { |
| self.fireAttributeChanged(self.getAttribute()); |
| } |
| }); |
| } |
| |
| private void initializeDatatypes() { |
| // |
| // Remove any filters |
| // |
| AttributeStandardSelectorComponent.datatypes.removeAllContainerFilters(); |
| // |
| // Initialize data source & GUI properties |
| // |
| this.tableDatatypes.setContainerDataSource(AttributeStandardSelectorComponent.datatypes); |
| this.tableDatatypes.setVisibleColumns(new Object[] {"shortName", "xacmlId"}); |
| this.tableDatatypes.setColumnHeaders(new String[] {"Short Name", "XACML Data Type ID"}); |
| this.tableDatatypes.setImmediate(true); |
| this.tableDatatypes.setNullSelectionAllowed(false); |
| this.tableDatatypes.setPageLength(10); |
| // |
| // Are we restricted to a certain datatype? |
| // |
| if (this.datatype != null) { |
| // |
| // Datatype restricted |
| // |
| this.tableDatatypes.select(this.datatype.getId()); |
| this.tableDatatypes.setEnabled(false); |
| return; |
| } |
| this.tableDatatypes.setSelectable(true); |
| // |
| // Select a default |
| // |
| Datatype defaultDatatype; |
| if (this.attribute == null || this.attribute.getDatatypeBean() == null) { |
| defaultDatatype = JPAUtils.findDatatype(XACML3.ID_DATATYPE_STRING); |
| } else { |
| defaultDatatype = this.attribute.getDatatypeBean(); |
| } |
| if (defaultDatatype != null) { |
| this.tableDatatypes.select(defaultDatatype.getId()); |
| } |
| // |
| // Respond to events |
| // |
| this.tableDatatypes.addValueChangeListener(new ValueChangeListener() { |
| private static final long serialVersionUID = 1L; |
| |
| @Override |
| public void valueChange(ValueChangeEvent event) { |
| self.fireAttributeChanged(self.getAttribute()); |
| } |
| }); |
| } |
| |
| private void setupAttributeIDs() { |
| // |
| // Get the current selection (should NOT be null) |
| // |
| Object id = this.comboBoxCategories.getValue(); |
| Category category = AttributeStandardSelectorComponent.categories.getItem(id).getEntity(); |
| Set<Identifier> attributeIDs = null; |
| if (category.isStandard()) { |
| // |
| // Get the subset of attribute ID's specific to this standard |
| // category. |
| // |
| attributeIDs = XACMLConstants.MAP_STANDARD_CATEGORIES.get(category.getIdentifer()); |
| } |
| if (attributeIDs == null) { |
| // |
| // A custom category, there are no default attribute IDs |
| // that we can determine. |
| // |
| attributeIDs = XACMLConstants.STANDARD_ATTRIBUTES; |
| } |
| // |
| // Reset attribute IDs. Based on the category, add only acceptable |
| // attribute ID's for the category. |
| // |
| Object defaultBean = null; |
| this.tableAttributes.removeAllItems(); |
| for (Identifier attributeId : attributeIDs) { |
| BeanItem<AttributeBean> newItem = this.container.addItem(new AttributeBean(category.getIdentifer(), attributeId)); |
| if (this.attribute == null) { |
| if (attributeId.equals(XACML3.ID_SUBJECT_SUBJECT_ID) || |
| attributeId.equals(XACML3.ID_ACTION_ACTION_ID) || |
| attributeId.equals(XACML3.ID_RESOURCE_RESOURCE_ID) || |
| attributeId.equals(XACML3.ID_ENVIRONMENT_CURRENT_DATE)) { |
| defaultBean = newItem.getBean(); |
| } |
| } else { |
| if (newItem.getBean().getAttributeId().stringValue().equals(this.attribute.getXacmlId())) { |
| defaultBean = newItem.getBean(); |
| } |
| } |
| } |
| // |
| // Set the default selection |
| // |
| if (defaultBean != null) { |
| this.tableAttributes.select(defaultBean); |
| } |
| } |
| |
| @Override |
| public void commit() { |
| this.comboBoxCategories.commit(); |
| this.tableAttributes.commit(); |
| this.tableDatatypes.commit(); |
| } |
| |
| @Override |
| public Attribute getAttribute() { |
| Object categoryId = this.comboBoxCategories.getValue(); |
| Object attributeId = this.tableAttributes.getValue(); |
| Object datatypeId = this.tableDatatypes.getValue(); |
| if (attributeId == null || datatypeId == null || categoryId == null) { |
| return null; |
| } |
| AttributeBean attributeBean = this.container.getItem(attributeId).getBean(); |
| Datatype datatype = AttributeStandardSelectorComponent.datatypes.getItem(datatypeId).getEntity(); |
| Category category = AttributeStandardSelectorComponent.categories.getItem(categoryId).getEntity(); |
| if (datatype == null || category == null) { |
| return null; |
| } |
| Attribute attribute = new Attribute(attributeBean.getAttributeId().stringValue()); |
| attribute.setCategoryBean(category); |
| attribute.setDatatypeBean(datatype); |
| |
| return attribute; |
| } |
| |
| @Override |
| public boolean addListener(AttributeChangedEventListener listener) { |
| return this.notifier.addListener(listener); |
| } |
| |
| @Override |
| public boolean removeListener(AttributeChangedEventListener listener) { |
| return this.notifier.removeListener(listener); |
| } |
| |
| @Override |
| public void fireAttributeChanged(Attribute attribute) { |
| this.notifier.fireAttributeChanged(attribute); |
| } |
| |
| @AutoGenerated |
| private VerticalLayout buildMainLayout() { |
| // common part: create layout |
| mainLayout = new VerticalLayout(); |
| mainLayout.setImmediate(false); |
| mainLayout.setWidth("-1px"); |
| mainLayout.setHeight("-1px"); |
| mainLayout.setMargin(false); |
| mainLayout.setSpacing(true); |
| |
| // top-level component properties |
| setWidth("-1px"); |
| setHeight("-1px"); |
| |
| // comboBoxCategories |
| comboBoxCategories = new ComboBox(); |
| comboBoxCategories.setCaption("Select A Category"); |
| comboBoxCategories.setImmediate(false); |
| comboBoxCategories.setWidth("-1px"); |
| comboBoxCategories.setHeight("-1px"); |
| comboBoxCategories.setInvalidAllowed(false); |
| comboBoxCategories.setRequired(true); |
| mainLayout.addComponent(comboBoxCategories); |
| mainLayout.setExpandRatio(comboBoxCategories, 1.0f); |
| |
| // horizontalLayout_2 |
| horizontalLayout_2 = buildHorizontalLayout_2(); |
| mainLayout.addComponent(horizontalLayout_2); |
| mainLayout.setExpandRatio(horizontalLayout_2, 1.0f); |
| |
| return mainLayout; |
| } |
| |
| @AutoGenerated |
| private HorizontalLayout buildHorizontalLayout_2() { |
| // common part: create layout |
| horizontalLayout_2 = new HorizontalLayout(); |
| horizontalLayout_2.setImmediate(false); |
| horizontalLayout_2.setWidth("-1px"); |
| horizontalLayout_2.setHeight("-1px"); |
| horizontalLayout_2.setMargin(false); |
| horizontalLayout_2.setSpacing(true); |
| |
| // tableAttributes |
| tableAttributes = new Table(); |
| tableAttributes.setCaption("Standard Attributes"); |
| tableAttributes.setImmediate(false); |
| tableAttributes.setWidth("-1px"); |
| tableAttributes.setHeight("-1px"); |
| tableAttributes.setInvalidAllowed(false); |
| tableAttributes.setRequired(true); |
| horizontalLayout_2.addComponent(tableAttributes); |
| |
| // tableDatatypes |
| tableDatatypes = new Table(); |
| tableDatatypes.setCaption("Standard Data Types"); |
| tableDatatypes.setImmediate(false); |
| tableDatatypes.setWidth("-1px"); |
| tableDatatypes.setHeight("-1px"); |
| tableDatatypes.setInvalidAllowed(false); |
| tableDatatypes.setRequired(true); |
| horizontalLayout_2.addComponent(tableDatatypes); |
| |
| return horizontalLayout_2; |
| } |
| |
| } |