Java tutorial
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ package org.apache.openaz.xacml.admin.components; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; import java.util.List; 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.AllOfType; import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType; 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.MatchType; 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.PolicySetType; import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType; import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType; import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType; 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.jpa.Attribute; import org.apache.openaz.xacml.admin.model.GitRepositoryContainer; import org.apache.openaz.xacml.admin.model.PolicyContainer; import org.apache.openaz.xacml.admin.util.AdminNotification; import org.apache.openaz.xacml.admin.util.JPAUtils; import org.apache.openaz.xacml.admin.view.windows.AttributeSelectionWindow; import org.apache.openaz.xacml.admin.view.windows.AttributeValueEditorWindow; import org.apache.openaz.xacml.admin.view.windows.ExpressionBuilderComponent; import org.apache.openaz.xacml.admin.view.windows.MatchEditorWindow; import org.apache.openaz.xacml.admin.view.windows.ObligationAdviceEditorWindow; import org.apache.openaz.xacml.admin.view.windows.PolicyEditorWindow; import org.apache.openaz.xacml.admin.view.windows.PolicySetEditorWindow; import org.apache.openaz.xacml.admin.view.windows.RuleEditorWindow; import org.apache.openaz.xacml.admin.view.windows.VariableDefinitionEditorWindow; import org.apache.openaz.xacml.util.XACMLObjectCopy; import org.apache.openaz.xacml.util.XACMLPolicyWriter; 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.DataBoundTransferable; import com.vaadin.event.ItemClickEvent; import com.vaadin.event.ItemClickEvent.ItemClickListener; import com.vaadin.event.ShortcutAction; import com.vaadin.event.dd.DragAndDropEvent; import com.vaadin.event.dd.DropHandler; import com.vaadin.event.dd.acceptcriteria.AcceptAll; import com.vaadin.event.dd.acceptcriteria.AcceptCriterion; import com.vaadin.server.BrowserWindowOpener; import com.vaadin.server.FileDownloader; import com.vaadin.server.StreamResource; import com.vaadin.shared.ui.dd.VerticalDropLocation; import com.vaadin.ui.AbstractSelect.AbstractSelectTargetDetails; 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.CustomComponent; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.TabSheet.Tab; import com.vaadin.ui.Table.TableDragMode; import com.vaadin.ui.TreeTable; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window.CloseEvent; import com.vaadin.ui.Window.CloseListener; public class PolicyEditor extends CustomComponent { /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ @AutoGenerated private VerticalLayout mainLayout; @AutoGenerated private TreeTable tree; @AutoGenerated private HorizontalLayout horizontalLayoutToolbar; @AutoGenerated private Button buttonExport; @AutoGenerated private Button buttonViewXML; @AutoGenerated private Button buttonSave; @AutoGenerated private CheckBox checkBoxAutoSave; @AutoGenerated private CheckBox checkBoxReadOnly; private static final long serialVersionUID = 1L; private static Log logger = LogFactory.getLog(PolicyEditor.class); private final PolicyEditor self = this; private static final Action CREATE_POLICY = new Action("New Policy"); private static final Action CREATE_POLICYSET = new Action("New Policy Set"); private static final Action CREATE_RULE = new Action("New Rule"); private static final Action EDIT_POLICY = new Action("Edit Policy"); private static final Action EDIT_POLICYSET = new Action("Edit Policy Set"); private static final Action EDIT_RULE = new Action("Edit Rule"); private static final Action DELETE_POLICYSET = new Action("Delete Policy Set"); private static final Action DELETE_POLICY = new Action("Delete Policy"); private static final Action DELETE_RULE = new Action("Delete Rule"); private static final Action CREATE_NEWANYOF = new Action("New Any Of (Match)"); private static final Action CREATE_NEWALLOF = new Action("New All Of (Match)"); private static final Action CREATE_NEWMATCH = new Action("New Match"); private static final Action DELETE_ANYOF = new Action("Delete Any Of"); private static final Action DELETE_ALLOF = new Action("Delete All Of"); private static final Action DELETE_MATCH = new Action("Delete Match"); private static final Action EDIT_MATCH = new Action("Edit Match"); private static final Action EDIT_OBLIGATIONS = new Action("Edit Obligations"); private static final Action DELETE_OBLIGATIONS = new Action("Delete Obligations"); private static final Action EDIT_ADVICE = new Action("Edit Advice"); private static final Action DELETE_ADVICE = new Action("Delete Advice"); private static final Action CREATE_VARIABLE = new Action("Create Variable"); private static final Action EDIT_VARIABLE = new Action("Edit Variable"); private static final Action DELETE_VARIABLE = new Action("Delete Variable"); private static final Action CREATE_TARGET = new Action("Create Target"); private static final Action CREATE_CONDITION = new Action("Create Condition"); private static final Action EDIT_CONDITION = new Action("Edit Condition"); private static final Action DELETE_CONDITION = new Action("Delete Condition"); private static final Action EDIT_EXPRESSIONS = new Action("Edit Expressions"); private static final Action CLIPBOARD_CUT = new ShortcutAction("Cut", ShortcutAction.KeyCode.S, new int[] { ShortcutAction.ModifierKey.CTRL }); private static final Action CLIPBOARD_COPY = new ShortcutAction("Copy", ShortcutAction.KeyCode.C, new int[] { ShortcutAction.ModifierKey.CTRL }); private static final Action CLIPBOARD_PASTE = new ShortcutAction("Paste", ShortcutAction.KeyCode.V, new int[] { ShortcutAction.ModifierKey.CTRL }); private static final Object[] VISIBLE_COLUMNS = new Object[] { PolicyContainer.PROPERTY_NAME, PolicyContainer.PROPERTY_SHORTALGORITHM, PolicyContainer.PROPERTY_DESCRIPTION }; private static final String[] COLUMN_HEADERS = new String[] { "Name", "Algorithm or Effect", "Description" }; private final File file; private final GitRepositoryContainer gitContainer; private final PolicyContainer policyContainer; private Tab tab = null; private boolean isModified = false; private Object clipboardObject = null; /** * The constructor should first build the main layout, set the * composition root and then do any custom initialization. * * The constructor will not be automatically regenerated by the * visual editor. * @throws IOException */ public PolicyEditor(File policyFile, GitRepositoryContainer gitContainer, boolean readOnly) throws IOException { buildMainLayout(); setCompositionRoot(mainLayout); this.mainLayout.setSizeFull(); // // Save // this.file = policyFile; this.gitContainer = gitContainer; this.policyContainer = new PolicyContainer(this.file); // // Its our data also // this.setData(policyFile); // // Initialize GUI // this.initializeCheckboxes(readOnly); this.initializeButtons(); this.initializeDownload(); this.initializeTree(); // PLD TODO next release this.initializeContextMenu(); // // setup the caption etc. // this.setupCaption(); this.resetComponents(); } protected void initializeCheckboxes(boolean readOnly) { // // The readonly check box // this.checkBoxReadOnly.setImmediate(true); this.checkBoxReadOnly.setValue(readOnly); this.checkBoxReadOnly.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(ValueChangeEvent event) { self.resetComponents(); self.setupCaption(); } }); // // The autosave check box // this.checkBoxAutoSave.setImmediate(true); this.checkBoxAutoSave.setValue(true); } protected void initializeButtons() { // // The Save button // this.buttonSave.addClickListener(new ClickListener() { private static final long serialVersionUID = 1L; @Override public void buttonClick(ClickEvent event) { self.savePolicy(); } }); // // Attach a window opener to the View XML button // BrowserWindowOpener opener = new BrowserWindowOpener(new StreamResource(new StreamResource.StreamSource() { private static final long serialVersionUID = 1L; @Override public InputStream getStream() { try { if (logger.isDebugEnabled()) { logger.debug("Setting view xml button to: " + self.file.getAbsolutePath()); } return new FileInputStream(self.file); } catch (Exception e) { logger.error("Failed to open input stream " + self.file); } return null; } }, self.file.getName())); opener.setWindowName("_new"); opener.extend(this.buttonViewXML); } protected void initializeDownload() { // // Create a stream resource pointing to the file // StreamResource r = new StreamResource(new StreamResource.StreamSource() { private static final long serialVersionUID = 1L; @Override public InputStream getStream() { try { return new FileInputStream(self.file); } catch (Exception e) { logger.error("Failed to open input stream " + self.file); } return null; } }, self.file.getName()); r.setCacheTime(-1); r.setMIMEType("application/xml"); // // Extend a downloader to attach to the Export Button // FileDownloader downloader = new FileDownloader(r); downloader.extend(this.buttonExport); } public void setTab(Tab tab) { this.tab = tab; this.setupCaption(); } public boolean isAutoSave() { if (this.checkBoxAutoSave.isEnabled() == false) { return false; } return this.checkBoxAutoSave.getValue(); } public boolean isReadOnly() { return this.checkBoxReadOnly.getValue(); } protected void initializeTree() { // // Create our container and set it as the tree's data source // this.tree.setContainerDataSource(this.policyContainer); this.tree.setItemIconPropertyId("Icon"); this.tree.setVisibleColumns(VISIBLE_COLUMNS); this.tree.setColumnHeaders(COLUMN_HEADERS); this.tree.setSelectable(true); this.tree.setSizeFull(); // // Expand it down a few items // for (Object id : this.tree.getItemIds()) { this.tree.setCollapsed(id, false); for (Object child : this.tree.getChildren(id)) { this.tree.setCollapsed(child, false); } } // // Respond to double-click's // this.tree.addItemClickListener(new ItemClickListener() { private static final long serialVersionUID = 1L; @Override public void itemClick(ItemClickEvent event) { if (event.isDoubleClick()) { if (self.isReadOnly()) { AdminNotification.info("You are in read-only mode."); return; } Object target = event.getItemId(); if (target instanceof PolicySetType) { self.editPolicySet((PolicySetType) target, (PolicySetType) self.policyContainer.getParent(target)); } else if (target instanceof PolicyType) { self.editPolicy((PolicyType) target, (PolicySetType) self.policyContainer.getParent(target)); } else if (target instanceof RuleType) { self.editRule((RuleType) target, (PolicyType) self.policyContainer.getParent(target)); } else if (target instanceof ConditionType) { self.editCondition((ConditionType) target, (RuleType) self.policyContainer.getParent(target)); } else if (target instanceof VariableDefinitionType) { self.editVariable((VariableDefinitionType) target, (PolicyType) self.policyContainer.getParent(target)); } else if (target instanceof MatchType) { self.editMatch((MatchType) target, (AllOfType) self.policyContainer.getParent(target), null, null, "Edit Match"); } else if (target instanceof ObligationExpressionType) { self.editObAdvice(true, self.policyContainer.getParent(target)); } else if (target instanceof AdviceExpressionType) { self.editObAdvice(false, self.policyContainer.getParent(target)); } } } }); // // Respond to container changes // this.policyContainer.addItemSetChangeListener(new ItemSetChangeListener() { private static final long serialVersionUID = 1L; @Override public void containerItemSetChange(ItemSetChangeEvent event) { self.isModified = true; if (self.isAutoSave()) { self.savePolicy(); } else { self.setupCaption(); self.buttonSave.setEnabled(true); } } }); // // Implement drag-n-drop // this.tree.setDropHandler(new DropHandler() { private static final long serialVersionUID = 1L; @Override public void drop(DragAndDropEvent event) { DataBoundTransferable t = (DataBoundTransferable) event.getTransferable(); AbstractSelectTargetDetails target = (AbstractSelectTargetDetails) event.getTargetDetails(); // // Get ids of the dragged item and the target item // Object sourceItemId = t.getData("itemId"); Object targetItemId = target.getItemIdOver(); VerticalDropLocation location = target.getDropLocation(); if (logger.isDebugEnabled()) { logger.debug("Drop " + sourceItemId + " target " + targetItemId + " location " + location); } // // Tell our container what to do // try { if (location == VerticalDropLocation.MIDDLE) { // // Drop right on top of item making it a child // self.policyContainer.setParent(sourceItemId, targetItemId); } /* } else if (location == VerticalDropLocation.TOP) { // // Drop at the top of the tree making it the previous // Object parent = self.policyContainer.getParent(targetItemId); self.policyContainer.setParent(sourceItemId, parent); self.policyContainer.moveAfterSibling(sourceItemId, targetItemId); self.policyContainer.moveAfterSibling(targetItemId, sourceItemId); } else if (location == VerticalDropLocation.BOTTOM) { // // Drop below another item // Object parent = self.policyContainer.getParent(targetItemId); self.policyContainer.setParent(sourceItemId, targetItemId); self.policyContainer.moveAfterSibling(sourceItemId, targetItemId); } */ } catch (UnsupportedOperationException e) { logger.error("Unsupported " + e.getLocalizedMessage()); } } @Override public AcceptCriterion getAcceptCriterion() { return AcceptAll.get(); } }); } protected void removeObject(Object target) { if (target instanceof PolicySetType) { this.removePolicySet((PolicySetType) target); } else if (target instanceof PolicyType) { this.removePolicy((PolicyType) target); } else if (target instanceof RuleType) { this.removeRule((RuleType) target); } else if (target instanceof ConditionType) { this.removeCondition((ConditionType) target); } else if (target instanceof VariableDefinitionType) { this.removeVariable((VariableDefinitionType) target); } else if (target instanceof AdviceExpressionType) { this.removeAdvice((AdviceExpressionType) target); } else if (target instanceof ObligationExpressionType) { this.removeObligations((ObligationExpressionType) target); } } protected void removeAdvice(AdviceExpressionType target) { if (this.tree.removeItem(target) == false) { logger.error("Failed to remove advice."); } } protected void removeVariable(VariableDefinitionType target) { if (this.tree.removeItem(target) == false) { logger.error("Failed to remove variable."); } } protected void removeCondition(ConditionType target) { if (this.tree.removeItem(target) == false) { logger.error("Failed to remove condition."); } } protected void removeObligations(ObligationExpressionType target) { if (this.tree.removeItem(target) == false) { logger.error("Failed to remove obligations."); } } protected void removeRule(RuleType target) { if (this.tree.removeItem(target) == false) { logger.error("Failed to remove rule."); } } protected void removePolicy(PolicyType target) { Object parent = this.tree.getParent(target); if (parent == null) { this.deleteRoot(target); } else { if (this.tree.removeItem(target) == false) { logger.error("Failed to remove policy."); } } } protected void removePolicySet(PolicySetType target) { Object parent = this.tree.getParent(target); if (parent == null) { this.deleteRoot(target); } else { if (this.tree.removeItem(target) == false) { logger.error("Failed to remove policy set."); } } } /* protected void initializeContextMenu() { ContextMenu menu = new ContextMenu(); menu.setAsTableContextMenu(this.tree); menu.addContextMenuTableListener(new TableListener() { @Override public void onContextMenuOpenFromFooter( ContextMenuOpenedOnTableFooterEvent event) { // TODO Auto-generated method stub } @Override public void onContextMenuOpenFromHeader( ContextMenuOpenedOnTableHeaderEvent event) { // TODO Auto-generated method stub } @Override public void onContextMenuOpenFromRow(ContextMenuOpenedOnTableRowEvent event) { logger.info("context menu row"); } }); menu.addItem("test"); } */ protected void savePolicy() { if (this.isReadOnly()) { logger.warn("Should not call savePolicy when in read only mode."); return; } Collection<?> roots = this.policyContainer.rootItemIds(); if (roots.size() > 1) { logger.warn("More than one root policy."); } // // There should only be one root // Save the policy to disk. // for (Object root : roots) { logger.info("Saving policy: " + this.file.getName()); // // TODO - Bump the version? // if (root instanceof PolicySetType) { XACMLPolicyWriter.writePolicyFile(Paths.get(this.file.getAbsolutePath()), (PolicySetType) root); } else if (root instanceof PolicyType) { XACMLPolicyWriter.writePolicyFile(Paths.get(this.file.getAbsolutePath()), (PolicyType) root); } // // TODO ???? // this.gitContainer.updateItem(this.file); break; // NOPMD } // // No longer modified // this.isModified = false; this.setupCaption(); this.resetComponents(); } protected void installTreeActionHandler() { // // Remove any existing action handlers // this.tree.removeAllActionHandlers(); // // Are we read-only? // if (this.isReadOnly()) { // // Yes - no action handler's allowed // return; } // // Setup our action handlers // this.tree.addActionHandler(new Handler() { private static final long serialVersionUID = 1L; @Override public Action[] getActions(Object target, Object sender) { // // Are we read-only? // if (self.isReadOnly()) { if (logger.isDebugEnabled()) { logger.debug("Policy is read-only"); } return null; } if (target == null) { // // Nothing is selected, they right-clicked empty space // if (logger.isDebugEnabled()) { logger.debug("action tree target is null"); } return null; } if (target instanceof PolicySetType) { List<Action> actions = new ArrayList<Action>(); actions.add(EDIT_POLICYSET); if (((PolicySetType) target).getTarget() == null) { actions.add(CREATE_TARGET); } /* actions.add(CLIPBOARD_CUT); actions.add(CLIPBOARD_COPY); actions.add(CLIPBOARD_PASTE); */ actions.add(CREATE_POLICYSET); actions.add(CREATE_POLICY); actions.add(EDIT_OBLIGATIONS); actions.add(EDIT_ADVICE); actions.add(DELETE_POLICYSET); return (Action[]) actions.toArray(new Action[0]); } if (target instanceof PolicyType) { List<Action> actions = new ArrayList<Action>(); actions.add(EDIT_POLICY); if (((PolicyType) target).getTarget() == null) { actions.add(CREATE_TARGET); } /* actions.add(CLIPBOARD_CUT); actions.add(CLIPBOARD_COPY); actions.add(CLIPBOARD_PASTE); */ actions.add(CREATE_RULE); actions.add(CREATE_VARIABLE); actions.add(EDIT_OBLIGATIONS); actions.add(EDIT_ADVICE); actions.add(DELETE_POLICY); return (Action[]) actions.toArray(new Action[0]); } if (target instanceof RuleType) { List<Action> actions = new ArrayList<Action>(); actions.add(EDIT_RULE); if (((RuleType) target).getTarget() == null) { actions.add(CREATE_TARGET); } /* actions.add(CLIPBOARD_CUT); actions.add(CLIPBOARD_COPY); actions.add(CLIPBOARD_PASTE); */ if (((RuleType) target).getCondition() == null) { actions.add(CREATE_CONDITION); } actions.add(EDIT_OBLIGATIONS); actions.add(EDIT_ADVICE); actions.add(DELETE_RULE); return (Action[]) actions.toArray(new Action[0]); } if (target instanceof TargetType) { return new Action[] { CREATE_NEWANYOF }; } if (target instanceof AnyOfType) { return new Action[] { CREATE_NEWALLOF, DELETE_ANYOF }; } if (target instanceof AllOfType) { return new Action[] { CREATE_NEWMATCH, DELETE_ALLOF }; } if (target instanceof MatchType) { return new Action[] { EDIT_MATCH, DELETE_MATCH }; } if (target instanceof ConditionType) { return new Action[] { EDIT_CONDITION, DELETE_CONDITION }; } if (target instanceof VariableDefinitionType) { return new Action[] { EDIT_VARIABLE, DELETE_VARIABLE }; } if (target instanceof ObligationExpressionType) { return new Action[] { EDIT_OBLIGATIONS, DELETE_OBLIGATIONS }; } if (target instanceof AdviceExpressionType) { return new Action[] { EDIT_ADVICE, DELETE_ADVICE }; } return null; } @Override public void handleAction(Action action, Object sender, Object target) { if (action == CLIPBOARD_CUT) { assert target != null; self.clipboardObject = XACMLObjectCopy.deepCopy(target); self.removeObject(target); return; } if (action == CLIPBOARD_COPY) { assert target != null; self.clipboardObject = XACMLObjectCopy.deepCopy(target); return; } if (action == CLIPBOARD_PASTE) { assert target != null; self.clipboardPaste(target, true); return; } if (action == CREATE_POLICYSET) { assert target instanceof PolicySetType; self.editPolicySet(null, (PolicySetType) target); return; } if (action == CREATE_POLICY) { assert target instanceof PolicySetType; self.editPolicy(null, (PolicySetType) target); return; } if (action == CREATE_RULE) { assert target instanceof PolicyType; self.editRule(null, (PolicyType) target); return; } if (action == CREATE_TARGET) { assert target instanceof RuleType || target instanceof PolicyType || target instanceof PolicySetType; TargetType newTarget = new TargetType(); self.policyContainer.addItem(newTarget, target); return; } if (action == EDIT_POLICYSET) { assert target instanceof PolicySetType; self.editPolicySet((PolicySetType) target, (PolicySetType) self.policyContainer.getParent(target)); return; } if (action == EDIT_POLICY) { assert target instanceof PolicyType; self.editPolicy((PolicyType) target, (PolicySetType) self.policyContainer.getParent(target)); return; } if (action == EDIT_RULE) { assert target instanceof RuleType; self.editRule((RuleType) target, (PolicyType) self.policyContainer.getParent(target)); return; } if (action == DELETE_POLICYSET) { assert target instanceof PolicySetType; self.removePolicySet((PolicySetType) target); return; } if (action == DELETE_POLICY) { assert target instanceof PolicyType; self.removePolicy((PolicyType) target); return; } if (action == DELETE_RULE) { assert target instanceof RuleType; self.removeRule((RuleType) target); return; } if (action == CREATE_NEWANYOF) { assert target instanceof TargetType; self.editMatch(null, null, null, (TargetType) target, "Create New Match"); return; } if (action == CREATE_NEWALLOF) { assert target instanceof AnyOfType; self.editMatch(null, null, (AnyOfType) target, null, "Create New Match"); return; } if (action == CREATE_NEWMATCH) { if (target instanceof AllOfType) { self.editMatch(null, (AllOfType) target, null, null, "Create New Match"); } else if (target instanceof TargetType) { self.editMatch(null, null, null, (TargetType) target, "Create New Match"); } else { assert false; } return; } if (action == DELETE_ANYOF) { assert target instanceof AnyOfType; self.removeAnyOf((AnyOfType) target, (TargetType) self.policyContainer.getParent(target)); return; } if (action == DELETE_ALLOF) { assert target instanceof AllOfType; self.removeAllOf((AllOfType) target, (AnyOfType) self.policyContainer.getParent(target)); return; } if (action == DELETE_MATCH) { assert target instanceof MatchType; self.removeMatch((MatchType) target, (AllOfType) self.policyContainer.getParent(target)); return; } if (action == EDIT_MATCH) { assert target instanceof MatchType; self.editMatch((MatchType) target, (AllOfType) self.policyContainer.getParent(target), null, null, "Edit Match"); return; } if (action == EDIT_OBLIGATIONS) { assert target instanceof RuleType || target instanceof PolicyType || target instanceof PolicySetType || target instanceof ObligationExpressionType; if (target instanceof ObligationExpressionType) { self.editObAdvice(true, self.policyContainer.getParent(target)); } else { self.editObAdvice(true, target); } return; } if (action == DELETE_OBLIGATIONS) { assert target instanceof ObligationExpressionType; self.removeObligations((ObligationExpressionType) target); return; } if (action == EDIT_ADVICE) { assert target instanceof RuleType || target instanceof PolicyType || target instanceof PolicySetType || target instanceof AdviceExpressionType; if (target instanceof AdviceExpressionType) { self.editObAdvice(false, self.policyContainer.getParent(target)); } else { self.editObAdvice(false, target); } return; } if (action == DELETE_ADVICE) { assert target instanceof AdviceExpressionType; self.removeAdvice((AdviceExpressionType) target); return; } if (action == CREATE_VARIABLE) { assert target instanceof PolicyType; self.editVariable(null, (PolicyType) target); return; } if (action == CREATE_CONDITION) { assert target instanceof RuleType; self.editCondition(null, (RuleType) target); return; } if (action == EDIT_CONDITION) { assert target instanceof ConditionType; self.editCondition((ConditionType) target, (RuleType) self.policyContainer.getParent(target)); return; } if (action == DELETE_CONDITION) { assert target instanceof ConditionType; self.removeCondition((ConditionType) target); return; } if (action == EDIT_EXPRESSIONS) { return; } if (action == DELETE_VARIABLE) { assert target instanceof VariableDefinitionType; self.removeVariable((VariableDefinitionType) target); return; } if (action == EDIT_VARIABLE) { assert target instanceof VariableDefinitionType; self.editVariable((VariableDefinitionType) target, (PolicyType) self.policyContainer.getParent(target)); return; } } }); } protected void resetComponents() { if (this.isReadOnly()) { this.checkBoxAutoSave.setEnabled(false); this.buttonSave.setEnabled(false); this.tree.setDragMode(TableDragMode.NONE); this.tree.removeAllActionHandlers(); this.tree.setReadOnly(true); } else { this.checkBoxAutoSave.setEnabled(true); this.buttonSave.setEnabled(this.isModified); this.tree.setReadOnly(false); this.tree.setDragMode(TableDragMode.ROW); this.installTreeActionHandler(); } } public void setupCaption() { String caption = this.file.getName(); if (this.isModified) { caption = caption + " *"; } if (this.isReadOnly()) { caption = caption + " (Read-Only)"; } if (this.tab != null) { this.tab.setCaption(caption); } } protected void editPolicySet(final PolicySetType policy, final PolicySetType parent) { logger.info("editPolicySet: " + policy + " parent " + parent); // // Create a copy // final PolicySetType newPolicySet = (policy == null ? new PolicySetType() : XACMLObjectCopy.copy(policy)); // // Create window // final PolicySetEditorWindow window = new PolicySetEditorWindow(newPolicySet); window.setCaption(policy == null ? "Create New Policy Set" : "Edit Policy Set"); 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) { if (logger.isDebugEnabled()) { logger.debug("user did NOT save"); } return; } // // Was it a new Policy Set? // if (policy == null) { logger.info("adding new policy set " + newPolicySet.getPolicySetId()); // // Yes - new add it in // if (newPolicySet.getTarget() == null) { newPolicySet.setTarget(new TargetType()); } if (self.policyContainer.addItem(newPolicySet, parent) == null) { logger.error("Failed to add new policy set"); } else { self.tree.setCollapsed(parent, false); self.tree.setCollapsed(newPolicySet, false); self.tree.select(newPolicySet); } } else { logger.info("updating new policy set " + newPolicySet.getPolicySetId()); // // No - copy everything // policy.setDescription(newPolicySet.getDescription()); policy.setVersion(newPolicySet.getVersion()); policy.setPolicyCombiningAlgId(newPolicySet.getPolicyCombiningAlgId()); // // Update // self.policyContainer.updateItem(policy); } } }); window.center(); UI.getCurrent().addWindow(window); } protected void editPolicy(final PolicyType policy, final PolicySetType parent) { // // Create a copy // final PolicyType newPolicy = (policy == null ? new PolicyType() : XACMLObjectCopy.copy(policy)); // // Create window // final PolicyEditorWindow window = new PolicyEditorWindow(newPolicy); window.setCaption(policy == null ? "Create New Policy" : "Edit Policy"); 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 it a new Policy? // if (policy == null) { // // Yes - new add it in // if (newPolicy.getTarget() == null) { newPolicy.setTarget(new TargetType()); } if (self.policyContainer.addItem(newPolicy, parent) == null) { logger.error("Failed to add policy"); } else { self.tree.setCollapsed(parent, false); self.tree.setCollapsed(newPolicy, false); self.tree.select(newPolicy); } } else { // // No - copy everything // policy.setDescription(newPolicy.getDescription()); policy.setVersion(newPolicy.getVersion()); policy.setRuleCombiningAlgId(newPolicy.getRuleCombiningAlgId()); // // Update // self.policyContainer.updateItem(policy); } } }); window.center(); UI.getCurrent().addWindow(window); } protected void editRule(final RuleType rule, final PolicyType parent) { // // Create a copy // final RuleType newRule = (rule == null ? new RuleType() : XACMLObjectCopy.copy(rule)); // // Create window // final RuleEditorWindow window = new RuleEditorWindow(newRule); window.setCaption(rule == null ? "Create New Rule" : "Edit Rule"); 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 rule? // if (rule == null) { // // Yes a new rule // if (newRule.getTarget() == null) { newRule.setTarget(new TargetType()); } if (self.policyContainer.addItem(newRule, parent) == null) { logger.error("Failed to add new rule"); } else { self.tree.setCollapsed(parent, false); self.tree.setCollapsed(newRule, false); self.tree.select(newRule); } } else { // // No - editing existing rule. Copy everything // rule.setEffect(newRule.getEffect()); rule.setDescription(newRule.getDescription()); self.policyContainer.updateItem(rule); } } }); window.center(); UI.getCurrent().addWindow(window); } protected void editCondition(final ConditionType condition, final RuleType rule) { // // Make a copy of it first, in case the user manipulates it // and then decides to NOT save it // final ConditionType copyCondition = (condition == null ? new ConditionType() : XACMLObjectCopy.copy(condition)); // // Create the window // final ExpressionBuilderComponent expression = new ExpressionBuilderComponent(copyCondition, (copyCondition.getExpression() != null ? copyCondition.getExpression().getValue() : null), null, self.policyContainer.getVariables()); if (condition == null) { expression.setCaption("Create An Expression For The Condition"); } else { expression.setCaption("Edit The Condition Expression"); } expression.setModal(true); // // Add the close listener // expression.addCloseListener(new CloseListener() { private static final long serialVersionUID = 1L; @Override public void windowClose(CloseEvent e) { // // Did the user hit save? // if (expression.isSaved() == false) { return; } // // Were we creating something new? // if (condition == null) { // // Yes add the new one into the container // if (self.policyContainer.addItem(copyCondition, rule) == null) { logger.error("Failed to add condition"); } else { self.tree.setCollapsed(rule, false); self.tree.setCollapsed(copyCondition, false); self.tree.select(copyCondition); } } else { // // We were editing an existing condition, so copy // over the new edited expression. // condition.setExpression(copyCondition.getExpression()); // // Update the container // self.policyContainer.updateItem(condition); } } }); expression.center(); UI.getCurrent().addWindow(expression); } protected void editVariable(final VariableDefinitionType variable, final PolicyType parent) { // // Make a copy of it first, in case the user manipulates it // and then decides to NOT save it // final VariableDefinitionType copyVariable = (variable == null ? new VariableDefinitionType() : XACMLObjectCopy.copy(variable)); // // Have the user create or edit the Variables ID // final VariableDefinitionEditorWindow editor = new VariableDefinitionEditorWindow(copyVariable); if (variable == null) { editor.setCaption("Create Variable"); } else { editor.setCaption( "Edit Variable" + (copyVariable.getVariableId() == null ? "" : copyVariable.getVariableId())); } editor.setModal(true); editor.addCloseListener(new CloseListener() { private static final long serialVersionUID = 1L; @Override public void windowClose(CloseEvent e) { // // Did the user click save button? // if (editor.isSaved() == false) { return; } // // Create the window // final ExpressionBuilderComponent expression = new ExpressionBuilderComponent(copyVariable, (copyVariable.getExpression() != null ? copyVariable.getExpression().getValue() : null), null, self.policyContainer.getVariables()); expression.setCaption("Edit The Variable \"" + copyVariable.getVariableId() + "\" Expression"); // // Add the close listener // expression.addCloseListener(new CloseListener() { private static final long serialVersionUID = 1L; @Override public void windowClose(CloseEvent e) { // // Did the user click save button? // if (expression.isSaved() == false) { return; } // // Was it a new variable or were we editing an existing one? // if (variable == null) { // // New one, add it to the container // if (self.policyContainer.addItem(copyVariable, parent) == null) { logger.error("Failed to add variable"); } else { self.tree.setCollapsed(parent, false); self.tree.setCollapsed(copyVariable, false); self.tree.select(copyVariable); } } else { // // We were editing one, copy it back over. // variable.setVariableId(copyVariable.getVariableId()); variable.setExpression(copyVariable.getExpression()); // // Update the container // self.policyContainer.updateItem(variable); } } }); expression.center(); UI.getCurrent().addWindow(expression); } }); editor.center(); UI.getCurrent().addWindow(editor); } protected void editMatch(final MatchType match, final AllOfType allOf, final AnyOfType anyOf, final TargetType target, final String caption) { // // Create an empty match or copy the one we are going to edit. // final MatchType newMatch = (match == null ? new MatchType() : XACMLObjectCopy.copy(match)); // // Have user select an attribute // final AttributeSelectionWindow selection = new AttributeSelectionWindow(null, (newMatch.getAttributeDesignator() != null ? newMatch.getAttributeDesignator() : newMatch.getAttributeSelector())); selection.setCaption("Select Attribute To Match Against"); selection.setModal(true); selection.addCloseListener(new CloseListener() { private static final long serialVersionUID = 1L; @Override public void windowClose(CloseEvent event) { // // Did the user save anything? // if (selection.isSaved() == false) { return; } // // Save the selected attribute // final Attribute attribute = selection.getAttribute(); if (attribute.isDesignator()) { newMatch.setAttributeDesignator(JPAUtils.createDesignator(attribute)); } else { newMatch.setAttributeSelector(JPAUtils.createSelector(attribute)); } // // Yes - now match it up to a function // final MatchEditorWindow editor = new MatchEditorWindow(newMatch, attribute.getDatatypeBean()); editor.setCaption(caption); editor.setModal(true); editor.addCloseListener(new CloseListener() { private static final long serialVersionUID = 1L; @Override public void windowClose(CloseEvent event) { // // Did the user hit save? // if (editor.isSaved() == false) { return; } // // Yes - now we need the value to check the attribute against // final AttributeValueType copyAttributeValue = (newMatch.getAttributeValue() == null ? new AttributeValueType() : newMatch.getAttributeValue()); // String currentValue = null; // if (newMatch.getAttributeValue() != null) { // currentValue = XACMLObjectCopy.getContent(newMatch.getAttributeValue().getContent()); // } final AttributeValueEditorWindow value = new AttributeValueEditorWindow(copyAttributeValue, attribute.getDatatypeBean()); value.setCaption("Set the value the attribute should match against."); value.setModal(true); value.addCloseListener(new CloseListener() { private static final long serialVersionUID = 1L; @Override public void windowClose(CloseEvent event) { // // Did the user save? // if (value.isSaved() == false) { return; } // // Yes - copy the value into the match // AttributeValueType val = new AttributeValueType(); val.getContent().add(value.getValue()); val.setDataType(value.getDatatype().getXacmlId()); newMatch.setAttributeValue(val); // // Was this a new match or were we editing an // existing match? // if (match != null) { // // Editing - now we can save it // match.setAttributeDesignator(newMatch.getAttributeDesignator()); match.setAttributeSelector(newMatch.getAttributeSelector()); match.setAttributeValue(newMatch.getAttributeValue()); match.setMatchId(newMatch.getMatchId()); // // Update the container // self.policyContainer.updateItem(match); } else { // // Do we have a parent(s)? // AllOfType allOfParent = allOf; AnyOfType anyOfParent = anyOf; if (allOfParent == null) { // // No direct AllOfParent // if (anyOfParent == null) { // // No AnyOfParent // if (target == null) { logger.error("We should NOT get this"); return; } anyOfParent = new AnyOfType(); if (self.policyContainer.addItem(anyOfParent, target) == null) { logger.error("Failed to add anyOf parent"); assert false; } self.tree.setCollapsed(anyOfParent, false); } allOfParent = new AllOfType(); if (self.policyContainer.addItem(allOfParent, anyOfParent) == null) { logger.error("Failed to add allOf parent"); assert false; } self.tree.setCollapsed(allOfParent, false); } // // Add the MatchType into the Tree // if (self.policyContainer.addItem(newMatch, allOfParent) == null) { logger.error("Failed to add match"); assert false; } self.tree.select(newMatch); } } }); value.center(); UI.getCurrent().addWindow(value); } }); editor.center(); UI.getCurrent().addWindow(editor); } }); selection.center(); UI.getCurrent().addWindow(selection); } protected void deleteRoot(Object root) { // // TODO - prompt user for new root object // } protected void editObAdvice(boolean isObligation, final Object target) { // // Get the object // String caption; Object expressionsObject = null; if (target instanceof RuleType) { if (isObligation) { expressionsObject = ((RuleType) target).getObligationExpressions(); if (expressionsObject == null) { caption = "Create New Obligation for Rule"; } else { caption = "Edit Obligations for Rule"; } } else { expressionsObject = ((RuleType) target).getAdviceExpressions(); if (expressionsObject == null) { caption = "Create New Advice for Rule"; } else { caption = "Edit Advice for Rule"; } } } else if (target instanceof PolicyType) { if (isObligation) { expressionsObject = ((PolicyType) target).getObligationExpressions(); if (expressionsObject == null) { caption = "Create New Obligation for Policy"; } else { caption = "Edit Obligations for Policy"; } } else { expressionsObject = ((PolicyType) target).getAdviceExpressions(); if (expressionsObject == null) { caption = "Create New Advice for Policy"; } else { caption = "Edit Advice for Policy"; } } } else if (target instanceof PolicySetType) { if (isObligation) { expressionsObject = ((PolicySetType) target).getObligationExpressions(); if (expressionsObject == null) { caption = "Create New Obligation for Policy Set"; } else { caption = "Edit Obligation for Policy Set"; } } else { expressionsObject = ((PolicySetType) target).getAdviceExpressions(); if (expressionsObject == null) { caption = "Create New Advice for Policy Set"; } else { caption = "Edit Advice for Policy Set"; } } } else { throw new IllegalArgumentException("Expected a rule/policy/policyset."); } // // Make a copy // final Object originalExpressions = expressionsObject; final Object copyExpression = (originalExpressions == null ? (isObligation ? new ObligationExpressionsType() : new AdviceExpressionsType()) : originalExpressions instanceof ObligationExpressionsType ? XACMLObjectCopy.copy((ObligationExpressionsType) originalExpressions) : XACMLObjectCopy.copy((AdviceExpressionsType) originalExpressions)); // // Invoke the editor window // final ObligationAdviceEditorWindow window = new ObligationAdviceEditorWindow(copyExpression, this.policyContainer.getVariables()); window.setCaption(caption); window.setModal(true); 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; } // // It was saved - is this a new object? // if (originalExpressions == null) { // // New object // if (self.policyContainer.addItem(copyExpression, target) == null) { logger.error("Failed to add expression"); assert false; } } else { // // Editing an existing object. // if (originalExpressions instanceof ObligationExpressionsType) { // // Remove old obligations // while (((ObligationExpressionsType) originalExpressions).getObligationExpression() .isEmpty() == false) { // for (ObligationExpressionType old : ((ObligationExpressionsType) originalExpressions).getObligationExpression()) { ObligationExpressionType old = ((ObligationExpressionsType) originalExpressions) .getObligationExpression().get(0); self.policyContainer.removeItem(old); } // // Copy new ones in // for (ObligationExpressionType newObligation : ((ObligationExpressionsType) copyExpression) .getObligationExpression()) { self.policyContainer.addItem(newObligation, (ObligationExpressionsType) originalExpressions); } } else if (originalExpressions instanceof AdviceExpressionsType) { ((AdviceExpressionsType) originalExpressions).getAdviceExpression().clear(); ((AdviceExpressionsType) originalExpressions).getAdviceExpression() .addAll(((AdviceExpressionsType) copyExpression).getAdviceExpression()); } } } }); window.center(); UI.getCurrent().addWindow(window); } protected void removeMatch(MatchType match, AllOfType parent) { assert match != null && parent != null; if (self.policyContainer.removeItem(match) == false) { logger.error("Failed to remove match"); assert false; } // // Check for empty AllOf's // if (parent.getMatch().isEmpty()) { this.removeAllOf(parent, (AnyOfType) this.policyContainer.getParent(parent)); } } protected void removeAllOf(AllOfType allOf, AnyOfType parent) { assert allOf != null && parent != null; if (self.policyContainer.removeItem(allOf) == false) { logger.error("Failed to remove AllOf"); assert false; } // // Check for empty AnyOf's // if (parent.getAllOf().isEmpty()) { this.removeAnyOf(parent, (TargetType) this.policyContainer.getParent(parent)); } } protected void removeAnyOf(AnyOfType anyOf, TargetType parent) { assert anyOf != null && parent != null; if (self.policyContainer.removeItem(anyOf) == false) { logger.error("Failed to remove anyOf"); assert false; } } protected boolean clipboardPaste(final Object target, boolean performPaste) { if (this.clipboardObject == null) { if (logger.isDebugEnabled()) { logger.debug("nothing in clipboard."); } return false; } boolean doPaste = false; if (this.clipboardObject instanceof PolicySetType && target instanceof PolicySetType) { doPaste = true; } if (this.clipboardObject instanceof PolicyType && target instanceof PolicySetType) { doPaste = true; } if (this.clipboardObject instanceof RuleType && target instanceof PolicyType) { doPaste = true; } if (doPaste == false) { // // Pasting clipboard object onto target not // possible. // return false; } if (performPaste == false) { // // They did not ask to do the actual paste, // but the called wanted to know if it was // possible. // return true; } // // Do the actual paste // Item item = this.policyContainer.addItem(XACMLObjectCopy.deepCopy(this.clipboardObject), target); assert item != null; this.tree.select(this.clipboardObject); return true; } @AutoGenerated private VerticalLayout buildMainLayout() { // common part: create layout mainLayout = new VerticalLayout(); mainLayout.setImmediate(false); mainLayout.setWidth("-1px"); mainLayout.setHeight("100.0%"); mainLayout.setMargin(false); mainLayout.setSpacing(true); // top-level component properties setWidth("-1px"); setHeight("100.0%"); // horizontalLayoutToolbar horizontalLayoutToolbar = buildHorizontalLayoutToolbar(); mainLayout.addComponent(horizontalLayoutToolbar); mainLayout.setExpandRatio(horizontalLayoutToolbar, 1.0f); // tree tree = new TreeTable(); tree.setImmediate(true); tree.setWidth("100.0%"); tree.setHeight("100.0%"); mainLayout.addComponent(tree); mainLayout.setExpandRatio(tree, 1.0f); return mainLayout; } @AutoGenerated private HorizontalLayout buildHorizontalLayoutToolbar() { // common part: create layout horizontalLayoutToolbar = new HorizontalLayout(); horizontalLayoutToolbar.setImmediate(false); horizontalLayoutToolbar.setWidth("-1px"); horizontalLayoutToolbar.setHeight("-1px"); horizontalLayoutToolbar.setMargin(true); horizontalLayoutToolbar.setSpacing(true); // checkBoxReadOnly checkBoxReadOnly = new CheckBox(); checkBoxReadOnly.setCaption("Read Only"); checkBoxReadOnly.setImmediate(false); checkBoxReadOnly.setDescription("Check this to turn-off policy editing."); checkBoxReadOnly.setWidth("-1px"); checkBoxReadOnly.setHeight("-1px"); horizontalLayoutToolbar.addComponent(checkBoxReadOnly); // checkBoxAutoSave checkBoxAutoSave = new CheckBox(); checkBoxAutoSave.setCaption("Auto Save"); checkBoxAutoSave.setImmediate(false); checkBoxAutoSave.setDescription("Check this to turn-on automatic saving of policy when a change occurs."); checkBoxAutoSave.setWidth("-1px"); checkBoxAutoSave.setHeight("-1px"); horizontalLayoutToolbar.addComponent(checkBoxAutoSave); // buttonSave buttonSave = new Button(); buttonSave.setCaption("Save"); buttonSave.setImmediate(true); buttonSave.setDescription("Click to save the policy."); buttonSave.setWidth("-1px"); buttonSave.setHeight("-1px"); horizontalLayoutToolbar.addComponent(buttonSave); // buttonViewXML buttonViewXML = new Button(); buttonViewXML.setCaption("View XML"); buttonViewXML.setImmediate(true); buttonViewXML.setWidth("-1px"); buttonViewXML.setHeight("-1px"); horizontalLayoutToolbar.addComponent(buttonViewXML); // buttonExport buttonExport = new Button(); buttonExport.setCaption("Export Policy"); buttonExport.setImmediate(false); buttonExport.setWidth("-1px"); buttonExport.setHeight("-1px"); horizontalLayoutToolbar.addComponent(buttonExport); return horizontalLayoutToolbar; } }