org.apache.openaz.xacml.admin.view.windows.ObligationAdviceEditorWindow.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.openaz.xacml.admin.view.windows.ObligationAdviceEditorWindow.java

Source

/*
 *  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 oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionsType;
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.ObligationExpressionType;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionsType;
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 org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.apache.openaz.xacml.admin.model.ObligationAdviceContainer;
import org.apache.openaz.xacml.util.XACMLObjectCopy;
import com.vaadin.annotations.AutoGenerated;
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.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.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 ObligationAdviceEditorWindow 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 TreeTable tableExpressions;
    @AutoGenerated
    private HorizontalLayout horizontalLayout_1;
    @AutoGenerated
    private Button buttonClear;
    @AutoGenerated
    private Button buttonRemove;
    @AutoGenerated
    private Button buttonAdd;
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private static Log logger = LogFactory.getLog(ObligationAdviceEditorWindow.class);
    private final ObligationAdviceEditorWindow self = this;
    private final Object root;
    private final Map<VariableDefinitionType, PolicyType> variables;
    private ObligationAdviceContainer container;
    private boolean isSaved = false;

    private static final Action ADD_OBLIGATION = new Action("Add Obligation");
    private static final Action ADD_ADVICE = new Action("Add Advice");
    private static final Action ADD_EXPRESSION = new Action("Add Expression");
    private static final Action ADD_ATTRIBUTE = new Action("Add Attribute");
    private static final Action EDIT_OBLIGATION = new Action("Edit Obligation");
    private static final Action EDIT_ADVICE = new Action("Edit Advice");
    private static final Action EDIT_EXPRESSION = new Action("Edit Expression");
    private static final Action EDIT_ATTRIBUTE = new Action("Edit Attribute");
    private static final Action REMOVE_OBLIGATION = new Action("Remove Obligation");
    private static final Action REMOVE_ADVICE = new Action("Remove Advice");
    private static final Action REMOVE_EXPRESSION = new Action("Remove Expression");
    private static final Action REMOVE_ATTRIBUTE = new Action("Remove Attribute");

    /**
     * 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 ObligationAdviceEditorWindow(Object root, Map<VariableDefinitionType, PolicyType> variables) {
        buildMainLayout();
        //setCompositionRoot(mainLayout);
        setContent(mainLayout);
        //
        // Save
        //
        if (!(root instanceof ObligationExpressionsType) && !(root instanceof AdviceExpressionsType)) {
            throw new IllegalArgumentException("This window supports Obligation or Advice Expressions only.");
        }
        this.root = root;
        this.variables = variables;
        this.container = new ObligationAdviceContainer(this.root);
        //
        // Set our shortcuts
        //
        this.setCloseShortcut(KeyCode.ESCAPE);
        //
        // Initialize GUI
        //
        this.initializeTable();
        this.initializeButtons();
        this.setupButtons();
        //
        // Focus
        //
        this.tableExpressions.focus();
    }

    protected void initializeTable() {
        //
        // GUI properties
        //
        this.tableExpressions.setImmediate(true);
        //
        // Set the container
        //
        this.tableExpressions.setContainerDataSource(this.container);
        this.tableExpressions.setVisibleColumns(new Object[] { ObligationAdviceContainer.PROPERTY_NAME,
                ObligationAdviceContainer.PROPERTY_ID_SHORT, ObligationAdviceContainer.PROPERTY_EFFECT,
                ObligationAdviceContainer.PROPERTY_CATEGORY_SHORT,
                ObligationAdviceContainer.PROPERTY_DATATYPE_SHORT });
        this.tableExpressions.setColumnHeaders(new String[] { "Name", "ID or Value",
                (this.root instanceof ObligationExpressionsType ? "Effect" : "Applies"), "Category", "Data Type" });
        //this.tableExpressions.setColumnExpandRatio(ObligationAdviceContainer.PROPERTY_NAME, 1.0f);
        //this.tableExpressions.setColumnExpandRatio(ObligationAdviceContainer.PROPERTY_ID_SHORT, 1.0f);
        //this.tableExpressions.setColumnWi
        this.tableExpressions.setSelectable(true);
        //
        // Expand it out
        //
        for (Object item : this.tableExpressions.getItemIds()) {
            this.tableExpressions.setCollapsed(item, false);
            for (Object child : this.tableExpressions.getChildren(item)) {
                this.tableExpressions.setCollapsed(child, false);
            }
        }
        this.tableExpressions.setPageLength(this.container.size() + 3);
        //
        // Respond to events
        //
        this.tableExpressions.addActionHandler(new Handler() {
            private static final long serialVersionUID = 1L;

            @Override
            public Action[] getActions(Object target, Object sender) {
                if (target == null) {
                    if (self.root instanceof ObligationExpressionsType) {
                        return new Action[] { ADD_OBLIGATION };
                    }
                    if (self.root instanceof AdviceExpressionsType) {
                        return new Action[] { ADD_ADVICE };
                    }
                }
                if (target instanceof ObligationExpressionType) {
                    return new Action[] { EDIT_OBLIGATION, REMOVE_OBLIGATION, ADD_EXPRESSION };
                }
                if (target instanceof AdviceExpressionType) {
                    return new Action[] { EDIT_ADVICE, REMOVE_ADVICE, ADD_EXPRESSION };
                }
                if (target instanceof AttributeAssignmentExpressionType) {
                    return new Action[] { EDIT_EXPRESSION, REMOVE_EXPRESSION, ADD_ATTRIBUTE };
                }
                if (target instanceof AttributeValueType || target instanceof AttributeDesignatorType
                        || target instanceof AttributeSelectorType || target instanceof ApplyType) {
                    return new Action[] { EDIT_ATTRIBUTE, REMOVE_ATTRIBUTE };
                }
                return null;
            }

            @Override
            public void handleAction(Action action, Object sender, Object target) {
                if (action == ADD_OBLIGATION) {
                    self.editObligation(null);
                    return;
                }
                if (action == EDIT_OBLIGATION) {
                    assert target instanceof ObligationExpressionType;
                    self.editObligation((ObligationExpressionType) target);
                    return;
                }
                if (action == REMOVE_OBLIGATION) {
                    assert target instanceof ObligationExpressionType;
                    if (self.container.removeItem(target) == false) {
                        logger.error("Failed to remove obligation");
                        assert false;
                    }
                    return;
                }
                if (action == ADD_ADVICE) {
                    self.editAdvice(null);
                    return;
                }
                if (action == EDIT_ADVICE) {
                    assert target instanceof AdviceExpressionType;
                    self.editAdvice((AdviceExpressionType) target);
                    return;
                }
                if (action == REMOVE_ADVICE) {
                    assert target instanceof AdviceExpressionType;
                    if (self.container.removeItem(target) == false) {
                        logger.error("Failed to remove advice");
                        assert false;
                    }
                    return;
                }
                if (action == ADD_EXPRESSION) {
                    assert target instanceof ObligationExpressionType || target instanceof AdviceExpressionType;
                    self.editExpression(null, target);
                    return;
                }
                if (action == EDIT_EXPRESSION) {
                    assert target instanceof AttributeAssignmentExpressionType;
                    self.editExpression((AttributeAssignmentExpressionType) target,
                            self.container.getParent(target));
                    return;
                }
                if (action == REMOVE_EXPRESSION) {
                    assert target instanceof AttributeAssignmentExpressionType;
                    if (self.container.removeItem(target) == false) {
                        logger.error("Failed to remove expression");
                        assert false;
                    }
                    return;
                }
                if (action == ADD_ATTRIBUTE) {
                    assert target instanceof AttributeAssignmentExpressionType;
                    self.editAttribute(null, (AttributeAssignmentExpressionType) target);
                    return;
                }
                if (action == EDIT_ATTRIBUTE) {
                    assert target instanceof AttributeValueType || target instanceof AttributeDesignatorType
                            || target instanceof AttributeSelectorType || target instanceof ApplyType;
                    self.editAttribute(target,
                            (AttributeAssignmentExpressionType) self.container.getParent(target));
                    return;
                }
                if (action == REMOVE_ATTRIBUTE) {
                    assert target instanceof AttributeValueType || target instanceof AttributeDesignatorType
                            || target instanceof AttributeSelectorType || target instanceof ApplyType;
                    if (self.container.removeItem(target) == false) {
                        logger.error("Failed to remove attribute");
                        assert false;
                    }
                    return;
                }
            }
        });
        //
        // Respond to selections
        //
        this.tableExpressions.addValueChangeListener(new ValueChangeListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void valueChange(ValueChangeEvent event) {
                self.setupButtons();
            }
        });
        this.tableExpressions.addItemClickListener(new ItemClickListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void itemClick(ItemClickEvent event) {
                if (event.isDoubleClick()) {
                    if (event.getSource() instanceof AdviceExpressionType) {
                        self.editAdvice((AdviceExpressionType) event.getSource());
                    } else if (event.getSource() instanceof ObligationExpressionType) {
                        self.editObligation((ObligationExpressionType) event.getSource());
                    } else if (event.getSource() instanceof AttributeAssignmentExpressionType) {
                        self.editExpression((AttributeAssignmentExpressionType) event.getSource(),
                                self.container.getParent(event.getSource()));
                    } else {
                        self.editAttribute(event.getSource(),
                                (AttributeAssignmentExpressionType) self.container.getParent(event.getSource()));
                    }
                }
            }
        });
        //
        // Implement a description generator, to display the full XACML ID.
        //
        this.tableExpressions.setItemDescriptionGenerator(new ItemDescriptionGenerator() {
            private static final long serialVersionUID = 1L;

            @Override
            public String generateDescription(Component source, Object itemId, Object propertyId) {
                if (propertyId == ObligationAdviceContainer.PROPERTY_ID_SHORT) {
                    if (itemId instanceof AdviceExpressionType) {
                        return ((AdviceExpressionType) itemId).getAdviceId();
                    }
                    if (itemId instanceof ObligationExpressionType) {
                        return ((ObligationExpressionType) itemId).getObligationId();
                    }
                    if (itemId instanceof AttributeAssignmentExpressionType) {
                        return ((AttributeAssignmentExpressionType) itemId).getAttributeId();
                    }
                    if (itemId instanceof AttributeDesignatorType) {
                        return ((AttributeDesignatorType) itemId).getAttributeId();
                    }
                    if (itemId instanceof AttributeSelectorType) {
                        return ((AttributeSelectorType) itemId).getContextSelectorId();
                    }
                    if (itemId instanceof ApplyType) {
                        return ((ApplyType) itemId).getDescription();
                    }
                }
                if (propertyId == ObligationAdviceContainer.PROPERTY_CATEGORY_SHORT) {
                    if (itemId instanceof AttributeAssignmentExpressionType) {
                        return ((AttributeAssignmentExpressionType) itemId).getCategory();
                    }
                    if (itemId instanceof AttributeDesignatorType) {
                        return ((AttributeDesignatorType) itemId).getCategory();
                    }
                    if (itemId instanceof AttributeSelectorType) {
                        return ((AttributeSelectorType) itemId).getCategory();
                    }
                    if (itemId instanceof ApplyType) {
                        return null;
                    }
                }
                if (propertyId == ObligationAdviceContainer.PROPERTY_DATATYPE_SHORT) {
                    if (itemId instanceof AttributeValueType) {
                        return ((AttributeValueType) itemId).getDataType();
                    }
                    if (itemId instanceof AttributeDesignatorType) {
                        return ((AttributeDesignatorType) itemId).getDataType();
                    }
                    if (itemId instanceof AttributeSelectorType) {
                        return ((AttributeSelectorType) itemId).getDataType();
                    }
                    /*
                    if (itemId instanceof ApplyType) {
                       //
                       // TODO - get the datatype for the function
                       //
                    }
                    */
                }
                return null;
            }
        });
    }

    protected void initializeButtons() {
        this.buttonAdd.addClickListener(new ClickListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void buttonClick(ClickEvent event) {
                if (self.tableExpressions.getValue() == null) {
                    //
                    // Add new root advice or obligation
                    //
                    if (self.root instanceof AdviceExpressionsType) {
                        self.editAdvice(null);
                    } else {
                        self.editObligation(null);
                    }
                } else {
                    //
                    // Add new assignment expression
                    //
                    self.editExpression(null, self.tableExpressions.getValue());
                }
            }
        });

        this.buttonRemove.addClickListener(new ClickListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void buttonClick(ClickEvent event) {
                Object object = self.tableExpressions.getValue();
                if (object != null) {
                    if (object instanceof AttributeValueType || object instanceof AttributeDesignatorType
                            || object instanceof AttributeSelectorType || object instanceof ApplyType) {
                        if (self.container.removeItem(self.container.getParent(object)) == false) {
                            logger.error("Failed to remove attribute value/des/sel/apply");
                            assert false;
                        }
                    } else {
                        if (self.container.removeItem(object) == false) {
                            logger.error("Failed to remove object");
                            assert false;
                        }
                    }
                } else {
                    logger.error("This code should never get executed if the button was properly disabled.");
                }
            }
        });

        this.buttonClear.addClickListener(new ClickListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void buttonClick(ClickEvent event) {
                Object object = self.tableExpressions.getValue();
                if (object == null) {
                    if (self.container.removeAllItems() == false) {
                        logger.error("Failed to remove all items");
                        assert false;
                    }
                } else {
                    if (self.container.removeAllAssignments() == false) {
                        logger.error("Failed to remove all assignments");
                        assert false;
                    }
                }
            }
        });

        this.buttonSave.addClickListener(new ClickListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void buttonClick(ClickEvent event) {
                //
                // Mark ourselves as saved
                //
                self.isSaved = true;
                //
                // Close the window
                //
                self.close();
            }
        });
    }

    protected void setupButtons() {
        Object target = this.tableExpressions.getValue();
        if (target == null) {
            if (this.root instanceof AdviceExpressionsType) {
                this.buttonAdd.setVisible(true);
                this.buttonAdd.setCaption("Add Advice");
                this.buttonRemove.setCaption("Remove Advice");
                this.buttonClear.setCaption("Clear All Advice");
                this.buttonClear.setVisible(true);
            } else {
                this.buttonAdd.setVisible(true);
                this.buttonAdd.setCaption("Add Obligation");
                this.buttonRemove.setCaption("Remove Obligation");
                this.buttonClear.setCaption("Clear All Obligations");
                this.buttonClear.setVisible(true);
            }
            this.buttonRemove.setEnabled(false);
        } else {
            if (target instanceof AdviceExpressionType || target instanceof ObligationExpressionType) {
                this.buttonAdd.setVisible(true);
                this.buttonAdd.setCaption("Add Assignment");
                if (target instanceof AdviceExpressionType) {
                    this.buttonRemove.setCaption("Remove Advice");
                } else {
                    this.buttonRemove.setCaption("Remove Obligation");
                }
                this.buttonClear.setCaption("Clear All Assignments");
                this.buttonClear.setVisible(true);
            } else {
                this.buttonAdd.setVisible(false);
                this.buttonRemove.setCaption("Remove Assignment");
                this.buttonClear.setVisible(false);
            }
            this.buttonRemove.setEnabled(true);
        }
        if (this.tableExpressions.size() == 0) {
            this.buttonClear.setEnabled(false);
        } else {
            this.buttonClear.setEnabled(true);
        }
    }

    protected void editAttribute(Object target, final AttributeAssignmentExpressionType parent) {
        //
        // Make a copy
        //
        final AttributeAssignmentExpressionType copyAssignment = (parent == null
                ? new AttributeAssignmentExpressionType()
                : XACMLObjectCopy.copy(parent));
        //
        // Prompt user for attribute right away
        //
        final ExpressionBuilderComponent builder = new ExpressionBuilderComponent(copyAssignment,
                copyAssignment.getExpression() != null ? copyAssignment.getExpression().getValue() : null, null,
                self.variables);
        builder.setCaption("Define Assignment Attribute");
        builder.setModal(true);
        builder.addCloseListener(new CloseListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void windowClose(CloseEvent e) {
                //
                // Did the user save?
                //
                if (builder.isSaved() == false) {
                    return;
                }
                //
                // Yes - update it
                //
                parent.setExpression(copyAssignment.getExpression());
                if (parent.getExpression() != null) {
                    self.container.removeItem(parent.getExpression().getValue());
                }
                self.container.addItem(copyAssignment.getExpression().getValue(), parent);
                //
                // Set the table size
                //
                self.tableExpressions.setPageLength(self.container.size() + 1);
            }
        });
        builder.center();
        UI.getCurrent().addWindow(builder);
    }

    protected void editExpression(final AttributeAssignmentExpressionType assignment, final Object parent) {
        //
        // Copy
        //
        final AttributeAssignmentExpressionType copyAssignment = (assignment == null
                ? new AttributeAssignmentExpressionType()
                : XACMLObjectCopy.copy(assignment));
        //
        // Create the window
        //
        final AttributeAssignmentExpressionEditorWindow window = new AttributeAssignmentExpressionEditorWindow(
                copyAssignment);
        window.setCaption(assignment == null ? "Create Attribute Assignment" : "Edit Attribute Assignment");
        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;
                }
                //
                // Was this a new assignment?
                //
                if (assignment == null) {
                    //
                    // Prompt user for attribute right away
                    //
                    final ExpressionBuilderComponent builder = new ExpressionBuilderComponent(copyAssignment, null,
                            null, self.variables);
                    builder.setCaption("Define Assignment Attribute");
                    builder.setModal(true);
                    builder.addCloseListener(new CloseListener() {
                        private static final long serialVersionUID = 1L;

                        @Override
                        public void windowClose(CloseEvent e) {
                            //
                            // Did the user save?
                            //
                            if (builder.isSaved() == false) {
                                return;
                            }
                            //
                            // Yes - add it to the container
                            //
                            if (self.container.addItem(copyAssignment, parent) == null) {
                                logger.error("Failed to add copy assignment");
                                assert false;
                            }
                            //
                            // Set the table size
                            //
                            self.tableExpressions.setPageLength(self.container.size() + 1);
                        }
                    });
                    builder.center();
                    UI.getCurrent().addWindow(builder);
                } else {
                    //
                    // No - copy back the data
                    //
                    assignment.setAttributeId(copyAssignment.getAttributeId());
                    assignment.setIssuer(assignment.getIssuer());
                    assignment.setCategory(copyAssignment.getCategory());
                    //
                    // Update the container
                    //
                    self.container.updateItem(assignment);
                }
            }
        });
        window.center();
        UI.getCurrent().addWindow(window);
    }

    protected void editAdvice(final AdviceExpressionType advice) {
        //
        // Copy the advice
        //
        final AdviceExpressionType copyAdvice = (advice == null ? new AdviceExpressionType()
                : XACMLObjectCopy.copy(advice));
        //
        // Setup the window
        //
        final AdviceEditorWindow window = new AdviceEditorWindow(copyAdvice);
        window.setCaption("Edit Advice");
        window.setModal(true);
        window.addCloseListener(new CloseListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void windowClose(CloseEvent e) {
                //
                // Is it saved?
                //
                if (window.isSaved() == false) {
                    return;
                }
                //
                // Was this a new object?
                //
                if (advice == null) {
                    //
                    // New - add it to the container
                    //
                    if (self.container.addItem(copyAdvice) == null) {
                        logger.error("failed to add advice");
                        assert false;
                    }
                    //
                    // Set the table size
                    //
                    self.tableExpressions.setPageLength(self.container.size() + 1);
                } else {
                    //
                    // No - copy it back
                    //
                    advice.setAdviceId(copyAdvice.getAdviceId());
                    advice.setAppliesTo(copyAdvice.getAppliesTo());
                    //
                    // Update
                    //
                    self.container.updateItem(advice);
                }
            }
        });
        window.center();
        UI.getCurrent().addWindow(window);
    }

    protected void editObligation(final ObligationExpressionType obligation) {
        //
        // Copy the advice
        //
        final ObligationExpressionType copyObligation = (obligation == null ? new ObligationExpressionType()
                : XACMLObjectCopy.copy(obligation));
        //
        // Setup the window
        //
        final ObligationEditorWindow window = new ObligationEditorWindow(copyObligation);
        window.setCaption("Edit Obligation");
        window.setModal(true);
        window.addCloseListener(new CloseListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void windowClose(CloseEvent e) {
                //
                // Is it saved?
                //
                if (window.isSaved() == false) {
                    return;
                }
                //
                // Was this a new object?
                //
                if (obligation == null) {
                    //
                    // New - add it to the container
                    //
                    if (self.container.addItem(copyObligation) == null) {
                        logger.error("Failed to add obligation");
                        assert false;
                    }
                    //
                    // Set the table size
                    //
                    self.tableExpressions.setPageLength(self.container.size() + 1);
                } else {
                    //
                    // No - copy it back
                    //
                    obligation.setObligationId(copyObligation.getObligationId());
                    obligation.setFulfillOn(copyObligation.getFulfillOn());
                    //
                    // Update
                    //
                    self.container.updateItem(obligation);
                }
            }
        });
        window.center();
        UI.getCurrent().addWindow(window);
    }

    public boolean isSaved() {
        return this.isSaved;
    }

    public Object getRootObject() {
        return this.root;
    }

    @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);

        // tableExpressions
        tableExpressions = new TreeTable();
        tableExpressions.setCaption("Expressions");
        tableExpressions.setImmediate(false);
        tableExpressions.setWidth("100%");
        tableExpressions.setHeight("-1px");
        mainLayout.addComponent(tableExpressions);
        mainLayout.setExpandRatio(tableExpressions, 1.0f);

        // buttonSave
        buttonSave = new Button();
        buttonSave.setCaption("Save");
        buttonSave.setImmediate(false);
        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);

        // buttonAdd
        buttonAdd = new Button();
        buttonAdd.setCaption("Add Expression");
        buttonAdd.setImmediate(false);
        buttonAdd.setWidth("-1px");
        buttonAdd.setHeight("-1px");
        horizontalLayout_1.addComponent(buttonAdd);

        // buttonRemove
        buttonRemove = new Button();
        buttonRemove.setCaption("Remove Expression");
        buttonRemove.setImmediate(false);
        buttonRemove.setWidth("-1px");
        buttonRemove.setHeight("-1px");
        horizontalLayout_1.addComponent(buttonRemove);

        // buttonClear
        buttonClear = new Button();
        buttonClear.setCaption("Clear Expressions");
        buttonClear.setImmediate(false);
        buttonClear.setWidth("-1px");
        buttonClear.setHeight("-1px");
        horizontalLayout_1.addComponent(buttonClear);

        return horizontalLayout_1;
    }

}