blob: 7529e70b96acee8dce1a1e34d90c65664442e340 [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.components;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.openaz.xacml.admin.XacmlAdminUI;
import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
import org.apache.openaz.xacml.admin.jpa.PIPResolver;
import org.apache.openaz.xacml.admin.view.windows.PIPResolverEditorWindow;
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.vaadin.addon.jpacontainer.EntityItem;
import com.vaadin.addon.jpacontainer.JPAContainer;
import com.vaadin.addon.jpacontainer.provider.CachingMutableLocalEntityProvider;
import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.util.filter.Compare;
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.CustomComponent;
import com.vaadin.ui.Table;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window.CloseEvent;
import com.vaadin.ui.Window.CloseListener;
public class PIPResolverComponent extends CustomComponent {
/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
@AutoGenerated
private VerticalLayout mainLayout;
@AutoGenerated
private Table tableResolvers;
private final Action ADD_RESOLVER = new Action("Add Resolver");
private final Action EDIT_RESOLVER = new Action("Edit Resolver");
private final Action CLONE_RESOLVER = new Action("Clone Resolver");
private final Action REMOVE_RESOLVER = new Action("Remove Resolver");
private static final long serialVersionUID = 1L;
private static final Log logger = LogFactory.getLog(PIPResolverComponent.class);
private final PIPResolverComponent self = this;
private final PIPConfiguration config;
private final JPAContainer<PIPResolver> resolverContainer = new JPAContainer<PIPResolver>(PIPResolver.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 PIPResolverComponent(PIPConfiguration configuration) {
buildMainLayout();
setCompositionRoot(mainLayout);
//
// Save
//
this.config = configuration;
this.resolverContainer.setEntityProvider(new CachingMutableLocalEntityProvider<PIPResolver>(PIPResolver.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
this.resolverContainer.addContainerFilter(new Compare.Equal("pipconfiguration", this.config));
//
// Initialize GUI
//
this.initializeTable();
}
protected void initializeTable() {
//
// Setup the container datasource
//
this.tableResolvers.setContainerDataSource(this.resolverContainer);
//
// Set GUI properties
//
this.tableResolvers.setImmediate(true);
this.tableResolvers.setVisibleColumns(new Object[] {"name", "description", "issuer"});
this.tableResolvers.setColumnHeaders(new String[] {"Name", "Description", "Issuer"});
this.tableResolvers.setPageLength(this.config.getPipresolvers().size() + 1);
this.tableResolvers.setSizeFull();
this.tableResolvers.setSelectable(true);
//
// Add the actions
//
this.tableResolvers.addActionHandler(new Handler() {
private static final long serialVersionUID = 1L;
@Override
public Action[] getActions(Object target, Object sender) {
if (target == null) {
return new Action[] {ADD_RESOLVER};
}
return new Action[] {EDIT_RESOLVER, CLONE_RESOLVER, REMOVE_RESOLVER};
}
@Override
public void handleAction(Action action, Object sender, Object target) {
if (action == ADD_RESOLVER) {
PIPResolverComponent.addResolver(self.config, null);
return;
}
if (action == EDIT_RESOLVER) {
PIPResolverComponent.editResolver(self.resolverContainer.getItem(target));
return;
}
if (action == CLONE_RESOLVER) {
PIPResolverComponent.addResolver(self.config, self.resolverContainer.getItem(target).getEntity());
return;
}
if (action == REMOVE_RESOLVER) {
self.removeResolver(self.config, self.resolverContainer.getItem(target).getEntity());
return;
}
}
});
//
// Respond to events
//
this.tableResolvers.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) {
return;
}
PIPResolverComponent.editResolver(self.resolverContainer.getItem(id));
}
}
});
}
protected void removeResolver(PIPConfiguration config, PIPResolver resolver) {
config.removePipresolver(resolver);
this.tableResolvers.removeItem(resolver.getId());
}
public static void addResolver(PIPConfiguration config, PIPResolver pipResolver) {
//
// Create the entity
//
PIPResolver resolver = null;
if (pipResolver != null) {
resolver = new PIPResolver(pipResolver);
} else {
resolver = new PIPResolver();
}
resolver.setCreatedBy(((XacmlAdminUI)UI.getCurrent()).getUserid());
resolver.setModifiedBy(((XacmlAdminUI)UI.getCurrent()).getUserid());
resolver.setPipconfiguration(config);
//
// Set its default class
//
if (config.getPiptype().isSQL()) {
resolver.setClassname(ConfigurableJDBCResolver.class.getCanonicalName());
} else if (config.getPiptype().isLDAP()) {
resolver.setClassname(ConfigurableLDAPResolver.class.getCanonicalName());
} else if (config.getPiptype().isCSV()) {
resolver.setClassname(ConfigurableCSVResolver.class.getCanonicalName());
} else if (config.getPiptype().isHyperCSV()) {
resolver.setClassname(ConfigurableJDBCResolver.class.getCanonicalName());
}
//
// Bring up the editor window
//
PIPResolverComponent.editResolver(((XacmlAdminUI)UI.getCurrent()).getPIPResolvers().createEntityItem(resolver));
}
public static void editResolver(final EntityItem<PIPResolver> entity) {
final PIPResolverEditorWindow window = new PIPResolverEditorWindow(entity);
window.setModal(true);
window.center();
if (entity.isPersistent()) {
window.setCaption("Edit Resolver");
} else {
window.setCaption("Create Resolver");
}
window.addCloseListener(new CloseListener() {
private static final long serialVersionUID = 1L;
@Override
public void windowClose(CloseEvent e) {
//
// Did the user click "save"?
//
if (window.isSaved() == false) {
return;
}
//
// Adding a new entity?
//
if (entity.isPersistent() == false) {
//
// Yes - let's official add it
//
((XacmlAdminUI)UI.getCurrent()).getPIPResolvers().addEntity(entity.getEntity());
((XacmlAdminUI)UI.getCurrent()).refreshPIPConfiguration();
}
}
});
UI.getCurrent().addWindow(window);
}
public static void publishConfiguration(EntityItem<PIPConfiguration> config) {
Properties properties = config.getEntity().generateProperties(Integer.toString(config.getEntity().getId()));
try {
ByteArrayOutputStream os = new ByteArrayOutputStream();
properties.store(os, "");
if (logger.isDebugEnabled()) {
logger.debug(os.toString());
}
} catch (IOException e) { //NOPMD
// TODO - Handle, Log or NOPMD
// TODO - Will vaadin display error?
}
}
@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");
// tableResolvers
tableResolvers = new Table();
tableResolvers.setCaption("Resolvers");
tableResolvers.setImmediate(false);
tableResolvers.setWidth("-1px");
tableResolvers.setHeight("-1px");
mainLayout.addComponent(tableResolvers);
return mainLayout;
}
}