Search in sources :

Example 21 with DatabaseEditorConfig

use of com.cubrid.common.ui.spi.model.DatabaseEditorConfig in project cubrid-manager by CUBRID.

the class ShortSettingEditorConfigDialog method okPressed.

protected void okPressed() {
    RGB selectedColor = colorCombo.getSelectedColor();
    if (editorConfig == null) {
        editorConfig = new DatabaseEditorConfig();
    }
    editorConfig.setBackGround(selectedColor);
    super.okPressed();
}
Also used : RGB(org.eclipse.swt.graphics.RGB) DatabaseEditorConfig(com.cubrid.common.ui.spi.model.DatabaseEditorConfig)

Example 22 with DatabaseEditorConfig

use of com.cubrid.common.ui.spi.model.DatabaseEditorConfig in project cubrid-manager by CUBRID.

the class LoginDatabaseAction method doRun.

public void doRun(CubridDatabase[] databaseArray) {
    if (databaseArray == null || databaseArray.length == 0) {
        return;
    }
    CubridNavigatorView navigationView = CubridNavigatorView.findNavigationView();
    if (navigationView != null && databaseArray.length > 0) {
        final TreeViewer treeViewer = navigationView.getViewer();
        if (databaseArray.length > 1) {
            List<MultiDatabaseloginFailedInfo> failedDatabaseList = new ArrayList<MultiDatabaseloginFailedInfo>();
            for (CubridDatabase object : databaseArray) {
                CubridDatabase database = (CubridDatabase) object;
                String errMsg = null;
                if (database.isAutoSavePassword()) {
                    errMsg = CubridWorkbenchContrItem.connectDatabaseWithErrMsg(database.getDatabaseInfo(), false);
                } else {
                    errMsg = "Incorrect or missing password.";
                }
                if (errMsg == null) {
                    database.getLoader().setLoaded(false);
                    database.setLogined(true);
                    treeViewer.refresh(database, true);
                    treeViewer.expandToLevel(database, 1);
                    ActionManager.getInstance().fireSelectionChanged(treeViewer.getSelection());
                    LayoutManager.getInstance().fireSelectionChanged(treeViewer.getSelection());
                    CubridNodeManager.getInstance().fireCubridNodeChanged(new CubridNodeChangedEvent(database, CubridNodeChangedEventType.DATABASE_LOGIN));
                    // open database dashboard
                    if (GeneralPreference.isUseDatabaseDashboard()) {
                        LayoutManager.getInstance().getWorkbenchContrItem().openEditorOrView(database);
                    }
                } else {
                    failedDatabaseList.add(new MultiDatabaseloginFailedInfo(database, errMsg));
                }
            }
            if (failedDatabaseList.size() > 0) {
                MultiDatabaseLoginFailedDialog dialog = new MultiDatabaseLoginFailedDialog(getShell(), failedDatabaseList);
                dialog.open();
            }
            return;
        } else {
            CubridDatabase database = databaseArray[0];
            if (DbRunningType.STANDALONE.equals(database.getRunningType()) && ActionSupportUtil.hasAdminPermissionOnStopState(database)) {
                if (CommonUITool.openConfirmBox(Messages.bind(Messages.msgWhetherStartDB, database.getName()))) {
                    StartDatabaseAction startDatabaseAction = (StartDatabaseAction) ActionManager.getInstance().getAction(StartDatabaseAction.ID);
                    startDatabaseAction.doRun(new CubridDatabase[] { database });
                }
            }
            if (!database.isLogined() && database.isAutoSavePassword()) {
                DatabaseEditorConfig editorConfig = QueryOptions.getEditorConfig(database, true);
                if (EditorConstance.isNeedSetBackground(editorConfig)) {
                    new ShortSetEditorConfigAction(database).run();
                }
            }
            if (!database.isLogined() && database.isAutoSavePassword() && CubridWorkbenchContrItem.connectDatabase(database.getDatabaseInfo(), true)) {
                database.getLoader().setLoaded(false);
                database.setLogined(true);
                treeViewer.refresh(database, true);
                treeViewer.expandToLevel(database, 1);
                ActionManager.getInstance().fireSelectionChanged(treeViewer.getSelection());
                LayoutManager.getInstance().fireSelectionChanged(treeViewer.getSelection());
                CubridNodeManager.getInstance().fireCubridNodeChanged(new CubridNodeChangedEvent(database, CubridNodeChangedEventType.DATABASE_LOGIN));
                // open database dashboard
                if (GeneralPreference.isUseDatabaseDashboard()) {
                    LayoutManager.getInstance().getWorkbenchContrItem().openEditorOrView(database);
                }
            } else if (!database.isLogined()) {
                EditDatabaseLoginAction editDatabaseLoginAction = (EditDatabaseLoginAction) ActionManager.getInstance().getAction(EditDatabaseLoginAction.ID);
                editDatabaseLoginAction.doRun(databaseArray);
            }
        }
    }
}
Also used : TreeViewer(org.eclipse.jface.viewers.TreeViewer) ArrayList(java.util.ArrayList) MultiDatabaseloginFailedInfo(com.cubrid.cubridmanager.ui.cubrid.database.dialog.MultiDatabaseloginFailedInfo) CubridNodeChangedEvent(com.cubrid.common.ui.spi.event.CubridNodeChangedEvent) CubridNavigatorView(com.cubrid.common.ui.common.navigator.CubridNavigatorView) ShortSetEditorConfigAction(com.cubrid.cubridmanager.ui.common.action.ShortSetEditorConfigAction) MultiDatabaseLoginFailedDialog(com.cubrid.cubridmanager.ui.cubrid.database.dialog.MultiDatabaseLoginFailedDialog) CubridDatabase(com.cubrid.common.ui.spi.model.CubridDatabase) DatabaseEditorConfig(com.cubrid.common.ui.spi.model.DatabaseEditorConfig)

