blob: 292fef8a1223a06c640905da53caa102f6d393fb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2014 EclipseSource Muenchen GmbH and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Edgar Mueller - initial API and implementation
******************************************************************************/
package org.eclipse.emf.emfstore.internal.client.ui.dialogs.admin.action;
import java.text.MessageFormat;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.eclipse.emf.emfstore.internal.client.model.AdminBroker;
import org.eclipse.emf.emfstore.internal.client.ui.dialogs.EMFStoreMessageDialog;
import org.eclipse.emf.emfstore.internal.client.ui.dialogs.admin.Messages;
import org.eclipse.emf.emfstore.internal.client.ui.dialogs.admin.PropertiesForm;
import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.ACOrgUnit;
import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.ACOrgUnitId;
import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.ACUser;
import org.eclipse.emf.emfstore.server.exceptions.ESException;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableItem;
/**
* Abstract action for creating {@link ACOrgUnit}s.
*
* @author emueller
*
*/
public abstract class CreateOrgUnitAction extends Action {
private final AdminBroker adminBroker;
private final TableViewer tableViewer;
private final PropertiesForm form;
/**
* Constructor.
*
* @param title
* the action title
* @param adminBroker
* the {@link AdminBroker} responsible for creating the {@link ACOrgUnit}
* @param tableViewer
* the {@link TableViewer} listing all available {@link ACOrgUnit}s
* @param form
* the {@link PropertiesForm} that will display the details of the created {@link ACOrgUnit}
*/
public CreateOrgUnitAction(String title, AdminBroker adminBroker, TableViewer tableViewer, PropertiesForm form) {
super(title);
this.adminBroker = adminBroker;
this.tableViewer = tableViewer;
this.form = form;
}
@Override
public void run() {
ACOrgUnitId newUserId = null;
try {
final Shell shell = Display.getCurrent().getActiveShell();
final NewOrgUnitDialog newUserDialog = new NewOrgUnitDialog(shell, getInputFieldNames());
if (newUserDialog.open() == Window.CANCEL) {
return;
}
boolean hasEmptyField = false;
for (final String fieldName : getInputFieldNames()) {
if (StringUtils.isBlank(newUserDialog.getFieldValue(fieldName))) {
hasEmptyField = true;
openEmptyInputDialog(shell, fieldName);
break;
}
}
if (hasEmptyField) {
return;
}
if (orgUnitExists(getPrimaryFieldName())) {
openOrgUnitExistsDialog(shell, getPrimaryFieldName());
} else {
newUserId = createOrgUnit(getFieldValues(newUserDialog));
}
} catch (final ESException e) {
EMFStoreMessageDialog.showExceptionDialog(e);
}
if (newUserId != null) {
tableViewer.refresh();
final TableItem[] items = tableViewer.getTable().getItems();
int index = -1;
for (final TableItem tableItem : items) {
if (!ACOrgUnit.class.isInstance(tableItem.getData())) {
continue;
}
final ACOrgUnit orgUnit = ACOrgUnit.class.cast(tableItem.getData());
if (orgUnit.getId().equals(newUserId)) {
index = tableViewer.getTable().indexOf(tableItem);
form.setInput(orgUnit);
break;
}
}
form.getTableViewer().refresh();
tableViewer.getTable().deselectAll();
tableViewer.getTable().select(index);
}
}
/**
* @param newUserDialog
* @return
*/
private Map<String, String> getFieldValues(final NewOrgUnitDialog newUserDialog) {
final Map<String, String> fieldValues = new LinkedHashMap<String, String>();
for (final String fieldName : getInputFieldNames()) {
fieldValues.put(fieldName, newUserDialog.getFieldValue(fieldName));
}
return fieldValues;
}
private boolean orgUnitExists(String username) {
try {
for (final ACUser user : adminBroker.getUsers()) {
if (user.getName().equals(username)) {
return true;
}
}
} catch (final ESException ex) {
return false;
}
return false;
}
private void openOrgUnitExistsDialog(Shell shell, String username) {
MessageDialog
.openInformation(shell,
Messages.UserTabContent_User_Exists,
Messages.UserTabContent_User_With_Given_Name
+ "'" + username + "'" //$NON-NLS-1$ //$NON-NLS-2$
+ Messages.UserTabContent_Already_Exists);
}
private void openEmptyInputDialog(Shell shell, String fieldName) {
MessageDialog
.openWarning(shell,
Messages.CreateOrgUnitAction_EmptyInput,
MessageFormat.format(
Messages.CreateOrgUnitAction_EmptyField, fieldName));
}
/**
* @return the adminBroker
*/
public AdminBroker getAdminBroker() {
return adminBroker;
}
/**
* Returns the field that is used to identify a {@link ACOrgUnit} such as the name.
*
* @return the field that is used to identify a ACOrgUnit
*/
protected abstract String getPrimaryFieldName();
/**
* Returns the name of the organizational unit.
* Will be used to label the input dialog and such.
*
* @return a stirng describing the organizational unit
*/
protected abstract String orgUnitName();
/**
* Call that is responsible for actually creating the {@link ACOrgUnit}.
*
* @param fieldValues
* a mapping from field names to their values
* @return the created ACOrgUnit
* @throws ESException
* in case creation of the ACOrgUnit failed
*/
protected abstract ACOrgUnitId createOrgUnit(Map<String, String> fieldValues) throws ESException;
/**
* Returns all fields that are necessary for creating a {@link ACOrgUnit}.
* For each field a corresponding text field will be created in the
* input dialog that holds the information about the create user.
*
* @return all fields that are necessary for creating a {@link ACOrgUnit}
*/
protected abstract Set<String> getInputFieldNames();
}