| /* |
| * 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 org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| |
| import org.apache.openaz.xacml.admin.jpa.Attribute; |
| import org.apache.openaz.xacml.admin.jpa.ConstraintValue; |
| import org.apache.openaz.xacml.admin.util.AdminNotification; |
| import org.apache.openaz.xacml.api.Identifier; |
| import org.apache.openaz.xacml.api.XACML3; |
| import com.vaadin.annotations.AutoGenerated; |
| import com.vaadin.data.Property.ValueChangeEvent; |
| import com.vaadin.data.Property.ValueChangeListener; |
| import com.vaadin.data.Validator; |
| import com.vaadin.data.Validator.InvalidValueException; |
| import com.vaadin.data.validator.DoubleRangeValidator; |
| import com.vaadin.data.validator.IntegerRangeValidator; |
| 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.CustomComponent; |
| import com.vaadin.ui.HorizontalLayout; |
| import com.vaadin.ui.Panel; |
| import com.vaadin.ui.TextField; |
| import com.vaadin.ui.VerticalLayout; |
| |
| public class RangeEditorComponent extends CustomComponent { |
| @AutoGenerated |
| private VerticalLayout mainLayout; |
| @AutoGenerated |
| private Panel panelTester; |
| @AutoGenerated |
| private VerticalLayout verticalLayout_2; |
| @AutoGenerated |
| private Button buttonValidate; |
| @AutoGenerated |
| private TextField textFieldTestInput; |
| @AutoGenerated |
| private HorizontalLayout horizontalLayout_2; |
| @AutoGenerated |
| private TextField textFieldMax; |
| @AutoGenerated |
| private ComboBox comboBoxMax; |
| @AutoGenerated |
| private HorizontalLayout horizontalLayout_1; |
| @AutoGenerated |
| private TextField textFieldMin; |
| @AutoGenerated |
| private ComboBox comboBoxMin; |
| private static final long serialVersionUID = -1L; |
| private static final Log logger = LogFactory.getLog(RangeEditorComponent.class); |
| private final RangeEditorComponent self = this; |
| private final Attribute attribute; |
| private Identifier datatype; |
| |
| /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ |
| |
| public RangeEditorComponent(Attribute attribute, Identifier datatype) { |
| buildMainLayout(); |
| setCompositionRoot(mainLayout); |
| // |
| // Save our attribute |
| // |
| this.attribute = attribute; |
| this.datatype = datatype; |
| // |
| // Finish initialization |
| // |
| this.initializeCombos(); |
| this.initializeTextFields(); |
| this.initializeTest(); |
| this.setupDatatype(this.datatype); |
| } |
| |
| private void initializeCombos() { |
| // |
| // Add the 2 possible values into each combo box |
| // |
| this.comboBoxMin.setNullSelectionAllowed(true); |
| this.comboBoxMin.addItem("minInclusive"); |
| this.comboBoxMin.addItem("minExclusive"); |
| this.comboBoxMax.addItem("maxInclusive"); |
| this.comboBoxMax.addItem("maxExclusive"); |
| // |
| // Find any current values |
| // |
| for (ConstraintValue value : this.attribute.getConstraintValues()) { |
| if (value.getProperty().equals("minInclusive") || |
| value.getProperty().equals("minExclusive")) { |
| // |
| // If it hasn't been set yet |
| // |
| if (this.comboBoxMin.getData() == null) { |
| // |
| // Select the appropriate combo value |
| // |
| this.comboBoxMin.select(value.getProperty()); |
| // |
| // Save the object |
| // |
| this.comboBoxMin.setData(value); |
| // |
| // Setup the text field |
| // |
| this.textFieldMin.setValue(value.getValue()); |
| } else { |
| // |
| // Extra value in there, this shouldn't happen. But this |
| // is here just in case |
| // |
| logger.warn("Extra min value found: " + value.getProperty() + " " + value.getValue()); |
| } |
| } else if (value.getProperty().equals("maxInclusive") || |
| value.getProperty().equals("maxExclusive")) { |
| // |
| // Check if it hasn't been set yet |
| // |
| if (this.comboBoxMax.getData() == null) { |
| // |
| // Select the appropriate combo value |
| // |
| this.comboBoxMax.select(value.getProperty()); |
| // |
| // Save the object |
| // |
| this.comboBoxMax.setData(value); |
| // |
| // Setup the text field |
| // |
| this.textFieldMax.setValue(value.getValue()); |
| } else { |
| // |
| // Extra value in there, this shouldn't happen. But this |
| // is here just in case |
| // |
| logger.warn("Extra max value found: " + value.getProperty() + " " + value.getValue()); |
| } |
| } else { |
| logger.warn("Non-range value found: " + value.getProperty() + " " + value.getValue()); |
| } |
| } |
| // |
| // Were there values? |
| // |
| if (this.comboBoxMin.getData() == null) { |
| // |
| // Put a new empty value in there |
| // |
| ConstraintValue value = new ConstraintValue("minInclusive", null); |
| // |
| // Associate it with the attribute |
| // |
| value.setAttribute(this.attribute); |
| // |
| // Make sure the attribute has it in its list |
| // |
| this.attribute.addConstraintValue(value); |
| // |
| // Save it in the combo |
| // |
| this.comboBoxMin.setData(value); |
| // |
| // Disable text field |
| // |
| this.textFieldMin.setEnabled(false); |
| } |
| if (this.comboBoxMax.getData() == null) { |
| // |
| // Put a new empty value in there |
| // |
| ConstraintValue value = new ConstraintValue("maxInclusive", null); |
| // |
| // Associate it with the attribute |
| // |
| value.setAttribute(this.attribute); |
| // |
| // Make sure the attribute has it in its list |
| // |
| this.attribute.addConstraintValue(value); |
| // |
| // Save it in the combo |
| // |
| this.comboBoxMax.setData(value); |
| // |
| // Disable text field |
| // |
| this.textFieldMax.setEnabled(false); |
| } |
| // |
| // Respond to combo changes |
| // |
| this.setupComboText(this.comboBoxMin, this.textFieldMin); |
| this.setupComboText(this.comboBoxMax, this.textFieldMax); |
| } |
| |
| private void setupComboText(final ComboBox box, final TextField text) { |
| // |
| // Respond to combo changes |
| // |
| box.addValueChangeListener(new ValueChangeListener() { |
| private static final long serialVersionUID = 1L; |
| |
| @Override |
| public void valueChange(ValueChangeEvent event) { |
| // |
| // Get the new value |
| // |
| String property = (String) box.getValue(); |
| // |
| // Get our constraint object |
| // |
| ConstraintValue value = (ConstraintValue) box.getData(); |
| // |
| // Update our object |
| // |
| if (property == null) { |
| // |
| // Clear the text field and disable it |
| // |
| text.setEnabled(false); |
| text.setValue(null); |
| } else { |
| // |
| // Change the property name |
| // |
| value.setProperty(property); |
| // |
| // Focus to the text field and enable it |
| // |
| text.setEnabled(true); |
| text.focus(); |
| } |
| } |
| }); |
| |
| } |
| |
| private void initializeTextFields() { |
| this.textFieldMin.setNullRepresentation(""); |
| this.textFieldMin.addValueChangeListener(new ValueChangeListener() { |
| private static final long serialVersionUID = 1L; |
| |
| @Override |
| public void valueChange(ValueChangeEvent event) { |
| // |
| // Get our min object |
| // |
| ConstraintValue value = (ConstraintValue) self.comboBoxMin.getData(); |
| // |
| // Save its new value |
| // |
| value.setValue(self.textFieldMin.getValue()); |
| } |
| }); |
| this.textFieldMax.setNullRepresentation(""); |
| this.textFieldMax.addValueChangeListener(new ValueChangeListener() { |
| private static final long serialVersionUID = 1L; |
| |
| @Override |
| public void valueChange(ValueChangeEvent event) { |
| // |
| // Get our max object |
| // |
| ConstraintValue value = (ConstraintValue) self.comboBoxMax.getData(); |
| // |
| // Save its new value |
| // |
| value.setValue(self.textFieldMax.getValue()); |
| } |
| |
| }); |
| } |
| |
| private void initializeTest() { |
| this.textFieldTestInput.setNullRepresentation(""); |
| this.textFieldTestInput.addValueChangeListener(new ValueChangeListener() { |
| private static final long serialVersionUID = 1L; |
| |
| @Override |
| public void valueChange(ValueChangeEvent event) { |
| if (self.textFieldTestInput.getValue() != null && self.textFieldTestInput.getValue().length() > 0) { |
| self.buttonValidate.setEnabled(true); |
| } else { |
| self.buttonValidate.setEnabled(false); |
| } |
| } |
| }); |
| |
| this.buttonValidate.addClickListener(new ClickListener() { |
| private static final long serialVersionUID = 1L; |
| |
| @Override |
| public void buttonClick(ClickEvent event) { |
| // |
| // Create our validator and add it into the text |
| // |
| Validator validator = self.setupValidator(self.datatype); |
| if (validator == null) { |
| logger.warn("Could not create a validator"); |
| return; |
| } |
| self.textFieldTestInput.addValidator(validator); |
| // |
| // Initiate the validation |
| // |
| try { |
| self.textFieldTestInput.validate(); |
| // |
| // If we get here, then it validated! |
| // |
| AdminNotification.info("Success! Value is in range"); |
| } catch (InvalidValueException e) { |
| AdminNotification.warn("Failed, Value is NOT in range"); |
| } |
| // |
| // Remove the validator |
| // |
| self.textFieldTestInput.removeValidator(validator); |
| } |
| }); |
| } |
| |
| private Validator setupValidator(Identifier id) { |
| if (logger.isTraceEnabled()) { |
| logger.trace("setupValidator: " + id); |
| } |
| // |
| // Get our min/max objects |
| // |
| ConstraintValue min = (ConstraintValue) self.comboBoxMin.getData(); |
| ConstraintValue max = (ConstraintValue) self.comboBoxMax.getData(); |
| Object minObject = self.comboBoxMin.getConvertedValue(); |
| Object maxObject = self.comboBoxMax.getConvertedValue(); |
| logger.debug("Converted values: " + minObject + " " + maxObject); |
| // |
| // Get our min/max values |
| // |
| String minValue = self.textFieldMin.getValue(); |
| String maxValue = self.textFieldMax.getValue(); |
| // |
| // What is our datatype? |
| // |
| if (id.equals(XACML3.ID_DATATYPE_INTEGER)) { |
| Integer minimum = null; |
| Integer maximum = null; |
| boolean minInclusive = true; |
| boolean maxInclusive = true; |
| if (min.getProperty() != null) { |
| if (minValue != null && minValue.length() > 0) { |
| minimum = Integer.parseInt(minValue); |
| } |
| if (min.getProperty().equals("minInclusive")) { |
| minInclusive = true; |
| } else if (min.getProperty().equals("minExclusive")) { |
| minInclusive = false; |
| } |
| } |
| if (max.getProperty() != null) { |
| if (maxValue != null && maxValue.length() > 0) { |
| maximum = Integer.parseInt(maxValue); |
| } |
| if (max.getProperty().equals("maxInclusive")) { |
| maxInclusive = true; |
| } else if (max.getProperty().equals("maxExclusive")) { |
| maxInclusive = false; |
| } |
| } |
| IntegerRangeValidator validator = new IntegerRangeValidator("The value is NOT within the range", minimum, maximum); |
| validator.setMinValueIncluded(minInclusive); |
| validator.setMaxValueIncluded(maxInclusive); |
| return validator; |
| } |
| if (id.equals(XACML3.ID_DATATYPE_DOUBLE)) { |
| Double minimum = null; |
| Double maximum = null; |
| boolean minInclusive = true; |
| boolean maxInclusive = true; |
| if (min.getProperty() != null) { |
| if (minValue != null && minValue.length() > 0) { |
| minimum = Double.parseDouble(minValue); |
| } |
| if (min.getProperty().equals("minInclusive")) { |
| minInclusive = true; |
| } else if (min.getProperty().equals("minExclusive")) { |
| minInclusive = false; |
| } |
| } |
| if (max.getProperty() != null) { |
| if (maxValue != null && maxValue.length() > 0) { |
| maximum = Double.parseDouble(maxValue); |
| } |
| if (max.getProperty().equals("maxInclusive")) { |
| maxInclusive = true; |
| } else if (max.getProperty().equals("maxExclusive")) { |
| maxInclusive = false; |
| } |
| } |
| DoubleRangeValidator validator = new DoubleRangeValidator("The value is NOT within the range", minimum, maximum); |
| validator.setMinValueIncluded(minInclusive); |
| validator.setMaxValueIncluded(maxInclusive); |
| return validator; |
| } |
| |
| return null; |
| } |
| |
| public void setupDatatype(Identifier datatype) { |
| if (logger.isTraceEnabled()) { |
| logger.trace("setupDatatype: " + datatype); |
| } |
| this.datatype = datatype; |
| if (datatype.equals(XACML3.ID_DATATYPE_INTEGER)) { |
| this.textFieldMin.setConverter(Integer.class); |
| this.textFieldMax.setConverter(Integer.class); |
| this.textFieldTestInput.setConverter(Integer.class); |
| return; |
| } |
| if (datatype.equals(XACML3.ID_DATATYPE_DOUBLE)) { |
| this.textFieldMin.setConverter(Double.class); |
| this.textFieldMax.setConverter(Double.class); |
| this.textFieldTestInput.setConverter(Double.class); |
| return; |
| } |
| } |
| |
| @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); |
| mainLayout.setExpandRatio(horizontalLayout_1, 1.0f); |
| |
| // horizontalLayout_2 |
| horizontalLayout_2 = buildHorizontalLayout_2(); |
| mainLayout.addComponent(horizontalLayout_2); |
| mainLayout.setExpandRatio(horizontalLayout_2, 1.0f); |
| |
| // panelTester |
| panelTester = buildPanelTester(); |
| mainLayout.addComponent(panelTester); |
| mainLayout.setExpandRatio(panelTester, 1.0f); |
| |
| 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); |
| |
| // comboBoxMin |
| comboBoxMin = new ComboBox(); |
| comboBoxMin.setCaption("Minimum Type"); |
| comboBoxMin.setImmediate(true); |
| comboBoxMin.setDescription("Select the type for the minimum."); |
| comboBoxMin.setWidth("-1px"); |
| comboBoxMin.setHeight("-1px"); |
| horizontalLayout_1.addComponent(comboBoxMin); |
| |
| // textFieldMin |
| textFieldMin = new TextField(); |
| textFieldMin.setCaption("Minimum Value"); |
| textFieldMin.setImmediate(true); |
| textFieldMin.setDescription("Enter a value for the minimum."); |
| textFieldMin.setWidth("-1px"); |
| textFieldMin.setHeight("-1px"); |
| textFieldMin.setInvalidAllowed(false); |
| textFieldMin.setInputPrompt("eg. 1"); |
| horizontalLayout_1.addComponent(textFieldMin); |
| horizontalLayout_1 |
| .setComponentAlignment(textFieldMin, new Alignment(9)); |
| |
| return horizontalLayout_1; |
| } |
| |
| @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); |
| |
| // comboBoxMax |
| comboBoxMax = new ComboBox(); |
| comboBoxMax.setCaption("Maximum Type"); |
| comboBoxMax.setImmediate(true); |
| comboBoxMax.setDescription("Select the type for the maximum."); |
| comboBoxMax.setWidth("-1px"); |
| comboBoxMax.setHeight("-1px"); |
| horizontalLayout_2.addComponent(comboBoxMax); |
| |
| // textFieldMax |
| textFieldMax = new TextField(); |
| textFieldMax.setCaption("Maximum Value"); |
| textFieldMax.setImmediate(true); |
| textFieldMax.setDescription("Enter a value for the maxmum."); |
| textFieldMax.setWidth("-1px"); |
| textFieldMax.setHeight("-1px"); |
| textFieldMax.setInvalidAllowed(false); |
| textFieldMax.setInputPrompt("eg. 100"); |
| horizontalLayout_2.addComponent(textFieldMax); |
| |
| return horizontalLayout_2; |
| } |
| |
| @AutoGenerated |
| private Panel buildPanelTester() { |
| // common part: create layout |
| panelTester = new Panel(); |
| panelTester.setCaption("Test Range Values"); |
| panelTester.setImmediate(true); |
| panelTester.setWidth("-1px"); |
| panelTester.setHeight("-1px"); |
| |
| // verticalLayout_2 |
| verticalLayout_2 = buildVerticalLayout_2(); |
| panelTester.setContent(verticalLayout_2); |
| |
| return panelTester; |
| } |
| |
| @AutoGenerated |
| private VerticalLayout buildVerticalLayout_2() { |
| // common part: create layout |
| verticalLayout_2 = new VerticalLayout(); |
| verticalLayout_2.setImmediate(false); |
| verticalLayout_2.setWidth("100.0%"); |
| verticalLayout_2.setHeight("100.0%"); |
| verticalLayout_2.setMargin(false); |
| verticalLayout_2.setSpacing(true); |
| |
| // textFieldTestInput |
| textFieldTestInput = new TextField(); |
| textFieldTestInput.setCaption("Value"); |
| textFieldTestInput.setImmediate(true); |
| textFieldTestInput.setDescription("Enter a value to test against."); |
| textFieldTestInput.setWidth("-1px"); |
| textFieldTestInput.setHeight("-1px"); |
| textFieldTestInput.setInputPrompt("eg. 50"); |
| verticalLayout_2.addComponent(textFieldTestInput); |
| |
| // buttonValidate |
| buttonValidate = new Button(); |
| buttonValidate.setCaption("Test"); |
| buttonValidate.setImmediate(true); |
| buttonValidate |
| .setDescription("Click to test if value is within the range."); |
| buttonValidate.setWidth("-1px"); |
| buttonValidate.setHeight("-1px"); |
| verticalLayout_2.addComponent(buttonValidate); |
| verticalLayout_2.setComponentAlignment(buttonValidate, |
| new Alignment(48)); |
| |
| return verticalLayout_2; |
| } |
| |
| } |