Example 23 with DatabaseEditorConfig

use of com.cubrid.common.ui.spi.model.DatabaseEditorConfig in project cubrid-manager by CUBRID.

the class LoginDatabaseDialog method createDialogArea.

protected Control createDialogArea(Composite parent) {
    Composite parentComp = (Composite) super.createDialogArea(parent);
    final Composite composite = new Composite(parentComp, SWT.NONE);
    composite.setLayoutData(new GridData(GridData.FILL_BOTH));
    GridLayout layout = new GridLayout();
    layout.numColumns = 5;
    layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
    layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
    layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
    layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
    composite.setLayout(layout);
    Label userNameLabel = new Label(composite, SWT.LEFT);
    userNameLabel.setText(Messages.lblDbUserName);
    userNameLabel.setLayoutData(CommonUITool.createGridData(1, 1, -1, -1));
    userNameText = new Text(composite, SWT.LEFT | SWT.BORDER);
    if (database != null && database.getUserName() != null) {
        userNameText.setText(database.getUserName());
    }
    userNameText.addModifyListener(this);
    userNameText.setLayoutData(CommonUITool.createGridData(GridData.FILL_HORIZONTAL, 4, 1, 100, -1));
    userNameText.setFocus();
    Label passwordLabel = new Label(composite, SWT.LEFT);
    passwordLabel.setText(Messages.lblDbPassword);
    passwordLabel.setLayoutData(CommonUITool.createGridData(1, 1, -1, -1));
    passwordText = new Text(composite, SWT.LEFT | SWT.PASSWORD | SWT.BORDER);
    passwordText.setTextLimit(ValidateUtil.MAX_PASSWORD_LENGTH);
    passwordText.setLayoutData(CommonUITool.createGridData(GridData.FILL_HORIZONTAL, 4, 1, 100, -1));
    if (database != null && database.getPassword() != null && database.isAutoSavePassword()) {
        passwordText.setText(database.getPassword());
    }
    if (database != null && database.getUserName() != null) {
        passwordText.selectAll();
        passwordText.setFocus();
    }
    new Composite(composite, SWT.NONE).setLayoutData(CommonUITool.createGridData(1, 1, 0, 0));
    Button btnSavePassword = new Button(composite, SWT.CHECK);
    btnSavePassword.setLayoutData(CommonUITool.createGridData(GridData.HORIZONTAL_ALIGN_FILL, 1, 1, -1, -1));
    btnSavePassword.setText(Messages.btnSavePassword);
    if (database == null) {
        btnSavePassword.setSelection(true);
        isSavePassword = true;
    } else {
        btnSavePassword.setSelection(database.isAutoSavePassword());
        isSavePassword = database.isAutoSavePassword();
    }
    btnSavePassword.addSelectionListener(new SelectionAdapter() {

        public void widgetSelected(SelectionEvent event) {
            isSavePassword = !isSavePassword;
        }
    });
    Label backgroundLabel = new Label(composite, SWT.None);
    backgroundLabel.setText(Messages.lblBackground);
    backgroundLabel.setLayoutData(CommonUITool.createGridData(GridData.HORIZONTAL_ALIGN_END | GridData.FILL_HORIZONTAL, 1, 1, -1, -1));
    DatabaseEditorConfig editorConfig = QueryOptions.getEditorConfig(database, true);
    RGB selectedColor = null;
    if (editorConfig != null) {
        selectedColor = editorConfig.getBackGround();
    } else {
        selectedColor = EditorConstance.getDefaultBackground();
    }
    selectColorCombo = new SelectColorCombo(composite, SWT.BORDER, selectedColor);
    selectColorCombo.setLayoutData(CommonUITool.createGridData(GridData.HORIZONTAL_ALIGN_END, 2, 1, 110, -1));
    Label commentLabel = new Label(composite, SWT.None);
    commentLabel.setText(Messages.lblComment);
    commentLabel.setLayoutData(CommonUITool.createGridData(GridData.HORIZONTAL_ALIGN_BEGINNING, 1, 1, -1, -1));
    commentText = new Text(composite, SWT.BORDER);
    commentText.setLayoutData(CommonUITool.createGridData(GridData.FILL_HORIZONTAL, 4, 1, -1, -1));
    commentText.setTextLimit(64);
    if (editorConfig != null) {
        commentText.setText(StringUtil.nvl(editorConfig.getDatabaseComment()));
    }
    new Label(composite, SWT.None);
    Label commentDescLabel = new Label(composite, SWT.None);
    commentDescLabel.setText(Messages.lblDescComment);
    commentDescLabel.setLayoutData(CommonUITool.createGridData(GridData.HORIZONTAL_ALIGN_BEGINNING, 4, 1, -1, -1));
    final Group brokerGroup = new Group(composite, SWT.NONE);
    {
        brokerGroup.setText(com.cubrid.common.ui.query.Messages.brokerGrp);
        brokerGroup.setLayoutData(CommonUITool.createGridData(GridData.FILL_HORIZONTAL, 5, 1, -1, -1));
        GridLayout brokerLayout = new GridLayout();
        brokerLayout.numColumns = 3;
        brokerLayout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
        brokerLayout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
        brokerLayout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
        brokerLayout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
        brokerGroup.setLayout(brokerLayout);
        final Label labelBrokerIp = new Label(brokerGroup, SWT.NONE);
        labelBrokerIp.setLayoutData(CommonUITool.createGridData(1, 1, -1, -1));
        labelBrokerIp.setText(com.cubrid.common.ui.query.Messages.brokerIP);
        brokerIpText = new Text(brokerGroup, SWT.BORDER);
        brokerIpText.setLayoutData(CommonUITool.createGridData(GridData.FILL_HORIZONTAL, 2, 1, -1, -1));
        final Label labelBrokerPort = new Label(brokerGroup, SWT.NONE);
        labelBrokerPort.setLayoutData(CommonUITool.createGridData(1, 1, -1, -1));
        labelBrokerPort.setText(com.cubrid.common.ui.query.Messages.brokerPort);
        brokerPortCombo = new Combo(brokerGroup, SWT.NONE);
        brokerPortCombo.setLayoutData(CommonUITool.createGridData(GridData.FILL_HORIZONTAL, 2, 1, -1, -1));
        BrokerInfos brokerInfos = database.getServer().getServerInfo().getBrokerInfos();
        BrokerInfoList bis = brokerInfos == null ? null : brokerInfos.getBorkerInfoList();
        if (bis != null) {
            List<BrokerInfo> brokerInfoList = bis.getBrokerInfoList();
            for (BrokerInfo brokerInfo : brokerInfoList) {
                if (StringUtil.isEmpty(brokerInfo.getPort())) {
                    continue;
                }
                String status = "";
                if (!StringUtil.isEqualIgnoreCase(brokerInfos.getBrokerstatus(), "ON")) {
                    status = "OFF";
                } else {
                    status = !StringUtil.isEqualIgnoreCase(brokerInfo.getState(), "ON") ? "OFF" : "ON";
                }
                String text = brokerInfo.getName() + "[" + brokerInfo.getPort() + "/" + status + "]";
                brokerPortCombo.add(text);
                brokerPortCombo.setData(brokerInfo.getPort(), text);
                brokerPortCombo.setData(text, brokerInfo);
            }
        }
        Label charSetLbl = new Label(brokerGroup, SWT.CHECK);
        charSetLbl.setLayoutData(CommonUITool.createGridData(1, 1, -1, -1));
        charSetLbl.setText(com.cubrid.common.ui.query.Messages.lblCharSet);
        charsetCombo = new Combo(brokerGroup, SWT.BORDER);
        charsetCombo.setLayoutData(CommonUITool.createGridData(GridData.FILL_HORIZONTAL, 1, 1, -1, -1));
        Button testConnectionButton = new Button(brokerGroup, SWT.None);
        testConnectionButton.setText(com.cubrid.common.ui.query.Messages.btnTestConnection);
        testConnectionButton.setLayoutData(CommonUITool.createGridData(1, 1, -1, -1));
        testConnectionButton.addSelectionListener(new SelectionListener() {

            public void widgetSelected(SelectionEvent e) {
                widgetDefaultSelected(e);
            }

            public void widgetDefaultSelected(SelectionEvent e) {
                final String dbUser = userNameText.getText();
                final String dbPassword = passwordText.getText();
                final DatabaseInfo dbInfo = database.getDatabaseInfo();
                final String brokerIP = brokerIpText.getText();
                final String brokerPort = getBrokerPort();
                final String dbName = dbInfo.getDbName();
                final ServerInfo serverInfo = dbInfo.getServerInfo();
                final String charset = dbInfo.getCharSet();
                final String driverVersion = serverInfo.getJdbcDriverVersion();
                // advanced jdbc settings
                final String jdbcAttrs = attrText.getText();
                final boolean isShard = dbInfo.isShard();
                TaskExecutor taskExcutor = new ConnectDatabaseExecutor(brokerIP, brokerPort, dbName, dbUser, dbPassword, charset, jdbcAttrs, driverVersion, false, isShard);
                new ExecTaskWithProgress(taskExcutor).exec();
                if (taskExcutor.isSuccess()) {
                    CommonUITool.openInformationBox(Messages.titleSuccess, Messages.msgTestConnSuccess);
                }
            }
        });
    }
    Group advancedOptionGroup = new Group(composite, SWT.NONE);
    {
        advancedOptionGroup.setText(Messages.grpAdvancedJDBC);
        advancedOptionGroup.setLayoutData(CommonUITool.createGridData(GridData.FILL_HORIZONTAL, 5, 1, -1, -1));
        GridLayout brokerInfoGroupLayout = new GridLayout();
        brokerInfoGroupLayout.numColumns = 3;
        advancedOptionGroup.setLayout(brokerInfoGroupLayout);
        // JDBC attributes
        Label attrLabel = new Label(advancedOptionGroup, SWT.LEFT);
        attrLabel.setText(com.cubrid.common.ui.common.Messages.lblJdbcAttr);
        attrLabel.setLayoutData(CommonUITool.createGridData(1, 1, -1, -1));
        attrText = new Text(advancedOptionGroup, SWT.LEFT | SWT.BORDER);
        attrText.setEditable(false);
        attrText.setLayoutData(CommonUITool.createGridData(GridData.FILL_HORIZONTAL, 1, 1, -1, -1));
        Button btnAttr = new Button(advancedOptionGroup, SWT.NONE);
        {
            btnAttr.setText(com.cubrid.common.ui.common.Messages.btnJdbcAttr);
            btnAttr.setLayoutData(CommonUITool.createGridData(1, 1, 80, -1));
            btnAttr.addSelectionListener(new SelectionAdapter() {

                public void widgetSelected(SelectionEvent event) {
                    JdbcOptionDialog dialog = new JdbcOptionDialog(getShell(), attrText.getText());
                    if (IDialogConstants.OK_ID == dialog.open()) {
                        String jdbcOptions = dialog.getJdbcOptions();
                        attrText.setText(StringUtil.nvl(jdbcOptions));
                    }
                }
            });
        }
    }
    if (database != null && database.getDatabaseInfo() != null) {
        String jdbcAttrs = database.getDatabaseInfo().getJdbcAttrs();
        attrText.setText(StringUtil.nvl(jdbcAttrs));
        String brokerIp = QueryOptions.getBrokerIp(database.getDatabaseInfo());
        if (StringUtil.isEmpty(brokerIp)) {
            brokerIp = database.getServer().getHostAddress();
        }
        if (brokerIp != null) {
            brokerIpText.setText(brokerIp);
        }
        String brokerPort = QueryOptions.getBrokerPort(database.getDatabaseInfo());
        brokerPort = (String) brokerPortCombo.getData(brokerPort);
        if (brokerPort != null) {
            brokerPortCombo.setText(brokerPort);
        }
        String charset = QueryOptions.getCharset(database.getDatabaseInfo());
        charsetCombo.setItems(QueryOptions.getAllCharset(charset));
        if (charset != null && charset.trim().length() > 0) {
            charsetCombo.setText(charset);
        } else {
            charsetCombo.select(0);
        }
    }
    setTitle(Messages.titleLoginDbDialog);
    setMessage(Messages.msgLoginDbDialog);
    return parentComp;
}
Also used : Group(org.eclipse.swt.widgets.Group) DatabaseInfo(com.cubrid.cubridmanager.core.cubrid.database.model.DatabaseInfo) BrokerInfos(com.cubrid.cubridmanager.core.broker.model.BrokerInfos) ServerInfo(com.cubrid.cubridmanager.core.common.model.ServerInfo) Label(org.eclipse.swt.widgets.Label) SelectColorCombo(com.cubrid.common.ui.common.control.SelectColorCombo) Combo(org.eclipse.swt.widgets.Combo) BrokerInfoList(com.cubrid.cubridmanager.core.broker.model.BrokerInfoList) BrokerInfo(com.cubrid.cubridmanager.core.broker.model.BrokerInfo) GridLayout(org.eclipse.swt.layout.GridLayout) Button(org.eclipse.swt.widgets.Button) SelectionEvent(org.eclipse.swt.events.SelectionEvent) ExecTaskWithProgress(com.cubrid.common.ui.spi.progress.ExecTaskWithProgress) BrokerInfoList(com.cubrid.cubridmanager.core.broker.model.BrokerInfoList) List(java.util.List) JdbcOptionDialog(com.cubrid.common.ui.common.dialog.JdbcOptionDialog) Composite(org.eclipse.swt.widgets.Composite) SelectionAdapter(org.eclipse.swt.events.SelectionAdapter) Text(org.eclipse.swt.widgets.Text) RGB(org.eclipse.swt.graphics.RGB) SelectColorCombo(com.cubrid.common.ui.common.control.SelectColorCombo) TaskExecutor(com.cubrid.common.ui.spi.progress.TaskExecutor) GridData(org.eclipse.swt.layout.GridData) ConnectDatabaseExecutor(com.cubrid.common.ui.spi.util.ConnectDatabaseExecutor) DatabaseEditorConfig(com.cubrid.common.ui.spi.model.DatabaseEditorConfig) SelectionListener(org.eclipse.swt.events.SelectionListener)

