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

Java tutorial

Introduction

Here is the source code for org.apache.openaz.xacml.admin.view.windows.ApplyEditorWindow.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 java.util.List;
import java.util.Map;

import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.ConditionType;

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.Datatype;
import org.apache.openaz.xacml.admin.jpa.FunctionArgument;
import org.apache.openaz.xacml.admin.jpa.FunctionDefinition;
import org.apache.openaz.xacml.admin.util.JPAUtils;
import org.apache.openaz.xacml.admin.view.events.ApplyParametersChangedListener;
import org.apache.openaz.xacml.admin.view.events.ApplyParametersChangedNotifier;
import org.apache.openaz.xacml.api.XACML3;
import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Buffered.SourceException;
import com.vaadin.data.Container;
import com.vaadin.data.Container.Filter;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.Validator.InvalidValueException;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.filter.Compare;
import com.vaadin.data.util.filter.SimpleStringFilter;
import com.vaadin.event.FieldEvents.TextChangeEvent;
import com.vaadin.event.FieldEvents.TextChangeListener;
import com.vaadin.event.ItemClickEvent;
import com.vaadin.event.ItemClickEvent.ItemClickListener;
import com.vaadin.event.ShortcutAction.KeyCode;
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.CheckBox;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;

public class ApplyEditorWindow extends Window implements ApplyParametersChangedNotifier {

    /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

    @AutoGenerated
    private VerticalLayout mainLayout;
    @AutoGenerated
    private Button buttonSelect;
    @AutoGenerated
    private Table tableFunction;
    @AutoGenerated
    private HorizontalLayout horizontalLayout_1;
    @AutoGenerated
    private CheckBox checkBoxFilterIsBag;
    @AutoGenerated
    private ComboBox comboBoxDatatypeFilter;
    @AutoGenerated
    private TextField textFieldFilter;
    @AutoGenerated
    private TextArea textAreaDescription;
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private static Log logger = LogFactory.getLog(ApplyEditorWindow.class);
    private final ApplyEditorWindow self = this;
    private final ApplyParametersChangedNotifier notifier = new ApplyParametersChangedNotifier.BasicNotifier();
    private final BeanItemContainer<FunctionDefinition> container = new BeanItemContainer<FunctionDefinition>(
            FunctionDefinition.class);
    private final ApplyType apply;
    private final ApplyType applyParent;
    private final FunctionArgument argument;
    private final Object parent;
    private boolean isSaved = false;
    private FunctionDefinition function = 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.
     * @param parent 
     * @param parentApply 
     */
    public ApplyEditorWindow(ApplyType apply, ApplyType parentApply, FunctionArgument argument, Object parent) {
        buildMainLayout();
        //setCompositionRoot(mainLayout);
        setContent(mainLayout);
        //
        // Save
        //
        this.apply = apply;
        this.applyParent = parentApply;
        this.argument = argument;
        this.parent = parent;
        logger.info(this.apply + " " + this.applyParent + " " + this.argument + " " + this.parent);
        //
        // Set our shortcuts
        //
        this.setCloseShortcut(KeyCode.ESCAPE);
        //
        // Initialize
        //
        this.textAreaDescription.setValue(apply.getDescription());
        this.textAreaDescription.setNullRepresentation("");
        this.initializeButton();
        this.initializeTable();
        this.initializeFilters();
        //
        // focus
        //
        this.textFieldFilter.focus();
    }

