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:32 UTC

[10/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/components/AttributeSimpleCreatorComponent.java
----------------------------------------------------------------------
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeSimpleCreatorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeSimpleCreatorComponent.java
new file mode 100644
index 0000000..c1568b9
--- /dev/null
+++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeSimpleCreatorComponent.java
@@ -0,0 +1,372 @@
+/*
+ *  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.components;
+
+import org.apache.openaz.xacml.admin.XacmlAdminUI;
+import org.apache.openaz.xacml.admin.jpa.Attribute;
+import org.apache.openaz.xacml.admin.jpa.Category;
+import org.apache.openaz.xacml.admin.jpa.Datatype;
+import org.apache.openaz.xacml.admin.util.JPAUtils;
+import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventListener;
+import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventNotifier;
+import org.apache.openaz.xacml.api.XACML3;
+import com.vaadin.addon.jpacontainer.JPAContainer;
+import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider;
+import com.vaadin.annotations.AutoGenerated;
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.ui.CustomComponent;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Table;
+import com.vaadin.ui.TextField;
+import com.vaadin.ui.UI;
+import com.vaadin.ui.VerticalLayout;
+
+public class AttributeSimpleCreatorComponent extends CustomComponent implements AttributeChangedEventNotifier {
+
+	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
+
+	@AutoGenerated
+	private VerticalLayout mainLayout;
+	@AutoGenerated
+	private HorizontalLayout horizontalLayout_1;
+	@AutoGenerated
+	private Table tableDatatype;
+	@AutoGenerated
+	private Table tableCategory;
+	@AutoGenerated
+	private TextField textFieldContextPath;
+	@AutoGenerated
+	private TextField textFieldAttributeId;
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	private final AttributeSimpleCreatorComponent self = this;
+	private final Datatype datatype;
+	private final Attribute attribute;
+	private final BasicNotifier notifier = new BasicNotifier();
+	private static final JPAContainer<Category>	categories = new JPAContainer<Category>(Category.class);
+	private static final JPAContainer<Datatype>	datatypes = new JPAContainer<Datatype>(Datatype.class);
+	static {
+		categories.setEntityProvider(new CachingLocalEntityProvider<Category>(Category.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
+		datatypes.setEntityProvider(new CachingLocalEntityProvider<Datatype>(Datatype.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
+		categories.sort(new String[]{"xacmlId"}, new boolean[]{true});
+		datatypes.sort(new String[]{"xacmlId"}, new boolean[]{true});
+	}
+	/**
+	 * 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 AttributeSimpleCreatorComponent(Datatype datatype, Attribute initialAttribute) {
+		buildMainLayout();
+		setCompositionRoot(mainLayout);
+		//
+		// Save
+		//
+		this.datatype = datatype;
+		this.attribute = initialAttribute;
+		//
+		// Initialize GUI
+		//
+		this.initializeCategories();
+		this.initializeDatatypes();
+		this.initializeAttributeId();
+		//
+		// Focus
+		//
+		this.textFieldAttributeId.focus();
+	}
+	
+	private void initializeCategories() {
+		//
+		// Remove any filters
+		//
+		AttributeSimpleCreatorComponent.categories.removeAllContainerFilters();
+		//
+		// Initialize data source & GUI properties
+		//
+		this.tableCategory.setContainerDataSource(AttributeSimpleCreatorComponent.categories);
+		this.tableCategory.setVisibleColumns(new Object[] {"xacmlId"});
+		this.tableCategory.setColumnHeaders(new String[] {"XACML ID"});
+		this.tableCategory.setImmediate(true);
+		this.tableCategory.setNullSelectionAllowed(false);
+		this.tableCategory.setPageLength(10);
+		this.tableCategory.setSelectable(true);
+		//
+		// Default selection
+		//
+		Category defaultCategory;
+		if (this.attribute == null || this.attribute.getCategoryBean() == null || this.attribute.getCategoryBean().getIdentifer() == null) {
+			defaultCategory = JPAUtils.findCategory(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT);
+			assert defaultCategory != null;
+		} else {
+			defaultCategory = JPAUtils.findCategory(this.attribute.getCategoryBean().getIdentifer());
+		}
+		if (defaultCategory != null) {
+			this.tableCategory.select(defaultCategory.getId());
+		}
+		//
+		// Respond to changes
+		//
+		this.tableCategory.addValueChangeListener(new ValueChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void valueChange(ValueChangeEvent event) {
+				self.fireAttributeChanged(self.getAttribute());
+			}
+		});
+	}
+
+	private void initializeDatatypes() {
+		//
+		// Remove any filters
+		//
+		AttributeSimpleCreatorComponent.datatypes.removeAllContainerFilters();
+		//
+		// Initialize data source & GUI properties
+		//
+		this.tableDatatype.setContainerDataSource(AttributeSimpleCreatorComponent.datatypes);
+		this.tableDatatype.setVisibleColumns(new Object[] {"xacmlId", "shortName"});
+		this.tableDatatype.setColumnHeaders(new String[] {"Data Type ID", "Data Type"});
+		this.tableDatatype.setNullSelectionAllowed(false);
+		this.tableDatatype.setImmediate(true);
+		this.tableDatatype.setPageLength(10);
+		//
+		// Are we restricted to a certain datatype?
+		//
+		if (this.datatype != null) {
+			//
+			// Datatype restricted
+			//
+			this.tableDatatype.select(this.datatype.getId());
+			this.tableDatatype.setEnabled(false);
+			return;
+		}
+		this.tableDatatype.setSelectable(true);
+		//
+		// Do we have a default value?
+		//
+		Datatype defaultDatatype;
+		if (this.attribute != null && this.attribute.getDatatypeBean() != null) {
+			defaultDatatype = this.attribute.getDatatypeBean();
+		} else {
+			defaultDatatype = JPAUtils.findDatatype(XACML3.ID_DATATYPE_STRING);
+		}
+		if (defaultDatatype != null) {
+			this.tableDatatype.select(defaultDatatype.getId());
+		}
+		//
+		// Respond to changes
+		//
+		this.tableDatatype.addValueChangeListener(new ValueChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void valueChange(ValueChangeEvent event) {
+				self.fireAttributeChanged(self.getAttribute());
+			}
+		});
+	}
+	
+	private void initializeAttributeId() {
+		this.textFieldAttributeId.setImmediate(true);
+		this.textFieldAttributeId.setNullRepresentation("");
+		if (this.attribute == null) {
+			this.textFieldAttributeId.setValue(XacmlAdminUI.getDomain());
+		} else {
+			//
+			// Set the ID
+			//
+			this.textFieldAttributeId.setValue(this.attribute.getXacmlId());
+			//
+			// Is it an attribute selector?
+			//
+			if (this.attribute.isDesignator()) {
+				this.textFieldContextPath.setVisible(false);
+				this.textFieldContextPath.setRequired(false);
+			} else {
+				this.textFieldAttributeId.setCaption("Context Selector Id");
+				this.textFieldAttributeId.setRequired(false);
+				this.textFieldContextPath.setVisible(true);				
+				this.textFieldContextPath.setValue(this.attribute.getSelectorPath());
+				this.textFieldContextPath.setRequired(true);
+				this.textFieldContextPath.setRequiredError("You must have a context path for a selector.");
+				this.textFieldContextPath.addValueChangeListener(new ValueChangeListener() {
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					public void valueChange(ValueChangeEvent event) {
+						self.fireAttributeChanged(self.getAttribute());
+					}
+				});
+			}
+		}
+		//
+		// Respond to changes
+		//
+		this.textFieldAttributeId.addValueChangeListener(new ValueChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void valueChange(ValueChangeEvent event) {
+				self.fireAttributeChanged(self.getAttribute());
+			}
+		});
+	}
+	
+	@Override
+	public Attribute	getAttribute() {
+		try {
+			this.textFieldAttributeId.commit();
+		} catch (Exception e) { //NOPMD
+			// TODO - Handle, Log or NOPMD
+			// TODO - Will vaadin display error?
+		}
+		Attribute attribute = new Attribute(this.textFieldAttributeId.getValue());
+		attribute.setSelectorPath(this.textFieldContextPath.getValue());
+		Object categoryId = this.tableCategory.getValue();
+		if (categoryId != null) {
+			attribute.setCategoryBean(AttributeSimpleCreatorComponent.categories.getItem(categoryId).getEntity());
+		}
+		if (this.datatype != null) {
+			attribute.setDatatypeBean(this.datatype);
+		} else {
+			Object datatypeId = this.tableDatatype.getValue();
+			if (datatypeId == null) {
+				return null;
+			}
+			attribute.setDatatypeBean(AttributeSimpleCreatorComponent.datatypes.getItem(datatypeId).getEntity());
+		}
+		return attribute;
+	}
+	
+	@Override
+	public boolean addListener(AttributeChangedEventListener listener) {
+		return this.notifier.addListener(listener);
+	}
+
+	@Override
+	public boolean removeListener(AttributeChangedEventListener listener) {
+		return this.notifier.removeListener(listener);
+	}
+
+	@Override
+	public void commit() {
+		try {
+			this.textFieldAttributeId.commit();
+			this.textFieldContextPath.commit();
+			this.tableCategory.commit();
+			this.tableDatatype.commit();
+		} catch (Exception e) { //NOPMD
+			// TODO - Handle, Log or NOPMD
+			// TODO - Will vaadin display error?
+		}
+	}
+
+	@Override
+	public void fireAttributeChanged(Attribute attribute) {
+		this.notifier.fireAttributeChanged(attribute);
+	}
+
+	@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");
+		
+		// textFieldAttributeId
+		textFieldAttributeId = new TextField();
+		textFieldAttributeId.setCaption("Attribute Id");
+		textFieldAttributeId.setImmediate(false);
+		textFieldAttributeId.setWidth("100.0%");
+		textFieldAttributeId.setHeight("-1px");
+		textFieldAttributeId.setInvalidAllowed(false);
+		textFieldAttributeId.setRequired(true);
+		mainLayout.addComponent(textFieldAttributeId);
+		mainLayout.setExpandRatio(textFieldAttributeId, 1.0f);
+		
+		// textFieldContextPath
+		textFieldContextPath = new TextField();
+		textFieldContextPath.setCaption("Context Path");
+		textFieldContextPath.setImmediate(false);
+		textFieldContextPath.setDescription("The Selector's Context Path.");
+		textFieldContextPath.setWidth("100.0%");
+		textFieldContextPath.setHeight("-1px");
+		textFieldContextPath
+				.setInputPrompt("eg. md:record/md:patient/md:patient-number/text()");
+		mainLayout.addComponent(textFieldContextPath);
+		mainLayout.setExpandRatio(textFieldContextPath, 1.0f);
+		
+		// horizontalLayout_1
+		horizontalLayout_1 = buildHorizontalLayout_1();
+		mainLayout.addComponent(horizontalLayout_1);
+		mainLayout.setExpandRatio(horizontalLayout_1, 1.0f);
+		
+		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);
+		
+		// tableCategory
+		tableCategory = new Table();
+		tableCategory.setCaption("Choose Category");
+		tableCategory.setImmediate(false);
+		tableCategory.setWidth("-1px");
+		tableCategory.setHeight("-1px");
+		tableCategory.setInvalidAllowed(false);
+		tableCategory.setRequired(true);
+		horizontalLayout_1.addComponent(tableCategory);
+		
+		// tableDatatype
+		tableDatatype = new Table();
+		tableDatatype.setCaption("Choose Data Type");
+		tableDatatype.setImmediate(false);
+		tableDatatype.setWidth("-1px");
+		tableDatatype.setHeight("-1px");
+		tableDatatype.setInvalidAllowed(false);
+		tableDatatype.setRequired(true);
+		horizontalLayout_1.addComponent(tableDatatype);
+		
+		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/components/AttributeStandardSelectorComponent.java
----------------------------------------------------------------------
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeStandardSelectorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeStandardSelectorComponent.java
new file mode 100644
index 0000000..a3fded5
--- /dev/null
+++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeStandardSelectorComponent.java
@@ -0,0 +1,414 @@
+/*
+ *  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.components;
+
+import java.io.Serializable;
+import java.util.Set;
+
+import org.apache.openaz.xacml.admin.XacmlAdminUI;
+import org.apache.openaz.xacml.admin.jpa.Attribute;
+import org.apache.openaz.xacml.admin.jpa.Category;
+import org.apache.openaz.xacml.admin.jpa.Datatype;
+import org.apache.openaz.xacml.admin.util.JPAUtils;
+import org.apache.openaz.xacml.admin.util.XACMLConstants;
+import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventListener;
+import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventNotifier;
+import org.apache.openaz.xacml.api.Identifier;
+import org.apache.openaz.xacml.api.XACML3;
+import com.vaadin.addon.jpacontainer.JPAContainer;
+import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider;
+import com.vaadin.annotations.AutoGenerated;
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.data.util.BeanItem;
+import com.vaadin.data.util.BeanItemContainer;
+import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
+import com.vaadin.ui.ComboBox;
+import com.vaadin.ui.CustomComponent;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Table;
+import com.vaadin.ui.UI;
+import com.vaadin.ui.VerticalLayout;
+
+public class AttributeStandardSelectorComponent extends CustomComponent implements AttributeChangedEventNotifier {
+
+	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
+
+	@AutoGenerated
+	private VerticalLayout mainLayout;
+	@AutoGenerated
+	private HorizontalLayout horizontalLayout_2;
+	@AutoGenerated
+	private Table tableDatatypes;
+	@AutoGenerated
+	private Table tableAttributes;
+	@AutoGenerated
+	private ComboBox comboBoxCategories;
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	
+	public class AttributeBean implements Serializable {
+		private static final long serialVersionUID = 1L;
+		private Identifier	attributeId;
+		private Identifier	categoryId;
+		
+		public AttributeBean(Identifier category, Identifier id) {
+			this.categoryId = category;
+			this.attributeId = id;
+		}
+		public Identifier getAttributeId() {
+			return attributeId;
+		}
+		public void setAttributeId(Identifier attributeId) {
+			this.attributeId = attributeId;
+		}
+		public Identifier getCategoryId() {
+			return categoryId;
+		}
+		public void setCategoryId(Identifier categoryId) {
+			this.categoryId = categoryId;
+		}
+		@Override
+		public String toString() {
+			return this.attributeId.stringValue();
+		}
+		
+	}
+	private final AttributeStandardSelectorComponent self = this;
+	private final Datatype datatype;
+	private final Attribute attribute;
+	private final BasicNotifier notifier = new BasicNotifier();
+	private static final JPAContainer<Category>	categories = new JPAContainer<Category>(Category.class);
+	private static final JPAContainer<Datatype>	datatypes = new JPAContainer<Datatype>(Datatype.class);
+	static {
+		categories.setEntityProvider(new CachingLocalEntityProvider<Category>(Category.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
+		datatypes.setEntityProvider(new CachingLocalEntityProvider<Datatype>(Datatype.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
+		categories.sort(new String[]{"xacmlId"}, new boolean[]{true});
+		datatypes.sort(new String[]{"xacmlId"}, new boolean[]{true});
+	}
+	private BeanItemContainer<AttributeBean> container = new BeanItemContainer<AttributeBean>(AttributeBean.class);
+	/**
+	 * 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 AttributeStandardSelectorComponent(Datatype datatype, Attribute initialAttribute) {
+		buildMainLayout();
+		setCompositionRoot(mainLayout);
+		//
+		// Save
+		//
+		this.datatype = datatype;
+		this.attribute = initialAttribute;
+		//
+		// Initialize GUI
+		//
+		this.initializeCategories();
+		this.initializeAttributes();
+		this.initializeDatatypes();
+		//
+		// Initialize focus
+		//
+		this.tableAttributes.focus();
+	}
+	
+	private void initializeCategories() {
+		//
+		// Remove any filters
+		//
+		AttributeStandardSelectorComponent.categories.removeAllContainerFilters();
+		//
+		// Initialize data source & GUI properties
+		//
+		this.comboBoxCategories.setContainerDataSource(AttributeStandardSelectorComponent.categories);
+		this.comboBoxCategories.setItemCaptionMode(ItemCaptionMode.PROPERTY);
+		this.comboBoxCategories.setItemCaptionPropertyId("xacmlId");
+		this.comboBoxCategories.setImmediate(true);
+		this.comboBoxCategories.setNullSelectionAllowed(false);
+		//
+		// Set default selection
+		//
+		Category defaultCategory;
+		if (this.attribute == null || this.attribute.getCategoryBean() == null) {
+			defaultCategory = JPAUtils.findCategory(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT);
+		} else {
+			defaultCategory = this.attribute.getCategoryBean();
+		}
+		if (defaultCategory != null) {
+			this.comboBoxCategories.select(defaultCategory.getId());
+		}
+		//
+		// Respond to events
+		//
+		this.comboBoxCategories.addValueChangeListener(new ValueChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void valueChange(ValueChangeEvent event) {
+				self.setupAttributeIDs();
+				self.fireAttributeChanged(self.getAttribute());
+			}
+		});
+	}
+	
+	private void initializeAttributes() {
+		//
+		// Initialize GUI properties
+		//
+		this.tableAttributes.setImmediate(true);
+		this.tableAttributes.setNullSelectionAllowed(false);
+		this.tableAttributes.setPageLength(10);
+		//
+		// Setup
+		//
+		this.tableAttributes.setContainerDataSource(this.container);
+		this.tableAttributes.setVisibleColumns(new Object[] {"attributeId"});
+		this.tableAttributes.setColumnHeaders(new String[] {"Attribute Id"});
+		this.tableAttributes.setSelectable(true);
+		this.setupAttributeIDs();
+		//
+		// Respond
+		//
+		this.tableAttributes.addValueChangeListener(new ValueChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void valueChange(ValueChangeEvent event) {
+				self.fireAttributeChanged(self.getAttribute());
+			}
+		});
+	}
+	
+	private void initializeDatatypes() {
+		//
+		// Remove any filters
+		//
+		AttributeStandardSelectorComponent.datatypes.removeAllContainerFilters();
+		//
+		// Initialize data source & GUI properties
+		//
+		this.tableDatatypes.setContainerDataSource(AttributeStandardSelectorComponent.datatypes);
+		this.tableDatatypes.setVisibleColumns(new Object[] {"shortName", "xacmlId"});
+		this.tableDatatypes.setColumnHeaders(new String[] {"Short Name", "XACML Data Type ID"});
+		this.tableDatatypes.setImmediate(true);
+		this.tableDatatypes.setNullSelectionAllowed(false);
+		this.tableDatatypes.setPageLength(10);
+		//
+		// Are we restricted to a certain datatype?
+		//
+		if (this.datatype != null) {
+			//
+			// Datatype restricted
+			//
+			this.tableDatatypes.select(this.datatype.getId());
+			this.tableDatatypes.setEnabled(false);
+			return;
+		}
+		this.tableDatatypes.setSelectable(true);
+		//
+		// Select a default
+		//
+		Datatype defaultDatatype;
+		if (this.attribute == null || this.attribute.getDatatypeBean() == null) {
+			defaultDatatype = JPAUtils.findDatatype(XACML3.ID_DATATYPE_STRING);
+		} else {
+			defaultDatatype = this.attribute.getDatatypeBean();
+		}
+		if (defaultDatatype != null) {
+			this.tableDatatypes.select(defaultDatatype.getId());
+		}
+		//
+		// Respond to events
+		//
+		this.tableDatatypes.addValueChangeListener(new ValueChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void valueChange(ValueChangeEvent event) {
+				self.fireAttributeChanged(self.getAttribute());
+			}
+		});
+	}
+	
+	private void	setupAttributeIDs() {
+		//
+		// Get the current selection (should NOT be null)
+		//
+		Object id = this.comboBoxCategories.getValue();
+		Category category = AttributeStandardSelectorComponent.categories.getItem(id).getEntity();
+		Set<Identifier> attributeIDs = null;
+		if (category.isStandard()) {
+			//
+			// Get the subset of attribute ID's specific to this standard
+			// category.
+			//
+			attributeIDs = XACMLConstants.MAP_STANDARD_CATEGORIES.get(category.getIdentifer());
+		}
+		if (attributeIDs == null) {
+			//
+			// A custom category, there are no default attribute IDs
+			// that we can determine.
+			//
+			attributeIDs = XACMLConstants.STANDARD_ATTRIBUTES;
+		} 
+		//
+		// Reset attribute IDs. Based on the category, add only acceptable
+		// attribute ID's for the category.
+		//
+		Object defaultBean = null;
+		this.tableAttributes.removeAllItems();
+		for (Identifier attributeId : attributeIDs) {
+			BeanItem<AttributeBean> newItem = this.container.addItem(new AttributeBean(category.getIdentifer(), attributeId));
+			if (this.attribute == null) {
+				if (attributeId.equals(XACML3.ID_SUBJECT_SUBJECT_ID) ||
+					attributeId.equals(XACML3.ID_ACTION_ACTION_ID) ||
+					attributeId.equals(XACML3.ID_RESOURCE_RESOURCE_ID) ||
+					attributeId.equals(XACML3.ID_ENVIRONMENT_CURRENT_DATE)) {
+					defaultBean = newItem.getBean();
+				}
+			} else {
+				if (newItem.getBean().getAttributeId().stringValue().equals(this.attribute.getXacmlId())) {
+					defaultBean = newItem.getBean();
+				}
+			}
+		}
+		//
+		// Set the default selection
+		//
+		if (defaultBean != null) {
+			this.tableAttributes.select(defaultBean);
+		}
+	}
+	
+	@Override
+	public void commit() {
+		this.comboBoxCategories.commit();
+		this.tableAttributes.commit();
+		this.tableDatatypes.commit();
+	}
+
+	@Override
+	public Attribute	getAttribute() {
+		Object categoryId = this.comboBoxCategories.getValue();
+		Object attributeId = this.tableAttributes.getValue();
+		Object datatypeId = this.tableDatatypes.getValue();
+		if (attributeId == null || datatypeId == null || categoryId == null) {
+			return null;
+		}
+		AttributeBean attributeBean = this.container.getItem(attributeId).getBean();
+		Datatype datatype = AttributeStandardSelectorComponent.datatypes.getItem(datatypeId).getEntity();
+		Category category = AttributeStandardSelectorComponent.categories.getItem(categoryId).getEntity();
+		if (datatype == null || category == null) {
+			return null;
+		}
+		Attribute attribute = new Attribute(attributeBean.getAttributeId().stringValue());
+		attribute.setCategoryBean(category);
+		attribute.setDatatypeBean(datatype);
+		
+		return attribute;
+	}
+
+	@Override
+	public boolean addListener(AttributeChangedEventListener listener) {
+		return this.notifier.addListener(listener);
+	}
+
+	@Override
+	public boolean removeListener(AttributeChangedEventListener listener) {
+		return this.notifier.removeListener(listener);
+	}
+
+	@Override
+	public void fireAttributeChanged(Attribute attribute) {
+		this.notifier.fireAttributeChanged(attribute);
+	}
+	
+	@AutoGenerated
+	private VerticalLayout buildMainLayout() {
+		// common part: create layout
+		mainLayout = new VerticalLayout();
+		mainLayout.setImmediate(false);
+		mainLayout.setWidth("-1px");
+		mainLayout.setHeight("-1px");
+		mainLayout.setMargin(false);
+		mainLayout.setSpacing(true);
+		
+		// top-level component properties
+		setWidth("-1px");
+		setHeight("-1px");
+		
+		// comboBoxCategories
+		comboBoxCategories = new ComboBox();
+		comboBoxCategories.setCaption("Select A Category");
+		comboBoxCategories.setImmediate(false);
+		comboBoxCategories.setWidth("-1px");
+		comboBoxCategories.setHeight("-1px");
+		comboBoxCategories.setInvalidAllowed(false);
+		comboBoxCategories.setRequired(true);
+		mainLayout.addComponent(comboBoxCategories);
+		mainLayout.setExpandRatio(comboBoxCategories, 1.0f);
+		
+		// horizontalLayout_2
+		horizontalLayout_2 = buildHorizontalLayout_2();
+		mainLayout.addComponent(horizontalLayout_2);
+		mainLayout.setExpandRatio(horizontalLayout_2, 1.0f);
+		
+		return mainLayout;
+	}
+
+	@AutoGenerated
+	private HorizontalLayout buildHorizontalLayout_2() {
+		// common part: create layout
+		horizontalLayout_2 = new HorizontalLayout();
+		horizontalLayout_2.setImmediate(false);
+		horizontalLayout_2.setWidth("-1px");
+		horizontalLayout_2.setHeight("-1px");
+		horizontalLayout_2.setMargin(false);
+		horizontalLayout_2.setSpacing(true);
+		
+		// tableAttributes
+		tableAttributes = new Table();
+		tableAttributes.setCaption("Standard Attributes");
+		tableAttributes.setImmediate(false);
+		tableAttributes.setWidth("-1px");
+		tableAttributes.setHeight("-1px");
+		tableAttributes.setInvalidAllowed(false);
+		tableAttributes.setRequired(true);
+		horizontalLayout_2.addComponent(tableAttributes);
+		
+		// tableDatatypes
+		tableDatatypes = new Table();
+		tableDatatypes.setCaption("Standard Data Types");
+		tableDatatypes.setImmediate(false);
+		tableDatatypes.setWidth("-1px");
+		tableDatatypes.setHeight("-1px");
+		tableDatatypes.setInvalidAllowed(false);
+		tableDatatypes.setRequired(true);
+		horizontalLayout_2.addComponent(tableDatatypes);
+		
+		return horizontalLayout_2;
+	}
+
+}

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/components/CSVPIPConfigurationComponent.java
----------------------------------------------------------------------
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CSVPIPConfigurationComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CSVPIPConfigurationComponent.java
new file mode 100644
index 0000000..ab466b0
--- /dev/null
+++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CSVPIPConfigurationComponent.java
@@ -0,0 +1,385 @@
+/*
+ *  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.components;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.openaz.xacml.admin.jpa.PIPConfigParam;
+import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
+import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener;
+import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier;
+import org.apache.openaz.xacml.std.pip.engines.csv.CSVEngine;
+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.converter.StringToIntegerConverter;
+import com.vaadin.event.FieldEvents.TextChangeEvent;
+import com.vaadin.event.FieldEvents.TextChangeListener;
+import com.vaadin.ui.CustomComponent;
+import com.vaadin.ui.TextField;
+import com.vaadin.ui.VerticalLayout;
+
+public class CSVPIPConfigurationComponent extends CustomComponent implements FormChangedEventNotifier {
+	
+	@AutoGenerated
+	private VerticalLayout mainLayout;
+
+	@AutoGenerated
+	private TextField textFieldSkip;
+
+	@AutoGenerated
+	private TextField textFieldQuote;
+
+	@AutoGenerated
+	private TextField textFieldDelimiter;
+
+	@AutoGenerated
+	private TextField textFieldFile;
+
+	public static String CLASSNAME = "org.apache.openaz.xacml.std.pip.engines.csv.CSVEngine";
+	
+	
+
+	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	private static final Log logger	= LogFactory.getLog(CSVPIPConfigurationComponent.class);
+	private final CSVPIPConfigurationComponent self = this;
+	private final BasicNotifier notifier = new BasicNotifier();
+	private final EntityItem<PIPConfiguration> entity;
+	/**
+	 * 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 entityConfig 
+	 * @param configParamField 
+	 */
+	public CSVPIPConfigurationComponent(EntityItem<PIPConfiguration> entityConfig) {
+		buildMainLayout();
+		setCompositionRoot(mainLayout);
+		//
+		// Save
+		//
+		this.entity = entityConfig;
+		//
+		// initialize
+		//
+		this.initialize();
+		//
+		//  Focus
+		//
+		this.textFieldFile.focus();
+	}
+	
+	protected void initialize() {
+		if (logger.isDebugEnabled()) {
+			logger.debug("initializing " + this.entity.getEntity().toString());
+		}
+		//
+		// What are our current values?
+		//
+		Set<PIPConfigParam> unneeded = new HashSet<PIPConfigParam>();
+		for (PIPConfigParam param : this.entity.getEntity().getPipconfigParams()) {
+			if (param.getParamName().equals(CSVEngine.PROP_SOURCE)) {
+				this.textFieldFile.setData(param);
+			} else if (param.getParamName().equals(CSVEngine.PROP_DELIMITER)) {
+				this.textFieldDelimiter.setData(param);
+			} else if (param.getParamName().equals(CSVEngine.PROP_QUOTE)) {
+				this.textFieldQuote.setData(param);
+			} else if (param.getParamName().equals(CSVEngine.PROP_SKIP)) {
+				this.textFieldSkip.setData(param);
+			} else {
+				unneeded.add(param);
+			}
+		}
+		if (unneeded.isEmpty() == false) {
+			this.entity.getEntity().getPipconfigParams().removeAll(unneeded);
+		}
+		//
+		//
+		//
+		this.initializeEntity();
+		this.initializeText();
+	}
+	
+	protected void initializeEntity() {
+		//
+		// Initialize the entity
+		//
+		this.entity.getEntity().setClassname(CLASSNAME);
+		this.entity.getEntity().setRequiresResolvers(true);
+	}
+	
+	protected void initializeText() {
+		//
+		//
+		//
+		this.textFieldFile.setRequired(true);
+		this.textFieldFile.setRequiredError("You need to specify a path to the CSV file on the server.");
+		this.textFieldFile.setImmediate(true);
+		this.textFieldFile.setNullRepresentation("");
+		//
+		//
+		//
+		PIPConfigParam param = (PIPConfigParam) this.textFieldFile.getData();
+		if (param != null) {
+			this.textFieldFile.setValue(param.getParamValue());
+		}
+		this.textFieldFile.addValueChangeListener(new ValueChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void valueChange(ValueChangeEvent event) {
+				PIPConfigParam param = (PIPConfigParam) self.textFieldFile.getData();
+				if (param == null) {
+					param = new PIPConfigParam(CSVEngine.PROP_SOURCE);
+					self.entity.getEntity().addPipconfigParam(param);
+					self.textFieldFile.setData(param);
+				}
+				param.setParamValue(self.textFieldFile.getValue());
+				self.fireFormChangedEvent();
+			}			
+		});
+		this.textFieldFile.addTextChangeListener(new TextChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void textChange(TextChangeEvent event) {
+				PIPConfigParam param = (PIPConfigParam) self.textFieldFile.getData();
+				if (param == null) {
+					param = new PIPConfigParam(CSVEngine.PROP_SOURCE);
+					self.entity.getEntity().addPipconfigParam(param);
+					self.textFieldFile.setData(param);
+				}
+				param.setParamValue(self.textFieldFile.getValue());
+				self.fireFormChangedEvent();
+			}			
+		});
+		//
+		//
+		//
+		this.textFieldDelimiter.setNullRepresentation("");
+		param = (PIPConfigParam) this.textFieldDelimiter.getData();
+		if (param != null) {
+			this.textFieldDelimiter.setValue(param.getParamValue());
+		}
+		this.textFieldDelimiter.addValueChangeListener(new ValueChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void valueChange(ValueChangeEvent event) {
+				PIPConfigParam param = (PIPConfigParam) self.textFieldDelimiter.getData();
+				if (param == null) {
+					param = new PIPConfigParam(CSVEngine.PROP_DELIMITER);
+					self.entity.getEntity().addPipconfigParam(param);
+					self.textFieldDelimiter.setData(param);
+				}
+				param.setParamValue(self.textFieldDelimiter.getValue());
+				self.fireFormChangedEvent();
+			}			
+		});
+		//
+		//
+		//
+		this.textFieldQuote.setNullRepresentation("");
+		param = (PIPConfigParam) this.textFieldQuote.getData();
+		if (param != null) {
+			this.textFieldQuote.setValue(param.getParamValue());
+		}
+		this.textFieldQuote.addValueChangeListener(new ValueChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void valueChange(ValueChangeEvent event) {
+				PIPConfigParam param = (PIPConfigParam) self.textFieldQuote.getData();
+				if (param == null) {
+					param = new PIPConfigParam(CSVEngine.PROP_QUOTE);
+					self.entity.getEntity().addPipconfigParam(param);
+					self.textFieldQuote.setData(param);
+				}
+				param.setParamValue(self.textFieldQuote.getValue());
+				self.fireFormChangedEvent();
+			}			
+		});
+		//
+		//
+		//
+		this.textFieldSkip.setNullRepresentation("");
+		param = (PIPConfigParam) this.textFieldSkip.getData();
+		if (param != null) {
+			this.textFieldSkip.setValue(param.getParamValue());
+		}
+		this.textFieldSkip.addValueChangeListener(new ValueChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void valueChange(ValueChangeEvent event) {
+				PIPConfigParam param = (PIPConfigParam) self.textFieldSkip.getData();
+				if (param == null) {
+					param = new PIPConfigParam(CSVEngine.PROP_SKIP);
+					self.entity.getEntity().addPipconfigParam(param);
+					self.textFieldSkip.setData(param);
+				}
+				param.setParamValue(self.textFieldSkip.getValue());
+				self.fireFormChangedEvent();
+			}			
+		});
+		this.textFieldSkip.setConverter(new StringToIntegerConverter());
+	}
+	
+	public void validate() throws InvalidValueException {
+		if (logger.isDebugEnabled()) {
+			logger.debug("validate");
+		}
+		this.textFieldFile.validate();
+		this.textFieldDelimiter.validate();
+		this.textFieldQuote.validate();
+		this.textFieldSkip.validate();
+	}
+	
+	public void commit() throws SourceException, InvalidValueException {
+		if (logger.isDebugEnabled()) {
+			logger.debug("commit");
+		}
+		this.textFieldFile.commit();
+		this.textFieldDelimiter.commit();
+		this.textFieldQuote.commit();
+		
+		if (this.textFieldSkip.getValue() == null || this.textFieldSkip.getValue().isEmpty()) {
+			this.entity.getEntity().removePipconfigParam((PIPConfigParam) this.textFieldSkip.getData());
+			this.textFieldSkip.setData(null);
+		}
+		this.textFieldSkip.commit();
+	}
+
+	public void discard() throws SourceException {
+		if (logger.isDebugEnabled()) {
+			logger.debug("discard");
+		}
+		this.textFieldFile.discard();
+		this.textFieldDelimiter.discard();
+		this.textFieldQuote.discard();
+		this.textFieldSkip.discard();
+		
+		this.entity.getEntity().getPipconfigParams().remove(CSVEngine.PROP_SOURCE);
+		this.entity.getEntity().getPipconfigParams().remove(CSVEngine.PROP_DELIMITER);
+		this.entity.getEntity().getPipconfigParams().remove(CSVEngine.PROP_QUOTE);
+		this.entity.getEntity().getPipconfigParams().remove(CSVEngine.PROP_SKIP);
+		this.entity.getEntity().getPipconfigParams().remove(CSVEngine.PROP_MAXSIZE);
+	}
+
+	@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");
+		
+		// textFieldFile
+		textFieldFile = new TextField();
+		textFieldFile.setCaption("Path to CSV File");
+		textFieldFile.setImmediate(false);
+		textFieldFile
+				.setDescription("This is the path to CSV file on the PDP node.");
+		textFieldFile.setWidth("-1px");
+		textFieldFile.setHeight("-1px");
+		textFieldFile.setInvalidAllowed(false);
+		textFieldFile.setRequired(true);
+		textFieldFile
+				.setInputPrompt("Eg. \"c:\\data.csv\" \"http://foo.com/data.csv\"");
+		mainLayout.addComponent(textFieldFile);
+		mainLayout.setExpandRatio(textFieldFile, 1.0f);
+		
+		// textFieldDelimiter
+		textFieldDelimiter = new TextField();
+		textFieldDelimiter.setCaption("Delimiter");
+		textFieldDelimiter.setImmediate(false);
+		textFieldDelimiter
+				.setDescription("Enter a separator character or string that delineates columns in each row.");
+		textFieldDelimiter.setWidth("-1px");
+		textFieldDelimiter.setHeight("-1px");
+		textFieldDelimiter.setInputPrompt("Eg. \",\" or \"|\"");
+		textFieldDelimiter.setNullSettingAllowed(true);
+		mainLayout.addComponent(textFieldDelimiter);
+		mainLayout.setExpandRatio(textFieldDelimiter, 1.0f);
+		
+		// textFieldQuote
+		textFieldQuote = new TextField();
+		textFieldQuote.setCaption("Quote");
+		textFieldQuote.setImmediate(false);
+		textFieldQuote
+				.setDescription("Enter character used for quoted elements.");
+		textFieldQuote.setWidth("-1px");
+		textFieldQuote.setHeight("-1px");
+		textFieldQuote.setInputPrompt("Eg. \" or '");
+		textFieldQuote.setNullSettingAllowed(true);
+		mainLayout.addComponent(textFieldQuote);
+		
+		// textFieldSkip
+		textFieldSkip = new TextField();
+		textFieldSkip.setCaption("Skip Lines");
+		textFieldSkip.setImmediate(false);
+		textFieldSkip
+				.setDescription("Skips the number of lines at the beginning of the file.");
+		textFieldSkip.setWidth("-1px");
+		textFieldSkip.setHeight("-1px");
+		textFieldSkip.setInputPrompt("Eg. 1 or 2");
+		mainLayout.addComponent(textFieldSkip);
+		
+		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/components/CustomPIPConfigurationComponent.java
----------------------------------------------------------------------
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CustomPIPConfigurationComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CustomPIPConfigurationComponent.java
new file mode 100644
index 0000000..043cba7
--- /dev/null
+++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CustomPIPConfigurationComponent.java
@@ -0,0 +1,200 @@
+/*
+ *  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.components;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
+import org.apache.openaz.xacml.admin.jpa.PIPResolver;
+import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener;
+import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier;
+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.ui.CustomComponent;
+import com.vaadin.ui.TextField;
+import com.vaadin.ui.VerticalLayout;
+
+public class CustomPIPConfigurationComponent extends CustomComponent implements FormChangedEventNotifier {
+
+	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
+
+	@AutoGenerated
+	private VerticalLayout mainLayout;
+	@AutoGenerated
+	private PIPParameterComponent pipParameterComponent;
+	@AutoGenerated
+	private TextField textFieldClassname;
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	private final EntityItem<?> entity;
+	private static final Log logger	= LogFactory.getLog(CustomPIPConfigurationComponent.class);
+	private final CustomPIPConfigurationComponent self = this;
+	private final BasicNotifier notifier = new BasicNotifier();
+	/**
+	 * 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 configParamField 
+	 */
+	public CustomPIPConfigurationComponent(EntityItem<PIPConfiguration> entityConfig) {
+		//
+		// Save
+		//
+		this.entity = entityConfig;
+		
+		buildMainLayout();
+		setCompositionRoot(mainLayout);
+		//
+		// InitializeGUI
+		//
+		this.initialize();
+	}
+	
+	protected void initialize() {
+		if (logger.isDebugEnabled()) {
+			logger.debug("initializing " + this.entity.getEntity().toString());
+		}
+		this.initializeEntity();
+		this.initializeText();
+	}
+	
+	protected void initializeEntity() {
+		//
+		// If the entity is persisted, then we are editing
+		// it. So don't remove anything.
+		//
+		if (this.entity.isPersistent()) {
+			return;
+		}
+		//
+		// Not sure if we really should remove stuff. To be
+		// determined later.
+		//
+	}
+	
+	protected void initializeText() {
+		this.textFieldClassname.setRequired(true);
+		this.textFieldClassname.setRequiredError("You must declare the Java classname for the PIP Factory Loader");
+		this.textFieldClassname.setImmediate(true);
+		final Object entity = this.entity.getEntity();
+		if (entity instanceof PIPConfiguration) {
+			this.textFieldClassname.setValue(((PIPConfiguration)entity).getClassname());
+		} else if (entity instanceof PIPResolver) {
+			this.textFieldClassname.setValue(((PIPResolver)entity).getClassname());
+		}
+		//
+		// Respond to events
+		//
+		this.textFieldClassname.addValueChangeListener(new ValueChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void valueChange(ValueChangeEvent event) {
+				if (entity instanceof PIPConfiguration) {
+					((PIPConfiguration) entity).setClassname(self.textFieldClassname.getValue());
+				} else if (entity instanceof PIPResolver) {
+					((PIPResolver) entity).setClassname(self.textFieldClassname.getValue());
+				}
+				self.fireFormChangedEvent();
+			}
+		});
+	}
+
+	public void validate() throws InvalidValueException {
+		if (logger.isDebugEnabled()) {
+			logger.debug("validate");
+		}
+		this.textFieldClassname.validate();
+	}
+	
+	public void commit() throws SourceException, InvalidValueException {
+		if (logger.isDebugEnabled()) {
+			logger.debug("commit");
+		}
+		this.textFieldClassname.commit();
+	}
+
+	public void discard() throws SourceException {
+		if (logger.isDebugEnabled()) {
+			logger.debug("discard");
+		}
+	}
+
+	@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(false);
+		mainLayout.setSpacing(true);
+		
+		// top-level component properties
+		setWidth("-1px");
+		setHeight("-1px");
+		
+		// textFieldClassname
+		textFieldClassname = new TextField();
+		textFieldClassname.setCaption("Java Classname");
+		textFieldClassname.setImmediate(false);
+		textFieldClassname
+				.setDescription("Java classname of the code implementing the custom PIP.");
+		textFieldClassname.setWidth("-1px");
+		textFieldClassname.setHeight("-1px");
+		textFieldClassname.setInputPrompt("Eg. com.foo.MyPIP");
+		mainLayout.addComponent(textFieldClassname);
+		mainLayout.setExpandRatio(textFieldClassname, 1.0f);
+		
+		// pipParameterComponent
+		pipParameterComponent = new PIPParameterComponent(this.entity.getEntity());
+		pipParameterComponent.setImmediate(false);
+		pipParameterComponent.setWidth("-1px");
+		pipParameterComponent.setHeight("-1px");
+		mainLayout.addComponent(pipParameterComponent);
+		
+		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/components/EnumerationEditorComponent.java
----------------------------------------------------------------------
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/EnumerationEditorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/EnumerationEditorComponent.java
new file mode 100644
index 0000000..eafbcad
--- /dev/null
+++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/EnumerationEditorComponent.java
@@ -0,0 +1,386 @@
+/*
+ *  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.components;
+
+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.ConstraintValue;
+import org.apache.openaz.xacml.api.Identifier;
+import org.apache.openaz.xacml.api.XACML3;
+import com.vaadin.annotations.AutoGenerated;
+import com.vaadin.data.Container;
+import com.vaadin.data.Item;
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.data.Validator;
+import com.vaadin.data.util.BeanItemContainer;
+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.CustomComponent;
+import com.vaadin.ui.Field;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Table;
+import com.vaadin.ui.TableFieldFactory;
+import com.vaadin.ui.TextField;
+import com.vaadin.ui.VerticalLayout;
+
+public class EnumerationEditorComponent extends CustomComponent implements Validator {
+	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
+
+	@AutoGenerated
+	private VerticalLayout mainLayout;
+
+	@AutoGenerated
+	private HorizontalLayout horizontalLayout_1;
+
+	@AutoGenerated
+	private Button buttonClearAll;
+
+	@AutoGenerated
+	private Button buttonRemove;
+
+	@AutoGenerated
+	private Button buttonAdd;
+
+	@AutoGenerated
+	private Table tableEnumerations;
+
+	private static final long serialVersionUID = -1L;
+	private static final Log logger	= LogFactory.getLog(EnumerationEditorComponent.class);
+	private final EnumerationEditorComponent self = this;
+	private final Attribute attribute;
+	private Identifier datatype;
+	private final BeanItemContainer<ConstraintValue> beanContainer;
+
+	public EnumerationEditorComponent(Attribute attribute, Identifier datatype) {
+		buildMainLayout();
+		setCompositionRoot(mainLayout);
+		//
+		// Save our attribute
+		//
+		this.attribute = attribute;
+		this.datatype = datatype;
+		//
+		// Construct a bean container that the 
+		// table uses to manage the values.
+		//
+		this.beanContainer = new BeanItemContainer<ConstraintValue>(ConstraintValue.class);
+		//
+		// Initialize our components
+		//
+		this.initializeTable();
+		this.initializeButtons();
+	}
+	
+	private void initializeTable() {
+		//
+		// Add the current enumeration values into the
+		// bean container.
+		//
+		for (ConstraintValue value : this.attribute.getConstraintValues()) {
+			if (value.getProperty().equals("Enumeration")) {
+				this.beanContainer.addBean(value);
+			}
+		}
+		//
+		// Now hook the bean container to the table
+		//
+		this.tableEnumerations.setContainerDataSource(beanContainer);
+		//
+		// We have to manually create the text field because we need
+		// to set a validator.
+		//
+		this.tableEnumerations.setTableFieldFactory(new TableFieldFactory() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public Field<?> createField(Container container, Object itemId,
+					Object propertyId, Component uiContext) {
+				if (propertyId.toString().equals("value")) {
+					final TextField text = new TextField();
+					text.setImmediate(true);
+					text.setNullRepresentation("");
+					text.setNullSettingAllowed(false);
+					text.setRequired(true);
+					text.setRequiredError("Cannot have empty enumeration values.");
+					text.addValidator(self);
+					return text;
+				}
+				return null;
+			}
+		});
+		//
+		// Finish setting up the table.
+		//
+		this.tableEnumerations.setVisibleColumns(new Object[] {"value"});
+		this.tableEnumerations.setColumnHeaders(new String[] {"Enumeration Value"});
+		this.tableEnumerations.setSelectable(true);
+		this.tableEnumerations.setEditable(true);
+		this.tableEnumerations.setImmediate(true);
+		if (this.tableEnumerations.size() == 0) {
+			this.tableEnumerations.setPageLength(3);
+		} else {
+			this.tableEnumerations.setPageLength(this.tableEnumerations.size() + 1);
+		}
+		//
+		// As the user select items, enable/disable buttons
+		//
+		this.tableEnumerations.addValueChangeListener(new ValueChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void valueChange(ValueChangeEvent event) {
+				self.buttonRemove.setEnabled(self.tableEnumerations.getValue() != null);
+			}
+			
+		});
+	}
+	
+	private void initializeButtons() {
+		//
+		// Adding new values
+		//
+		this.buttonAdd.setImmediate(true);
+		this.buttonAdd.addClickListener(new ClickListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void buttonClick(ClickEvent event) {
+				//
+				// Create a new value object
+				//
+				ConstraintValue newValue = new ConstraintValue("Enumeration", "");
+				//
+				// Associate it with the attribute
+				//
+				newValue.setAttribute(self.attribute);
+				//
+				// Add it into the attribute's internal list
+				//
+				self.attribute.addConstraintValue(newValue);
+				//
+				// Now we can add it to the GUI
+				//
+				Item item = self.tableEnumerations.addItem(newValue);
+				if (item != null) {
+					self.tableEnumerations.select(newValue);
+					self.tableEnumerations.focus();
+				}
+				//
+				// Make sure this button is now enabled
+				//
+				self.buttonClearAll.setEnabled(true);
+			}
+		});
+		//
+		// Removing values - nothing is selected to begin with so
+		// disable the button.
+		//
+		this.buttonRemove.setEnabled(false);
+		this.buttonRemove.setImmediate(true);
+		this.buttonRemove.addClickListener(new ClickListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void buttonClick(ClickEvent event) {
+				//
+				// Get the selected value
+				//
+				Object value = self.tableEnumerations.getValue();
+				//
+				// Was it selected or unselected (i.e. null)? If so, remove it
+				// from the table
+				//
+				if (value != null && self.tableEnumerations.removeItem(value)) {
+					//
+					// Dis-associate it with the attribute
+					//
+					((ConstraintValue) value).setAttribute(null);
+					//
+					// Now remove it from the attribute's internal list
+					//
+					self.attribute.removeConstraintValue((ConstraintValue) value);
+					//
+					// If there are no items, then disable this button
+					//
+					if (self.tableEnumerations.size() == 0) {
+						self.buttonClearAll.setEnabled(false);
+					}
+				}
+			}
+			
+		});
+		//
+		// Clearing all the values, set it enabled if we have anything
+		//
+		this.buttonClearAll.setImmediate(true);
+		this.buttonClearAll.setEnabled(this.tableEnumerations.size() > 0);
+		this.buttonClearAll.addClickListener(new ClickListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void buttonClick(ClickEvent event) {
+				//
+				// Iterate all the values
+				//
+				for (Object id : self.tableEnumerations.getItemIds()) {
+					//
+					// Get the value object (it is the id)
+					//
+					ConstraintValue value = (ConstraintValue) id;
+					//
+					// Dis-associate it with the attribute
+					//
+					value.setAttribute(null);
+					//
+					// Now remove it from the attribute's internal list
+					//
+					self.attribute.removeConstraintValue(value);
+				}
+				//
+				// Remove everything from the table
+				//
+				self.tableEnumerations.removeAllItems();
+				//
+				// Now disable this button
+				//
+				self.buttonClearAll.setEnabled(false);
+			}			
+		});
+	}
+	
+	public void setupDatatype(Identifier id) {
+		if (logger.isTraceEnabled()) {
+			logger.trace("setupDatatype: " + datatype);
+		}
+		this.datatype = id;
+		//
+		// Initiate a validate
+		//
+		this.tableEnumerations.validate();
+	}
+
+	@Override
+	public void validate(Object value) throws InvalidValueException {
+		if (value == null || value.toString().length() == 0) {
+			return;
+		}
+		if (datatype.equals(XACML3.ID_DATATYPE_INTEGER)) {
+			try {
+				Integer.parseInt(value.toString());
+			} catch(NumberFormatException e) {
+				throw new InvalidValueException(e.getLocalizedMessage());
+			}
+			return;
+		}
+		if (datatype.equals(XACML3.ID_DATATYPE_DOUBLE)) {
+			try {
+				Double.parseDouble(value.toString());
+			} catch(NumberFormatException e) {
+				throw new InvalidValueException(e.getLocalizedMessage());
+			}
+			return;
+		}
+	}
+	
+	@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");
+		
+		// tableEnumerations
+		tableEnumerations = new Table();
+		tableEnumerations.setCaption("Enumeration Values");
+		tableEnumerations.setImmediate(true);
+		tableEnumerations
+				.setDescription("Enter possible values for the attribute.");
+		tableEnumerations.setWidth("100.0%");
+		tableEnumerations.setHeight("-1px");
+		tableEnumerations.setInvalidAllowed(false);
+		mainLayout.addComponent(tableEnumerations);
+		mainLayout.setExpandRatio(tableEnumerations, 1.0f);
+		
+		// horizontalLayout_1
+		horizontalLayout_1 = buildHorizontalLayout_1();
+		mainLayout.addComponent(horizontalLayout_1);
+		mainLayout.setExpandRatio(horizontalLayout_1, 1.0f);
+		
+		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");
+		buttonAdd.setImmediate(true);
+		buttonAdd.setDescription("Add a new enumeration value.");
+		buttonAdd.setWidth("-1px");
+		buttonAdd.setHeight("-1px");
+		horizontalLayout_1.addComponent(buttonAdd);
+		horizontalLayout_1.setComponentAlignment(buttonAdd, new Alignment(9));
+		
+		// buttonRemove
+		buttonRemove = new Button();
+		buttonRemove.setCaption("Remove");
+		buttonRemove.setImmediate(true);
+		buttonRemove.setDescription("Remove the selected enumeration value.");
+		buttonRemove.setWidth("-1px");
+		buttonRemove.setHeight("-1px");
+		horizontalLayout_1.addComponent(buttonRemove);
+		horizontalLayout_1.setComponentAlignment(buttonRemove,
+				new Alignment(10));
+		
+		// buttonClearAll
+		buttonClearAll = new Button();
+		buttonClearAll.setCaption("Clear All");
+		buttonClearAll.setImmediate(false);
+		buttonClearAll.setDescription("Clears all the values out.");
+		buttonClearAll.setWidth("-1px");
+		buttonClearAll.setHeight("-1px");
+		horizontalLayout_1.addComponent(buttonClearAll);
+		
+		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/components/HyperCSVPIPConfigurationComponent.java
----------------------------------------------------------------------
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/HyperCSVPIPConfigurationComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/HyperCSVPIPConfigurationComponent.java
new file mode 100644
index 0000000..67f7faf
--- /dev/null
+++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/HyperCSVPIPConfigurationComponent.java
@@ -0,0 +1,339 @@
+/*
+ *  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.components;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.openaz.xacml.admin.jpa.PIPConfigParam;
+import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
+import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener;
+import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier;
+import org.apache.openaz.xacml.std.pip.engines.csv.HyperCSVEngine;
+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.event.FieldEvents.TextChangeEvent;
+import com.vaadin.event.FieldEvents.TextChangeListener;
+import com.vaadin.ui.CustomComponent;
+import com.vaadin.ui.TextField;
+import com.vaadin.ui.VerticalLayout;
+
+public class HyperCSVPIPConfigurationComponent extends CustomComponent implements FormChangedEventNotifier {
+
+	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
+
+	@AutoGenerated
+	private VerticalLayout mainLayout;
+	@AutoGenerated
+	private TextField textFieldDefinition;
+	@AutoGenerated
+	private TextField textFieldTarget;
+	@AutoGenerated
+	private TextField textFieldSource;
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	public static final String CLASSNAME = "org.apache.openaz.xacml.std.pip.engines.csv.HyperCSVEngine";
+	
+	private final EntityItem<PIPConfiguration> entity;
+	private static final Log logger	= LogFactory.getLog(CustomPIPConfigurationComponent.class);
+	private final HyperCSVPIPConfigurationComponent self = this;
+	private final BasicNotifier notifier = new BasicNotifier();
+	
+	/**
+	 * 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 HyperCSVPIPConfigurationComponent(EntityItem<PIPConfiguration> entityConfig) {
+		buildMainLayout();
+		setCompositionRoot(mainLayout);
+		//
+		// Save
+		//
+		this.entity = entityConfig;
+		//
+		// Initialize
+		//
+		this.initialize();
+	}
+
+	protected void initialize() {
+		if (logger.isDebugEnabled()) {
+			logger.debug("initializing " + this.entity.getEntity().toString());
+		}
+		//
+		// What are our current values?
+		//
+		Set<PIPConfigParam> unneeded = new HashSet<PIPConfigParam>();
+		for (PIPConfigParam param : this.entity.getEntity().getPipconfigParams()) {
+			if (param.getParamName().equals(HyperCSVEngine.PROP_SOURCE)) {
+				this.textFieldSource.setData(param);
+			} else if (param.getParamName().equals(HyperCSVEngine.PROP_TARGET)) {
+				this.textFieldTarget.setData(param);
+			} else if (param.getParamName().equals(HyperCSVEngine.PROP_DEFINITION)) {
+				this.textFieldDefinition.setData(param);
+			} else {
+				unneeded.add(param);
+			}
+		}
+		if (unneeded.isEmpty() == false) {
+			this.entity.getEntity().getPipconfigParams().removeAll(unneeded);
+		}
+		//
+		//
+		//
+		this.initializeEntity();
+		this.initializeText();
+	}
+	
+	protected void initializeEntity() {
+		//
+		// Initialize the entity
+		//
+		this.entity.getEntity().setClassname(CLASSNAME);
+		this.entity.getEntity().setRequiresResolvers(true);
+	}
+	
+	protected void initializeText() {
+		//
+		//
+		//
+		this.textFieldSource.setNullRepresentation("");
+		PIPConfigParam param = (PIPConfigParam) this.textFieldSource.getData();
+		if (param != null) {
+			this.textFieldSource.setValue(param.getParamValue());
+		}
+		this.textFieldSource.addTextChangeListener(new TextChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void textChange(TextChangeEvent event) {
+				PIPConfigParam param = (PIPConfigParam) self.textFieldSource.getData();
+				if (param == null) {
+					param = new PIPConfigParam(HyperCSVEngine.PROP_SOURCE);
+					self.entity.getEntity().addPipconfigParam(param);
+					self.textFieldSource.setData(param);
+				}
+				param.setParamValue(self.textFieldSource.getValue());
+				self.fireFormChangedEvent();
+			}
+		});
+		this.textFieldSource.addValueChangeListener(new ValueChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void valueChange(ValueChangeEvent event) {
+				PIPConfigParam param = (PIPConfigParam) self.textFieldSource.getData();
+				if (param == null) {
+					param = new PIPConfigParam(HyperCSVEngine.PROP_SOURCE);
+					self.entity.getEntity().addPipconfigParam(param);
+					self.textFieldSource.setData(param);
+				}
+				param.setParamValue(self.textFieldSource.getValue());
+				self.fireFormChangedEvent();
+			}
+		});
+		//
+		//
+		//
+		this.textFieldTarget.setNullRepresentation("");
+		param = (PIPConfigParam) this.textFieldTarget.getData();
+		if (param != null) {
+			this.textFieldTarget.setValue(param.getParamValue());
+		}
+		this.textFieldTarget.addTextChangeListener(new TextChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void textChange(TextChangeEvent event) {
+				PIPConfigParam param = (PIPConfigParam) self.textFieldTarget.getData();
+				if (param == null) {
+					param = new PIPConfigParam(HyperCSVEngine.PROP_TARGET);
+					self.entity.getEntity().addPipconfigParam(param);
+					self.textFieldTarget.setData(param);
+				}
+				param.setParamValue(self.textFieldTarget.getValue());
+				self.fireFormChangedEvent();
+			}
+		});
+		this.textFieldTarget.addValueChangeListener(new ValueChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void valueChange(ValueChangeEvent event) {
+				PIPConfigParam param = (PIPConfigParam) self.textFieldTarget.getData();
+				if (param == null) {
+					param = new PIPConfigParam(HyperCSVEngine.PROP_TARGET);
+					self.entity.getEntity().addPipconfigParam(param);
+					self.textFieldTarget.setData(param);
+				}
+				param.setParamValue(self.textFieldTarget.getValue());
+				self.fireFormChangedEvent();
+			}
+		});
+		//
+		//
+		//
+		this.textFieldDefinition.setNullRepresentation("");
+		param = (PIPConfigParam) this.textFieldDefinition.getData();
+		if (param != null) {
+			this.textFieldDefinition.setValue(param.getParamValue());
+		}
+		this.textFieldDefinition.addTextChangeListener(new TextChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void textChange(TextChangeEvent event) {
+				PIPConfigParam param = (PIPConfigParam) self.textFieldDefinition.getData();
+				if (param == null) {
+					param = new PIPConfigParam(HyperCSVEngine.PROP_DEFINITION);
+					self.entity.getEntity().addPipconfigParam(param);
+					self.textFieldDefinition.setData(param);
+				}
+				param.setParamValue(self.textFieldDefinition.getValue());
+				self.fireFormChangedEvent();
+			}
+		});
+		this.textFieldDefinition.addValueChangeListener(new ValueChangeListener() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void valueChange(ValueChangeEvent event) {
+				PIPConfigParam param = (PIPConfigParam) self.textFieldDefinition.getData();
+				if (param == null) {
+					param = new PIPConfigParam(HyperCSVEngine.PROP_DEFINITION);
+					self.entity.getEntity().addPipconfigParam(param);
+					self.textFieldDefinition.setData(param);
+				}
+				param.setParamValue(self.textFieldDefinition.getValue());
+				self.fireFormChangedEvent();
+			}
+		});
+	}
+	
+	public void validate() throws InvalidValueException {
+		if (logger.isDebugEnabled()) {
+			logger.debug("validate");
+		}
+		this.textFieldSource.validate();
+		this.textFieldTarget.validate();
+		this.textFieldDefinition.validate();
+	}
+	
+	public void commit() throws SourceException, InvalidValueException {
+		if (logger.isDebugEnabled()) {
+			logger.debug("commit");
+		}
+		this.textFieldSource.commit();
+		this.textFieldTarget.commit();
+		this.textFieldDefinition.commit();
+	}
+
+	public void discard() throws SourceException {
+		if (logger.isDebugEnabled()) {
+			logger.debug("discard");
+		}
+		this.textFieldSource.discard();
+		this.textFieldTarget.discard();
+		this.textFieldDefinition.discard();
+		//??
+		this.entity.getEntity().getPipconfigParams().remove(HyperCSVEngine.PROP_SOURCE);
+		this.entity.getEntity().getPipconfigParams().remove(HyperCSVEngine.PROP_TARGET);
+		this.entity.getEntity().getPipconfigParams().remove(HyperCSVEngine.PROP_DEFINITION);
+	}
+
+	@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(false);
+		
+		// top-level component properties
+		setWidth("-1px");
+		setHeight("-1px");
+		
+		// textFieldSource
+		textFieldSource = new TextField();
+		textFieldSource.setCaption("CSV Source File");
+		textFieldSource.setImmediate(false);
+		textFieldSource.setDescription("Path to CSV file");
+		textFieldSource.setWidth("-1px");
+		textFieldSource.setHeight("-1px");
+		textFieldSource.setInvalidAllowed(false);
+		textFieldSource.setRequired(true);
+		textFieldSource.setInputPrompt("Eg. /opt/app/data.csv");
+		mainLayout.addComponent(textFieldSource);
+		
+		// textFieldTarget
+		textFieldTarget = new TextField();
+		textFieldTarget.setCaption("Table");
+		textFieldTarget.setImmediate(false);
+		textFieldTarget.setDescription("Name of database table to be created.");
+		textFieldTarget.setWidth("-1px");
+		textFieldTarget.setHeight("-1px");
+		textFieldTarget.setInvalidAllowed(false);
+		textFieldTarget.setRequired(true);
+		mainLayout.addComponent(textFieldTarget);
+		
+		// textFieldDefinition
+		textFieldDefinition = new TextField();
+		textFieldDefinition.setCaption("Table Definition");
+		textFieldDefinition.setImmediate(false);
+		textFieldDefinition.setDescription("SQL Table Definition");
+		textFieldDefinition.setWidth("-1px");
+		textFieldDefinition.setHeight("-1px");
+		textFieldDefinition.setInvalidAllowed(false);
+		textFieldDefinition.setRequired(true);
+		mainLayout.addComponent(textFieldDefinition);
+		
+		return mainLayout;
+	}
+
+}