blob: e8496e539aed0e94045e6fe4cd9b5040638045d9 [file] [log] [blame]
/*
* 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;
}
}