    protected void initializeTable() {
        //
        // Setup GUI properties
        //
        this.tableFunction.setImmediate(true);
        this.tableFunction.setSelectable(true);
        this.tableFunction.setNullSelectionAllowed(false);
        this.tableFunction.setRequired(true);
        this.tableFunction.setRequiredError("You MUST select a function for the Apply");
        //
        // Set its data source
        //
        this.tableFunction.setContainerDataSource(this.container);
        this.tableFunction
                .setVisibleColumns(new Object[] { "xacmlid", "shortname", "datatypeBean", "isBagReturn" });
        this.tableFunction
                .setColumnHeaders(new String[] { "Function Xacml ID", "ID", "Return Data Type", "Return Bag?" });
        //
        // Determine appropriate filters
        //
        Datatype datatypeId = null;
        if (this.applyParent == null) {
            if (this.parent instanceof ConditionType) {
                //
                // Only boolean functions allowed
                //
                datatypeId = JPAUtils.findDatatype(XACML3.ID_DATATYPE_BOOLEAN);
            }
        } else {
            String parentFunction = this.applyParent.getFunctionId();
            this.function = JPAUtils.findFunction(parentFunction);
            if (this.function == null) {
                throw new IllegalArgumentException("applyParent's function is not found:" + parentFunction);
            }
            if (this.argument == null) {
                throw new IllegalArgumentException("Need to know what argument apply is ");
            }
            datatypeId = this.argument.getDatatypeBean();
        }
        Map<Datatype, List<FunctionDefinition>> functionMap = JPAUtils.getFunctionDatatypeMap();
        if (datatypeId == null) {
            //
            // All functions are available
            //
            for (Datatype id : functionMap.keySet()) {
                this.addTableEntries(functionMap.get(id));
            }
        } else {
            for (Datatype id : functionMap.keySet()) {
                if (id == null) {
                    if (datatypeId == null) {
                        this.addTableEntries(functionMap.get(id));
                        break;
                    }
                    continue;
                }
                if (id.getId() == datatypeId.getId()) {
                    this.addTableEntries(functionMap.get(id));
                    break;
                }
            }
        }
        //
        // Setup double-click
        //
        this.tableFunction.addItemClickListener(new ItemClickListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void itemClick(ItemClickEvent event) {
                if (event.isDoubleClick()) {
                    self.selected();
                }
            }
        });
        //
        // Value change listener
        //
        this.tableFunction.addValueChangeListener(new ValueChangeListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void valueChange(ValueChangeEvent event) {
                logger.info("valueChange " + self.tableFunction.getValue());
                if (self.tableFunction.getValue() != null) {
                    self.buttonSelect.setEnabled(true);
                } else {
                    self.buttonSelect.setEnabled(false);
                }
            }
        });
        //
        // Select current value if possible
        //
        if (this.apply != null && this.apply.getFunctionId() != null
                && this.apply.getFunctionId().isEmpty() == false) {
            FunctionDefinition current = JPAUtils.findFunction(this.apply.getFunctionId());
            if (current != null) {
                this.tableFunction.select(current);
                this.tableFunction.setCurrentPageFirstItemId(current);
            } else {
                logger.warn("Could not find function in table for " + this.apply.getFunctionId());
            }
        } else {
            this.buttonSelect.setEnabled(false);
        }
    }

    protected void addTableEntries(List<FunctionDefinition> functions) {
        if (functions == null) {
            logger.warn("NULL list of functions, cannot add to table.");
            return;
        }
        for (FunctionDefinition function : functions) {
            //
            // Just check if this function is available for this
            // apply.
            //
            //         if (XACMLFunctionValidator.isFunctionAvailable(function, this.apply, this.argument)) {
            this.container.addBean(function);
            //         } else {
            //            if (logger.isDebugEnabled()) {
            //               logger.debug("Function not available: " + function);
            //            }
            //         }
        }
    }

    protected void initializeButton() {
        this.buttonSelect.addClickListener(new ClickListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void buttonClick(ClickEvent event) {
                self.selected();
            }
        });
    }

    protected void initializeFilters() {
        this.textFieldFilter.setImmediate(true);
        this.textFieldFilter.addTextChangeListener(new TextChangeListener() {
            private static final long serialVersionUID = 1L;
            SimpleStringFilter currentFilter = null;

            @Override
            public void textChange(TextChangeEvent event) {
                //
                // Remove current filter
                //
                if (this.currentFilter != null) {
                    self.container.removeContainerFilter(this.currentFilter);
                    this.currentFilter = null;
                }
                //
                // Get the text
                //
                String value = event.getText();
                if (value != null && value.length() > 0) {
                    //
                    // Add the new filter
                    //
                    this.currentFilter = new SimpleStringFilter("shortname", value, true, false);
                    self.container.addContainerFilter(this.currentFilter);
                }
            }
        });

        this.comboBoxDatatypeFilter.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getDatatypes());
        this.comboBoxDatatypeFilter.setImmediate(true);
        this.comboBoxDatatypeFilter.setItemCaptionMode(ItemCaptionMode.PROPERTY);
        this.comboBoxDatatypeFilter.setItemCaptionPropertyId("xacmlId");
        this.comboBoxDatatypeFilter.setNullSelectionAllowed(true);
        this.comboBoxDatatypeFilter.addValueChangeListener(new ValueChangeListener() {
            private static final long serialVersionUID = 1L;
            Container.Filter currentFilter = null;

            @Override
            public void valueChange(ValueChangeEvent event) {
                //
                // Remove current filter
                //
                if (this.currentFilter != null) {
                    self.container.removeContainerFilter(this.currentFilter);
                    this.currentFilter = null;
                }
                //
                // Get the current selection
                //
                Object id = self.comboBoxDatatypeFilter.getValue();
                if (id == null) {
                    return;
                }
                //
                // Setup the filter
                //
                final Datatype datatype = ((XacmlAdminUI) UI.getCurrent()).getDatatypes().getItem(id).getEntity();
                this.currentFilter = new Container.Filter() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public boolean passesFilter(Object itemId, Item item) throws UnsupportedOperationException {
                        if (itemId instanceof FunctionDefinition) {
                            Datatype dt = ((FunctionDefinition) itemId).getDatatypeBean();
                            if (dt == null) {
                                return false;
                            }
                            return dt.getXacmlId().equals(datatype.getXacmlId());
                        }
                        return false;
                    }

                    @Override
                    public boolean appliesToProperty(Object propertyId) {
                        if (propertyId != null && propertyId.toString().equals("datatypeBean")) {
                            return true;
                        }
                        return false;
                    }
                };
                self.container.addContainerFilter(this.currentFilter);
            }
        });

        this.checkBoxFilterIsBag.setImmediate(true);
        this.checkBoxFilterIsBag.addValueChangeListener(new ValueChangeListener() {
            private static final long serialVersionUID = 1L;
            Filter currentFilter = null;

            @Override
            public void valueChange(ValueChangeEvent event) {
                //
                // Remove current filter
                //
                if (this.currentFilter != null) {
                    self.container.removeContainerFilter(this.currentFilter);
                    this.currentFilter = null;
                }
                //
                // Is it checked?
                //
                if (self.checkBoxFilterIsBag.getValue() == false) {
                    //
                    // Nope, get out of here
                    //
                    return;
                }
                //
                // Add the filter
                //
                this.currentFilter = new Compare.Equal("isBagReturn", true);
                self.container.addContainerFilter(this.currentFilter);
            }
        });
    }

    protected void selected() {
        //
        // Is there a selected function?
        //
        try {
            //
            // Run the commit
            //
            this.textAreaDescription.commit();
            this.tableFunction.commit();
            //
            // Commit worked, get the selected function
            //
            Object id = this.tableFunction.getValue();
            //
            // Sanity check, it *should* never be null
            // unless someone changed the initialization code.
            //
            if (id == null || !(id instanceof FunctionDefinition)) {
                throw new InvalidValueException(this.tableFunction.getRequiredError());
            }
            //
            // Get the actual function and save it into the apply
            //
            this.function = (FunctionDefinition) id;
            this.apply.setDescription(this.textAreaDescription.getValue());
            this.apply.setFunctionId(function.getXacmlid());
        } catch (SourceException | InvalidValueException e) {
            //
            // Vaadin GUI will display message
            //
            return;
        }
        /**
        //
        // Make sure the arguments are good
        //
        final ApplyType copyApply = XACMLObjectCopy.copy(this.apply);
        final ApplyArgumentsEditorWindow window = new ApplyArgumentsEditorWindow(copyApply, this.function);
        window.setCaption("Define Arguments for " + this.function.getShortname());
        window.setModal(true);
        window.addCloseListener(new CloseListener() {
           private static final long serialVersionUID = 1L;
            
           @Override
           public void windowClose(CloseEvent e) {
        //
        // Did the user click save?
        //
        if (window.isSaved() == false) {
           return;
        }
        //
        // Save our arguments
        //
        self.apply.getExpression().clear();
        self.apply.getExpression().addAll(copyApply.getExpression());
        //
        // We are saved
        //
        self.isSaved = true;
        //
        // Fire
        //
        self.fireEvent(self.apply, self.applyParent, self.argument, self.parent);
        //
        // Close the apply editor window
        //
        self.close();
           }
        });
        window.center();
        UI.getCurrent().addWindow(window);
        **/
        //
        // We are saved
        //
        self.isSaved = true;
        //
        // Fire
        //
        self.fireEvent(self.apply, self.applyParent, self.argument, self.parent);
        //
        // Close the apply editor window
        //
        self.close();
    }

    @Override
    public boolean addListener(ApplyParametersChangedListener listener) {
        return this.notifier.addListener(listener);
    }

    @Override
    public boolean removeListener(ApplyParametersChangedListener listener) {
        return this.notifier.removeListener(listener);
    }

    @Override
    public void fireEvent(ApplyType apply, ApplyType parent, FunctionArgument argument, Object container) {
        this.notifier.fireEvent(apply, parent, argument, container);
    }

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

    public FunctionDefinition getSelectedFunction() {
        return this.function;
    }

    @AutoGenerated
    private VerticalLayout buildMainLayout() {
        // common part: create layout
        mainLayout = new VerticalLayout();
        mainLayout.setImmediate(false);
        mainLayout.setWidth("-1px");
        mainLayout.setHeight("-1px");
        mainLayout.setMargin(true);
        mainLayout.setSpacing(true);

        // top-level component properties
        setWidth("-1px");
        setHeight("-1px");

        // horizontalLayout_1
        horizontalLayout_1 = buildHorizontalLayout_1();
        mainLayout.addComponent(horizontalLayout_1);

        // tableFunction
        tableFunction = new Table();
        tableFunction.setCaption("Select A Function");
        tableFunction.setImmediate(false);
        tableFunction.setWidth("100.0%");
        tableFunction.setHeight("-1px");
        tableFunction.setInvalidAllowed(false);
        tableFunction.setRequired(true);
        mainLayout.addComponent(tableFunction);
        mainLayout.setExpandRatio(tableFunction, 1.0f);

        // buttonSelect
        buttonSelect = new Button();
        buttonSelect.setCaption("Select and Continue");
        buttonSelect.setImmediate(true);
        buttonSelect.setWidth("-1px");
        buttonSelect.setHeight("-1px");
        mainLayout.addComponent(buttonSelect);
        mainLayout.setComponentAlignment(buttonSelect, new Alignment(48));

        return mainLayout;
    }

    @AutoGenerated
    private HorizontalLayout buildHorizontalLayout_1() {
        // common part: create layout
        horizontalLayout_1 = new HorizontalLayout();
        horizontalLayout_1.setImmediate(false);
        horizontalLayout_1.setWidth("-1px");
        horizontalLayout_1.setHeight("-1px");
        horizontalLayout_1.setMargin(false);
        horizontalLayout_1.setSpacing(true);

        // textAreaDescription
        textAreaDescription = new TextArea();
        textAreaDescription.setCaption("Enter A Description");
        textAreaDescription.setImmediate(false);
        textAreaDescription.setWidth("50.0%");
        textAreaDescription.setHeight("-1px");
        horizontalLayout_1.addComponent(textAreaDescription);

        // textFieldFilter
        textFieldFilter = new TextField();
        textFieldFilter.setCaption("Filter Function By ID");
        textFieldFilter.setImmediate(false);
        textFieldFilter.setWidth("-1px");
        textFieldFilter.setHeight("-1px");
        horizontalLayout_1.addComponent(textFieldFilter);
        horizontalLayout_1.setComponentAlignment(textFieldFilter, new Alignment(9));

        // comboBoxDatatypeFilter
        comboBoxDatatypeFilter = new ComboBox();
        comboBoxDatatypeFilter.setCaption("Filter By Data Type");
        comboBoxDatatypeFilter.setImmediate(false);
        comboBoxDatatypeFilter.setWidth("-1px");
        comboBoxDatatypeFilter.setHeight("-1px");
        horizontalLayout_1.addComponent(comboBoxDatatypeFilter);
        horizontalLayout_1.setComponentAlignment(comboBoxDatatypeFilter, new Alignment(9));

        // checkBoxFilterIsBag
        checkBoxFilterIsBag = new CheckBox();
        checkBoxFilterIsBag.setCaption("Is Bag Filter");
        checkBoxFilterIsBag.setImmediate(false);
        checkBoxFilterIsBag.setWidth("-1px");
        checkBoxFilterIsBag.setHeight("-1px");
        horizontalLayout_1.addComponent(checkBoxFilterIsBag);
        horizontalLayout_1.setComponentAlignment(checkBoxFilterIsBag, new Alignment(9));

        return horizontalLayout_1;
    }

}