| /* |
| * 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; |
| } |
| |
| } |