Example 24 with DatabaseEditorConfig

use of com.cubrid.common.ui.spi.model.DatabaseEditorConfig in project cubrid-manager by CUBRID.

the class LoginDatabaseDialog method save.

private boolean save() {
    if (database == null) {
        return false;
    }
    database.setAutoSavePassword(isSavePassword);
    final String dbUser = userNameText.getText();
    final String dbPassword = passwordText.getText();
    if (database.getDatabaseInfo() != null) {
        database.getDatabaseInfo().setJdbcAttrs(attrText.getText());
        DbUserInfo info = database.getDatabaseInfo().getAuthLoginedDbUserInfo();
        if (info != null) {
            info.setName(dbUser);
            info.setNoEncryptPassword(dbPassword);
        }
        CMDBNodePersistManager.getInstance().updateDbPassword(database.getServer().getHostAddress(), database.getServer().getMonPort(), database.getDatabaseInfo().getDbName(), dbUser, dbPassword, isSavePassword);
        CMDBNodePersistManager.getInstance().setJdbcAttrs(database, attrText.getText());
        DatabaseEditorConfig editorConfig = QueryOptions.getEditorConfig(database, true);
        if (editorConfig == null) {
            editorConfig = new DatabaseEditorConfig();
        }
        RGB selectedColor = selectColorCombo.getSelectedColor();
        editorConfig.setBackGround(selectedColor);
        editorConfig.setDatabaseComment(commentText.getText());
        QueryOptions.putEditorConfig(database, editorConfig, true);
        /* TOOLS-1222Edit database dialog can't save password */
        CMDBNodePersistManager.getInstance().addDatabase(database, editorConfig);
        saveBrokerInfo();
        boolean userChanged = !dbUser.equals(oldLoginUserName);
        return oldDatabaseIsLogin && userChanged;
    }
    return false;
}
Also used : DbUserInfo(com.cubrid.cubridmanager.core.cubrid.user.model.DbUserInfo) RGB(org.eclipse.swt.graphics.RGB) DatabaseEditorConfig(com.cubrid.common.ui.spi.model.DatabaseEditorConfig)

