/** * Licensed to the Austrian Association for Software Tool Integration (AASTI) * under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright * ownership. The AASTI 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.openengsb.ui.common.usermanagement; import java.util.List; import java.util.Map; import javax.inject.Inject; import javax.inject.Named; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.panel.EmptyPanel; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; import org.openengsb.labs.delegation.service.ClassProvider; import org.openengsb.ui.common.editor.BeanEditorPanel; import org.openengsb.ui.common.usermanagement.PermissionInput.State; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.Lists; import com.google.common.collect.Maps; public abstract class PermissionEditorPanel extends Panel { private static final long serialVersionUID = 2009943701781924243L; private static final Logger LOGGER = LoggerFactory.getLogger(PermissionEditorPanel.class); private Panel editorPanel; private AjaxButton submitButton; private DropDownChoice<Class<?>> permissionTypeChoice; private Model<Class<?>> permissionTypeModel; private final Map<String, String> values = Maps.newHashMap(); private final UserInput user; private boolean createMode = true; private PermissionInput permissionInput; @Inject @Named("permissionProviders") private List<ClassProvider> providers; public PermissionEditorPanel(String id, UserInput user) { super(id); this.user = user; init(); } public PermissionEditorPanel(String id, PermissionInput permissionInput) { super(id); this.user = null; this.permissionInput = permissionInput; createMode = false; init(); } private void init() { final WebMarkupContainer container = new WebMarkupContainer("container"); add(container); container.setOutputMarkupId(true); Form<?> form = new Form<Object>("form"); container.add(form); permissionTypeModel = new Model<Class<?>>(); LoadableDetachableModel<List<Class<?>>> permissionTypeListModel = new LoadableDetachableModel<List<Class<?>>>() { private static final long serialVersionUID = -3960517945144173704L; @Override protected List<Class<?>> load() { List<Class<?>> result = Lists.newArrayList(); for (ClassProvider p : providers) { result.addAll(p.listClasses()); } return result; } }; submitButton = new AjaxButton("submitButton") { private static final long serialVersionUID = 6787520770396648012L; @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { if (createMode) { Class<?> permissionClass = permissionTypeModel.getObject(); user.getPermissions().add(new PermissionInput(permissionClass, values, State.NEW)); } else { permissionInput.setState(State.UPDATED); } editorPanel.replaceWith(new EmptyPanel("permissionEditor")); submitButton.setVisible(false); target.add(container); afterSubmit(target, form); LOGGER.info("got values {}", values.toString()); } @Override protected void onError(AjaxRequestTarget target, Form<?> form) { LOGGER.warn("Error occured during submit of form via submitButton"); } }; form.add(submitButton); submitButton.setVisible(!createMode); permissionTypeChoice = new DropDownChoice<Class<?>>("permissionTypeSelect", permissionTypeModel, permissionTypeListModel) { private static final long serialVersionUID = -9044237781077496289L; @Override public boolean isVisible() { return createMode; } }; permissionTypeChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") { private static final long serialVersionUID = 5195539410268926662L; @Override protected void onUpdate(AjaxRequestTarget target) { LOGGER.info("selected + " + permissionTypeModel.getObject()); BeanEditorPanel beanEditorPanel = new BeanEditorPanel("permissionEditor", permissionTypeModel.getObject(), values); editorPanel.replaceWith(beanEditorPanel); editorPanel = beanEditorPanel; submitButton.setVisible(true); target.add(container); } }); form.add(permissionTypeChoice); if (createMode) { editorPanel = new EmptyPanel("permissionEditor"); } else { editorPanel = new BeanEditorPanel("permissionEditor", permissionInput.getType(), permissionInput.getValues()); } form.add(editorPanel); } protected abstract void afterSubmit(AjaxRequestTarget target, Form<?> form); }