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

Java tutorial

Introduction

Here is the source code for org.apache.openaz.xacml.admin.view.windows.PIPConfigurationEditorWindow.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.Locale;

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.PIPConfiguration;
import org.apache.openaz.xacml.admin.jpa.PIPType;
import org.apache.openaz.xacml.admin.util.JPAUtils;
import org.apache.openaz.xacml.admin.view.fields.ConfigParamField;
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.converter.Converter;
import com.vaadin.event.FieldEvents.TextChangeEvent;
import com.vaadin.event.FieldEvents.TextChangeListener;
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.GridLayout;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.Window;

public class PIPConfigurationEditorWindow extends Window {
    private static final long serialVersionUID = 1L;
    private static final Log logger = LogFactory.getLog(PIPConfigurationEditorWindow.class);
    private final PIPConfigurationEditorWindow self = this;
    private final EntityItem<PIPConfiguration> entity;
    private FieldGroup fieldGroup;
    private boolean isSaved = false;

    private GridLayout grid = new GridLayout(2, 6);

    @PropertyId("piptype")
    ComboBox comboType = new ComboBox("Type");

    @PropertyId("name")
    TextField fieldName = new TextField("Name");

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

    @PropertyId("issuer")
    TextField fieldIssuer = new TextField("Issuer");

    @PropertyId("requiresResolvers")
    CheckBox requiresResolvers = new CheckBox("Requires Resolvers");

    @PropertyId("pipconfigParams")
    ConfigParamField paramField = null;

    Button buttonSave = new Button("Save");

