You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openaz.apache.org by pd...@apache.org on 2016/03/17 02:15:27 UTC
[05/23] incubator-openaz git commit: Ported original att source to
openaz This Closes #3
http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/648d0c0d/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/FunctionSelectionWindow.java
----------------------------------------------------------------------
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/FunctionSelectionWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/FunctionSelectionWindow.java
new file mode 100644
index 0000000..80d33b8
--- /dev/null
+++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/FunctionSelectionWindow.java
@@ -0,0 +1,314 @@
+/*
+ * 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 org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.openaz.xacml.admin.XacmlAdminUI;
+import com.vaadin.annotations.AutoGenerated;
+import com.vaadin.data.Buffered.SourceException;
+import com.vaadin.data.Item;
+import com.vaadin.data.Property;
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.data.Validator.InvalidValueException;
+import com.vaadin.data.util.filter.SimpleStringFilter;
+import com.vaadin.data.util.sqlcontainer.SQLContainer;
+import com.vaadin.event.FieldEvents.TextChangeEvent;
+import com.vaadin.event.FieldEvents.TextChangeListener;
+import com.vaadin.event.ItemClickEvent;
+import com.vaadin.event.ItemClickEvent.ItemClickListener;
+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.TextField;
+import com.vaadin.ui.UI;
+import com.vaadin.ui.VerticalLayout;
+import com.vaadin.ui.Window;
+
+public class FunctionSelectionWindow 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 tableFunctions;
+ @AutoGenerated
+ private TextField textFieldFilter;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private static Log logger = LogFactory.getLog(FunctionSelectionWindow.class);
+ private final FunctionSelectionWindow self = this;
+ private final String defaultFunctionID;
+ private String selectedFunction = null;
+ private boolean isSaved = false;
+ private static SQLContainer highOrderFunctions = ((XacmlAdminUI) UI.getCurrent()).getHigherOrderBagContainer();
+ /*
+ * Seems that when this view is created it may or may not be upper case.
+ */
+ private static String PROPERTY_SHORTNAME = "shortname";
+ private static String PROPERTY_XACMLID = "xacmlid";
+
+ static {
+ for (Object prop : FunctionSelectionWindow.highOrderFunctions.getContainerPropertyIds()) {
+ logger.info("SQL Container Property Id: " + prop.toString());
+ if (prop.toString().equalsIgnoreCase(PROPERTY_SHORTNAME)) {
+ PROPERTY_SHORTNAME = prop.toString();
+ } else if (prop.toString().equalsIgnoreCase(PROPERTY_XACMLID)) {
+ PROPERTY_XACMLID = prop.toString();
+ }
+ }
+
+ }
+
+
+ /**
+ * 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 FunctionSelectionWindow(String defaultFunction) {
+ buildMainLayout();
+ //setCompositionRoot(mainLayout);
+ setContent(mainLayout);
+ //
+ // Save
+ //
+ this.defaultFunctionID = defaultFunction;
+ //
+ // Close shortcut
+ //
+ this.setCloseShortcut(KeyCode.ESCAPE);
+ //
+ // Initialize GUI
+ //
+ this.initializeTextField();
+ this.initializeFunctions();
+ this.initializeButtons();
+ //
+ // Set our focus
+ //
+ this.tableFunctions.focus();
+ }
+
+ protected void initializeTextField() {
+ //
+ // Initialize GUI settings
+ //
+ this.textFieldFilter.setImmediate(true);
+ //
+ // Respond to the text change events
+ //
+ this.textFieldFilter.addTextChangeListener(new TextChangeListener() {
+ private static final long serialVersionUID = 1L;
+ SimpleStringFilter currentFilter = null;
+
+ @Override
+ public void textChange(TextChangeEvent event) {
+ //
+ // Remove current filter
+ //
+ if (this.currentFilter != null) {
+ FunctionSelectionWindow.highOrderFunctions.removeContainerFilter(this.currentFilter);
+ this.currentFilter = null;
+ }
+ //
+ // Get the text
+ //
+ String value = event.getText();
+ if (value != null && value.length() > 0) {
+ //
+ // Add the new filter
+ //
+ this.currentFilter = new SimpleStringFilter(PROPERTY_SHORTNAME, value, true, false);
+ FunctionSelectionWindow.highOrderFunctions.addContainerFilter(this.currentFilter);
+ }
+ }
+ });
+ }
+ protected void initializeFunctions() {
+ //
+ // Setup data source. Make sure there are no current filters
+ //
+ FunctionSelectionWindow.highOrderFunctions.removeAllContainerFilters();
+ this.tableFunctions.setContainerDataSource(FunctionSelectionWindow.highOrderFunctions);
+ //
+ // Initialize GUI properties
+ //
+ this.tableFunctions.setImmediate(true);
+ this.tableFunctions.setNullSelectionAllowed(false);
+ this.tableFunctions.setRequired(true);
+ this.tableFunctions.setRequiredError("Please select a function.");
+ this.tableFunctions.setSelectable(true);
+ this.tableFunctions.setPageLength(15);
+ this.tableFunctions.setVisibleColumns(new Object[] {PROPERTY_SHORTNAME, PROPERTY_XACMLID});
+ this.tableFunctions.setColumnHeaders(new String[] {"Short Function Name", "Xacml ID"});
+ //
+ // Respond to selection events
+ //
+ this.tableFunctions.addValueChangeListener(new ValueChangeListener() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void valueChange(ValueChangeEvent event) {
+ Object id = self.tableFunctions.getValue();
+ if (id != null) {
+ Item item = FunctionSelectionWindow.highOrderFunctions.getItem(id);
+ if (item == null) {
+ return;
+ }
+ Property<?> property = item.getItemProperty(PROPERTY_XACMLID);
+ if (property == null) {
+ return;
+ }
+ selectedFunction = property.getValue().toString();
+ self.buttonSave.setEnabled(true);
+ } else {
+ self.buttonSave.setEnabled(false);
+ }
+ }
+ });
+ //
+ // Respond to double-click events
+ //
+ this.tableFunctions.addItemClickListener(new ItemClickListener() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void itemClick(ItemClickEvent event) {
+ if (event.isDoubleClick()) {
+ self.doSave();
+ }
+ }
+ });
+ //
+ // Setup the default selection
+ //
+ this.buttonSave.setEnabled(false);
+ if (this.defaultFunctionID != null) {
+ for (Object id : FunctionSelectionWindow.highOrderFunctions.getItemIds()) {
+ Item item = FunctionSelectionWindow.highOrderFunctions.getItem(id);
+ if (item != null) {
+ Property<?> property = item.getItemProperty(PROPERTY_XACMLID);
+ if (property != null && property.getValue().toString().equals(this.defaultFunctionID)) {
+ this.tableFunctions.select(id);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ protected void initializeButtons() {
+ this.buttonSave.addClickListener(new ClickListener() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ self.doSave();
+ }
+ });
+ }
+
+ protected void doSave() {
+ try {
+ //
+ // Commit changes
+ //
+ self.tableFunctions.commit();
+ //
+ // We are saved
+ //
+ self.isSaved = true;
+ //
+ // Close the window
+ //
+ self.close();
+ } catch (SourceException | InvalidValueException e) { //NOPMD
+ //
+ // Nothing to do, Vaadin highlights
+ //
+ }
+ }
+
+ public boolean isSaved() {
+ return this.isSaved;
+ }
+
+ public String getSelectedFunction() {
+ return this.selectedFunction;
+ }
+
+ @AutoGenerated
+ private VerticalLayout buildMainLayout() {
+ // common part: create layout
+ mainLayout = new VerticalLayout();
+ mainLayout.setImmediate(false);
+ mainLayout.setWidth("-1px");
+ mainLayout.setHeight("-1px");
+ mainLayout.setMargin(true);
+ mainLayout.setSpacing(true);
+
+ // top-level component properties
+ setWidth("-1px");
+ setHeight("-1px");
+
+ // textFieldFilter
+ textFieldFilter = new TextField();
+ textFieldFilter.setCaption("Filter");
+ textFieldFilter.setImmediate(false);
+ textFieldFilter.setWidth("-1px");
+ textFieldFilter.setHeight("-1px");
+ mainLayout.addComponent(textFieldFilter);
+
+ // tableFunctions
+ tableFunctions = new Table();
+ tableFunctions.setImmediate(false);
+ tableFunctions.setDescription("Functions To Select From");
+ tableFunctions.setWidth("100.0%");
+ tableFunctions.setHeight("-1px");
+ mainLayout.addComponent(tableFunctions);
+ mainLayout.setExpandRatio(tableFunctions, 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;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/648d0c0d/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitConflictResolver.java
----------------------------------------------------------------------
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitConflictResolver.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitConflictResolver.java
new file mode 100644
index 0000000..cd75c07
--- /dev/null
+++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitConflictResolver.java
@@ -0,0 +1,67 @@
+/*
+ * 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 com.vaadin.annotations.AutoGenerated;
+import com.vaadin.ui.CustomComponent;
+import com.vaadin.ui.VerticalLayout;
+
+public class GitConflictResolver extends CustomComponent {
+
+ /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
+
+ @AutoGenerated
+ private VerticalLayout mainLayout;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ * 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 GitConflictResolver() {
+ buildMainLayout();
+ setCompositionRoot(mainLayout);
+
+ // TODO add user code here
+ }
+
+ @AutoGenerated
+ private VerticalLayout buildMainLayout() {
+ // common part: create layout
+ mainLayout = new VerticalLayout();
+ mainLayout.setImmediate(false);
+ mainLayout.setWidth("-1px");
+ mainLayout.setHeight("-1px");
+ mainLayout.setMargin(false);
+
+ // top-level component properties
+ setWidth("-1px");
+ setHeight("-1px");
+
+ return mainLayout;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/648d0c0d/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitPushWindow.java
----------------------------------------------------------------------
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitPushWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitPushWindow.java
new file mode 100644
index 0000000..492d8b9
--- /dev/null
+++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitPushWindow.java
@@ -0,0 +1,356 @@
+/*
+ * 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.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.Status;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.dircache.DirCache;
+import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.errors.NoWorkTreeException;
+
+import org.apache.openaz.xacml.admin.XacmlAdminUI;
+import org.apache.openaz.xacml.admin.model.GitStatusContainer;
+import org.apache.openaz.xacml.admin.model.GitStatusContainer.GitEntry;
+import org.apache.openaz.xacml.admin.model.GitStatusContainer.StatusItem;
+import org.apache.openaz.xacml.admin.util.AdminNotification;
+import com.vaadin.annotations.AutoGenerated;
+import com.vaadin.data.Buffered.SourceException;
+import com.vaadin.data.Item;
+import com.vaadin.data.Validator.InvalidValueException;
+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.Table.ColumnGenerator;
+import com.vaadin.ui.TextArea;
+import com.vaadin.ui.VerticalLayout;
+import com.vaadin.ui.Window;
+
+public class GitPushWindow extends Window {
+
+ /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
+
+ @AutoGenerated
+ private VerticalLayout mainLayout;
+ @AutoGenerated
+ private Button buttonPush;
+ @AutoGenerated
+ private Table tableChanges;
+ @AutoGenerated
+ private TextArea textAreaComments;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private static final Log logger = LogFactory.getLog(GitPushWindow.class);
+ private final GitPushWindow self = this;
+ private final GitStatusContainer container;
+ private final Git git;
+ private final File target;
+ private boolean isSaved = false;
+ /**
+ * The constructor should first build the main layout, set the
+ * composition root and then do any custom initialization.
+ *
+ * The constructor will not be automatically regenerated by the
+ * visual editor.
+ * @param git
+ * @param status
+ */
+ public GitPushWindow(Git git, File target, Status status) {
+ buildMainLayout();
+ //setCompositionRoot(mainLayout);
+ setContent(mainLayout);
+ //
+ // Save data
+ //
+ this.git = git;
+ this.target = target;
+ this.container = new GitStatusContainer(status);
+ //
+ // Set our shortcuts
+ //
+ this.setCloseShortcut(KeyCode.ESCAPE);
+ //
+ // Initialize GUI
+ //
+ this.initializeText();
+ this.initializeTable(status);
+ this.initializeButtons();
+ //
+ // Focus
+ //
+ this.textAreaComments.focus();
+ }
+
+ protected void initializeText() {
+ this.textAreaComments.setImmediate(true);
+ this.textAreaComments.addTextChangeListener(new TextChangeListener() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void textChange(TextChangeEvent event) {
+ if (event.getText().isEmpty()) {
+ self.buttonPush.setEnabled(false);
+ } else {
+ if (self.container.getConflictCount() == 0) {
+ self.buttonPush.setEnabled(true);
+ } else {
+ self.buttonPush.setEnabled(false);
+ }
+ }
+ }
+ });
+ }
+
+ protected void initializeTable(Status status) {
+ //
+ // Setup the table
+ //
+ this.tableChanges.setContainerDataSource(this.container);
+ this.tableChanges.setPageLength(this.container.size());
+ this.tableChanges.setImmediate(true);
+ //
+ // Generate column
+ //
+ this.tableChanges.addGeneratedColumn("Entry", new ColumnGenerator() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public Object generateCell(Table source, Object itemId, Object columnId) {
+ Item item = self.container.getItem(itemId);
+ assert item != null;
+ if (item instanceof StatusItem) {
+ return self.generateGitEntryComponent(((StatusItem) item).getGitEntry());
+ }
+ assert item instanceof StatusItem;
+ return null;
+ }
+ });
+ }
+
+ protected Object generateGitEntryComponent(final GitEntry entry) {
+ //
+ // If its conflicting, take care of it
+ //
+ if (entry.isConflicting()) {
+ return this.generateConflictingEntry(entry);
+ }
+ if (entry.isUntracked()) {
+ return this.generateUntrackedEntry(entry);
+ }
+ /*
+ if (entry.isChanged() ||
+ entry.isModified() ||
+ entry.isUncommitted()) {
+ return this.generateUncommittedEntry(entry);
+ }
+ */
+ return null;
+ }
+
+ protected Object generateConflictingEntry(final GitEntry entry) {
+ Button resolve = new Button("Resolve");
+ resolve.setImmediate(true);
+ resolve.addClickListener(new ClickListener() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+
+ }
+ });
+ return resolve;
+ }
+
+ protected Object generateUntrackedEntry(final GitEntry entry) {
+ Button add = new Button("Add");
+ add.setImmediate(true);
+ add.addClickListener(new ClickListener() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ try {
+ DirCache cache = self.git.add().addFilepattern(entry.getName()).call();
+ DirCacheEntry cacheEntry = cache.getEntry(entry.getName());
+ assert cacheEntry != null;
+ if (cacheEntry == null) {
+ return;
+ }
+ if (cacheEntry.isMerged()) {
+ self.refreshStatus();
+ }
+ } catch (GitAPIException e) {
+ String error = "Failed to add: " + e.getLocalizedMessage();
+ logger.error(error);
+ AdminNotification.error(error);
+ }
+ }
+ });
+ return add;
+ }
+
+ protected Object generateUncommittedEntry(final GitEntry entry) {
+ Button commit = new Button("Commit");
+ commit.setImmediate(true);
+ commit.addClickListener(new ClickListener() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ }
+ });
+ return commit;
+ }
+
+ protected void initializeButtons() {
+ this.buttonPush.setEnabled(false);
+ this.buttonPush.addClickListener(new ClickListener() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ try {
+ //
+ // Commit
+ //
+ self.textAreaComments.commit();
+ //
+ // Mark as saved
+ //
+ self.isSaved = true;
+ //
+ // Close the window
+ //
+ self.close();
+ } catch(SourceException | InvalidValueException idontcare) { //NOPMD
+ //
+ // Vaadin will highlight the failed requirement or validation
+ //
+ }
+ }
+ });
+ }
+
+ protected void refreshStatus() {
+ try {
+ //
+ // Grab our working repository
+ //
+ Path repoPath = ((XacmlAdminUI)getUI()).getUserGitPath();
+ final Git git = Git.open(repoPath.toFile());
+ //
+ // Get our status
+ //
+ final String base;
+ Status status;
+ if (target == null) {
+ base = ".";
+ } else {
+ Path relativePath = repoPath.relativize(Paths.get(target.getPath()));
+ base = relativePath.toString();
+ }
+ if (logger.isDebugEnabled()) {
+ logger.debug("Status on base: " + base);
+ }
+ status = git.status().addPath(base).call();
+ //
+ // Pass it to our container
+ //
+ this.container.refreshStatus(status);
+ this.tableChanges.refreshRowCache();
+ } catch (NoWorkTreeException | IOException | GitAPIException e) {
+ String error = "Failed to refresh status: " + e.getLocalizedMessage();
+ logger.error(error);
+ }
+ }
+
+ public boolean isSaved() {
+ return this.isSaved;
+ }
+
+ public String getComment() {
+ return this.textAreaComments.getValue();
+ }
+
+ @AutoGenerated
+ private VerticalLayout buildMainLayout() {
+ // common part: create layout
+ mainLayout = new VerticalLayout();
+ mainLayout.setImmediate(false);
+ mainLayout.setWidth("-1px");
+ mainLayout.setHeight("-1px");
+ mainLayout.setMargin(true);
+ mainLayout.setSpacing(true);
+
+ // top-level component properties
+ setWidth("-1px");
+ setHeight("-1px");
+
+ // textAreaComments
+ textAreaComments = new TextArea();
+ textAreaComments.setCaption("Add Comments");
+ textAreaComments.setImmediate(false);
+ textAreaComments
+ .setDescription("Enter comments that reflect the changes you have made to the repository domains and/or policy files.");
+ textAreaComments.setWidth("400px");
+ textAreaComments.setHeight("-1px");
+ textAreaComments.setInvalidAllowed(false);
+ textAreaComments.setRequired(true);
+ textAreaComments
+ .setInputPrompt("Eg. Add new rule for employees in marketing department.");
+ mainLayout.addComponent(textAreaComments);
+
+ // tableChanges
+ tableChanges = new Table();
+ tableChanges.setCaption("Changes To Be Pushed");
+ tableChanges.setImmediate(false);
+ tableChanges.setWidth("100.0%");
+ tableChanges.setHeight("-1px");
+ mainLayout.addComponent(tableChanges);
+ mainLayout.setExpandRatio(tableChanges, 1.0f);
+
+ // buttonPush
+ buttonPush = new Button();
+ buttonPush.setCaption("Push Changes");
+ buttonPush.setImmediate(true);
+ buttonPush.setWidth("-1px");
+ buttonPush.setHeight("-1px");
+ mainLayout.addComponent(buttonPush);
+ mainLayout.setComponentAlignment(buttonPush, new Alignment(48));
+
+ return mainLayout;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/648d0c0d/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitSynchronizeWindow.java
----------------------------------------------------------------------
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitSynchronizeWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitSynchronizeWindow.java
new file mode 100644
index 0000000..da2edf7
--- /dev/null
+++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitSynchronizeWindow.java
@@ -0,0 +1,158 @@
+/*
+ * 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.io.IOException;
+import java.nio.file.Path;
+
+import org.eclipse.jgit.api.Git;
+// import org.eclipse.jgit.api.MergeResult;
+import org.eclipse.jgit.api.PullResult;
+// import org.eclipse.jgit.api.RebaseResult;
+import org.eclipse.jgit.api.errors.GitAPIException;
+// import org.eclipse.jgit.transport.FetchResult;
+
+import org.apache.openaz.xacml.admin.XacmlAdminUI;
+import com.vaadin.annotations.AutoGenerated;
+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.TextArea;
+import com.vaadin.ui.VerticalLayout;
+import com.vaadin.ui.Window;
+
+public class GitSynchronizeWindow extends Window {
+
+ /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
+
+ @AutoGenerated
+ private VerticalLayout mainLayout;
+ @AutoGenerated
+ private Button buttonSynchronize;
+ @AutoGenerated
+ private TextArea textAreaResults;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private final GitSynchronizeWindow self = this;
+ /**
+ * 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 GitSynchronizeWindow() {
+ buildMainLayout();
+ //setCompositionRoot(mainLayout);
+ setContent(mainLayout);
+ //
+ // Set our shortcuts
+ //
+ this.setCloseShortcut(KeyCode.ESCAPE);
+ //
+ //
+ //
+ this.initializeButtons();
+ }
+
+ protected void initializeButtons() {
+ this.buttonSynchronize.addClickListener(new ClickListener() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ if (self.buttonSynchronize.getCaption().equals("Synchronize")) {
+ self.synchronize();
+ } else {
+ self.close();
+ }
+ }
+ });
+ }
+
+ protected void synchronize() {
+ //
+ // Grab our working repository
+ //
+ Path repoPath = ((XacmlAdminUI)getUI()).getUserGitPath();
+ try {
+ final Git git = Git.open(repoPath.toFile());
+
+ PullResult result = git.pull().call();
+ // FetchResult fetch = result.getFetchResult();
+ // MergeResult merge = result.getMergeResult();
+ // RebaseResult rebase = result.getRebaseResult();
+ if (result.isSuccessful()) {
+ //
+ // TODO add more notification
+ //
+ this.textAreaResults.setValue("Successful!");
+ } else {
+ //
+ // TODO
+ //
+ this.textAreaResults.setValue("Failed.");
+ }
+ } catch (IOException | GitAPIException e) {
+ e.printStackTrace();
+ }
+ this.buttonSynchronize.setCaption("Ok");
+ }
+
+ @AutoGenerated
+ private VerticalLayout buildMainLayout() {
+ // common part: create layout
+ mainLayout = new VerticalLayout();
+ mainLayout.setImmediate(false);
+ mainLayout.setWidth("-1px");
+ mainLayout.setHeight("-1px");
+ mainLayout.setMargin(true);
+ mainLayout.setSpacing(true);
+
+ // top-level component properties
+ setWidth("-1px");
+ setHeight("-1px");
+
+ // textAreaResults
+ textAreaResults = new TextArea();
+ textAreaResults.setCaption("Synch Results");
+ textAreaResults.setImmediate(false);
+ textAreaResults.setWidth("462px");
+ textAreaResults.setHeight("222px");
+ mainLayout.addComponent(textAreaResults);
+
+ // buttonSynchronize
+ buttonSynchronize = new Button();
+ buttonSynchronize.setCaption("Synchronize");
+ buttonSynchronize.setImmediate(true);
+ buttonSynchronize.setWidth("-1px");
+ buttonSynchronize.setHeight("-1px");
+ mainLayout.addComponent(buttonSynchronize);
+ mainLayout.setComponentAlignment(buttonSynchronize, new Alignment(24));
+
+ return mainLayout;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/648d0c0d/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/MatchEditorWindow.java
----------------------------------------------------------------------
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/MatchEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/MatchEditorWindow.java
new file mode 100644
index 0000000..eafb7e0
--- /dev/null
+++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/MatchEditorWindow.java
@@ -0,0 +1,304 @@
+/*
+ * 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 oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.openaz.xacml.admin.XacmlAdminUI;
+import org.apache.openaz.xacml.admin.jpa.Attribute;
+import org.apache.openaz.xacml.admin.jpa.Datatype;
+import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventListener;
+import com.vaadin.annotations.AutoGenerated;
+import com.vaadin.data.Buffered.SourceException;
+import com.vaadin.data.Item;
+import com.vaadin.data.Property;
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.data.Validator.InvalidValueException;
+import com.vaadin.data.util.filter.Compare;
+import com.vaadin.data.util.sqlcontainer.SQLContainer;
+import com.vaadin.event.ItemClickEvent;
+import com.vaadin.event.ItemClickEvent.ItemClickListener;
+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.UI;
+import com.vaadin.ui.VerticalLayout;
+import com.vaadin.ui.Window;
+
+public class MatchEditorWindow extends Window implements AttributeChangedEventListener {
+
+ /*- 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 tableFunctions;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private static Log logger = LogFactory.getLog(MatchEditorWindow.class);
+ private final MatchEditorWindow self = this;
+ private final MatchType match;
+ private final Datatype datatype;
+ private boolean isSaved = false;
+ private static SQLContainer matchFunctions = ((XacmlAdminUI) UI.getCurrent()).getMatchFunctionContainer();
+
+ private static String PROPERTY_SHORTNAME = "shortname";
+ private static String PROPERTY_XACMLID = "xacmlid";
+ private static String PROPERTY_ARG2_DATATYPE = "arg2_datatype";
+
+ static {
+ //
+ // H2 seems to insist on capitalizing, even with the no uppercase switch.
+ //
+ for (Object prop : MatchEditorWindow.matchFunctions.getContainerPropertyIds()) {
+ logger.info("SQL Container Property Id: " + prop.toString());
+ if (prop.toString().equalsIgnoreCase(PROPERTY_SHORTNAME)) {
+ PROPERTY_SHORTNAME = prop.toString();
+ } else if (prop.toString().equalsIgnoreCase(PROPERTY_XACMLID)) {
+ PROPERTY_XACMLID = prop.toString();
+ } else if (prop.toString().equalsIgnoreCase(PROPERTY_ARG2_DATATYPE)) {
+ PROPERTY_ARG2_DATATYPE = prop.toString();
+ }
+ }
+
+ }
+
+ /**
+ * 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 MatchEditorWindow(MatchType match, Datatype datatype) {
+ buildMainLayout();
+ //setCompositionRoot(mainLayout);
+ setContent(mainLayout);
+ //
+ // Save our data
+ //
+ this.match = match;
+ this.datatype = datatype;
+ //
+ // Close shortcut
+ //
+ this.setCloseShortcut(KeyCode.ESCAPE);
+ //
+ // Initialize GUI
+ //
+ this.initializeFunctions();
+ this.initializeButtons();
+ //
+ // Set our focus
+ //
+ this.tableFunctions.focus();
+ }
+
+ protected void initializeFunctions() {
+ //
+ // Setup datasource and GUI properties
+ //
+ this.tableFunctions.setContainerDataSource(MatchEditorWindow.matchFunctions);
+ this.tableFunctions.setImmediate(true);
+ this.tableFunctions.setNullSelectionAllowed(false);
+ this.tableFunctions.setRequired(true);
+ this.tableFunctions.setRequiredError("Please select a function.");
+ this.tableFunctions.setSelectable(true);
+ this.tableFunctions.setPageLength(15);
+ this.tableFunctions.setVisibleColumns(PROPERTY_SHORTNAME, PROPERTY_XACMLID);
+ this.tableFunctions.setColumnHeaders(new String[] {"Short Function Name", "Xacml ID"});
+ //
+ // Filter out functions where ARG2 is the given datatype. NOTE: The
+ // AttributeDesignator/AttributeSelector is the 2nd argument.
+ //
+ MatchEditorWindow.matchFunctions.removeAllContainerFilters();
+ MatchEditorWindow.matchFunctions.addContainerFilter(new Compare.Equal(PROPERTY_ARG2_DATATYPE, this.datatype.getId()));
+ //
+ // Respond to selection events
+ //
+ this.tableFunctions.addValueChangeListener(new ValueChangeListener() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void valueChange(ValueChangeEvent event) {
+ Object id = self.tableFunctions.getValue();
+ if (id != null) {
+ Item item = MatchEditorWindow.matchFunctions.getItem(id);
+ if (item == null) {
+ return;
+ }
+ Property<?> property = item.getItemProperty(PROPERTY_XACMLID);
+ if (property == null) {
+ return;
+ }
+ self.match.setMatchId(property.getValue().toString());
+ self.buttonSave.setEnabled(true);
+ } else {
+ self.buttonSave.setEnabled(false);
+ }
+ }
+ });
+ //
+ // Respond to double-click events
+ //
+ this.tableFunctions.addItemClickListener(new ItemClickListener() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void itemClick(ItemClickEvent event) {
+ if (event.isDoubleClick()) {
+ self.doSave();
+ }
+ }
+ });
+ //
+ // Default selection
+ //
+ this.buttonSave.setEnabled(false);
+ if (this.match.getMatchId() != null) {
+ for (Object id : MatchEditorWindow.matchFunctions.getItemIds()) {
+ Item item = MatchEditorWindow.matchFunctions.getItem(id);
+ if (item != null) {
+ Property<?> property = item.getItemProperty(PROPERTY_XACMLID);
+ if (property != null && property.getValue().toString().equals(this.match.getMatchId())) {
+ this.tableFunctions.select(id);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ protected void initializeButtons() {
+ this.buttonSave.addClickListener(new ClickListener() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ self.doSave();
+ }
+ });
+ }
+
+ protected void doSave() {
+ try {
+ //
+ // Commit changes
+ //
+ self.tableFunctions.commit();
+ //
+ // We are saved
+ //
+ self.isSaved = true;
+ //
+ // Close the window
+ //
+ self.close();
+ } catch (SourceException | InvalidValueException e) {
+ return;
+ }
+ }
+
+ @Override
+ public void attributeChanged(Attribute attribute) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("attributeChanged: " + attribute);
+ }
+ //
+ // Remove all filters.
+ //
+ MatchEditorWindow.matchFunctions.removeAllContainerFilters();
+ if (attribute == null) {
+ return;
+ }
+ //
+ // Get the datatype for the attribute
+ //
+ Datatype datatype = attribute.getDatatypeBean();
+ if (logger.isDebugEnabled()) {
+ logger.debug("datatype: " + datatype.getId());
+ }
+ //
+ // Filter out functions where ARG2 is the datatype. The
+ // AttributeDesignator/AttributeSelector is the 2nd arg.
+ //
+ MatchEditorWindow.matchFunctions.addContainerFilter(new Compare.Equal(PROPERTY_ARG2_DATATYPE, datatype.getId()));
+ }
+
+ public boolean isSaved() {
+ return this.isSaved;
+ }
+
+ public MatchType getMatch() {
+ return this.match;
+ }
+
+ @AutoGenerated
+ private VerticalLayout buildMainLayout() {
+ // common part: create layout
+ mainLayout = new VerticalLayout();
+ mainLayout.setImmediate(false);
+ mainLayout.setWidth("-1px");
+ mainLayout.setHeight("-1px");
+ mainLayout.setMargin(true);
+ mainLayout.setSpacing(true);
+
+ // top-level component properties
+ setWidth("-1px");
+ setHeight("-1px");
+
+ // tableFunctions
+ tableFunctions = new Table();
+ tableFunctions.setCaption("Function");
+ tableFunctions.setImmediate(true);
+ tableFunctions
+ .setDescription("Select a function for matching the attribute.");
+ tableFunctions.setWidth("100.0%");
+ tableFunctions.setHeight("-1px");
+ tableFunctions.setInvalidAllowed(false);
+ tableFunctions.setRequired(true);
+ mainLayout.addComponent(tableFunctions);
+ mainLayout.setExpandRatio(tableFunctions, 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;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/648d0c0d/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObadviceEditorWindow.java
----------------------------------------------------------------------
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObadviceEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObadviceEditorWindow.java
new file mode 100644
index 0000000..960a2b7
--- /dev/null
+++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObadviceEditorWindow.java
@@ -0,0 +1,184 @@
+/*
+ * 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 org.apache.openaz.xacml.admin.jpa.Obadvice;
+import org.apache.openaz.xacml.admin.view.fields.OaExpressionsField;
+import com.vaadin.addon.jpacontainer.EntityItem;
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.data.fieldgroup.FieldGroup;
+import com.vaadin.data.fieldgroup.FieldGroup.CommitException;
+import com.vaadin.data.fieldgroup.PropertyId;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.FormLayout;
+import com.vaadin.ui.OptionGroup;
+import com.vaadin.ui.TextArea;
+import com.vaadin.ui.TextField;
+import com.vaadin.ui.Window;
+
+public class ObadviceEditorWindow extends Window {
+
+ /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
+
+ private static final long serialVersionUID = 1L;
+ private ObadviceEditorWindow self = this;
+
+ private FormLayout mainLayout = new FormLayout();
+
+ @PropertyId("type")
+ OptionGroup typeOption = new OptionGroup("Type");
+
+ @PropertyId("xacmlId")
+ TextField xacmlID = new TextField("Obligation Id");
+
+ @PropertyId("description")
+ TextArea descriptionField = new TextArea("Description");
+
+ @PropertyId("fulfillOn")
+ OptionGroup fulfillOption = new OptionGroup("Fullfill On");
+
+ @PropertyId("obadviceExpressions")
+ OaExpressionsField expressionsField;
+ //Table tableExpressions = new Table("Attribute Assignments");
+
+ Button saveButton = new Button("Save");
+
+ private FieldGroup fieldGroup = null;
+ private final EntityItem<Obadvice> obad;
+ private boolean isSaved = false;
+
+ /**
+ * The constructor should first build the main layout, set the
+ * composition root and then do any custom initialization.
+ *
+ * The constructor will not be automatically regenerated by the
+ * visual editor.
+ * @param caption
+ */
+ public ObadviceEditorWindow(EntityItem<Obadvice> obad) {
+ this.setContent(mainLayout);
+ //
+ // Save
+ //
+ this.obad = obad;
+ //
+ // Initialize main layout
+ //
+ this.mainLayout.setMargin(true);
+ this.mainLayout.setWidth("-1px");
+ //
+ // Initialize components
+ //
+ this.typeOption.setNullSelectionAllowed(false);
+ this.typeOption.setImmediate(true);
+ this.typeOption.setDescription("Select whether this is an obligation or advice");
+ this.typeOption.addItem("Obligation");
+ this.typeOption.addItem("Advice");
+
+ this.fulfillOption.setNullSelectionAllowed(true);
+ this.fulfillOption.setDescription("Optionally restrict the use of the obligation/advice to a Permit or a Deny");
+ this.fulfillOption.addItem("Permit");
+ this.fulfillOption.addItem("Deny");
+
+ this.descriptionField.setNullRepresentation("");
+
+ this.expressionsField = new OaExpressionsField(this.obad);
+ //
+ // Add our form components
+ //
+ this.mainLayout.addComponent(this.typeOption);
+ this.mainLayout.addComponent(this.fulfillOption);
+ this.mainLayout.addComponent(this.xacmlID);
+ this.mainLayout.addComponent(this.descriptionField);
+ this.mainLayout.addComponent(this.expressionsField);
+// this.mainLayout.addComponent(this.tableExpressions);
+ this.mainLayout.addComponent(this.saveButton);
+ //
+ // Now bind those fields to the data
+ //
+ this.fieldGroup = new FieldGroup(obad);
+ this.fieldGroup.bindMemberFields(this);
+ //
+ // Finish setting up
+ //
+ this.initializeButtons();
+ this.initializeOptions();
+ //
+ // Set focus
+ //
+ this.xacmlID.focus();
+ }
+
+ private void initializeButtons() {
+ this.saveButton.addClickListener(new ClickListener() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ try {
+ fieldGroup.commit();
+ self.isSaved = true;
+ self.close();
+ } catch (CommitException e) {
+ e.printStackTrace();
+ }
+ }
+
+ });
+ }
+
+ private void initializeOptions() {
+ self.setIDCaption();
+ this.typeOption.addValueChangeListener(new ValueChangeListener() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void valueChange(ValueChangeEvent event) {
+ self.setIDCaption();
+ }
+
+ });
+ }
+
+ private void setIDCaption() {
+ String value = (String) self.typeOption.getValue();
+ if (value.equals("Obligation")) {
+ self.xacmlID.setCaption("Obligation Id");
+ } else {
+ self.xacmlID.setCaption("Advice Id");
+ }
+ }
+
+ public boolean isSaved() {
+ return this.isSaved;
+ }
+
+ public void discard() {
+ //
+ // May be discarded automatically??
+ //
+ this.fieldGroup.discard();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/648d0c0d/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationAdviceEditorWindow.java
----------------------------------------------------------------------
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationAdviceEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationAdviceEditorWindow.java
new file mode 100644
index 0000000..21c2d45
--- /dev/null
+++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationAdviceEditorWindow.java
@@ -0,0 +1,817 @@
+/*
+ * 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;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/648d0c0d/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationEditorWindow.java
----------------------------------------------------------------------
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationEditorWindow.java
new file mode 100644
index 0000000..dac4eda
--- /dev/null
+++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationEditorWindow.java
@@ -0,0 +1,208 @@
+/*
+ * 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 oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionType;
+
+import org.apache.openaz.xacml.admin.XacmlAdminUI;
+import com.vaadin.annotations.AutoGenerated;
+import com.vaadin.data.Buffered.SourceException;
+import com.vaadin.data.Validator.InvalidValueException;
+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.OptionGroup;
+import com.vaadin.ui.TextField;
+import com.vaadin.ui.VerticalLayout;
+import com.vaadin.ui.Window;
+
+public class ObligationEditorWindow 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 OptionGroup optionGroupFullfillOn;
+ @AutoGenerated
+ private TextField textFieldObligationID;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private final ObligationEditorWindow self = this;
+ private final ObligationExpressionType obligation;
+ private boolean isSaved = false;
+ /**
+ * The constructor should first build the main layout, set the
+ * composition root and then do any custom initialization.
+ *
+ * The constructor will not be automatically regenerated by the
+ * visual editor.
+ */
+ public ObligationEditorWindow(ObligationExpressionType obligation) {
+ buildMainLayout();
+ //setCompositionRoot(mainLayout);
+ setContent(mainLayout);
+ //
+ // Save
+ //
+ this.obligation = obligation;
+ //
+ // Set our shortcuts
+ //
+ this.setCloseShortcut(KeyCode.ESCAPE);
+ //
+ // Initialize GUI
+ //
+ this.initialize();
+ this.initializeButton();
+ //
+ // Focus
+ //
+ this.textFieldObligationID.focus();
+ }
+
+ protected void initialize() {
+ //
+ // The text field for the advice ID
+ //
+ this.textFieldObligationID.setNullRepresentation("");
+ if (this.obligation.getObligationId() == null) {
+ this.textFieldObligationID.setValue(XacmlAdminUI.getDomain());
+ } else {
+ this.textFieldObligationID.setValue(obligation.getObligationId());
+ }
+ this.textFieldObligationID.setRequiredError("You must have an ID for the obligation");
+ //
+ // The option
+ //
+ this.optionGroupFullfillOn.setRequiredError("You must select Permit or Deny for the obligation");
+ this.optionGroupFullfillOn.addItem(EffectType.PERMIT);
+ this.optionGroupFullfillOn.addItem(EffectType.DENY);
+ if (this.obligation.getFulfillOn() == null) {
+ this.optionGroupFullfillOn.select(EffectType.PERMIT);
+ } else {
+ if (this.obligation.getFulfillOn().equals(EffectType.PERMIT)) {
+ this.optionGroupFullfillOn.select(EffectType.PERMIT);
+ } else {
+ this.optionGroupFullfillOn.select(EffectType.DENY);
+ }
+ }
+ }
+
+ protected void initializeButton() {
+ this.buttonSave.setImmediate(true);
+ this.buttonSave.setClickShortcut(KeyCode.ENTER);
+ this.buttonSave.addClickListener(new ClickListener() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ try {
+ //
+ // Commit
+ //
+ self.textFieldObligationID.commit();
+ self.optionGroupFullfillOn.commit();
+ //
+ // all good, save everything
+ //
+ self.obligation.setObligationId(self.textFieldObligationID.getValue());
+ self.obligation.setFulfillOn((EffectType) self.optionGroupFullfillOn.getValue());
+ //
+ // Set ourselves as saved
+ //
+ self.isSaved = true;
+ //
+ // Close the window
+ //
+ self.close();
+ } catch (SourceException | InvalidValueException e) { //NOPMD
+ //
+ // Vaadin displays the error
+ //
+ }
+ }
+ });
+ }
+
+ public boolean isSaved() {
+ return this.isSaved;
+ }
+
+ public ObligationExpressionType getAdvice() {
+ return this.obligation;
+ }
+
+ @AutoGenerated
+ private VerticalLayout buildMainLayout() {
+ // common part: create layout
+ mainLayout = new VerticalLayout();
+ mainLayout.setImmediate(false);
+ mainLayout.setWidth("-1px");
+ mainLayout.setHeight("-1px");
+ mainLayout.setMargin(true);
+ mainLayout.setSpacing(true);
+
+ // top-level component properties
+ setWidth("-1px");
+ setHeight("-1px");
+
+ // textFieldObligationID
+ textFieldObligationID = new TextField();
+ textFieldObligationID.setCaption("Obligation ID");
+ textFieldObligationID.setImmediate(false);
+ textFieldObligationID.setWidth("-1px");
+ textFieldObligationID.setHeight("-1px");
+ textFieldObligationID.setInvalidAllowed(false);
+ textFieldObligationID.setRequired(true);
+ textFieldObligationID.setInputPrompt("Eg. urn:com:foo:obligation:sample");
+ mainLayout.addComponent(textFieldObligationID);
+
+ // optionGroupFullfillOn
+ optionGroupFullfillOn = new OptionGroup();
+ optionGroupFullfillOn.setCaption("Fulfill On");
+ optionGroupFullfillOn.setImmediate(false);
+ optionGroupFullfillOn.setWidth("-1px");
+ optionGroupFullfillOn.setHeight("-1px");
+ optionGroupFullfillOn.setInvalidAllowed(false);
+ optionGroupFullfillOn.setRequired(true);
+ mainLayout.addComponent(optionGroupFullfillOn);
+
+ // 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;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-openaz/blob/648d0c0d/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PDPStatusWindow.java
----------------------------------------------------------------------
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PDPStatusWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PDPStatusWindow.java
new file mode 100644
index 0000000..de279a3
--- /dev/null
+++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PDPStatusWindow.java
@@ -0,0 +1,264 @@
+/*
+ * 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 org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.openaz.xacml.api.pap.PDPPIPConfig;
+import org.apache.openaz.xacml.api.pap.PDPPolicy;
+import org.apache.openaz.xacml.api.pap.PDPStatus;
+import com.vaadin.annotations.AutoGenerated;
+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.Label;
+import com.vaadin.ui.Table;
+import com.vaadin.ui.TextArea;
+import com.vaadin.ui.VerticalLayout;
+import com.vaadin.ui.Window;
+
+public class PDPStatusWindow extends Window {
+
+ /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
+
+ @AutoGenerated
+ private VerticalLayout mainLayout;
+
+
+ @AutoGenerated
+ private Button buttonOK;
+
+
+ @AutoGenerated
+ private Table table;
+
+
+ private PDPStatus status;
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private static final Log logger = LogFactory.getLog(PDPStatusWindow.class);
+ private final PDPStatusWindow self = this;
+
+ /**
+ * 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 PDPStatusWindow(PDPStatus status) {
+ buildMainLayout();
+ setContent(mainLayout);
+ //setCompositionRoot(mainLayout);
+ //
+ // Save
+ //
+ this.status = status;
+ //
+ // Setup shortcuts
+ //
+ this.setCloseShortcut(KeyCode.ESCAPE);
+ this.buttonOK.setClickShortcut(KeyCode.ENTER);
+ //
+ // Initialize
+ //
+ try {
+ this.initialize();
+ this.initializeButton();
+ } catch (Exception e) {
+ logger.error("Initialize exception: " + e);
+ }
+ //
+ // Focus
+ //
+ this.buttonOK.focus();
+ }
+
+ protected void initialize() {
+ //
+ // Setup the table - real simple
+ //
+ this.table.addContainerProperty("Property", Label.class, null);
+ this.table.addContainerProperty("Value", TextArea.class, null);
+ //
+ // Set the status
+ //
+ StringBuilder builder;
+ int rows;
+ Integer id = 1;
+ this.table.addItem(new Object[] {new Label("Status"), this.createTextArea(this.status.getStatus().toString(), 1)}, id++);
+ //
+ // Setup Errors
+ //
+ builder = new StringBuilder();
+ rows = 0;
+ for (String error : this.status.getLoadErrors()) {
+ builder.append(error);
+ builder.append(System.lineSeparator());
+ rows++;
+ }
+ if (rows == 0) {
+ rows = 1;
+ }
+ this.table.addItem(new Object[] {new Label("Errors"), this.createTextArea(builder.toString(), rows)}, id++);
+ //
+ // Setup Errors
+ //
+ builder = new StringBuilder();
+ rows = 0;
+ for (String error : this.status.getLoadWarnings()) {
+ builder.append(error);
+ builder.append(System.lineSeparator());
+ rows++;
+ }
+ if (rows == 0) {
+ rows = 1;
+ }
+ this.table.addItem(new Object[] {new Label("Warnings"), this.createTextArea(builder.toString(), rows)}, id++);
+ //
+ // Setup the loaded policy table
+ //
+ builder = new StringBuilder();
+ rows = 0;
+ for (PDPPolicy policy : this.status.getLoadedPolicies()) {
+ builder.append(policy.getName());
+ builder.append(System.lineSeparator());
+ rows++;
+ }
+ if (rows == 0) {
+ rows = 1;
+ }
+ this.table.addItem(new Object[] {new Label("Policies Loaded"), this.createTextArea(builder.toString(), rows)}, id++);
+ //
+ // Setup the Failed policy table
+ //
+ builder = new StringBuilder();
+ rows = 0;
+ for (PDPPolicy policy : this.status.getFailedPolicies()) {
+ builder.append(policy.getName());
+ builder.append(System.lineSeparator());
+ rows++;
+ }
+ if (rows == 0) {
+ rows = 1;
+ }
+ this.table.addItem(new Object[] {new Label("Policies Failed To Load"), this.createTextArea(builder.toString(), rows)}, id++);
+ //
+ // Setup the Loaded PIP configuration table
+ //
+ builder = new StringBuilder();
+ rows = 0;
+ for (PDPPIPConfig config : this.status.getLoadedPipConfigs()) {
+ builder.append(config.getName());
+ builder.append(System.lineSeparator());
+ rows++;
+ }
+ if (rows == 0) {
+ rows = 1;
+ }
+ this.table.addItem(new Object[] {new Label("Loaded PIP Configurations"), this.createTextArea(builder.toString(), rows)}, id++);
+ //
+ // Setup the Failed PIP configuration table
+ //
+ builder = new StringBuilder();
+ rows = 0;
+ for (PDPPIPConfig config : this.status.getFailedPipConfigs()) {
+ builder.append(config.getName());
+ builder.append(System.lineSeparator());
+ rows++;
+ }
+ if (rows == 0) {
+ rows = 1;
+ }
+ this.table.addItem(new Object[] {new Label("Failed PIP Configurations"), this.createTextArea(builder.toString(), rows)}, id++);
+ //
+ // Set the length
+ //
+ table.setPageLength(id - 1);
+ table.setReadOnly(true);
+ table.setSizeFull();
+ }
+
+ protected TextArea createTextArea(String value, int lines) {
+ TextArea area = new TextArea();
+ area.setValue(value);
+ area.setNullRepresentation("");
+ area.setSizeFull();
+ area.setReadOnly(true);
+ area.setRows(lines);
+ return area;
+ }
+
+ protected void initializeButton() {
+ this.buttonOK.addClickListener(new ClickListener() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ self.close();
+ }
+ });
+ }
+
+ @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");
+
+ // table
+ table = new Table();
+ table.setCaption("Status");
+ table.setImmediate(false);
+ table.setWidth("100.0%");
+ table.setHeight("-1px");
+ mainLayout.addComponent(table);
+
+ // buttonOK
+ buttonOK = new Button();
+ buttonOK.setCaption("Ok");
+ buttonOK.setImmediate(true);
+ buttonOK.setWidth("-1px");
+ buttonOK.setHeight("-1px");
+ mainLayout.addComponent(buttonOK);
+ mainLayout.setComponentAlignment(buttonOK, new Alignment(48));
+
+ return mainLayout;
+ }
+
+
+
+}