org.apache.openaz.xacml.admin.view.windows.AttributeEditorWindow.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.openaz.xacml.admin.view.windows.AttributeEditorWindow.java

Source

/*
 *  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.windows;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.apache.openaz.xacml.admin.XacmlAdminUI;
import org.apache.openaz.xacml.admin.jpa.Attribute;
import org.apache.openaz.xacml.admin.jpa.ConstraintType;
import org.apache.openaz.xacml.admin.jpa.Datatype;
import org.apache.openaz.xacml.admin.view.fields.ConstraintField;
import org.apache.openaz.xacml.admin.view.fields.DesignatorSelectorField;
import org.apache.openaz.xacml.api.Identifier;
import org.apache.openaz.xacml.api.XACML3;
import com.vaadin.addon.jpacontainer.EntityItem;
import com.vaadin.addon.jpacontainer.fieldfactory.SingleSelectConverter;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.fieldgroup.FieldGroup;
import com.vaadin.data.fieldgroup.FieldGroup.CommitException;
import com.vaadin.data.fieldgroup.PropertyId;
import com.vaadin.data.util.filter.Compare;
import com.vaadin.data.util.filter.Not;
import com.vaadin.event.ShortcutAction.KeyCode;
import com.vaadin.shared.ui.combobox.FilteringMode;
import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
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.ComboBox;
import com.vaadin.ui.FormLayout;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.Window;

public class AttributeEditorWindow extends Window {
    private static final long serialVersionUID = 1L;
    private static final Log logger = LogFactory.getLog(AttributeEditorWindow.class);
    private AttributeEditorWindow self = this;

    private boolean isSaved = false;
    private Attribute attribute;

    private FormLayout mainLayout = new FormLayout();

    @PropertyId("isDesignator")
    DesignatorSelectorField selectDesignator;

    @PropertyId("selectorPath")
    TextField selectorPath = new TextField("Attribute Selector Path");

    @PropertyId("xacmlId")
    TextField xacmlID = new TextField("XACML ID");

    @PropertyId("categoryBean")
    ComboBox category = new ComboBox("Category");

    @PropertyId("description")
    TextArea descriptionField = new TextArea("Description");

    @PropertyId("datatypeBean")
    ComboBox datatype = new ComboBox("DataType");

    @PropertyId("constraintType")
    ComboBox constraintTypes = new ComboBox("Constraint Type");

    @PropertyId("constraintValues")
    ConstraintField constraintValues;

    Button saveButton = new Button("Save");

    FieldGroup fieldGroup = null;

    /**
     * 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 AttributeEditorWindow(EntityItem<Attribute> entityItem) {
        //
        // Save our attribute
        //
        this.attribute = entityItem.getEntity();
        if (logger.isDebugEnabled()) {
            logger.debug("Editing attribute: " + entityItem.getEntity().toString());
        }
        //
        // Set our shortcuts
        //
        this.setCloseShortcut(KeyCode.ESCAPE);
        //
        // Create our main layout
        //
        this.setContent(mainLayout);
        //
        // Finish setting up the main layout
        //
        this.mainLayout.setSpacing(true);
        this.mainLayout.setMargin(true);
        //
        // Setup option group, binding the
        // field group doesn't seem to work.
        //
        this.selectDesignator = new DesignatorSelectorField(entityItem);
        this.selectDesignator.setCaption("Select the Attribute Type");
        this.selectDesignator.addValueChangeListener(new ValueChangeListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void valueChange(ValueChangeEvent event) {
                Object value = self.selectDesignator.getValue();
                if (value == null || !(value instanceof Character)) {
                    self.selectorPath.setVisible(false);
                }
                if (((Character) value) == '1') {
                    self.selectorPath.setVisible(false);
                } else {
                    self.selectorPath.setVisible(true);
                }
            }
        });
        //
        // Setup selector path
        //
        this.selectorPath.setImmediate(true);
        this.selectorPath.setNullRepresentation("");
        this.selectorPath.setWidth("100%");
        //
        // Setup the Category combo
        //
        this.category.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getCategories());
        this.category.setItemCaptionMode(ItemCaptionMode.PROPERTY);
        this.category.setItemCaptionPropertyId("xacmlId");
        this.category.setFilteringMode(FilteringMode.CONTAINS);
        this.category.setImmediate(true);
        this.category.setNullSelectionAllowed(false);
        this.category.setConverter(new SingleSelectConverter<Object>(this.category));
        //
        // Setup the Datatype combo
        //
        this.datatype.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getDatatypes());
        this.datatype.setItemCaptionMode(ItemCaptionMode.PROPERTY);
        this.datatype.setItemCaptionPropertyId("xacmlId");
        this.datatype.setFilteringMode(FilteringMode.CONTAINS);
        this.datatype.setImmediate(true);
        this.datatype.setNullSelectionAllowed(false);
        this.datatype.setConverter(new SingleSelectConverter<Object>(this.datatype));
        //
        // Setup the constraint type combo
        //
        this.constraintTypes.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getConstraintTypes());
        this.constraintTypes.setItemCaptionMode(ItemCaptionMode.PROPERTY);
        this.constraintTypes.setItemCaptionPropertyId("constraintType");
        this.constraintTypes.setFilteringMode(FilteringMode.CONTAINS);
        this.constraintTypes.setImmediate(true);
        this.constraintTypes.setNullSelectionAllowed(true);
        this.constraintTypes.setConverter(new SingleSelectConverter<Object>(this.constraintTypes));
        //
        // Setup the constraint value custom field
        //
        this.constraintValues = new ConstraintField(entityItem);
        //
        // Finish laying out the main layout
        //
        this.mainLayout.addComponent(this.selectDesignator);
        this.mainLayout.addComponent(this.selectorPath);
        this.mainLayout.addComponent(this.xacmlID);
        this.mainLayout.addComponent(this.category);
        this.mainLayout.addComponent(this.descriptionField);
        this.mainLayout.addComponent(this.datatype);
        this.mainLayout.addComponent(this.constraintTypes);
        this.mainLayout.addComponent(this.constraintValues);
        //
        // Now create our field group and bind our bean items
        // This will populate the components with the attribute's
        // current value.
        //
        this.fieldGroup = new FieldGroup(entityItem);
        this.fieldGroup.bindMemberFields(this);
        //
        // Finishing setting up after the bind. There are some components
        // where initializing the bind causes some properties to be reset.
        //
        this.xacmlID.setWidth("100%");
        this.descriptionField.setNullRepresentation("");
        this.descriptionField.setWidth("100%");
        this.setupDatatype(this.attribute.getDatatypeBean().getIdentifer());
        this.datatype.addValueChangeListener(new ValueChangeListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void valueChange(ValueChangeEvent event) {
                Identifier id = self.getCurrentDatatype();
                if (id != null) {
                    self.setupDatatype(id);
                }
            }
        });
        //
        // Listen to when constraint type changes
        //
        this.constraintTypes.addValueChangeListener(new ValueChangeListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void valueChange(ValueChangeEvent event) {
                Object value = self.constraintTypes.getValue();
                if (value == null) {
                    self.constraintValues.resetContent(null, self.getCurrentDatatype());
                } else {
                    ConstraintType newValue = ((XacmlAdminUI) UI.getCurrent()).getConstraintTypes().getItem(value)
                            .getEntity();
                    self.constraintValues.resetContent(newValue, self.getCurrentDatatype());
                }
            }
        });
        //
        // Setup our "SAVE" button to commit the fields
        //
        this.mainLayout.addComponent(this.saveButton);
        this.mainLayout.setComponentAlignment(this.saveButton, Alignment.MIDDLE_CENTER);
        this.saveButton.addClickListener(new ClickListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void buttonClick(ClickEvent event) {
                try {
                    //
                    // SAVE the latest values
                    //
                    fieldGroup.commit();
                    //
                    // Set that we did save the attribute
                    //
                    self.isSaved = true;
                    //
                    // Close the window
                    //
                    self.close();
                } catch (CommitException e) {
                    logger.error("Failed to commit fields", e);
                }
            }

        });
        //
        // Add our close listener so we can discard anything that was changed.
        //
        this.addCloseListener(new CloseListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void windowClose(CloseEvent e) {
                if (self.isSaved == false) {
                    logger.info("discarding");
                    //
                    // Discard any changes to the existing JPA container entity
                    //
                    self.fieldGroup.discard();
                    //
                    // Make sure there are no filters on the container
                    //
                    ((XacmlAdminUI) UI.getCurrent()).getConstraintTypes().removeAllContainerFilters();
                }
            }

        });
        //
        // Set focus
        //
        this.xacmlID.focus();
    }

    private void setupDatatype(Identifier datatype) {
        if (datatype.equals(XACML3.ID_DATATYPE_INTEGER) || datatype.equals(XACML3.ID_DATATYPE_DOUBLE)) {
            ((XacmlAdminUI) UI.getCurrent()).getConstraintTypes().removeAllContainerFilters();
            this.constraintTypes.setEnabled(true);
            this.constraintValues.resetDatatype(datatype);
            return;
        }
        if (datatype.equals(XACML3.ID_DATATYPE_STRING)) {
            ((XacmlAdminUI) UI.getCurrent()).getConstraintTypes()
                    .addContainerFilter(new Not(new Compare.Equal("constraintType", ConstraintType.RANGE_TYPE)));
            if (this.attribute.getConstraintType() != null
                    && this.attribute.getConstraintType().getConstraintType() != null
                    && this.attribute.getConstraintType().getConstraintType().equals(ConstraintType.RANGE_TYPE)) {
                this.attribute.setConstraintType(null);
            }
            this.constraintValues.resetDatatype(datatype);
            return;
        }
        //
        // No constraint for all other datatypes
        //
        this.attribute.setConstraintType(null);
        this.constraintTypes.select(null);
        this.constraintTypes.setEnabled(false);
    }

    private Identifier getCurrentDatatype() {
        Object id = self.datatype.getValue();
        if (id != null) {
            EntityItem<Datatype> dt = ((XacmlAdminUI) UI.getCurrent()).getDatatypes().getItem(id);
            if (dt != null) {
                return dt.getEntity().getIdentifer();
            }
        }
        return null;
    }

    public boolean isSaved() {
        return this.isSaved;
    }
}