blob: b231d704debb3c6c52d31f4982528d9abcee2acb [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.Map;
import javax.xml.bind.JAXBElement;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeSelectorType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.ConditionType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.FunctionType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableDefinitionType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableReferenceType;
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.Datatype;
import org.apache.openaz.xacml.admin.jpa.FunctionArgument;
import org.apache.openaz.xacml.admin.jpa.FunctionDefinition;
import org.apache.openaz.xacml.admin.model.ExpressionContainer;
import org.apache.openaz.xacml.admin.util.AdminNotification;
import org.apache.openaz.xacml.admin.util.JPAUtils;
import org.apache.openaz.xacml.admin.util.XACMLFunctionValidator;
import org.apache.openaz.xacml.admin.view.events.ApplyParametersChangedListener;
import org.apache.openaz.xacml.util.XACMLObjectCopy;
import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Container.ItemSetChangeEvent;
import com.vaadin.data.Container.ItemSetChangeListener;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.event.Action;
import com.vaadin.event.Action.Handler;
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.AbstractSelect.ItemDescriptionGenerator;
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.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.TreeTable;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
public class ExpressionBuilderComponent extends Window implements ApplyParametersChangedListener {
/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
@AutoGenerated
private VerticalLayout mainLayout;
@AutoGenerated
private Button buttonSave;
@AutoGenerated
private TreeTable treeExpressions;
@AutoGenerated
private HorizontalLayout horizontalLayout_1;
@AutoGenerated
private CheckBox checkBoxShortName;
@AutoGenerated
private Button buttonClearAll;
@AutoGenerated
private Button buttonDeleteExpression;
@AutoGenerated
private Button buttonAddExpression;
/*
*
*
*
*/
private static final long serialVersionUID = 1L;
private static Log logger = LogFactory.getLog(ExpressionBuilderComponent.class);
private static final Action ADD_EXPRESSION = new Action ("Add Expression");
private static final Action EDIT_EXPRESSION = new Action ("Edit Expression");
private static final Action DELETE_EXPRESSION = new Action ("Delete Expression");
private static final Action ADD_ARGUMENT = new Action ("Add Argument");
private static final Action EDIT_ARGUMENT = new Action ("Edit Argument");
private static final Action DELETE_ARGUMENT = new Action ("Delete Argument");
private final Object[] visibleColumns = new Object[] {ExpressionContainer.PROPERTY_NAME, ExpressionContainer.PROPERTY_ID, ExpressionContainer.PROPERTY_ID_SHORT, ExpressionContainer.PROPERTY_DATATYPE, ExpressionContainer.PROPERTY_DATATYPE_SHORT};
private final String[] columnHeaders = new String[] {"Name", "XCAML ID or Value", "XCAML ID or Value", "Data Type ID", "Data Type ID"};
private final ExpressionBuilderComponent self = this;
private final Object parent;
private final Map<VariableDefinitionType, PolicyType> variables;
private final ExpressionContainer container;
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 ExpressionBuilderComponent(Object parent, Object root, FunctionArgument argument, Map<VariableDefinitionType, PolicyType> variables) {
buildMainLayout();
// setCompositionRoot(mainLayout);
setContent(mainLayout);
//
// Save our data
//
this.parent = parent;
this.variables = variables;
this.container = new ExpressionContainer(parent, root, argument);
//
// Make sure we support the parent object
//
if (this.isSupported() == false) {
throw new IllegalArgumentException("Unsupported object type");
}
//
// Set our shortcuts
//
this.setCloseShortcut(KeyCode.ESCAPE);
//
// Finish our GUI initialization
//
this.initializeTree();
this.initializeButtons();
this.initializeCheckbox();
//
// Setup the buttons
//
this.setupButtons();
}
private boolean isSupported() {
return this.isParentACondition() ||
this.isParentAVariable() ||
this.isParentAAssignment();
}
private boolean isParentACondition() {
return this.parent instanceof ConditionType;
}
private boolean isParentAVariable() {
return this.parent instanceof VariableDefinitionType;
}
private boolean isParentAAssignment() {
return this.parent instanceof AttributeAssignmentExpressionType;
}
private void initializeTree() {
//
// Initialize GUI properties
//
this.treeExpressions.setImmediate(true);
this.treeExpressions.setSelectable(true);
//
// Initialize the data source
//
this.treeExpressions.setContainerDataSource(this.container);
this.treeExpressions.setItemCaptionMode(ItemCaptionMode.PROPERTY);
this.treeExpressions.setVisibleColumns(this.visibleColumns);
this.treeExpressions.setColumnHeaders(this.columnHeaders);
this.treeExpressions.setColumnCollapsingAllowed(true);
this.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_ID, true);
this.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_DATATYPE, true);
//
// Add our action handler
//
this.treeExpressions.addActionHandler(new Handler() {
private static final long serialVersionUID = 1L;
@Override
public Action[] getActions(Object target, Object sender) {
if (target == null) {
if (self.container.size() == 0) {
return new Action[] {ADD_EXPRESSION};
}
return null;
}
if (target instanceof ApplyType && XACMLFunctionValidator.canHaveMoreArguments((ApplyType) target)) {
return new Action[] {ADD_ARGUMENT, EDIT_EXPRESSION, DELETE_EXPRESSION};
}
return new Action[] {EDIT_ARGUMENT, DELETE_ARGUMENT};
}
@Override
public void handleAction(Action action, Object sender, Object target) {
if (action == ADD_EXPRESSION && target == null) {
self.addExpression(null, null);
}
if (action == EDIT_EXPRESSION && target != null) {
self.editExpression(target, (ApplyType) self.container.getParent(target), (FunctionArgument) self.container.getArgument(target));
}
if (action == DELETE_EXPRESSION && target != null) {
self.deleteExpression(target);
}
if (action == ADD_ARGUMENT && target != null && target instanceof ApplyType) {
self.addArgument((ApplyType) target);
}
if (action == EDIT_ARGUMENT && target != null) {
self.editExpression(target, (ApplyType) self.container.getParent(target), (FunctionArgument) self.container.getArgument(target));
}
if (action == DELETE_ARGUMENT && target != null) {
self.deleteExpression(target);
}
}
});
//
// Listen to double-click item selections
//
this.treeExpressions.addItemClickListener(new ItemClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void itemClick(ItemClickEvent event) {
if (event.isDoubleClick()) {
Object target = event.getItemId();//self.treeExpressions.getValue();
if (target == null) {
return;
}
self.editExpression(target, (ApplyType) self.container.getParent(target), (FunctionArgument) self.container.getArgument(target));
}
}
});
//
// Listen when the user selects a row
//
this.treeExpressions.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = 1L;
@Override
public void valueChange(ValueChangeEvent event) {
self.setupButtons();
}
});
//
// Listen to when the table contents change
//
this.treeExpressions.addItemSetChangeListener(new ItemSetChangeListener() {
private static final long serialVersionUID = 1L;
@Override
public void containerItemSetChange(ItemSetChangeEvent event) {
self.validateExpression();
}
});
//
// Expand columns automatically
//
this.treeExpressions.setColumnExpandRatio(ExpressionContainer.PROPERTY_NAME, 1.0f);
this.treeExpressions.setColumnExpandRatio(ExpressionContainer.PROPERTY_ID, 1.0f);
this.treeExpressions.setColumnExpandRatio(ExpressionContainer.PROPERTY_DATATYPE, 1.0f);
//
// Expand all the children
//
for (Object id : this.treeExpressions.getItemIds()) {
this.treeExpressions.setCollapsed(id, false);
}
//
// Have a description generator
//
this.treeExpressions.setItemDescriptionGenerator(new ItemDescriptionGenerator() {
private static final long serialVersionUID = 1L;
@Override
public String generateDescription(Component source, Object itemId, Object propertyId) {
if (propertyId != null && propertyId.equals(ExpressionContainer.PROPERTY_NAME) && itemId instanceof ApplyType) {
return ((ApplyType) itemId).getDescription();
}
return null;
}
});
}
private void initializeButtons() {
this.buttonClearAll.setImmediate(true);
this.buttonClearAll.addClickListener(new ClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void buttonClick(ClickEvent event) {
self.clearAllExpressions();
}
});
this.buttonAddExpression.setImmediate(true);
this.buttonAddExpression.addClickListener(new ClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void buttonClick(ClickEvent event) {
Object selected = self.treeExpressions.getValue();
if (selected == null) {
//
// Adding a root expression
//
self.addExpression(null, null);
} else {
//
// Adding an argument
//
if (selected instanceof ApplyType) {
//
// Get the function
//
self.addArgument((ApplyType) selected);
}
}
}
});
this.buttonDeleteExpression.setImmediate(true);
this.buttonDeleteExpression.addClickListener(new ClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void buttonClick(ClickEvent event) {
Object id = self.treeExpressions.getValue();
if (id == null) {
logger.error("Delete button clicked on null selection");
return;
}
self.deleteExpression(id);
}
});
this.buttonSave.setImmediate(true);
this.buttonSave.setClickShortcut(KeyCode.ENTER);
this.buttonSave.setEnabled(false);
this.buttonSave.addClickListener(new ClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void buttonClick(ClickEvent event) {
//
// TODO validate
//
//
// Mark that we are saved
//
self.isSaved = true;
//
// Close the window
//
self.close();
}
});
}
protected void initializeCheckbox() {
this.checkBoxShortName.setValue(true);
this.checkBoxShortName.setImmediate(true);
this.checkBoxShortName.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = 1L;
@Override
public void valueChange(ValueChangeEvent event) {
self.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_ID, self.checkBoxShortName.getValue());
self.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_DATATYPE, self.checkBoxShortName.getValue());
self.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_ID_SHORT, ! self.checkBoxShortName.getValue());
self.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_DATATYPE_SHORT, ! self.checkBoxShortName.getValue());
}
});
}
protected void setupButtons() {
if (this.treeExpressions.size() == 0) {
this.buttonAddExpression.setEnabled(true);
this.buttonClearAll.setEnabled(false);
this.buttonSave.setEnabled(false);
} else {
this.validateExpression();
this.buttonAddExpression.setEnabled(false);
this.buttonClearAll.setEnabled(true);
}
Object value = this.treeExpressions.getValue();
if (value == null) {
this.buttonDeleteExpression.setEnabled(false);
} else {
this.buttonDeleteExpression.setEnabled(true);
}
}
protected void validateExpression() {
boolean valid = false;
boolean canHaveMore = false;
if (this.isParentACondition()) {
valid = XACMLFunctionValidator.validateCondition((ConditionType) this.parent);
canHaveMore = XACMLFunctionValidator.canHaveMoreArguments((ConditionType) this.parent);
} else if (this.isParentAVariable()) {
valid = XACMLFunctionValidator.validateVariable((VariableDefinitionType) this.parent);
canHaveMore = XACMLFunctionValidator.canHaveMoreArguments((VariableDefinitionType) this.parent);
} else if (this.isParentAAssignment()) {
valid = XACMLFunctionValidator.validateAssignment((AttributeAssignmentExpressionType)this.parent);
canHaveMore = XACMLFunctionValidator.canHaveMoreArguments((AttributeAssignmentExpressionType) this.parent);
}
if (logger.isDebugEnabled()) {
logger.debug("valid: " + valid + " canHaveMore: " + canHaveMore);
}
// this.buttonAddExpression.setEnabled(canHaveMore);
this.buttonSave.setEnabled(valid);
}
protected void addArgument(final ApplyType parentApply) {
//
// Get the function
//
FunctionDefinition function = JPAUtils.findFunction(parentApply.getFunctionId());
if (function != null) {
FunctionArgument argument = XACMLFunctionValidator.getFunctionArgument(parentApply.getExpression().size() + 1, function);
if (logger.isDebugEnabled()) {
logger.debug("Add Argument: " + argument);
}
assert argument != null;
//
// Is this a high order bag function? And it's data type not defined? (most likely)
//
if (function.isHigherOrder() && argument.getDatatypeBean() == null) {
if (logger.isDebugEnabled()) {
logger.debug("isHighOrder and a null datatype bean");
}
//
// Get what the data type restriction should be
//
try {
assert parentApply.getExpression().size() > 0;
JAXBElement<?> element = parentApply.getExpression().get(0);
assert element != null && element.getValue() != null;
Object declaredFunction = element.getValue();
assert declaredFunction instanceof FunctionType;
FunctionDefinition declaredFunctionDefinition = JPAUtils.findFunction(((FunctionType) declaredFunction).getFunctionId());
assert declaredFunctionDefinition != null;
if (logger.isDebugEnabled()) {
logger.debug("declaredFunction is: " + declaredFunctionDefinition);
}
FunctionArgument declaredFunctionArgument = XACMLFunctionValidator.getFunctionArgument(parentApply.getExpression().size(), declaredFunctionDefinition);
assert declaredFunctionArgument != null;
if (logger.isDebugEnabled()) {
logger.debug("declaredFunctionArgument is: " + declaredFunctionArgument);
}
//
// Copy the argument
//
argument = new FunctionArgument(argument);
argument.setDatatypeBean(declaredFunctionArgument.getDatatypeBean());
} catch (Exception e) {
logger.error("Exception while determining parent apply's FunctionType argument datatype.");
}
}
self.addExpression(parentApply, argument);
} else {
AdminNotification.error("ApplyType does not have a function defined. Please define that first.");
}
}
protected void addExpression(final ApplyType parentApply, final FunctionArgument argument) {
if (logger.isDebugEnabled()) {
logger.debug("Adding Expression: " + parentApply + " arg: " + argument);
}
//
// First we need to select what Expression They want
//
final ExpressionSelectionWindow selector = new ExpressionSelectionWindow(parentApply,
this.isParentAAssignment(),
(argument != null ? argument.isBag() : false),
(argument != null ? ! argument.isBag() : false));
selector.setCaption("Select the Expression Type");
selector.setModal(true);
selector.addCloseListener(new CloseListener() {
private static final long serialVersionUID = 1L;
@Override
public void windowClose(CloseEvent e) {
//
// Was something selected?
//
String selection = selector.getSelection();
if (selection == null) {
return;
}
//
// What did the user select?
//
if (selection.equals(ExpressionSelectionWindow.OPTION_APPLY)) {
//
self.editApply(new ApplyType(), parentApply, argument);
//
} else if (selection.equals(ExpressionSelectionWindow.OPTION_DESIGNATOR)) {
//
self.editAttribute(new AttributeDesignatorType(), parentApply, argument);
//
} else if (selection.equals(ExpressionSelectionWindow.OPTION_SELECTOR) ) {
//
self.editAttribute(new AttributeSelectorType(), parentApply, argument);
//
} else if (selection.equals(ExpressionSelectionWindow.OPTION_VALUE)) {
//
self.editValue(new AttributeValueType(), parentApply, argument);
//
} else if (selection.equals(ExpressionSelectionWindow.OPTION_VARIABLE)) {
//
self.editVariable(new VariableReferenceType(), parentApply, argument);
//
}
}
});
selector.center();
UI.getCurrent().addWindow(selector);
}
protected void editApply(final ApplyType apply, final ApplyType parent, final FunctionArgument argument) {
if (logger.isDebugEnabled()) {
logger.debug("editApply: " + apply + " parent: " + parent + " :" + argument);
}
//
// Copy the apply and create its window
//
final ApplyType copyApply = XACMLObjectCopy.copy(apply);
final ApplyEditorWindow window = new ApplyEditorWindow(copyApply, parent, argument, self.parent);
window.setCaption("Edit The Apply Expression");
window.setModal(true);
//
// Set ourselves as an ApplyParametersChanged listener
//
window.addCloseListener(new CloseListener() {
private static final long serialVersionUID = 1L;
@Override
public void windowClose(CloseEvent e) {
//
// Did the user save?
//
if (window.isSaved() == false) {
return;
}
//
// Copy back the apply
//
apply.setDescription(copyApply.getDescription());
apply.setFunctionId(copyApply.getFunctionId());
//
// Get the function information
//
FunctionDefinition function = JPAUtils.findFunction(apply.getFunctionId());
assert function != null;
//
// Is this a new Apply?
//
if (self.container.containsId(apply)) {
//
// No - we are updating
//
self.container.updateItem(apply);
} else {
//
// Is this a higher-order bag function?
//
if (function.isHigherOrder()) {
//
// Have the user select a function for it
//
final FunctionSelectionWindow functionSelection = new FunctionSelectionWindow(null);
functionSelection.setCaption("Select Function");
functionSelection.setModal(true);
functionSelection.addCloseListener(new CloseListener() {
private static final long serialVersionUID = 1L;
@Override
public void windowClose(CloseEvent e) {
//
// Did the user save?
//
if (functionSelection.isSaved() == false) {
return;
}
//
// Get the function
//
String function = functionSelection.getSelectedFunction();
if (function == null || function.isEmpty()) {
logger.error("Function window said it was saved, but there was no function.");
return;
}
//
// Create the function object
//
FunctionType hoFunction = new FunctionType();
hoFunction.setFunctionId(function);
//
// Add it into the apply
//
apply.getExpression().add(new ObjectFactory().createFunction(hoFunction));
//
// New Item
//
Item item = self.container.addItem(apply, parent, argument);
assert item != null;
self.treeExpressions.setCollapsed(apply, false);
self.treeExpressions.select(apply);
}
});
functionSelection.center();
UI.getCurrent().addWindow(functionSelection);
} else {
//
// New Item
//
Item item = self.container.addItem(apply, parent, argument);
assert item != null;
self.treeExpressions.setCollapsed(apply, false);
self.treeExpressions.select(apply);
}
}
}
});
window.center();
UI.getCurrent().addWindow(window);
}
protected void editAttribute(final Object target, final ApplyType parent, final FunctionArgument argument) {
if (logger.isDebugEnabled()) {
logger.debug("editAttribute: " + target + " parent: " + parent + " :" + argument);
}
//
// Determine what the data type needs to be
//
Datatype datatype = null;
if (parent == null && this.isParentACondition()) {
datatype = JPAUtils.getBooleanDatatype();
} else {
if (argument != null) {
datatype = argument.getDatatypeBean();
}
}
//
// Copy the attribute
//
final Object copyAttribute = XACMLObjectCopy.deepCopy(target);
//
// Create the window
//
final AttributeSelectionWindow window = new AttributeSelectionWindow(datatype, copyAttribute);
if (target instanceof AttributeDesignatorType) {
window.setCaption("Edit Designator " + (((AttributeDesignatorType) target).getAttributeId() != null ? ((AttributeDesignatorType) target).getAttributeId() : ""));
} else {
window.setCaption("Edit Selector " + (((AttributeSelectorType) target).getContextSelectorId() != null ? ((AttributeSelectorType) target).getContextSelectorId() : ""));
}
window.setModal(true);
window.addCloseListener(new CloseListener() {
private static final long serialVersionUID = 1L;
@Override
public void windowClose(CloseEvent e) {
//
// Did the user hit save?
//
if (window.isSaved() == false) {
return;
}
//
// Grab the attribute
//
Attribute attribute = window.getAttribute();
if (attribute == null) {
return;
}
//
// Save it back into the original
//
if (target instanceof AttributeDesignatorType) {
((AttributeDesignatorType)target).setAttributeId(attribute.getXacmlId());
((AttributeDesignatorType)target).setCategory(attribute.getCategoryBean().getXacmlId());
((AttributeDesignatorType)target).setDataType(attribute.getDatatypeBean().getXacmlId());
((AttributeDesignatorType)target).setIssuer(attribute.getIssuer());
((AttributeDesignatorType)target).setMustBePresent(attribute.isMustBePresent());
} else {
((AttributeSelectorType)target).setContextSelectorId(attribute.getXacmlId());
((AttributeSelectorType)target).setCategory(attribute.getCategoryBean().getXacmlId());
((AttributeSelectorType)target).setDataType(attribute.getDatatypeBean().getXacmlId());
((AttributeSelectorType)target).setPath(attribute.getSelectorPath());
((AttributeSelectorType)target).setMustBePresent(attribute.isMustBePresent());
}
//
// Is this a new item?
//
if (self.container.containsId(target)) {
//
// No, just update the container
//
self.container.updateItem(target);
} else {
//
// Yes a new item, add it in
//
//assert(self.container.addItem(JPAUtils.createDesignator(attribute), parent, argument) != null);
Item item = self.container.addItem(target, parent, argument);
assert item != null;
self.treeExpressions.select(target);
}
}
});
window.center();
UI.getCurrent().addWindow(window);
}
protected void editValue(final AttributeValueType value, final ApplyType parent, final FunctionArgument argument) {
if (logger.isDebugEnabled()) {
logger.debug("editvalue: " + value + " parent: " + parent + " :" + argument);
}
//
// Copy the attribute value
//
final AttributeValueType copyValue = XACMLObjectCopy.copy(value);
//
// Get what the datatype should be
//
Datatype datatypeRestriction = null;
//
// Is this a root?
//
if (parent == null) {
//
// Check if our parent container is a condition
//
if (self.isParentACondition()) {
//
// We are only allowed to return boolean's
//
datatypeRestriction = JPAUtils.getBooleanDatatype();
}
} else {
//
// Are we an argument?
//
if (argument != null) {
//
// Yes - we are restricted to that argument's datatype
//
datatypeRestriction = argument.getDatatypeBean();
}
}
//
// Create the window
//
final AttributeValueEditorWindow window = new AttributeValueEditorWindow(copyValue, datatypeRestriction);
window.setCaption("Edit Attribute Value");
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;
}
//
// Yes - get the value
//
value.getContent().clear();
for (Object o : copyValue.getContent()) {
value.getContent().add(o);
}
value.setDataType(copyValue.getDataType());
//
// Was this a new value?
//
if (self.container.containsId(value)) {
//
// No - update it
//
self.container.updateItem(value);
} else {
//
// Yes - add it in
//
Item item = self.container.addItem(value, parent, argument);
assert item != null;
}
}
});
window.center();
UI.getCurrent().addWindow(window);
}
protected void editVariable(final VariableReferenceType variable, final ApplyType parent, final FunctionArgument argument) {
if (logger.isDebugEnabled()) {
logger.debug("editVariable: " + variable + " parent: " + parent + " :" + argument);
}
//
// Copy the variable
//
final VariableReferenceType copyVariable = XACMLObjectCopy.copy(variable);
//
// Create the window
//
final VariableReferenceEditorWindow window = new VariableReferenceEditorWindow(copyVariable, this.variables);
window.setCaption("Edit Variable Reference");
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;
}
//
// Copy the variable changes back
//
variable.setVariableId(copyVariable.getVariableId());
//
// Is this a new one?
//
if (self.container.containsId(variable)) {
//
// No - update it
//
self.container.updateItem(variable);
} else {
//
// Yes - add it
//
Item item = self.container.addItem(variable, parent, argument);
assert item != null;
}
}
});
window.center();
UI.getCurrent().addWindow(window);
}
protected void editFunction(final FunctionType func, final ApplyType parent, final FunctionArgument argument) {
if (logger.isDebugEnabled()) {
logger.debug("editFunction: " + func + " parent: " + parent + " :" + argument);
}
final FunctionSelectionWindow functionSelection = new FunctionSelectionWindow((func != null ? func.getFunctionId() : null));
functionSelection.setCaption("Edit Function");
functionSelection.setModal(true);
functionSelection.addCloseListener(new CloseListener() {
private static final long serialVersionUID = 1L;
@Override
public void windowClose(CloseEvent e) {
//
// Did the user save?
//
if (functionSelection.isSaved() == false) {
return;
}
//
// Get the function
//
String function = functionSelection.getSelectedFunction();
if (function == null || function.isEmpty()) {
logger.error("Function window said it was saved, but there was no function.");
return;
}
//
// New one?
//
if (func == null) {
//
// Create the function object
//
FunctionType hoFunction = new FunctionType();
hoFunction.setFunctionId(function);
//
// Add it into the apply
//
assert parent.getExpression().size() == 0;
parent.getExpression().add(new ObjectFactory().createFunction(hoFunction));
//
// New Item
//
Item item = self.container.addItem(func, parent, argument);
assert item != null;
self.treeExpressions.setCollapsed(parent, false);
self.treeExpressions.select(func);
} else {
//
// Editing an existing
//
func.setFunctionId(function);
self.container.updateItem(func);
//
// Warn user
//
if (parent.getExpression().size() > 1) {
AdminNotification.warn("You have updated the function ID. The rest of the arguments may be invalid for the function. Please verify the other arguments.");
}
}
}
});
functionSelection.center();
UI.getCurrent().addWindow(functionSelection);
}
protected void editExpression(final Object target, final ApplyType parent, final FunctionArgument argument) {
if (target instanceof ApplyType) {
//
this.editApply((ApplyType) target, parent, argument);
//
} else if (target instanceof AttributeValueType) {
//
this.editValue((AttributeValueType) target,parent, argument);
//
} else if (target instanceof AttributeDesignatorType || target instanceof AttributeSelectorType) {
//
this.editAttribute(target, parent, argument);
//
} else if (target instanceof VariableReferenceType) {
//
this.editVariable((VariableReferenceType) target, parent, argument);
//
} else if (target instanceof FunctionType) {
//
this.editFunction((FunctionType) target, parent, argument);
//
}
}
protected void deleteExpression(Object target) {
if (this.container.isRoot(target)) {
if (this.treeExpressions.removeAllItems() == false) {
logger.error("Failed to remove everything.");
}
} else {
if (this.treeExpressions.removeItem(target) == false) {
logger.error("Failed to remove " + target);
}
}
this.setupButtons();
}
protected void clearAllExpressions() {
if (this.treeExpressions.removeAllItems() == false) {
logger.error("Failed to remove everything.");
}
this.setupButtons();
}
@Override
public void applyParameterChanged(ApplyType apply, ApplyType parent, FunctionArgument argument, Object container) {
logger.info("applyParameterChanged: " + apply + " " + parent + " " + argument + " " + container);
//
// TODO - figure out if this something being edited, or a new one
//
}
public boolean isSaved() {
return this.isSaved;
}
@AutoGenerated
private VerticalLayout buildMainLayout() {
// common part: create layout
mainLayout = new VerticalLayout();
mainLayout.setImmediate(false);
mainLayout.setWidth("100%");
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);
// treeExpressions
treeExpressions = new TreeTable();
treeExpressions.setImmediate(false);
treeExpressions.setWidth("100.0%");
treeExpressions.setHeight("-1px");
mainLayout.addComponent(treeExpressions);
mainLayout.setExpandRatio(treeExpressions, 1.0f);
// 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;
}
@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);
// buttonAddExpression
buttonAddExpression = new Button();
buttonAddExpression.setCaption("Add Expression");
buttonAddExpression.setImmediate(true);
buttonAddExpression.setWidth("-1px");
buttonAddExpression.setHeight("-1px");
horizontalLayout_1.addComponent(buttonAddExpression);
// buttonDeleteExpression
buttonDeleteExpression = new Button();
buttonDeleteExpression.setCaption("Delete Expression");
buttonDeleteExpression.setImmediate(true);
buttonDeleteExpression.setWidth("-1px");
buttonDeleteExpression.setHeight("-1px");
horizontalLayout_1.addComponent(buttonDeleteExpression);
// buttonClearAll
buttonClearAll = new Button();
buttonClearAll.setCaption("Clear All");
buttonClearAll.setImmediate(true);
buttonClearAll.setDescription("Clears all the expressions.");
buttonClearAll.setWidth("-1px");
buttonClearAll.setHeight("-1px");
horizontalLayout_1.addComponent(buttonClearAll);
// checkBoxShortName
checkBoxShortName = new CheckBox();
checkBoxShortName.setCaption("Display Short XACML ID's");
checkBoxShortName.setImmediate(false);
checkBoxShortName
.setDescription("If checked, the right-most string of the function and datatype URI's will only be displayed.");
checkBoxShortName.setWidth("-1px");
checkBoxShortName.setHeight("-1px");
horizontalLayout_1.addComponent(checkBoxShortName);
return horizontalLayout_1;
}
}