Example 25 with DatabaseEditorConfig

use of com.cubrid.common.ui.spi.model.DatabaseEditorConfig in project cubrid-manager by CUBRID.

the class ShortSettingEditorConfigDialog method okPressed.

protected void okPressed() {
    RGB selectedColor = colorCombo.getSelectedColor();
    if (editorConfig == null) {
        editorConfig = new DatabaseEditorConfig();
    }
    editorConfig.setBackGround(selectedColor);
    super.okPressed();
}
Also used : RGB(org.eclipse.swt.graphics.RGB) DatabaseEditorConfig(com.cubrid.common.ui.spi.model.DatabaseEditorConfig)

Aggregations

DatabaseEditorConfig (com.cubrid.common.ui.spi.model.DatabaseEditorConfig)28 CubridDatabase (com.cubrid.common.ui.spi.model.CubridDatabase)19 DatabaseInfo (com.cubrid.cubridmanager.core.cubrid.database.model.DatabaseInfo)12 RGB (org.eclipse.swt.graphics.RGB)11 ServerInfo (com.cubrid.cubridmanager.core.common.model.ServerInfo)9 CubridNodeChangedEvent (com.cubrid.common.ui.spi.event.CubridNodeChangedEvent)6 IXMLMemento (com.cubrid.cubridmanager.core.common.xml.IXMLMemento)6 DbUserInfo (com.cubrid.cubridmanager.core.cubrid.user.model.DbUserInfo)6 TreeViewer (org.eclipse.jface.viewers.TreeViewer)6 CubridNavigatorView (com.cubrid.common.ui.common.navigator.CubridNavigatorView)5 CubridServer (com.cubrid.common.ui.spi.model.CubridServer)5 CubridNodeLoader (com.cubrid.common.ui.spi.model.CubridNodeLoader)3 ICubridNode (com.cubrid.common.ui.spi.model.ICubridNode)3 ICubridNodeLoader (com.cubrid.common.ui.spi.model.ICubridNodeLoader)3 XMLMemento (com.cubrid.cubridmanager.core.common.xml.XMLMemento)3 FileOutputStream (java.io.FileOutputStream)3 ArrayList (java.util.ArrayList)3 SelectColorCombo (com.cubrid.common.ui.common.control.SelectColorCombo)2 ExecTaskWithProgress (com.cubrid.common.ui.spi.progress.ExecTaskWithProgress)2 TaskExecutor (com.cubrid.common.ui.spi.progress.TaskExecutor)2