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.view.windows; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.openaz.xacml.admin.model.PDPPIPContainer; import org.apache.openaz.xacml.admin.model.PDPPolicyContainer; import org.apache.openaz.xacml.admin.util.AdminNotification; import org.apache.openaz.xacml.api.pap.PAPEngine; import org.apache.openaz.xacml.api.pap.PAPException; import org.apache.openaz.xacml.api.pap.PDPGroup; import org.apache.openaz.xacml.api.pap.PDPPIPConfig; import org.apache.openaz.xacml.api.pap.PDPPolicy; import org.apache.openaz.xacml.std.pap.StdPDPGroup; import org.apache.openaz.xacml.std.pap.StdPDPPolicy; import com.vaadin.annotations.AutoGenerated; import com.vaadin.data.Validator; import com.vaadin.data.Validator.InvalidValueException; import com.vaadin.event.Action; import com.vaadin.event.Action.Handler; import com.vaadin.event.FieldEvents.TextChangeEvent; import com.vaadin.event.FieldEvents.TextChangeListener; import com.vaadin.event.ShortcutAction.KeyCode; 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.Table; import com.vaadin.ui.TextArea; import com.vaadin.ui.TextField; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; public class EditPDPGroupWindow 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 Table tablePIP; @AutoGenerated private Table tablePolicies; @AutoGenerated private TextArea textDescription; @AutoGenerated private TextField textName; private static final Action ADD_POLICY = new Action("Add New Policy"); private static final Action REMOVE_POLICY = new Action("Remove Policy"); private static final Action MAKE_ROOT = new Action("Make Root"); private static final Action MAKE_REFERENCED = new Action("Make Referenced"); private static final Action EDIT_CONFIG = new Action("Edit Configurations"); // // ?? Why is this static? // private static PDPPolicyContainer policyContainer; private PDPPIPContainer pipContainer; /** * */ private static final long serialVersionUID = 1L; private final EditPDPGroupWindow self = this; private final StdPDPGroup group; private boolean isSaved = false; // this is the version that contains all of the edits made by the user. // it may be a copy of the original object (edited) or a new one. private StdPDPGroup updatedObject; private PAPEngine papEngine; private List<PDPGroup> groups; /** * 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 EditPDPGroupWindow(StdPDPGroup group, List<PDPGroup> list, PAPEngine engine) { buildMainLayout(); //setCompositionRoot(mainLayout); setContent(mainLayout); // // Save pointers // this.group = group; this.groups = list; this.papEngine = engine; // // Initialize // this.initialize(); // // Shortcuts // this.setCloseShortcut(KeyCode.ESCAPE); this.buttonSave.setClickShortcut(KeyCode.ENTER); // // Focus // this.textName.focus(); } protected void initialize() { this.initializeText(); this.initializeButton(); this.initializeTables(); } protected void initializeText() { this.textName.setNullRepresentation(""); this.textDescription.setNullRepresentation(""); if (this.group != null) { this.textName.setValue(this.group.getName()); this.textDescription.setValue(this.group.getDescription()); } // // Validation // this.textName.addValidator(new Validator() { private static final long serialVersionUID = 1L; @Override public void validate(Object value) throws InvalidValueException { assert value instanceof String; if (value == null) { throw new InvalidValueException("The name cannot be blank."); } // Group names must be unique so that user can distinguish between them (and we can create unique IDs from them) for (PDPGroup g : self.groups) { if (group != null && g.getId().equals(group.getId())) { // ignore this group - we may or may not be changing the name continue; } if (g.getName().equals(value.toString())) { throw new InvalidValueException("Name must be unique"); } } } }); this.textName.addTextChangeListener(new TextChangeListener() { private static final long serialVersionUID = 1L; @Override public void textChange(TextChangeEvent event) { if (event.getText() == null || event.getText().isEmpty()) { self.buttonSave.setEnabled(false); } else { self.buttonSave.setEnabled(true); } } }); } protected void initializeTables() { this.initializePolicyTable(); this.initializePIPTable(); } protected void initializePolicyTable() { if (this.group == null) { this.tablePolicies.setVisible(false); return; } // // GUI properties // EditPDPGroupWindow.policyContainer = new PDPPolicyContainer(group); this.tablePolicies.setContainerDataSource(EditPDPGroupWindow.policyContainer); this.tablePolicies.setVisibleColumns("Root", "Name", "Version", "Id");//, "Description"); this.tablePolicies.setPageLength(EditPDPGroupWindow.policyContainer.size() + 1); this.tablePolicies.setSelectable(true); this.tablePolicies.setSizeFull(); /* * Not in this release. * this.tablePolicies.setColumnCollapsingAllowed(true); this.tablePolicies.setColumnCollapsed("Description", true); // // Generated columns // this.tablePolicies.addGeneratedColumn("Description", new ColumnGenerator() { private static final long serialVersionUID = 1L; @Override public Object generateCell(Table source, Object itemId, Object columnId) { TextArea area = new TextArea(); if (itemId != null && itemId instanceof PDPPolicy) { area.setValue(((PDPPolicy)itemId).getDescription()); } area.setNullRepresentation(""); area.setWidth("100.0%"); return area; } }); */ // // Actions // this.tablePolicies.addActionHandler(new Handler() { private static final long serialVersionUID = 1L; @Override public Action[] getActions(Object target, Object sender) { if (target == null) { return new Action[] { ADD_POLICY }; } return new Action[] { ADD_POLICY, REMOVE_POLICY, MAKE_ROOT, MAKE_REFERENCED }; } @Override public void handleAction(Action action, Object sender, Object target) { if (action == ADD_POLICY) { final SelectWorkspacePoliciesWindow policiesWindow = new SelectWorkspacePoliciesWindow(); policiesWindow.setCaption("Select Policy to Add"); policiesWindow.setModal(true); policiesWindow.addCloseListener(new CloseListener() { private static final long serialVersionUID = 1L; @Override public void windowClose(CloseEvent event) { // // Did the user hit save? // if (policiesWindow.isSaved() == false) { return; } // // Get the selected policy // StdPDPPolicy selectedPolicy = policiesWindow.getSelectedPolicy(); if (selectedPolicy != null) { // do not allow multiple copies of same policy for (Object existingPolicy : EditPDPGroupWindow.policyContainer.getItemIds()) { if (selectedPolicy.getId().equals(((PDPPolicy) existingPolicy).getId())) { AdminNotification.warn( "Cannot re-add Policy with the same ID (i.e. same Name, source Sub-Domain and Version)"); return; } } // copy policy to PAP try { papEngine.copyPolicy(selectedPolicy, self.group); } catch (PAPException e) { AdminNotification.warn("Unable to copy Policy '" + selectedPolicy.getPolicyId() + "' to PAP: " + e.getMessage()); return; } // add Policy to group EditPDPGroupWindow.policyContainer.addItem(selectedPolicy); self.markAsDirtyRecursive(); } } }); policiesWindow.center(); UI.getCurrent().addWindow(policiesWindow); return; } if (action == REMOVE_POLICY) { assert target != null; PDPPolicy policy = (PDPPolicy) target; EditPDPGroupWindow.policyContainer.removeItem(policy); self.markAsDirtyRecursive(); return; } if (action == MAKE_ROOT) { assert target != null; assert target instanceof StdPDPPolicy; StdPDPPolicy policy = (StdPDPPolicy) target; EditPDPGroupWindow.policyContainer.getItem(policy).getItemProperty("Root").setValue(true); self.markAsDirtyRecursive(); return; } if (action == MAKE_REFERENCED) { assert target != null; assert target instanceof StdPDPPolicy; StdPDPPolicy policy = (StdPDPPolicy) target; EditPDPGroupWindow.policyContainer.getItem(policy).getItemProperty("Root").setValue(false); self.markAsDirtyRecursive(); return; } AdminNotification.error("Unrecognized action '" + action + "' on target '" + target + "'"); } }); } protected void initializePIPTable() { if (this.group == null) { this.tablePIP.setVisible(false); return; } // // Setup data source and GUI properties // this.pipContainer = new PDPPIPContainer(group); this.tablePIP.setContainerDataSource(this.pipContainer); this.tablePIP.setPageLength(this.pipContainer.size() + 2); this.tablePIP.setSelectable(true); this.tablePIP.setSizeFull(); // // Add the action handler // this.tablePIP.addActionHandler(new Handler() { private static final long serialVersionUID = 1L; @Override public Action[] getActions(Object target, Object sender) { return new Action[] { EDIT_CONFIG }; } @Override public void handleAction(Action action, Object sender, Object target) { if (action == EDIT_CONFIG) { self.editPIPConfiguration(); return; } } }); } protected void editPIPConfiguration() { final SelectPIPConfigurationWindow window = new SelectPIPConfigurationWindow(this.group); window.setCaption("Select PIP Configurations"); window.setModal(true); window.addCloseListener(new CloseListener() { private static final long serialVersionUID = 1L; @Override public void windowClose(CloseEvent e) { // // Did the user click save button? // if (window.isSaved() == false) { return; } // // Yes - save the PIP configuration // Set<PDPPIPConfig> configs = window.getSelectedConfigs(); assert configs != null; self.group.setPipConfigs(configs); // // Update the container // self.pipContainer.refresh(); } }); window.center(); UI.getCurrent().addWindow(window); } protected void initializeButton() { this.buttonSave.addClickListener(new ClickListener() { private static final long serialVersionUID = 1L; @Override public void buttonClick(ClickEvent event) { try { // // Validate // self.textName.commit(); // // All good save everything // self.doSave(); // // mark ourselves as saved // self.isSaved = true; // // Close the window // self.close(); } catch (InvalidValueException e) { //NOPMD // // Ignore, Vaadin will display our message // } } }); } protected void doSave() { if (this.group == null) { return; } StdPDPGroup updatedGroupObject = new StdPDPGroup(this.group.getId(), this.group.isDefaultGroup(), this.textName.getValue(), this.textDescription.getValue(), null); // replace the original set of Policies with the set from the container (possibly modified by the user) Set<PDPPolicy> changedPolicies = new HashSet<PDPPolicy>(); changedPolicies.addAll((Collection<PDPPolicy>) EditPDPGroupWindow.policyContainer.getItemIds()); updatedGroupObject.setPolicies(changedPolicies); updatedGroupObject.setPdps(this.group.getPdps()); // replace the original set of PIP Configs with the set from the container //TODO - get PIP Configs from a container used to support editing // selfPDPObject.getPipConfigs().clear(); // selfPDPObject.getPipConfigs().addAll(containerGroup.getPipConfigs()); updatedGroupObject.setPipConfigs(this.group.getPipConfigs()); // copy those things that the user cannot change from the original to the new object updatedGroupObject.setStatus(this.group.getStatus()); this.updatedObject = updatedGroupObject; } public boolean isSaved() { return this.isSaved; } public String getGroupName() { return this.textName.getValue(); } public String getGroupDescription() { return this.textDescription.getValue(); } public PDPGroup getUpdatedObject() { return this.updatedObject; } @AutoGenerated private VerticalLayout buildMainLayout() { // common part: create layout mainLayout = new VerticalLayout(); mainLayout.setImmediate(false); mainLayout.setWidth("100.0%"); mainLayout.setHeight("-1px"); mainLayout.setMargin(true); mainLayout.setSpacing(true); // top-level component properties setWidth("-1px"); setHeight("-1px"); // textName textName = new TextField(); textName.setCaption("Group Name"); textName.setImmediate(false); textName.setWidth("-1px"); textName.setHeight("-1px"); textName.setRequired(true); mainLayout.addComponent(textName); // textDescription textDescription = new TextArea(); textDescription.setCaption("Group Description"); textDescription.setImmediate(false); textDescription.setWidth("100.0%"); textDescription.setHeight("-1px"); textDescription.setNullSettingAllowed(true); mainLayout.addComponent(textDescription); mainLayout.setExpandRatio(textDescription, 1.0f); // tablePolicies tablePolicies = new Table(); tablePolicies.setCaption("Policies"); tablePolicies.setImmediate(false); tablePolicies.setWidth("-1px"); tablePolicies.setHeight("-1px"); mainLayout.addComponent(tablePolicies); mainLayout.setExpandRatio(tablePolicies, 1.0f); // tablePIP tablePIP = new Table(); tablePIP.setCaption("PIP Configurations"); tablePIP.setImmediate(false); tablePIP.setWidth("-1px"); tablePIP.setHeight("-1px"); mainLayout.addComponent(tablePIP); mainLayout.setExpandRatio(tablePIP, 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; } }