Java tutorial
/* * 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 oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType; import org.apache.openaz.xacml.admin.XacmlAdminUI; import org.apache.openaz.xacml.admin.jpa.Datatype; import org.apache.openaz.xacml.admin.util.JPAUtils; import org.apache.openaz.xacml.admin.view.validators.ValidatorFactory; import com.vaadin.addon.jpacontainer.EntityItem; import com.vaadin.addon.jpacontainer.fieldfactory.SingleSelectConverter; 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.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.TextField; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; public class AttributeValueEditorWindow extends Window { /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ @AutoGenerated private VerticalLayout mainLayout; @AutoGenerated private Button buttonSave; @AutoGenerated private TextField textFieldValue; @AutoGenerated private ComboBox comboBoxDatatype; private static final long serialVersionUID = 1L; private final AttributeValueEditorWindow self = this; private final Datatype datatypeRestriction; private final AttributeValueType value; private boolean isSaved = false; /** * 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 AttributeValueEditorWindow(AttributeValueType value, Datatype datatypeRestriction) { buildMainLayout(); //setCompositionRoot(mainLayout); setContent(mainLayout); // // Save // this.value = value; this.datatypeRestriction = datatypeRestriction; // // Make sure the value has the same datatype as the restriction // if (this.datatypeRestriction != null) { this.value.setDataType(this.datatypeRestriction.getXacmlId()); } // // Set our shortcuts // this.setCloseShortcut(KeyCode.ESCAPE); // // Initialize GUI // this.initializeCombo(); this.initializeTextField(); this.initializeButtons(); // // Focus? // if (this.datatypeRestriction == null) { this.comboBoxDatatype.focus(); } else { this.textFieldValue.focus(); } } protected void initializeCombo() { this.comboBoxDatatype.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getDatatypes()); this.comboBoxDatatype.setItemCaptionMode(ItemCaptionMode.PROPERTY); this.comboBoxDatatype.setItemCaptionPropertyId("xacmlId"); this.comboBoxDatatype.setFilteringMode(FilteringMode.CONTAINS); this.comboBoxDatatype.setImmediate(true); this.comboBoxDatatype.setNullSelectionAllowed(false); this.comboBoxDatatype.setConverter(new SingleSelectConverter<Object>(this.comboBoxDatatype)); // // Select a value if its defined // if (this.datatypeRestriction != null) { this.comboBoxDatatype.select(this.datatypeRestriction.getId()); } else if (this.value.getDataType() != null) { this.comboBoxDatatype.select(JPAUtils.findDatatype(this.value.getDataType()).getId()); } // // Can the user change the datatype? // if (this.datatypeRestriction != null) { this.comboBoxDatatype.setEnabled(false); return; } // // Listen to events // this.comboBoxDatatype.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(ValueChangeEvent event) { Object id = self.comboBoxDatatype.getValue(); assert id != null; // // Get the entity and save it // EntityItem<Datatype> entity = ((XacmlAdminUI) UI.getCurrent()).getDatatypes().getItem(id); self.value.setDataType(entity.getEntity().getXacmlId()); // // Reset the validator // self.textFieldValue.removeAllValidators(); Validator validator = ValidatorFactory.newInstance(entity.getEntity()); if (validator != null) { self.textFieldValue.addValidator(validator); } } }); } protected void initializeTextField() { // // GUI properties // this.textFieldValue.setImmediate(true); this.textFieldValue.setNullRepresentation(""); // // Setup validator // if (this.datatypeRestriction != null) { Validator validator = ValidatorFactory.newInstance(this.datatypeRestriction); if (validator != null) { this.textFieldValue.addValidator(validator); } } // // Text change or Value Change? // this.textFieldValue.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(ValueChangeEvent event) { // // Save the new value. TODO - assuming position 0 of content list. // self.saveValue(0, self.textFieldValue.getValue()); // // Setup the save button // if (self.textFieldValue.getValue() == null || self.textFieldValue.getValue().isEmpty()) { self.buttonSave.setEnabled(false); } else { self.buttonSave.setEnabled(true); } } }); // // Initialize the value // if (this.value != null && this.value.getContent().isEmpty() == false) { // // TODO - If there are multiple Content objects...Right now we work with the first one only. // this.textFieldValue.setValue(this.value.getContent().get(0).toString()); } } protected void saveValue(int i, String value) { // // Get the content - TODO // if (this.value.getContent().isEmpty()) { this.value.getContent().add(value); return; } Object o = this.value.getContent().get(i); if (o == null) { // // Add it into the list - ensure its a // assert this.value.getContent().size() == i; this.value.getContent().add(value); } else { // // Overwrite the previous object // this.value.getContent().set(i, value); } } protected void initializeButtons() { this.buttonSave.setClickShortcut(KeyCode.ENTER); this.buttonSave.addClickListener(new ClickListener() { private static final long serialVersionUID = 1L; @Override public void buttonClick(ClickEvent event) { try { // // Make sure it validates (i.e. call the Validators) // self.comboBoxDatatype.validate(); self.textFieldValue.validate(); // // Yes // self.isSaved = true; // // Close // self.close(); } catch (InvalidValueException e) { //NOPMD // // Vaadin with update GUI displaying the error // } } }); } public boolean isSaved() { return this.isSaved; } public String getValue() { return this.textFieldValue.getValue(); } public AttributeValueType getAttribute() { return this.value; } public Datatype getDatatype() { return JPAUtils.findDatatype(this.value.getDataType()); } @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"); // comboBoxDatatype comboBoxDatatype = new ComboBox(); comboBoxDatatype.setCaption("Select Datatype"); comboBoxDatatype.setImmediate(false); comboBoxDatatype.setWidth("-1px"); comboBoxDatatype.setHeight("-1px"); comboBoxDatatype.setInvalidAllowed(false); comboBoxDatatype.setRequired(true); mainLayout.addComponent(comboBoxDatatype); // textFieldValue textFieldValue = new TextField(); textFieldValue.setCaption("Attribute Value"); textFieldValue.setImmediate(false); textFieldValue.setWidth("100.0%"); textFieldValue.setHeight("-1px"); textFieldValue.setInvalidAllowed(false); textFieldValue.setRequired(true); mainLayout.addComponent(textFieldValue); // buttonSave buttonSave = new Button(); buttonSave.setCaption("Save"); buttonSave.setImmediate(true); buttonSave.setWidth("-1px"); buttonSave.setHeight("-1px"); mainLayout.addComponent(buttonSave); mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); return mainLayout; } }