    /**
     * 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 PIPConfigurationEditorWindow(EntityItem<PIPConfiguration> entity) {
        //
        // Our base component
        //
        this.setContent(this.grid);
        this.grid.setMargin(true);
        this.grid.setSpacing(true);
        //
        // Set our shortcuts
        //
        this.setCloseShortcut(KeyCode.ESCAPE);
        //
        // Save
        //
        this.entity = entity;
        //
        // Check if a brand new object and set the default
        // pip type.
        //
        if (this.entity.getEntity().getPiptype() == null) {
            this.entity.getEntity().setPiptype(JPAUtils.getPIPType(PIPType.TYPE_SQL));
        }

        //
        // Initialize GUI components
        //
        this.initialize();
        //
        // Add components
        //
        this.grid.addComponent(this.comboType, 0, 0);
        this.grid.addComponent(this.fieldName, 0, 1);
        this.grid.addComponent(this.fieldIssuer, 0, 2);
        this.grid.addComponent(this.areaDescription, 0, 3);
        this.grid.addComponent(this.requiresResolvers, 0, 4);
        this.grid.addComponent(this.paramField, 1, 0, 1, 4);
        this.grid.addComponent(this.buttonSave, 0, 5, 1, 5);
        //
        // Bind and initialize
        //
        this.initializeFields();
        //
        // Post initialize
        //
        this.initializeButtons();
        //
        // Set focus
        //
        this.fieldName.focus();
        //
        // Initially call this to see if the entity is already
        // saveable
        //
        this.formChanged();
    }

    protected void initialize() {
        //
        //
        //
        this.fieldName.setImmediate(true);
        this.fieldName.setNullRepresentation("");
        this.fieldName.setRequired(true);
        this.fieldName.setRequiredError("Enter a name for the configuration");
        this.fieldName.setInputPrompt("Eg. \"Company LDAP Server\" or \"MySQL Customer DB\"");

        this.fieldIssuer.setNullRepresentation("");
        this.fieldIssuer.setRequired(false);
        this.fieldIssuer.setInputPrompt("Eg. urn:com:sample:hr");

        this.areaDescription.setNullRepresentation("");
        this.areaDescription.setRequired(false);
        this.areaDescription.setInputPrompt("Optionally write a description for this configuration.");
        this.areaDescription.setRows(3);
        this.areaDescription.setWidth("100%");
        //
        //
        //
        this.requiresResolvers.setConverter(new Converter<Boolean, Object>() {
            private static final long serialVersionUID = 1L;

            @Override
            public Object convertToModel(Boolean value, Class<? extends Object> targetType, Locale locale)
                    throws Converter.ConversionException {
                if (targetType.isAssignableFrom(java.lang.Character.class)) {
                    if (value) {
                        return '1';
                    } else {
                        return '0';
                    }
                }
                return null;
            }

            @Override
            public Boolean convertToPresentation(Object value, Class<? extends Boolean> targetType, Locale locale)
                    throws Converter.ConversionException {
                if (value instanceof Character) {
                    return ((Character) value) == '1';
                }
                return null;
            }

            @Override
            public Class<Object> getModelType() {
                return Object.class;
            }

            @Override
            public Class<Boolean> getPresentationType() {
                return Boolean.class;
            }
        });
        //
        //
        //
        this.comboType.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getPIPTypes());
        this.comboType.setImmediate(true);
        this.comboType.setConverter(new SingleSelectConverter<Object>(this.comboType));
        this.comboType.setItemCaptionMode(ItemCaptionMode.PROPERTY);
        this.comboType.setItemCaptionPropertyId("type");
        this.comboType.setNullSelectionAllowed(false);
        this.comboType.setRequired(true);
        this.comboType.setRequiredError("You need to identify what type of configuration this is.");
        //
        //
        //
        this.paramField = new ConfigParamField(this.entity);
        this.paramField.setValidationVisible(false);
    }

    protected void initializeFields() {
        //
        // Now create our field group and bind our fields.
        // This will populate the components with the
        // current value if we are editing an entity.
        //
        this.fieldGroup = new FieldGroup(this.entity);
        this.fieldGroup.bindMemberFields(this);
        //
        //
        //
        this.fieldName.addTextChangeListener(new TextChangeListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void textChange(TextChangeEvent event) {
                self.formChanged();
            }

        });
        this.fieldName.addValueChangeListener(new ValueChangeListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void valueChange(ValueChangeEvent event) {
                self.formChanged();
            }
        });
        //
        //
        //
        this.paramField.addValueChangeListener(new ValueChangeListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void valueChange(ValueChangeEvent event) {
                self.formChanged();
            }
        });
        //
        // Only custom PIP configurations should be allowed to
        // check the "requires resolvers" box. We know that the
        // SQL/LDAP/HyperSQL/CSV resolver already do require resolvers.
        //
        if (this.entity.getEntity().getPiptype().isCustom() == false) {
            this.requiresResolvers.setEnabled(false);
        }
        //
        // Finish GUI intialization
        //
        if (this.entity.isPersistent()) {
            //
            // The user is editing something, don't let them change
            // the type
            //
            this.comboType.setReadOnly(true);
        }
        this.comboType.addValueChangeListener(new ValueChangeListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void valueChange(ValueChangeEvent event) {
                //
                // Get the new value
                //
                Object id = self.comboType.getValue();
                EntityItem<PIPType> type = null;
                if (id != null) {
                    type = ((XacmlAdminUI) UI.getCurrent()).getPIPTypes().getItem(id);
                }
                //
                // Have our custom field reset itself
                //
                self.paramField.resetContent(type != null ? type.getEntity() : null);
                //
                // Do we need to display the requires resolver check box?
                //
                if (type != null && type.getEntity().isCustom()) {
                    self.requiresResolvers.setEnabled(true);
                    self.requiresResolvers.setRequired(true);
                    self.requiresResolvers.setValue(self.entity.getEntity().requiresResolvers());
                } else {
                    self.requiresResolvers.setEnabled(false);
                    self.requiresResolvers.setRequired(false);
                }
                //
                // Re-center the form
                //
                self.center();
                //
                // Check if we can enable the save button
                //
                self.formChanged();
            }
        });
    }

    protected void formChanged() {
        if (this.fieldGroup.isValid() || this.entity.isModified()) {
            this.buttonSave.setEnabled(true);
        } else {
            this.buttonSave.setEnabled(false);
        }
    }

    protected void initializeButtons() {
        this.grid.setComponentAlignment(this.buttonSave, Alignment.BOTTOM_CENTER);
        this.buttonSave.setImmediate(true);
        this.buttonSave.setEnabled(false);
        this.buttonSave.addClickListener(new ClickListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void buttonClick(ClickEvent event) {
                try {
                    //
                    // Commit changes
                    //
                    self.fieldGroup.commit();
                    //
                    // Save
                    //
                    self.isSaved = true;
                    //
                    // We can close
                    //
                    self.close();
                } catch (CommitException e) {
                    logger.warn("Couldn't commit, the save button should NOT be enabled.");
                }
            }
        });
    }

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