/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * Copyright (C) 2011-2012 Eugene Fradkin (eugene.fradkin@gmail.com) * * Licensed 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.jkiss.dbeaver.ext.mysql.editors; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.*; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.core.DBeaverUI; import org.jkiss.dbeaver.ext.mysql.MySQLMessages; import org.jkiss.dbeaver.ext.mysql.controls.PrivilegeTableControl; import org.jkiss.dbeaver.ext.mysql.edit.MySQLCommandGrantPrivilege; import org.jkiss.dbeaver.ext.mysql.edit.UserPropertyHandler; import org.jkiss.dbeaver.ext.mysql.model.MySQLGrant; import org.jkiss.dbeaver.ext.mysql.model.MySQLPrivilege; import org.jkiss.dbeaver.ext.mysql.model.MySQLUser; import org.jkiss.dbeaver.model.edit.DBECommandReflector; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.ui.LoadingJob; import org.jkiss.dbeaver.ui.editors.ControlPropertyCommandListener; import org.jkiss.dbeaver.model.impl.edit.DBECommandAdapter; import org.jkiss.dbeaver.model.runtime.load.DatabaseLoadService; import org.jkiss.dbeaver.ui.UIUtils; import java.lang.reflect.InvocationTargetException; import java.util.Iterator; import java.util.List; /** * MySQLUserEditorGeneral */ public class MySQLUserEditorGeneral extends MySQLUserEditorAbstract { //static final Log log = Log.getLog(MySQLUserEditorGeneral.class); public static final String DEF_PASSWORD_VALUE = "**********"; //$NON-NLS-1$ private PageControl pageControl; private boolean isLoaded; private PrivilegeTableControl privTable; private boolean newUser; private Text userNameText; private Text hostText; private CommandListener commandlistener; @Override public void createPartControl(Composite parent) { pageControl = new PageControl(parent); Composite container = UIUtils.createPlaceholder(pageControl, 2, 5); GridData gd = new GridData(GridData.FILL_VERTICAL); container.setLayoutData(gd); newUser = !getDatabaseObject().isPersisted(); { Composite loginGroup = UIUtils.createControlGroup(container, MySQLMessages.editors_user_editor_general_group_login, 2, GridData.HORIZONTAL_ALIGN_BEGINNING, 200); userNameText = UIUtils.createLabelText(loginGroup, MySQLMessages.editors_user_editor_general_label_user_name, getDatabaseObject().getUserName()); userNameText.setEditable(newUser); if (newUser) { ControlPropertyCommandListener.create(this, userNameText, UserPropertyHandler.NAME); } hostText = UIUtils.createLabelText(loginGroup, MySQLMessages.editors_user_editor_general_label_host, getDatabaseObject().getHost()); hostText.setEditable(newUser); if (newUser) { ControlPropertyCommandListener.create(this, hostText, UserPropertyHandler.HOST); } String password = newUser ? "" : DEF_PASSWORD_VALUE; //$NON-NLS-1$ Text passwordText = UIUtils.createLabelText(loginGroup, MySQLMessages.editors_user_editor_general_label_password, password, SWT.BORDER | SWT.PASSWORD); ControlPropertyCommandListener.create(this, passwordText, UserPropertyHandler.PASSWORD); Text confirmText = UIUtils.createLabelText(loginGroup, MySQLMessages.editors_user_editor_general_label_confirm, password, SWT.BORDER | SWT.PASSWORD); ControlPropertyCommandListener.create(this, confirmText, UserPropertyHandler.PASSWORD_CONFIRM); } { Composite limitsGroup = UIUtils.createControlGroup(container, MySQLMessages.editors_user_editor_general_group_limits, 2, GridData.HORIZONTAL_ALIGN_BEGINNING, 0); Spinner maxQueriesText = UIUtils.createLabelSpinner(limitsGroup, MySQLMessages.editors_user_editor_general_spinner_max_queries, getDatabaseObject().getMaxQuestions(), 0, Integer.MAX_VALUE); ControlPropertyCommandListener.create(this, maxQueriesText, UserPropertyHandler.MAX_QUERIES); Spinner maxUpdatesText = UIUtils.createLabelSpinner(limitsGroup, MySQLMessages.editors_user_editor_general_spinner_max_updates, getDatabaseObject().getMaxUpdates(), 0, Integer.MAX_VALUE); ControlPropertyCommandListener.create(this, maxUpdatesText, UserPropertyHandler.MAX_UPDATES); Spinner maxConnectionsText = UIUtils.createLabelSpinner(limitsGroup, MySQLMessages.editors_user_editor_general_spinner_max_connections, getDatabaseObject().getMaxConnections(), 0, Integer.MAX_VALUE); ControlPropertyCommandListener.create(this, maxConnectionsText, UserPropertyHandler.MAX_CONNECTIONS); Spinner maxUserConnectionsText = UIUtils.createLabelSpinner(limitsGroup, MySQLMessages.editors_user_editor_general_spinner_max_user_connections, getDatabaseObject().getMaxUserConnections(), 0, Integer.MAX_VALUE); ControlPropertyCommandListener.create(this, maxUserConnectionsText, UserPropertyHandler.MAX_USER_CONNECTIONS); } { privTable = new PrivilegeTableControl(container, MySQLMessages.editors_user_editor_general_control_dba_privileges); gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = 2; privTable.setLayoutData(gd); privTable.addListener(SWT.Modify, new Listener() { @Override public void handleEvent(Event event) { final MySQLPrivilege privilege = (MySQLPrivilege) event.data; final boolean grant = event.detail == 1; addChangeCommand( new MySQLCommandGrantPrivilege( getDatabaseObject(), grant, null, null, privilege), new DBECommandReflector<MySQLUser, MySQLCommandGrantPrivilege>() { @Override public void redoCommand(MySQLCommandGrantPrivilege mySQLCommandGrantPrivilege) { if (!privTable.isDisposed()) { privTable.checkPrivilege(privilege, grant); } } @Override public void undoCommand(MySQLCommandGrantPrivilege mySQLCommandGrantPrivilege) { if (!privTable.isDisposed()) { privTable.checkPrivilege(privilege, !grant); } } }); } }); } pageControl.createProgressPanel(); commandlistener = new CommandListener(); getEditorInput().getCommandContext().addCommandListener(commandlistener); } @Override public void dispose() { if (commandlistener != null) { getEditorInput().getCommandContext().removeCommandListener(commandlistener); } super.dispose(); } @Override public void activatePart() { if (isLoaded) { return; } isLoaded = true; LoadingJob.createService( new DatabaseLoadService<List<MySQLPrivilege>>(MySQLMessages.editors_user_editor_general_service_load_catalog_privileges, getExecutionContext()) { @Override public List<MySQLPrivilege> evaluate(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { final List<MySQLPrivilege> privList = getDatabaseObject().getDataSource().getPrivilegesByKind(monitor, MySQLPrivilege.Kind.ADMIN); for (Iterator<MySQLPrivilege> iterator = privList.iterator(); iterator.hasNext(); ) { MySQLPrivilege priv = iterator.next(); // Remove proxy (it is not singleton) if (priv.getName().equalsIgnoreCase("proxy")) { iterator.remove(); } } return privList; } catch (DBException e) { throw new InvocationTargetException(e); } } }, pageControl.createLoadVisualizer()) .schedule(); } @Override protected PageControl getPageControl() { return pageControl; } @Override protected void processGrants(List<MySQLGrant> grants) { privTable.fillGrants(grants); } @Override public void refreshPart(Object source, boolean force) { // do nothing } private class PageControl extends UserPageControl { public PageControl(Composite parent) { super(parent); } public ProgressVisualizer<List<MySQLPrivilege>> createLoadVisualizer() { return new ProgressVisualizer<List<MySQLPrivilege>>() { @Override public void completeLoading(List<MySQLPrivilege> privs) { super.completeLoading(privs); privTable.fillPrivileges(privs); loadGrants(); } }; } } private class CommandListener extends DBECommandAdapter { @Override public void onSave() { if (newUser && getDatabaseObject().isPersisted()) { newUser = false; DBeaverUI.asyncExec(new Runnable() { @Override public void run() { userNameText.setEditable(false); hostText.setEditable(false); } }); } } } }