/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.components.database.gui; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabFolder2Listener; import org.eclipse.swt.custom.CTabFolderEvent; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory; import de.rcenvironment.components.database.common.DatabaseComponentConstants; import de.rcenvironment.components.database.common.DatabaseStatement; import de.rcenvironment.core.component.model.endpoint.api.EndpointDescription; import de.rcenvironment.core.component.workflow.model.api.WorkflowNode; import de.rcenvironment.core.gui.resources.api.ImageManager; import de.rcenvironment.core.gui.resources.api.StandardImages; import de.rcenvironment.core.gui.workflow.editor.properties.ValidatingWorkflowNodePropertySection; import de.rcenvironment.core.utils.common.JsonUtils; import de.rcenvironment.core.utils.common.StringUtils; /** * Database statement section. * * @author Oliver Seebach */ public class DatabaseStatementSection extends ValidatingWorkflowNodePropertySection { private static final String INSERT_BUTTONS_TEXT = "Insert"; private static final int STATEMENTS_COMPOSITE_MINIMAL_WIDTH = 350; private static final int INPUTS_COMBO_MINIMUM_WIDTH = 100; private static final int TEMPLATES_COMBO_MINIMUM_WIDTH = 100; private static final String ADD_TAB_LABEL = "< + >"; private static final String NEW_STATEMENT_NAME = "Statement"; private static Map<String, String> templatesMap = new HashMap<>(); private CCombo templatesCombo; private CCombo inputCombo; private CTabFolder statementsFolder; private Button insertInputButton; static { templatesMap = new HashMap<>(); templatesMap.put( DatabaseComponentConstants.SELECT, "SELECT * FROM table_name WHERE column1 = 'value1';"); templatesMap.put( DatabaseComponentConstants.INSERT, "INSERT INTO table_name (id, column1, column2, column3) VALUES ${in:smalltable_input};"); templatesMap.put( DatabaseComponentConstants.DELETE, "DELETE FROM table_name WHERE column1 = 'value1';"); templatesMap.put( DatabaseComponentConstants.UPDATE, "UPDATE table_name SET column2 = 'value2' WHERE column1 = 'value1';"); } public DatabaseStatementSection() { } @Override public void setInput(IWorkbenchPart part, ISelection selection) { super.setInput(part, selection); refreshOutputCombos(); } @Override protected void createCompositeContent(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage) { super.createCompositeContent(parent, aTabbedPropertySheetPage); TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory(); final Section sectionStatement = factory.createSection(parent, Section.TITLE_BAR | Section.EXPANDED); sectionStatement.setText("Database Statement"); sectionStatement.marginWidth = 5; sectionStatement.marginHeight = 5; Composite mainComposite = new Composite(sectionStatement, SWT.NONE); mainComposite.setLayout(new GridLayout(2, false)); GridData mainData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH); mainComposite.setLayoutData(mainData); mainComposite.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); CLabel statementsOrderHintLabel = new CLabel(mainComposite, SWT.NONE); GridData statementHintLabelData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH); statementHintLabelData.horizontalSpan = 2; statementsOrderHintLabel.setLayoutData(statementHintLabelData); statementsOrderHintLabel.setText("Note: The statements are executed sequentially from left to right within one transaction."); statementsOrderHintLabel.setImage(ImageManager.getInstance().getSharedImage(StandardImages.INFORMATION_16)); // 1 Composite statementsComposite = new Composite(mainComposite, SWT.NONE); statementsComposite.setLayout(new GridLayout(1, false)); GridData statementsData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_BOTH); statementsData.widthHint = STATEMENTS_COMPOSITE_MINIMAL_WIDTH; statementsComposite.setLayoutData(statementsData); statementsFolder = new CTabFolder(statementsComposite, SWT.BORDER); GridData statementTabFolderData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH); statementsFolder.setLayoutData(statementTabFolderData); statementsFolder.addCTabFolder2Listener(new CTabFolderClosingListener()); statementsFolder.setSimple(false); // 2 Composite helperElementsComposite = new Composite(mainComposite, SWT.NONE); helperElementsComposite.setLayout(new GridLayout(1, false)); GridData helperElementsData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING); helperElementsComposite.setLayoutData(helperElementsData); Group inputsGroup = new Group(helperElementsComposite, SWT.NONE); inputsGroup.setLayout(new GridLayout(3, false)); GridData inputsGroupData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL); inputsGroup.setLayoutData(inputsGroupData); inputsGroup.setText("Input"); Label inputLabel = new Label(inputsGroup, SWT.NONE); inputLabel.setText("Input:"); inputCombo = new CCombo(inputsGroup, SWT.READ_ONLY | SWT.BORDER); GridData inputsComboData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL); inputsComboData.minimumWidth = INPUTS_COMBO_MINIMUM_WIDTH; inputCombo.setLayoutData(inputsComboData); inputCombo.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); insertInputButton = new Button(inputsGroup, SWT.NONE); insertInputButton.setText(INSERT_BUTTONS_TEXT); insertInputButton.addSelectionListener(new InsertInputButtonListener()); Group templatesGroup = new Group(helperElementsComposite, SWT.NONE); templatesGroup.setText("Templates"); templatesGroup.setLayout(new GridLayout(3, false)); GridData templatesGroupData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL); templatesGroup.setLayoutData(templatesGroupData); Label templatesLabel = new Label(templatesGroup, SWT.NONE); templatesLabel.setText("Template:"); templatesCombo = new CCombo(templatesGroup, SWT.READ_ONLY | SWT.BORDER); GridData templatesComboData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL); templatesComboData.minimumWidth = TEMPLATES_COMBO_MINIMUM_WIDTH; templatesCombo.setLayoutData(templatesComboData); templatesCombo.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); Button insertTemplateButton = new Button(templatesGroup, SWT.NONE); insertTemplateButton.setText(INSERT_BUTTONS_TEXT); insertTemplateButton.addSelectionListener(new InsertTemplateButtonListener()); sectionStatement.setClient(mainComposite); } private CTabItem addCTabItemToFolder(DatabaseStatement model, boolean autoUpdate) { refreshOutputCombos(); CTabItem newCTabItem = new CTabItem(statementsFolder, SWT.CLOSE, model.getIndex()); newCTabItem.setText(model.getName()); DatabaseStatementComposite newDatabaseStatementComposite = new DatabaseStatementComposite(statementsFolder, SWT.NONE); newDatabaseStatementComposite.createControls(); // fill gui with model if (model.getName() != null && !model.getName().isEmpty()) { newDatabaseStatementComposite.getStatementNameText().setText(model.getName()); } if (model.getStatement() != null && !model.getStatement().isEmpty()) { newDatabaseStatementComposite.getStatementText().setText(model.getStatement()); } newDatabaseStatementComposite.getWriteToOutputCheckButton().setSelection(model.isWillWriteToOutput()); if (getOrderedOutputNames().length > 0) { if (model.getOutputToWriteTo() != null && !model.getOutputToWriteTo().isEmpty()) { newDatabaseStatementComposite.fillOutputComboAndSetSelection(getOrderedOutputNames(), model.getOutputToWriteTo()); } else { newDatabaseStatementComposite.fillOutputCombo(getOrderedOutputNames()); } newDatabaseStatementComposite.getOutputCombo().setEnabled( newDatabaseStatementComposite.getWriteToOutputCheckButton().getSelection()); } else { newDatabaseStatementComposite.getOutputCombo().setEnabled(false); newDatabaseStatementComposite.getOutputCombo().setText(DatabaseComponentConstants.NO_OUTPUT_DEFINED_TEXT); } // register listeners newDatabaseStatementComposite.getStatementNameText().addModifyListener(new ModifyStatementNameListener(newCTabItem)); newDatabaseStatementComposite.getStatementText().addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { writeCurrentStatementsToProperties(); } }); newDatabaseStatementComposite.getWriteToOutputCheckButton().addSelectionListener(new WriteToOutputSelectionChangedListener()); newDatabaseStatementComposite.getOutputCombo().addSelectionListener(new OutputSelectionChangedListener()); newCTabItem.setControl(newDatabaseStatementComposite); if (autoUpdate) { writeCurrentStatementsToProperties(); } statementsFolder.setSelection(newCTabItem); return newCTabItem; } // private CTabItem addInitialCTabItemToFolder() { // DatabaseStatement initialModel = new DatabaseStatement(); // initialModel.setName(INITIAL_STATEMENT_NAME); // initialModel.setIndex(0); // CTabItem newItem = addCTabItemToFolder(initialModel, false); // return newItem; // } private String determineNextValidStatementName(String currentName) { String nextValidName = currentName; List<String> currentStatementNames = getCurrentStatementNames(); List<Integer> currentUsedIndices = convertStatementNamesToIndices(currentStatementNames); int newIndex = 1; while (currentUsedIndices.contains(newIndex)) { newIndex++; } nextValidName = currentName + " (" + newIndex + ")"; return nextValidName; } private List<Integer> convertStatementNamesToIndices(List<String> statementNames) { List<Integer> indices = new ArrayList<>(); for (String name : statementNames) { int count = 0; if (name.contains("(") && name.contains(")")) { try { int indexBegin = name.lastIndexOf("(") + 1; int indexEnd = name.lastIndexOf(")"); count = Integer.valueOf(name.substring(indexBegin, indexEnd)); } catch (NumberFormatException e) { count = 0; } } indices.add(count); } return indices; } private CTabItem addNewCTabItem() { int indexToSet = statementsFolder.getItemCount() - 1; if (statementsFolder.getItemCount() == 0) { indexToSet = 0; } String newStatementName = NEW_STATEMENT_NAME; String name = determineNextValidStatementName(newStatementName); DatabaseStatement newModel = new DatabaseStatement(); newModel.setName(name); newModel.setIndex(indexToSet); CTabItem newItem = addCTabItemToFolder(newModel, true); // Add before "+" item statementsFolder.setSelection(statementsFolder.getItemCount() - 2); // Select new created item refreshOutputCombos(); return newItem; } private void addPlusCTabItemToFolder() { CTabItem addNewItemTab = new CTabItem(statementsFolder, SWT.NONE); addNewItemTab.setText(ADD_TAB_LABEL); addNewItemTab.setShowClose(false); } @Override public void aboutToBeShown() { super.aboutToBeShown(); // inputs combo inputCombo.removeAll(); inputCombo.setItems(getOrderedInputNames()); if (inputCombo.getItemCount() > 0) { insertInputButton.setEnabled(true); inputCombo.setEnabled(true); inputCombo.select(0); // default combo selection } else { inputCombo.setEnabled(false); inputCombo.setText(DatabaseComponentConstants.NO_INPUT_DEFINED_TEXT); insertInputButton.setEnabled(false); } // templates combo templatesCombo.removeAll(); templatesCombo.setItems(getOrderedTemplateNames()); if (templatesCombo.getItemCount() > 0) { templatesCombo.select(0); // default combo selection } // outputs combos refreshOutputCombos(); // statement stuff for (CTabItem item : statementsFolder.getItems()) { item.dispose(); } List<DatabaseStatement> models = readCurrentDatabaseStatementsFromConfig(); statementsFolder.setRedraw(false); // at least one statement found if (models.size() > 0) { for (DatabaseStatement model : models) { addCTabItemToFolder(model, false); } } // and the plus item statementsFolder.setSelection(0); addPlusCTabItemToFolder(); statementsFolder.setRedraw(true); // make sure just one listener is registered. if (statementsFolder.getData("SelectionListenerToken") == null) { statementsFolder.addSelectionListener(new StatementsFolderSelectionListener()); statementsFolder.setData("SelectionListenerToken", true); } if (statementsFolder.getData("StatementsFolderListenerToken") == null) { statementsFolder.addMouseListener(new StatementsFolderMouseListener()); statementsFolder.setData("StatementsFolderListenerToken", true); } } private void refreshOutputCombos() { for (CTabItem item : statementsFolder.getItems()) { if (!item.getText().equals(ADD_TAB_LABEL)) { if (item.getControl() instanceof DatabaseStatementComposite) { DatabaseStatementComposite control = (DatabaseStatementComposite) item.getControl(); String selection = getOutputToWriteToByStatementName(item.getText()); boolean selected = control.getWriteToOutputCheckButton().getSelection(); fillOutputsCombo(control.getOutputCombo(), selection, selected); } } } } private String getOutputToWriteToByStatementName(String statementName) { List<DatabaseStatement> statements = readCurrentDatabaseStatementsFromConfig(); for (DatabaseStatement statement : statements) { if (statement.getName().equals(statementName)) { return statement.getOutputToWriteTo(); } } return null; } private void fillOutputsCombo(CCombo comboToFill, String currentSelection, boolean enabled) { comboToFill.removeAll(); if (getOutputNamesUnordered().isEmpty()) { // if no outputs are there: add placeholder comboToFill.setEnabled(false); comboToFill.setText(DatabaseComponentConstants.NO_OUTPUT_DEFINED_TEXT); } else { // else add them and set previous selection comboToFill.setEnabled(enabled); comboToFill.setItems(getOrderedOutputNames()); if (currentSelection != null) { if (Arrays.asList(comboToFill.getItems()).contains(currentSelection)) { comboToFill.select(comboToFill.indexOf(currentSelection)); } } } } /** * Listener to restrict closing of tabs. * * @author Oliver Seebach */ private final class CTabFolderClosingListener implements CTabFolder2Listener { @Override public void showList(CTabFolderEvent event) {} @Override public void restore(CTabFolderEvent event) {} @Override public void minimize(CTabFolderEvent event) {} @Override public void maximize(CTabFolderEvent event) {} @Override public void close(CTabFolderEvent event) { // prevent closing of < + > item and if there are just 2 tabs present if (event.item instanceof CTabItem) { CTabItem selectedItem = (CTabItem) event.item; CTabFolder tabFolder = (CTabFolder) event.widget; if (selectedItem.getText().equals(ADD_TAB_LABEL) || tabFolder.getItemCount() < 3) { event.doit = false; } else { selectedItem.dispose(); writeCurrentStatementsToProperties(); } } } } /** * Listener to handle item adding. * * @author Oliver Seebach */ private final class StatementsFolderSelectionListener implements SelectionListener { @Override public void widgetSelected(SelectionEvent event) { if (event.item instanceof CTabItem) { CTabItem clickedItem = (CTabItem) event.item; if (clickedItem.getText().equals(ADD_TAB_LABEL) && statementsFolder.getItemCount() > 1) { addNewCTabItem(); } } } @Override public void widgetDefaultSelected(SelectionEvent event) { widgetSelected(event); } } @Override public void aboutToBeHidden() { writeCurrentStatementsToProperties(); super.aboutToBeHidden(); } /** * Listener to handle tab closing via mouse wheel. * * @author Oliver Seebach */ private final class StatementsFolderMouseListener extends MouseAdapter { @Override public void mouseDown(MouseEvent event) { // FIXME: make sure the item where the mouse is over is disposed or discard mouse wheel closing -- seeb_ol, November 2015 // private static final int MOUSE_WHEEL_BUTTON_ID = 2; // if (event.button == MOUSE_WHEEL_BUTTON_ID) { // CTabItem item = ((CTabFolder) event.widget).getItem(((CTabFolder) event.widget).getSelectionIndex()); // CTabFolder tabFolder = (CTabFolder) event.widget; // if (!item.getText().equals(ADD_TAB_LABEL) && tabFolder.getItemCount() > 2) { // item.dispose(); // } // } } } /** * Listener to insert templates into statement textfields. * * @author Oliver Seebach */ private final class InsertTemplateButtonListener implements SelectionListener { @Override public void widgetSelected(SelectionEvent event) { String templateToInsert = templatesMap.get(templatesCombo.getText()); CTabItem currentItem = statementsFolder.getItem(statementsFolder.getSelectionIndex()); if (currentItem.getControl() instanceof DatabaseStatementComposite) { DatabaseStatementComposite statementComposite = (DatabaseStatementComposite) currentItem.getControl(); statementComposite.getStatementText().insert(templateToInsert); } } @Override public void widgetDefaultSelected(SelectionEvent event) { widgetSelected(event); } } /** * Listener to add input reference to statement text. * * @author Oliver Seebach */ private final class InsertInputButtonListener implements SelectionListener { @Override public void widgetSelected(SelectionEvent event) { String inputToInsert = inputCombo.getText(); String textToInsert = ""; if (inputToInsert != null && !inputToInsert.isEmpty()) { textToInsert = StringUtils.format(DatabaseComponentConstants.INPUT_PLACEHOLDER_PATTERN, inputToInsert); CTabItem currentItem = statementsFolder.getItem(statementsFolder.getSelectionIndex()); if (currentItem.getControl() instanceof DatabaseStatementComposite) { if (!textToInsert.isEmpty()) { DatabaseStatementComposite statementComposite = (DatabaseStatementComposite) currentItem.getControl(); statementComposite.getStatementText().insert(textToInsert); } } } } @Override public void widgetDefaultSelected(SelectionEvent event) { widgetSelected(event); } } /** * Listener to react on statement name modification. * * @author Oliver Seebach */ private final class ModifyStatementNameListener implements ModifyListener { private final CTabItem statementItem; private ModifyStatementNameListener(CTabItem statementItem) { this.statementItem = statementItem; } @Override public void modifyText(ModifyEvent event) { // if (!statementItem.isDisposed()) { statementItem.setText(((Text) event.widget).getText()); // } writeCurrentStatementsToProperties(); } } /** * Listener that reacts on output selection changes. * * @author Oliver Seebach */ private final class OutputSelectionChangedListener implements SelectionListener { @Override public void widgetDefaultSelected(SelectionEvent event) { widgetSelected(event); } @Override public void widgetSelected(SelectionEvent event) { writeCurrentStatementsToProperties(); } } /** * Listener that reacts on output checkbox changes. * * @author Oliver Seebach */ private final class WriteToOutputSelectionChangedListener implements SelectionListener { @Override public void widgetDefaultSelected(SelectionEvent event) { widgetSelected(event); } @Override public void widgetSelected(SelectionEvent event) { boolean selected = false; if (event.getSource() instanceof Button) { Button clickedButton = (Button) event.getSource(); selected = clickedButton.getSelection(); } CTabItem currentItem = statementsFolder.getItem(statementsFolder.getSelectionIndex()); if (currentItem.getControl() instanceof DatabaseStatementComposite) { DatabaseStatementComposite statementComposite = (DatabaseStatementComposite) currentItem.getControl(); if (statementComposite.getOutputCombo().getItemCount() == 0) { statementComposite.getOutputCombo().setEnabled(false); } else if (statementComposite.getOutputCombo().getItem(0).equals(DatabaseComponentConstants.NO_OUTPUT_DEFINED_TEXT)) { statementComposite.getOutputCombo().setEnabled(false); } else { statementComposite.getOutputCombo().setEnabled(selected); } } writeCurrentStatementsToProperties(); } } private List<String> getCurrentStatementNames() { List<String> statementNames = new ArrayList<>(); for (CTabItem tabItem : statementsFolder.getItems()) { statementNames.add(tabItem.getText()); } return statementNames; } private String[] getOrderedInputNames() { List<String> inputChannelNames = new ArrayList<String>(); for (EndpointDescription channelName : getConfiguration().getInputDescriptionsManager().getDynamicEndpointDescriptions()) { inputChannelNames.add(channelName.getName()); } Collections.sort(inputChannelNames, String.CASE_INSENSITIVE_ORDER); String[] inputChannelNamesArray = new String[inputChannelNames.size()]; for (int i = 0; i < inputChannelNames.size(); i++) { inputChannelNamesArray[i] = inputChannelNames.get(i); } return inputChannelNamesArray; } private String[] getOrderedOutputNames() { List<String> outputChannelNames = new ArrayList<String>(); for (EndpointDescription channelName : getConfiguration().getOutputDescriptionsManager().getDynamicEndpointDescriptions()) { outputChannelNames.add(channelName.getName()); } Collections.sort(outputChannelNames, String.CASE_INSENSITIVE_ORDER); String[] inputChannelNamesArray = new String[outputChannelNames.size()]; for (int i = 0; i < outputChannelNames.size(); i++) { inputChannelNamesArray[i] = outputChannelNames.get(i); } return inputChannelNamesArray; } private String[] getOrderedTemplateNames() { List<String> templateNames = new ArrayList<String>(); for (String templateName : templatesMap.keySet()) { templateNames.add(templateName); } Collections.sort(templateNames, String.CASE_INSENSITIVE_ORDER); String[] templateNamesArray = new String[templateNames.size()]; for (int i = 0; i < templateNames.size(); i++) { templateNamesArray[i] = templateNames.get(i); } return templateNamesArray; } private List<String> getOutputNamesUnordered() { List<String> outputNames = new ArrayList<>(); for (EndpointDescription output : getOutputs()) { // add only dynamic endpoints if (!output.getEndpointDefinition().isStatic()) { outputNames.add(output.getName()); } } return outputNames; } // READ MODEL private List<DatabaseStatement> readCurrentDatabaseStatementsFromConfig() { ObjectMapper mapper = JsonUtils.getDefaultObjectMapper(); List<DatabaseStatement> models = new ArrayList<>(); try { String modelsString = getProperty(DatabaseComponentConstants.DB_STATEMENTS_KEY); if (modelsString != null) { models = mapper.readValue(modelsString, mapper.getTypeFactory().constructCollectionType(List.class, DatabaseStatement.class)); } } catch (JsonGenerationException | JsonMappingException e) { logger.error("Failed to map database component's JSON content to database statements."); } catch (IOException e) { logger.error("Failed to load database component's JSON content from file system."); } return models; } @Override protected void setWorkflowNode(WorkflowNode workflowNode) { super.setWorkflowNode(workflowNode); aboutToBeShown(); } // WRITE MODEL private void writeCurrentStatementsToProperties() { List<DatabaseStatement> currentStatements = new ArrayList<>(); if (!statementsFolder.isDisposed()) { for (CTabItem item : statementsFolder.getItems()) { if (/* !item.getText().isEmpty() && */!item.getText().equals(ADD_TAB_LABEL)) { int index = statementsFolder.indexOf(item); // Position of tab in folder DatabaseStatementComposite control = (DatabaseStatementComposite) item.getControl(); DatabaseStatement statement = new DatabaseStatement(); statement.setName(control.getStatementNameText().getText()); statement.setStatement(control.getStatementText().getText()); statement.setWillWriteToOutput(control.getWriteToOutputCheckButton().getSelection()); String outputToWriteTo = control.getOutputCombo().getText(); if (outputToWriteTo.equals(DatabaseComponentConstants.NO_OUTPUT_DEFINED_TEXT)) { outputToWriteTo = ""; } statement.setOutputToWriteTo(outputToWriteTo); statement.setIndex(index); currentStatements.add(statement); } } ObjectMapper mapper = JsonUtils.getDefaultObjectMapper(); String currentStatementsString = null; try { currentStatementsString = mapper.writeValueAsString(currentStatements); } catch (JsonGenerationException | JsonMappingException e) { logger.error("Failed to map database statements to database component's JSON content."); } catch (IOException e) { logger.error("Failed to write database component's statements to file system."); } if (currentStatementsString != null) { if (getProperty(DatabaseComponentConstants.DB_STATEMENTS_KEY) == null) { setProperty(DatabaseComponentConstants.DB_STATEMENTS_KEY, currentStatementsString); } else if (!getProperty(DatabaseComponentConstants.DB_STATEMENTS_KEY).equals(currentStatementsString)) { setProperty(DatabaseComponentConstants.DB_STATEMENTS_KEY, currentStatementsString); } } } } }