blob: 2fb4a25a637f0d342cb0d719579f33c611c0d114 [file] [log] [blame]
/*
* 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.Serializable;
import java.util.ArrayList;
import java.util.List;
import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.openaz.xacml.admin.jpa.Attribute;
import org.apache.openaz.xacml.admin.jpa.PIPResolver;
import org.apache.openaz.xacml.admin.jpa.PIPResolverParam;
import org.apache.openaz.xacml.admin.util.AdminNotification;
import org.apache.openaz.xacml.admin.util.XACMLConstants;
import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener;
import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier;
import org.apache.openaz.xacml.api.XACML3;
import org.apache.openaz.xacml.std.pip.engines.csv.ConfigurableCSVResolver;
import org.apache.openaz.xacml.std.pip.engines.jdbc.ConfigurableJDBCResolver;
import org.apache.openaz.xacml.std.pip.engines.ldap.ConfigurableLDAPResolver;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.vaadin.addon.jpacontainer.EntityItem;
import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Buffered.SourceException;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.Validator.InvalidValueException;
import com.vaadin.data.util.BeanItem;
import com.vaadin.data.util.BeanItemContainer;
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.ui.CheckBox;
import com.vaadin.ui.CustomComponent;
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.CloseEvent;
import com.vaadin.ui.Window.CloseListener;
public class PIPSQLResolverEditorWindow extends CustomComponent implements FormChangedEventNotifier, Handler {
@AutoGenerated
private VerticalLayout mainLayout;
@AutoGenerated
private Table tableAttributes;
@AutoGenerated
private Table tableRequiredAttributes;
@AutoGenerated
private CheckBox checkBoxShortIds;
@AutoGenerated
private TextField textFieldFilter;
@AutoGenerated
private TextField textFieldBase;
@AutoGenerated
private TextArea textAreaSelect;
private final Action ADD_ATTRIBUTE = new Action("Add Attribute");
private final Action EDIT_ATTRIBUTE = new Action("Edit Attribute");
private final Action CLONE_ATTRIBUTE = new Action("Clone Attribute");
private final Action REMOVE_ATTRIBUTE = new Action("Remove Attribute");
/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
/**
*
*/
protected class ResolverAttribute implements Serializable {
private static final long serialVersionUID = 1L;
String identifier = null;
String prefix = null;
PIPResolverParam id = null;
PIPResolverParam category = null;
PIPResolverParam datatype = null;
PIPResolverParam issuer = null;
PIPResolverParam column = null;
public ResolverAttribute(String prefix, String identifier) {
this.prefix = prefix;
this.identifier = identifier;
}
public ResolverAttribute(String prefix, String identifier, ResolverAttribute target) {
this(prefix, identifier);
this.setId(target.getId());
this.setCategory(target.getCategory());
this.setDatatype(target.getDatatype());
this.setIssuer(target.getIssuer());
this.setColumn(target.getColumn());
this.setResolver(target.id.getPipresolver());
}
public String getIdentifier() {
return this.identifier;
}
public String getId() {
if (this.id == null) {
return null;
}
return this.id.getParamValue();
}
public String getShortId() {
String id = this.getId();
if (id == null) {
return null;
}
return XACMLConstants.extractShortName(id);
}
public PIPResolverParam getIdParam() {
return this.id;
}
public void setId(String id) {
if (this.id == null) {
this.id = new PIPResolverParam();
this.id.setParamName(this.prefix + this.identifier + ".id");
}
this.id.setParamValue(id);
}
public void setId(PIPResolverParam param) {
this.id = param;
}
public String getCategory() {
if (this.category == null) {
return null;
}
return this.category.getParamValue();
}
public String getShortCategory() {
String category = this.getCategory();
if (category == null) {
return null;
}
return XACMLConstants.extractShortName(category);
}
public PIPResolverParam getCategoryParam() {
return this.category;
}
public void setCategory(String category) {
if (this.category == null) {
this.category = new PIPResolverParam();
this.category.setParamName(this.prefix + this.identifier + ".category");
}
this.category.setParamValue(category);
}
public void setCategory(PIPResolverParam param) {
this.category = param;
}
public String getDatatype() {
if (this.datatype == null) {
return null;
}
return this.datatype.getParamValue();
}
public String getShortDatatype() {
String dt = this.getDatatype();
if (dt == null) {
return null;
}
return XACMLConstants.extractShortName(dt);
}
public PIPResolverParam getDatatypeParam() {
return this.datatype;
}
public void setDatatype(String datatype) {
if (this.datatype == null) {
this.datatype = new PIPResolverParam();
this.datatype.setParamName(this.prefix + this.identifier + ".datatype");
}
this.datatype.setParamValue(datatype);
}
public void setDatatype(PIPResolverParam param) {
this.datatype = param;
}
public String getIssuer() {
if (this.issuer == null) {
return null;
}
return this.issuer.getParamValue();
}
public String getShortIssuer() {
String issuer = this.getIssuer();
if (issuer == null) {
return null;
}
return XACMLConstants.extractShortName(issuer);
}
public PIPResolverParam getIssuerParam() {
return this.issuer;
}
public void setIssuer(String issuer) {
if (this.issuer == null) {
this.issuer = new PIPResolverParam();
this.issuer.setParamName(this.prefix + this.identifier + ".issuer");
}
this.issuer.setParamValue(issuer);
}
public void setIssuer(PIPResolverParam param) {
this.issuer = param;
}
public Integer getColumn() {
if (this.column == null) {
return null;
}
try {
return Integer.parseInt(this.column.getParamValue());
} catch (NumberFormatException e) {
logger.error("Failed to set column: " + e);
return null;
}
}
public PIPResolverParam getColumnParam() {
return this.column;
}
public void setColumn(Integer col) {
if (this.column == null) {
this.column = new PIPResolverParam();
this.column.setParamName(this.prefix + this.identifier + "column");
}
this.column.setParamValue(col.toString());
}
public void setColumn(PIPResolverParam param) {
this.column = param;
}
public void setResolver(PIPResolver resolver) {
if (this.id != null) {
this.id.setPipresolver(resolver);
}
if (this.category != null) {
this.category.setPipresolver(resolver);
}
if (this.datatype != null) {
this.datatype.setPipresolver(resolver);
}
if (this.issuer != null) {
this.issuer.setPipresolver(resolver);
}
if (this.column != null) {
this.column.setPipresolver(resolver);
}
}
}
private static final long serialVersionUID = 1L;
private static final Log logger = LogFactory.getLog(PIPSQLResolverEditorWindow.class);
private final PIPSQLResolverEditorWindow self = this;
private final EntityItem<PIPResolver> entity;
private final BeanItemContainer<ResolverAttribute> fieldsContainer = new BeanItemContainer<ResolverAttribute>(ResolverAttribute.class);
private final BeanItemContainer<ResolverAttribute> parametersContainer = new BeanItemContainer<ResolverAttribute>(ResolverAttribute.class);
private final BasicNotifier notifier = new BasicNotifier();
boolean isSaved = false;
String fieldPrefix;
String parameterPrefix;
/**
* 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 PIPSQLResolverEditorWindow(EntityItem<PIPResolver> entity) {
buildMainLayout();
setCompositionRoot(mainLayout);
//
// Save
//
this.entity = entity;
//
// Initialize
//
this.initialize();
}
protected boolean isSQL() {
if (this.entity.getEntity().getPipconfiguration().getPiptype().isSQL() ||
this.entity.getEntity().getPipconfiguration().getPiptype().isHyperCSV()) {
return true;
}
return false;
}
protected boolean isLDAP() {
return this.entity.getEntity().getPipconfiguration().getPiptype().isLDAP();
}
protected boolean isCSV() {
return this.entity.getEntity().getPipconfiguration().getPiptype().isCSV();
}
protected void initialize() {
//
// Initialize entity
//
this.initializeEntity();
//
// Go through the parameters, save them into a
// properties object.
//
boolean sourceInitialized = false;
boolean attributeInitialized = false;
for (PIPResolverParam param : this.entity.getEntity().getPipresolverParams()) {
//
// Look for ones we know about
//
if (param.getParamName().equalsIgnoreCase("select")) {
this.textAreaSelect.setValue(param.getParamValue());
this.textAreaSelect.setData(param);
} else if (param.getParamName().equals("fields") || param.getParamName().equals("filter.view")) {
this.initializeSourceTable(param.getParamValue());
this.tableRequiredAttributes.setData(param);
sourceInitialized = true;
} else if (param.getParamName().equals("parameters") || param.getParamName().equals("filter.parameters")) {
this.initializeAttributeTable(param.getParamValue());
this.tableAttributes.setData(param);
attributeInitialized = true;
} else if (param.getParamName().equalsIgnoreCase("base")) {
this.textFieldBase.setValue(param.getParamValue());
this.textFieldBase.setData(param);
} else if (param.getParamName().equalsIgnoreCase("filter")) {
this.textFieldFilter.setValue(param.getParamValue());
this.textFieldFilter.setData(param);
}
}
//
// Initialize GUI
//
this.initializeText();
this.initializeCheckBox();
//
// Verify the tables get setup, if this is a new object
// then they haven't been.
//
if (sourceInitialized == false) {
this.initializeSourceTable("");
}
if (attributeInitialized == false) {
this.initializeAttributeTable("");
}
}
protected void initializeEntity() {
//
// Make sure the classname is set correctly
//
if (this.isSQL()) {
//
//
//
this.fieldPrefix = "field.";
this.parameterPrefix = "parameter.";
this.entity.getEntity().setClassname(ConfigurableJDBCResolver.class.getCanonicalName());
} else if (this.isLDAP()) {
//
//
//
this.fieldPrefix = "filter.view.";
this.parameterPrefix = "filter.parameters.";
this.entity.getEntity().setClassname(ConfigurableLDAPResolver.class.getCanonicalName());
} else if (this.isCSV()) {
//
//
//
this.fieldPrefix = "field.";
this.parameterPrefix = "parameter.";
this.entity.getEntity().setClassname(ConfigurableCSVResolver.class.getCanonicalName());
}
}
protected void initializeText() {
//
// Are we SQL or LDAP?
//
if (this.isSQL()) {
//
// Turn these off
//
this.textFieldBase.setRequired(false);
this.textFieldBase.setVisible(false);
this.textFieldFilter.setRequired(false);
this.textFieldFilter.setVisible(false);
//
// GUI properties
//
this.textAreaSelect.setImmediate(true);
//
// Respond to changes
//
this.textAreaSelect.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = 1L;
@Override
public void valueChange(ValueChangeEvent event) {
PIPResolverParam param = (PIPResolverParam) self.textAreaSelect.getData();
if (param == null) {
param = new PIPResolverParam();
param.setPipresolver(self.entity.getEntity());
param.setParamName("select");
self.entity.getEntity().addPipresolverParam(param);
self.textAreaSelect.setData(param);
}
param.setParamValue(self.textAreaSelect.getValue());
self.fireFormChangedEvent();
}
});
} else if (this.isLDAP()) {
//
// Turn these off
//
this.textAreaSelect.setRequired(false);
this.textAreaSelect.setVisible(false);
//
//
//
this.textFieldBase.setImmediate(true);
this.textFieldBase.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = 1L;
@Override
public void valueChange(ValueChangeEvent event) {
PIPResolverParam param = (PIPResolverParam) self.textFieldBase.getData();
if (param == null) {
param = new PIPResolverParam();
param.setPipresolver(self.entity.getEntity());
param.setParamName("base");
self.entity.getEntity().addPipresolverParam(param);
self.textFieldBase.setData(param);
}
param.setParamValue(self.textFieldBase.getValue());
self.fireFormChangedEvent();
}
});
//
//
//
this.textFieldFilter.setImmediate(true);
this.textFieldFilter.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = 1L;
@Override
public void valueChange(ValueChangeEvent event) {
PIPResolverParam param = (PIPResolverParam) self.textFieldFilter.getData();
if (param == null) {
param = new PIPResolverParam();
param.setPipresolver(self.entity.getEntity());
param.setParamName("filter");
self.entity.getEntity().addPipresolverParam(param);
self.textFieldFilter.setData(param);
}
param.setParamValue(self.textFieldFilter.getValue());
self.fireFormChangedEvent();
}
});
} else if (this.isCSV()) {
//
// Turn these off
//
this.textAreaSelect.setRequired(false);
this.textAreaSelect.setVisible(false);
this.textFieldBase.setRequired(false);
this.textFieldBase.setVisible(false);
this.textFieldFilter.setRequired(false);
this.textFieldFilter.setVisible(false);
}
}
protected void initializeCheckBox() {
this.checkBoxShortIds.setValue(true);
this.checkBoxShortIds.setImmediate(true);
this.checkBoxShortIds.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = 1L;
@Override
public void valueChange(ValueChangeEvent event) {
if (self.checkBoxShortIds.getValue()) {
self.tableRequiredAttributes.setColumnCollapsed("id", true);
self.tableRequiredAttributes.setColumnCollapsed("category", true);
self.tableRequiredAttributes.setColumnCollapsed("datatype", true);
self.tableRequiredAttributes.setColumnCollapsed("shortId", false);
self.tableRequiredAttributes.setColumnCollapsed("shortCategory", false);
self.tableRequiredAttributes.setColumnCollapsed("shortDatatype", false);
} else {
self.tableRequiredAttributes.setColumnCollapsed("id", false);
self.tableRequiredAttributes.setColumnCollapsed("category", false);
self.tableRequiredAttributes.setColumnCollapsed("datatype", false);
self.tableRequiredAttributes.setColumnCollapsed("shortId", true);
self.tableRequiredAttributes.setColumnCollapsed("shortCategory", true);
self.tableRequiredAttributes.setColumnCollapsed("shortDatatype", true);
}
}
});
}
protected void initializeSourceTable(String fields) {
//
// Add data into the container
//
this.populateData(this.fieldPrefix, fields, this.fieldsContainer);
//
// Set GUI properties
//
this.tableRequiredAttributes.setContainerDataSource(this.fieldsContainer);
this.tableRequiredAttributes.setPageLength((this.fieldsContainer.size() == 0 ? 3 : this.fieldsContainer.size() + 1));
this.tableRequiredAttributes.setSizeFull();
this.tableRequiredAttributes.setColumnCollapsingAllowed(true);
this.tableRequiredAttributes.setVisibleColumns(new Object[] {"identifier", "id", "category", "datatype", "shortId", "shortCategory", "shortDatatype"});
this.tableRequiredAttributes.setColumnHeaders(new String[] {"Field", "Attribute Id", "Category", "Data Type", "Attribute Id", "Category", "Data Type"});
this.tableRequiredAttributes.setColumnCollapsed("id", true);
this.tableRequiredAttributes.setColumnCollapsed("category", true);
this.tableRequiredAttributes.setColumnCollapsed("datatype", true);
this.tableRequiredAttributes.setSelectable(true);
//
// Setup its handler
//
this.tableRequiredAttributes.addActionHandler(this);
//
// Respond to events
//
this.tableRequiredAttributes.addItemClickListener(new ItemClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void itemClick(ItemClickEvent event) {
if (event.isDoubleClick()) {
Object id = event.getItemId();
if (id == null) {
//
// Really shouldn't get here
//
return;
}
BeanItem<ResolverAttribute> beanItem = self.fieldsContainer.getItem(id);
if (beanItem == null) {
//
// Again, shouldn't get here
//
return;
}
self.editAttribute(self.tableRequiredAttributes, beanItem.getBean());
}
}
});
}
protected void initializeAttributeTable(String parameters) {
//
// Add data into the container
//
this.populateData(this.parameterPrefix, parameters, this.parametersContainer);
//
// setup gui properties
//
this.tableAttributes.setContainerDataSource(this.parametersContainer);
this.tableAttributes.setPageLength(this.parametersContainer.size() + 1);
this.tableAttributes.setSizeFull();
this.tableAttributes.setColumnCollapsingAllowed(true);
this.tableAttributes.setVisibleColumns(new Object[] {"identifier", "id", "category", "datatype", "shortId", "shortCategory", "shortDatatype"});
this.tableAttributes.setColumnHeaders(new String[] {"Position", "Attribute Id", "Category", "Data Type", "Attribute Id", "Category", "Data Type"});
this.tableAttributes.setColumnCollapsed("id", true);
this.tableAttributes.setColumnCollapsed("category", true);
this.tableAttributes.setColumnCollapsed("datatype", true);
this.tableAttributes.setSelectable(true);
//
// Setup its handler
//
this.tableAttributes.addActionHandler(this);
//
// Respond to events
//
this.tableAttributes.addItemClickListener(new ItemClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void itemClick(ItemClickEvent event) {
if (event.isDoubleClick()) {
Object id = event.getItemId();
if (id == null) {
//
// Really shouldn't get here
//
return;
}
BeanItem<ResolverAttribute> beanItem = self.parametersContainer.getItem(id);
if (beanItem == null) {
//
// Again, shouldn't get here
//
return;
}
self.editAttribute(self.tableAttributes, beanItem.getBean());
}
}
});
}
protected void populateData(String prefix, String list, BeanItemContainer<ResolverAttribute> container) {
for (String field : Splitter.on(',').trimResults().omitEmptyStrings().split(list)) {
//
// Create a bean for this field
//
ResolverAttribute bean = new ResolverAttribute(prefix, field);
//
// Now try to find the attribute information
//
for (PIPResolverParam param : this.entity.getEntity().getPipresolverParams()) {
if (param.getParamName().equals(prefix + field + ".id")) {
bean.setId(param);
} else if (param.getParamName().equals(prefix + field + ".category")) {
bean.setCategory(param);
} else if (param.getParamName().equals(prefix + field + ".datatype")) {
bean.setDatatype(param);
} else if (param.getParamName().equals(prefix + field + ".issuer")) {
bean.setIssuer(param);
} else if (param.getParamName().equals(prefix + field + ".column")) {
bean.setColumn(param);
}
}
container.addBean(bean);
}
}
@Override
public Action[] getActions(Object target, Object sender) {
if (target == null) {
return new Action[] {ADD_ATTRIBUTE};
}
return new Action[] {EDIT_ATTRIBUTE, CLONE_ATTRIBUTE, REMOVE_ATTRIBUTE};
}
@Override
public void handleAction(Action action, Object sender, Object target) {
if (action == ADD_ATTRIBUTE) {
if (sender.equals(this.tableRequiredAttributes)) {
this.editAttribute(self.tableRequiredAttributes, null);
} else {
this.editAttribute(self.tableAttributes, null);
}
return;
}
if (action == EDIT_ATTRIBUTE) {
assert target instanceof ResolverAttribute;
if (sender.equals(this.tableRequiredAttributes)) {
this.editAttribute(self.tableRequiredAttributes, (ResolverAttribute) target);
} else {
this.editAttribute(self.tableAttributes, (ResolverAttribute) target);
}
return;
}
if (action == CLONE_ATTRIBUTE) {
assert target instanceof ResolverAttribute;
try {
//
// Which table?
//
if (sender.equals(this.tableRequiredAttributes)) {
//
// Clone the attribute giving it a new
// field name.
//
ResolverAttribute clone = new ResolverAttribute(this.fieldPrefix, this.getNextField(), (ResolverAttribute) target);
//
// Add it to the container
//
this.fieldsContainer.addBean(clone);
//
// Reset the page length so we can see it and have room
// to add another.
//
this.tableRequiredAttributes.setPageLength(this.fieldsContainer.size() + 1);
//
// Select it
//
this.tableRequiredAttributes.select(clone);
} else {
//
// Clone the attribute giving it a new
// field name.
//
ResolverAttribute clone = new ResolverAttribute(this.parameterPrefix, this.getNextParameter(), (ResolverAttribute) target);
//
// Add it to the container
//
this.parametersContainer.addBean(clone);
//
// Reset the page length so we can see it and have room
// to add another.
//
this.tableAttributes.setPageLength(this.parametersContainer.size() + 1);
//
// Select it
//
this.tableAttributes.select(clone);
}
//
// We have changed
//
this.fireFormChangedEvent();
} catch (Exception e) {
logger.error("Failed to clone: " + e);
}
return;
}
if (action == REMOVE_ATTRIBUTE) {
assert target instanceof ResolverAttribute;
//
// Help method to remove the attribute
//
this.removeAttribute((ResolverAttribute) target);
//
// Which table?
//
if (sender.equals(this.tableRequiredAttributes)) {
//
// Now remove it from the table
//
this.tableRequiredAttributes.removeItem(target);
} else {
//
// Now remove it from the table
//
this.tableAttributes.removeItem(target);
}
//
// we have changed
//
this.fireFormChangedEvent();
return;
}
}
protected void removeAttribute(ResolverAttribute target) {
this.entity.getEntity().removePipresolverParam(target.getIdParam());
this.entity.getEntity().removePipresolverParam(target.getCategoryParam());
this.entity.getEntity().removePipresolverParam(target.getDatatypeParam());
this.entity.getEntity().removePipresolverParam(target.getIssuerParam());
}
protected void editAttribute(final Table table, final ResolverAttribute request) {
if (this.isCSV()) {
this.editCSVAttribute(table, request);
} else {
this.editResolverAttribute(table, request, null);
}
}
protected void editCSVAttribute(final Table table, final ResolverAttribute request) {
assert this.isCSV();
//
// Prompt for the column
//
final ColumnSelectionWindow window = new ColumnSelectionWindow((request != null ? request.getColumn() : 0));
if (request == null) {
window.setCaption("Input the CSV Column for the new attribute");
} else {
window.setCaption("Edit the CSV Column for the attribute");
}
window.setModal(true);
window.center();
window.addCloseListener(new CloseListener() {
private static final long serialVersionUID = 1L;
@Override
public void windowClose(CloseEvent e) {
//
// Did the user save?
//
if (window.isSaved() == false) {
return;
}
//
// Save it if its not a new
//
if (request != null) {
request.setColumn(window.getColumn());
}
//
// Now we select the attribute, pass the column
// in case this is a brand new attribute. Yeah its messy.
//
self.editResolverAttribute(table, request, window.getColumn());
}
});
window.center();
UI.getCurrent().addWindow(window);
}
protected void editResolverAttribute(final Table table, final ResolverAttribute request, final Integer column) {
//
// Provide objects to the attribute selection window
//
AttributeDesignatorType designator = new AttributeDesignatorType();
if (request == null) {
designator.setAttributeId(XACML3.ID_SUBJECT_SUBJECT_ID.stringValue());
designator.setCategory(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT.stringValue());
designator.setDataType(XACML3.ID_DATATYPE_STRING.stringValue());
designator.setIssuer(this.entity.getEntity().getIssuer());
} else {
designator.setAttributeId(request.getId());
designator.setCategory(request.getCategory());
designator.setDataType(request.getDatatype());
designator.setIssuer(request.getIssuer());
}
//
// Have user select an attribute
//
final AttributeSelectionWindow selection = new AttributeSelectionWindow(null, designator);
selection.setModal(true);
selection.setCaption("Select Attribute");
selection.addCloseListener(new CloseListener() {
private static final long serialVersionUID = 1L;
@Override
public void windowClose(CloseEvent event) {
//
// User click Save button?
//
if (selection.isSaved() == false) {
return;
}
//
// Yes - get the final attribute
//
Attribute attribute = selection.getAttribute();
//
// Is it a new one?
//
if (request == null) {
try {
//
// Create a new bean
//
ResolverAttribute bean = null;
if (table.equals(self.tableRequiredAttributes)) {
bean = new ResolverAttribute(self.fieldPrefix, self.getNextField());
} else {
bean = new ResolverAttribute(self.parameterPrefix, self.getNextParameter());
}
bean.setId(attribute.getXacmlId());
bean.setCategory(attribute.getCategoryBean().getXacmlId());
bean.setDatatype(attribute.getDatatypeBean().getXacmlId());
if (attribute.getIssuer() != null) {
bean.setIssuer(attribute.getIssuer());
}
if (column != null) {
bean.setColumn(column);
}
//
// Add it to the resolver
//
bean.setResolver(self.entity.getEntity());
self.entity.getEntity().addPipresolverParam(bean.getIdParam());
self.entity.getEntity().addPipresolverParam(bean.getCategoryParam());
self.entity.getEntity().addPipresolverParam(bean.getDatatypeParam());
if (bean.getIssuer() != null) {
self.entity.getEntity().addPipresolverParam(bean.getIssuerParam());
}
//
// Which table?
//
if (table.equals(self.tableRequiredAttributes)) {
//
// Add to table
//
self.fieldsContainer.addBean(bean);
//
// Reset the page length
//
self.tableRequiredAttributes.setPageLength(self.fieldsContainer.size() + 1);
} else if (table.equals(self.tableAttributes)) {
//
// Add to table
//
self.parametersContainer.addBean(bean);
//
// Reset the page length
//
self.tableAttributes.setPageLength(self.parametersContainer.size() + 1);
}
if (logger.isDebugEnabled()) {
logger.debug("Added new attribute: " + bean);
}
} catch (Exception e) {
logger.error(e);
AdminNotification.error("Unable to add another required attribute field");
}
} else {
//
// Update the table entry
//
request.setId(attribute.getXacmlId());
request.setCategory(attribute.getCategoryBean().getXacmlId());
request.setDatatype(attribute.getDatatypeBean().getXacmlId());
request.setIssuer(attribute.getIssuer());
//
// Let the table know
//
table.refreshRowCache();
}
//
// we have changed
//
self.fireFormChangedEvent();
}
});
selection.center();
UI.getCurrent().addWindow(selection);
}
protected String getNextField() throws Exception {
//
// Start at the next index number. NOTE: The GUI needs
// to use numbers to index the fields.
//
int index = this.tableRequiredAttributes.size() + 1;
//
// Really if we get to 100, that's an insane number of fields
// needed for a SQL query.
//
while (index < 100) {
String field = String.format("%02d", index);
boolean exists = false;
for (Object id : this.tableRequiredAttributes.getItemIds()) {
@SuppressWarnings("unchecked")
BeanItem<ResolverAttribute> required = (BeanItem<ResolverAttribute>) this.tableRequiredAttributes.getItem(id);
if (required.getBean().getIdentifier().equals(field)) {
exists = true;
index++;
break;
}
}
if (exists == false) {
return field;
}
}
//
// Sanity check
//
throw new Exception("Unable to find a next field name. Are there too many fields?");
}
protected String getNextParameter() throws Exception {
//
// Start at the next index number. NOTE: The GUI needs
// to use numbers to index the fields.
//
int index = this.tableAttributes.size() + 1;
//
// Really if we get to 100, that's an insane number of fields
// needed for a SQL query.
//
while (index < 100) {
String field = String.format("%02d", index);
boolean exists = false;
for (Object id : this.tableAttributes.getItemIds()) {
@SuppressWarnings("unchecked")
BeanItem<ResolverAttribute> required = (BeanItem<ResolverAttribute>) this.tableAttributes.getItem(id);
if (required.getBean().getIdentifier().equals(field)) {
exists = true;
index++;
break;
}
}
if (exists == false) {
return field;
}
}
//
// Sanity check
//
throw new Exception("Unable to find a next parameter name. Are there too many parameters?");
}
public void discard() throws SourceException {
if (this.isSQL()) {
this.textAreaSelect.discard();
} else if (this.isLDAP()) {
this.textFieldBase.discard();
this.textFieldFilter.discard();
// } else if (this.isCSV()) {
}
}
public void validate() throws InvalidValueException {
if (this.isSQL()) {
this.textAreaSelect.validate();
} else if (this.isLDAP()) {
this.textFieldBase.validate();
this.textFieldFilter.validate();
//} else if (this.isCSV()) {
}
}
public void commit() throws SourceException, InvalidValueException {
//
// Commit required fields
//
if (this.isSQL()) {
this.textAreaSelect.commit();
} else if (this.isLDAP()) {
this.textFieldBase.commit();
this.textFieldFilter.commit();
// } else if (this.isCSV()) {
}
//
// Setup the fields
//
{
List<String> fields = new ArrayList<String>(this.fieldsContainer.size());
for (ResolverAttribute attribute : this.fieldsContainer.getItemIds()) {
fields.add(attribute.getIdentifier());
}
PIPResolverParam param = (PIPResolverParam) this.tableRequiredAttributes.getData();
if (param == null) {
param = new PIPResolverParam();
if (this.isSQL()) {
param.setParamName("fields");
} else if (this.isLDAP()) {
param.setParamName("filter.view");
} else if (this.isCSV()) {
param.setParamName("fields");
}
this.entity.getEntity().addPipresolverParam(param);
this.tableRequiredAttributes.setData(param);
}
param.setParamValue(Joiner.on(',').join(fields));
}
//
// Setup the parameters
//
{
List<String> parameters = new ArrayList<String>(this.parametersContainer.size());
for (ResolverAttribute attribute : this.parametersContainer.getItemIds()) {
parameters.add(attribute.getIdentifier());
}
PIPResolverParam param = (PIPResolverParam) this.tableAttributes.getData();
if (param == null) {
param = new PIPResolverParam();
if (this.isSQL()) {
param.setParamName("parameters");
} else if (this.isLDAP()) {
param.setParamName("filter.parameters");
} else if (this.isCSV()) {
param.setParamName("parameters");
}
this.entity.getEntity().addPipresolverParam(param);
this.tableAttributes.setData(param);
}
param.setParamValue(Joiner.on(',').join(parameters));
}
}
public boolean isSaved() {
return this.isSaved;
}
@Override
public boolean addListener(FormChangedEventListener listener) {
return this.notifier.addListener(listener);
}
@Override
public boolean removeListener(FormChangedEventListener listener) {
return this.notifier.removeListener(listener);
}
@Override
public void fireFormChangedEvent() {
this.notifier.fireFormChangedEvent();
}
@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");
// textAreaSelect
textAreaSelect = new TextArea();
textAreaSelect.setCaption("SQL Select Statement");
textAreaSelect.setImmediate(false);
textAreaSelect.setWidth("100.0%");
textAreaSelect.setHeight("-1px");
textAreaSelect.setInvalidAllowed(false);
textAreaSelect.setRequired(true);
mainLayout.addComponent(textAreaSelect);
mainLayout.setExpandRatio(textAreaSelect, 1.0f);
// textFieldBase
textFieldBase = new TextField();
textFieldBase.setCaption("Base DN");
textFieldBase.setImmediate(false);
textFieldBase.setWidth("-1px");
textFieldBase.setHeight("-1px");
mainLayout.addComponent(textFieldBase);
// textFieldFilter
textFieldFilter = new TextField();
textFieldFilter.setCaption("Filter");
textFieldFilter.setImmediate(false);
textFieldFilter.setWidth("-1px");
textFieldFilter.setHeight("-1px");
mainLayout.addComponent(textFieldFilter);
// checkBoxShortIds
checkBoxShortIds = new CheckBox();
checkBoxShortIds.setCaption("Display short id’s.");
checkBoxShortIds.setImmediate(false);
checkBoxShortIds.setWidth("-1px");
checkBoxShortIds.setHeight("-1px");
mainLayout.addComponent(checkBoxShortIds);
// tableRequiredAttributes
tableRequiredAttributes = new Table();
tableRequiredAttributes.setCaption("Attributes Returned");
tableRequiredAttributes.setImmediate(false);
tableRequiredAttributes.setWidth("-1px");
tableRequiredAttributes.setHeight("-1px");
mainLayout.addComponent(tableRequiredAttributes);
// tableAttributes
tableAttributes = new Table();
tableAttributes.setCaption("Parameters - Attributes Needed (i.e. ?)");
tableAttributes.setImmediate(false);
tableAttributes.setWidth("-1px");
tableAttributes.setHeight("-1px");
tableAttributes.setInvalidAllowed(false);
tableAttributes.setRequired(true);
mainLayout.addComponent(tableAttributes);
return mainLayout;
}
}