diff --git a/bundles/org.jkiss.utils/src/org/jkiss/utils/CommonUtils.java b/bundles/org.jkiss.utils/src/org/jkiss/utils/CommonUtils.java index 45d6c697a1db3d6002f51e3c8c9ad7586a3626a0..3145cacc2cec13fd54889fc124f14f5cce9b1848 100644 --- a/bundles/org.jkiss.utils/src/org/jkiss/utils/CommonUtils.java +++ b/bundles/org.jkiss.utils/src/org/jkiss/utils/CommonUtils.java @@ -916,4 +916,18 @@ public class CommonUtils { public static boolean isValidIndex(int index, int length) { return index >= 0 || index < length; } + + @NotNull + public static String escapeHtml(@Nullable String text) { + if (text == null) { + return " "; + } + return text + .replace("&", "&") + .replace("<", "<") + .replace(">", ">") + .replace("\r\n", "
") + .replace("\r", "
") + .replace("\n", "
"); + } } diff --git a/plugins/org.jkiss.dbeaver.data.transfer.ui/src/org/jkiss/dbeaver/tools/transfer/ui/pages/database/ColumnsMappingDialog.java b/plugins/org.jkiss.dbeaver.data.transfer.ui/src/org/jkiss/dbeaver/tools/transfer/ui/pages/database/ColumnsMappingDialog.java index c6ec64e68922288f6bb2c1d545f0021586b33ff4..dcb1a064024a85df4ba442dbad1fa04ef419430a 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer.ui/src/org/jkiss/dbeaver/tools/transfer/ui/pages/database/ColumnsMappingDialog.java +++ b/plugins/org.jkiss.dbeaver.data.transfer.ui/src/org/jkiss/dbeaver/tools/transfer/ui/pages/database/ColumnsMappingDialog.java @@ -47,6 +47,7 @@ import org.jkiss.dbeaver.ui.SharedTextColors; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.CustomComboBoxCellEditor; import org.jkiss.dbeaver.ui.controls.ListContentProvider; +import org.jkiss.dbeaver.ui.controls.ViewerColumnController; import org.jkiss.dbeaver.ui.dialogs.BaseDialog; import org.jkiss.utils.CommonUtils; @@ -135,199 +136,174 @@ class ColumnsMappingDialog extends BaseDialog { } }); - { - TableViewerColumn columnSource = new TableViewerColumn(mappingViewer, SWT.LEFT); - columnSource.setLabelProvider(new CellLabelProvider() { - @Override - public void update(ViewerCell cell) - { - DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) cell.getElement(); - cell.setText(DBUtils.getObjectFullName(attrMapping.getSource(), DBPEvaluationContext.UI)); - if (attrMapping.getIcon() != null) { - cell.setImage(DBeaverIcons.getImage(attrMapping.getIcon())); - } - } - }); - columnSource.getColumn().setText(DTUIMessages.columns_mapping_dialog_column_source_text); - columnSource.getColumn().setWidth(170); - } - { - TableViewerColumn columnSourceType = new TableViewerColumn(mappingViewer, SWT.LEFT); - columnSourceType.setLabelProvider(new CellLabelProvider() { - @Override - public void update(ViewerCell cell) - { - cell.setText(((DatabaseMappingAttribute) cell.getElement()).getSourceType()); + final ViewerColumnController columnController = new ViewerColumnController<>(getClass().getName(), mappingViewer); + + columnController.addColumn(DTUIMessages.columns_mapping_dialog_column_source_text, null, SWT.LEFT, true, false, new ColumnLabelProvider() { + @Override + public void update(ViewerCell cell) { + DatabaseMappingAttribute mapping = (DatabaseMappingAttribute) cell.getElement(); + cell.setText(DBUtils.getObjectFullName(mapping.getSource(), DBPEvaluationContext.UI)); + if (mapping.getIcon() != null) { + cell.setImage(DBeaverIcons.getImage(mapping.getIcon())); } - }); - columnSourceType.getColumn().setText(DTUIMessages.columns_mapping_dialog_column_source_type_text); - columnSourceType.getColumn().setWidth(100); - } + } + }); - { - TableViewerColumn columnTarget = new TableViewerColumn(mappingViewer, SWT.LEFT); - columnTarget.setLabelProvider(new CellLabelProvider() { - @Override - public void update(ViewerCell cell) - { - DatabaseMappingAttribute mapping = (DatabaseMappingAttribute) cell.getElement(); - cell.setText(mapping.getTargetName()); - if (mapping.getMappingType() == DatabaseMappingType.unspecified) { - cell.setBackground(UIUtils.getSharedTextColors().getColor(SharedTextColors.COLOR_WARNING)); - } else { - cell.setBackground(null); - } - cell.setFont(boldFont); + columnController.addColumn(DTUIMessages.columns_mapping_dialog_column_source_type_text, null, SWT.LEFT, true, false, new ColumnLabelProvider() { + @Override + public void update(ViewerCell cell) { + cell.setText(((DatabaseMappingAttribute) cell.getElement()).getSourceType()); + } + }); + + columnController.addColumn(DTUIMessages.columns_mapping_dialog_column_target_text, null, SWT.LEFT, true, false, false, null, new ColumnLabelProvider() { + @Override + public void update(ViewerCell cell) { + DatabaseMappingAttribute mapping = (DatabaseMappingAttribute) cell.getElement(); + cell.setText(mapping.getTargetName()); + if (mapping.getMappingType() == DatabaseMappingType.unspecified) { + cell.setBackground(UIUtils.getSharedTextColors().getColor(SharedTextColors.COLOR_WARNING)); + } else { + cell.setBackground(null); } - }); - columnTarget.getColumn().setText(DTUIMessages.columns_mapping_dialog_column_target_text); - columnTarget.getColumn().setWidth(170); - columnTarget.setEditingSupport(new EditingSupport(mappingViewer) { - @Override - protected CellEditor getCellEditor(Object element) - { - try { - java.util.List items = new ArrayList<>(); - DatabaseMappingAttribute mapping = (DatabaseMappingAttribute) element; - if (mapping.getParent().getMappingType() == DatabaseMappingType.existing && - mapping.getParent().getTarget() instanceof DBSEntity) - { - DBSEntity parentEntity = (DBSEntity)mapping.getParent().getTarget(); - for (DBSEntityAttribute attr : CommonUtils.safeCollection(parentEntity.getAttributes(new VoidProgressMonitor()))) { - items.add(attr.getName()); - } + cell.setFont(boldFont); + } + }, new EditingSupport(mappingViewer) { + @Override + protected CellEditor getCellEditor(Object element) + { + try { + java.util.List items = new ArrayList<>(); + DatabaseMappingAttribute mapping = (DatabaseMappingAttribute) element; + if (mapping.getParent().getMappingType() == DatabaseMappingType.existing && + mapping.getParent().getTarget() instanceof DBSEntity) + { + DBSEntity parentEntity = (DBSEntity)mapping.getParent().getTarget(); + for (DBSEntityAttribute attr : CommonUtils.safeCollection(parentEntity.getAttributes(new VoidProgressMonitor()))) { + items.add(attr.getName()); } - - items.add(DatabaseMappingAttribute.TARGET_NAME_SKIP); - return new CustomComboBoxCellEditor( - mappingViewer, - mappingViewer.getTable(), - items.toArray(new String[0]), - SWT.DROP_DOWN); - } catch (DBException e) { - DBWorkbench.getPlatformUI().showError("Bad value", "Wrong target column", e); - return null; } - } - @Override - protected boolean canEdit(Object element) - { - return true; + items.add(DatabaseMappingAttribute.TARGET_NAME_SKIP); + return new CustomComboBoxCellEditor( + mappingViewer, + mappingViewer.getTable(), + items.toArray(new String[0]), + SWT.DROP_DOWN); + } catch (DBException e) { + DBWorkbench.getPlatformUI().showError("Bad value", "Wrong target column", e); + return null; } + } - @Override - protected Object getValue(Object element) - { - return ((DatabaseMappingAttribute)element).getTargetName(); - } + @Override + protected boolean canEdit(Object element) + { + return true; + } - @Override - protected void setValue(Object element, Object value) - { - try { - String name = CommonUtils.toString(value); - DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element; - if (DatabaseMappingAttribute.TARGET_NAME_SKIP.equals(name)) { - attrMapping.setMappingType(DatabaseMappingType.skip); - } else { - if (attrMapping.getParent().getMappingType() == DatabaseMappingType.existing && - attrMapping.getParent().getTarget() instanceof DBSEntity) - { - DBSEntity parentEntity = (DBSEntity)attrMapping.getParent().getTarget(); - for (DBSEntityAttribute attr : CommonUtils.safeCollection(parentEntity.getAttributes(new VoidProgressMonitor()))) { - if (name.equalsIgnoreCase(attr.getName())) { - attrMapping.setTarget(attr); - attrMapping.setMappingType(DatabaseMappingType.existing); - attrMapping.setTargetName(name); - return; - } + @Override + protected Object getValue(Object element) + { + return ((DatabaseMappingAttribute)element).getTargetName(); + } + + @Override + protected void setValue(Object element, Object value) + { + try { + String name = CommonUtils.toString(value); + DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element; + if (DatabaseMappingAttribute.TARGET_NAME_SKIP.equals(name)) { + attrMapping.setMappingType(DatabaseMappingType.skip); + } else { + if (attrMapping.getParent().getMappingType() == DatabaseMappingType.existing && + attrMapping.getParent().getTarget() instanceof DBSEntity) + { + DBSEntity parentEntity = (DBSEntity)attrMapping.getParent().getTarget(); + for (DBSEntityAttribute attr : CommonUtils.safeCollection(parentEntity.getAttributes(new VoidProgressMonitor()))) { + if (name.equalsIgnoreCase(attr.getName())) { + attrMapping.setTarget(attr); + attrMapping.setMappingType(DatabaseMappingType.existing); + attrMapping.setTargetName(name); + return; } } - attrMapping.setMappingType(DatabaseMappingType.create); - attrMapping.setTargetName(name); } - } catch (DBException e) { - DBWorkbench.getPlatformUI().showError("Bad value", "Wrong target", e); - } finally { - mappingViewer.refresh(); + attrMapping.setMappingType(DatabaseMappingType.create); + attrMapping.setTargetName(name); } + } catch (DBException e) { + DBWorkbench.getPlatformUI().showError("Bad value", "Wrong target", e); + } finally { + mappingViewer.refresh(); } - }); - } + } + }); - { - TableViewerColumn columnTargetType = new TableViewerColumn(mappingViewer, SWT.LEFT); - columnTargetType.setLabelProvider(new CellLabelProvider() { - @Override - public void update(ViewerCell cell) - { - DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) cell.getElement(); - DBPDataSource dataSource = settings.getTargetDataSource(attrMapping); - cell.setText(attrMapping.getTargetType(dataSource, true)); - cell.setFont(boldFont); - } - }); - columnTargetType.getColumn().setText(DTUIMessages.columns_mapping_dialog_column_target_type_text); - columnTargetType.getColumn().setWidth(100); - columnTargetType.setEditingSupport(new EditingSupport(mappingViewer) { - @Override - protected CellEditor getCellEditor(Object element) - { - DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element; + columnController.addColumn(DTUIMessages.columns_mapping_dialog_column_target_type_text, null, SWT.LEFT, true, false, false, null, new ColumnLabelProvider() { + @Override + public void update(ViewerCell cell) { + DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) cell.getElement(); + DBPDataSource dataSource = settings.getTargetDataSource(attrMapping); + cell.setText(attrMapping.getTargetType(dataSource, true)); + cell.setFont(boldFont); + } + }, new EditingSupport(mappingViewer) { + @Override + protected CellEditor getCellEditor(Object element) + { + DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element; - Set types = new TreeSet<>(); - DBPDataTypeProvider dataTypeProvider = DBUtils.getParentOfType(DBPDataTypeProvider.class, settings.getContainer()); - if (dataTypeProvider != null) { - for (DBSDataType type : dataTypeProvider.getLocalDataTypes()) { - types.add(type.getName()); - } + Set types = new TreeSet<>(); + DBPDataTypeProvider dataTypeProvider = DBUtils.getParentOfType(DBPDataTypeProvider.class, settings.getContainer()); + if (dataTypeProvider != null) { + for (DBSDataType type : dataTypeProvider.getLocalDataTypes()) { + types.add(type.getName()); } - types.add(attrMapping.getTargetType(settings.getTargetDataSource(attrMapping), true)); - - return new CustomComboBoxCellEditor(mappingViewer, mappingViewer.getTable(), types.toArray(new String[0]), SWT.BORDER); - } - @Override - protected boolean canEdit(Object element) - { - return true; - } - @Override - protected Object getValue(Object element) - { - DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element; - return attrMapping.getTargetType(settings.getTargetDataSource(attrMapping), true); - } - @Override - protected void setValue(Object element, Object value) - { - DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element; - attrMapping.setTargetType(CommonUtils.toString(value)); - mappingViewer.refresh(element); } - }); - } + types.add(attrMapping.getTargetType(settings.getTargetDataSource(attrMapping), true)); - { - TableViewerColumn columnType = new TableViewerColumn(mappingViewer, SWT.LEFT); - columnType.setLabelProvider(new CellLabelProvider() { - @Override - public void update(ViewerCell cell) - { - DatabaseMappingAttribute mapping = (DatabaseMappingAttribute) cell.getElement(); - String text = ""; - switch (mapping.getMappingType()) { - case unspecified: text = "?"; break; - case existing: text = DTUIMessages.columns_mapping_dialog_cell_text_existing; break; - case create: text = DTUIMessages.columns_mapping_dialog_cell_text_new; break; - case skip: text = DTUIMessages.columns_mapping_dialog_cell_text_skip; break; - } - cell.setText(text); + return new CustomComboBoxCellEditor(mappingViewer, mappingViewer.getTable(), types.toArray(new String[0]), SWT.BORDER); + } + @Override + protected boolean canEdit(Object element) + { + return true; + } + @Override + protected Object getValue(Object element) + { + DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element; + return attrMapping.getTargetType(settings.getTargetDataSource(attrMapping), true); + } + @Override + protected void setValue(Object element, Object value) + { + DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element; + attrMapping.setTargetType(CommonUtils.toString(value)); + mappingViewer.refresh(element); + } + }); + + columnController.addColumn(DTUIMessages.columns_mapping_dialog_column_type_text_mapping, null, SWT.LEFT, true, false, new ColumnLabelProvider() { + @Override + public String getText(Object element) { + DatabaseMappingAttribute mapping = (DatabaseMappingAttribute) element; + switch (mapping.getMappingType()) { + case existing: + return DTUIMessages.columns_mapping_dialog_cell_text_existing; + case create: + return DTUIMessages.columns_mapping_dialog_cell_text_new; + case skip: + return DTUIMessages.columns_mapping_dialog_cell_text_skip; + default: + return "?"; } - }); - columnType.getColumn().setText(DTUIMessages.columns_mapping_dialog_column_type_text_mapping); - columnType.getColumn().setWidth(60); - } + } + }); + + columnController.createColumns(); mappingViewer.setInput(attributeMappings); diff --git a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/exporter/DataExporterHTML.java b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/exporter/DataExporterHTML.java index 1cd858f70eb6bff55f9de10df88ec4cd55495e17..a5b739313cf288e99b046d82b7b298c23a39dd65 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/exporter/DataExporterHTML.java +++ b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/exporter/DataExporterHTML.java @@ -31,10 +31,7 @@ import org.jkiss.utils.CommonUtils; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.Reader; +import java.io.*; import java.util.Map; /** @@ -164,24 +161,14 @@ public class DataExporterHTML extends StreamExporterAbstract { private void writeTableTitle(String value, int columns) { PrintWriter out = getWriter(); out.write(String.format("", columns)); - if (value == null) { - out.write(" "); - } else { - value = value.replace("&", "&").replace("<", "<").replace(">", ">"); - out.write(value); - } + out.write(CommonUtils.escapeHtml(value)); out.write(""); } private void writeTextCell(String value, boolean header) { PrintWriter out = getWriter(); out.write(header ? "" : ""); - if (value == null) { - out.write(" "); - } else { - value = value.replace("&", "&").replace("<", "<").replace(">", ">"); - out.write(value); - } + out.write(CommonUtils.escapeHtml(value)); out.write(header ? "" : ""); } @@ -228,33 +215,16 @@ public class DataExporterHTML extends StreamExporterAbstract { } private void writeCellValue(Reader reader) throws IOException { - try { + try (BufferedReader bufferedReader = new BufferedReader(reader)) { PrintWriter out = getWriter(); - // Copy reader - char[] buffer = new char[2000]; - for (; ; ) { - int count = reader.read(buffer); - if (count <= 0) { - break; - } - for (int i = 0; i < count; i++) { - if (buffer[i] == '<') { - out.write("<"); - } else if (buffer[i] == '>') { - out.write(">"); - } - if (buffer[i] == '&') { - out.write("&"); - } - out.write(buffer[i]); + String line = bufferedReader.readLine(); + while (line != null) { + out.write(CommonUtils.escapeHtml(line)); + line = bufferedReader.readLine(); + if (line != null) { + out.write("
"); } } - } finally { - ContentUtils.close(reader); } } - - public boolean saveBinariesAsImages() { - return true; - } } diff --git a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/OracleSchema.java b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/OracleSchema.java index 7385e4d257b55073a10962e92b6bc9b7a84e1f26..0a23df0c81641001d167c0bd1d0e88d63beff7ce 100644 --- a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/OracleSchema.java +++ b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/OracleSchema.java @@ -1084,11 +1084,11 @@ public class OracleSchema extends OracleGlobalObject implements DBSSchema, DBPRe "i.OWNER,i.INDEX_NAME,i.INDEX_TYPE,i.TABLE_OWNER,i.TABLE_NAME,i.UNIQUENESS,i.TABLESPACE_NAME,i.STATUS,i.NUM_ROWS,i.SAMPLE_SIZE,\n" + "ic.COLUMN_NAME,ic.COLUMN_POSITION,ic.COLUMN_LENGTH,ic.DESCEND,iex.COLUMN_EXPRESSION\n" + "FROM " + OracleUtils.getAdminAllViewPrefix(session.getProgressMonitor(), getDataSource(), "INDEXES") + " i\n" + - ", " + OracleUtils.getAdminAllViewPrefix(session.getProgressMonitor(), getDataSource(), "IND_COLUMNS") + " ic, " + - OracleUtils.getAdminAllViewPrefix(session.getProgressMonitor(), getDataSource(), "IND_EXPRESSIONS") + " iex " + - "WHERE ic.INDEX_OWNER=i.OWNER AND ic.INDEX_NAME=i.INDEX_NAME \n" + - "AND iex.INDEX_OWNER(+)=i.OWNER AND iex.INDEX_NAME(+)=i.INDEX_NAME AND iex.COLUMN_POSITION(+)=ic.COLUMN_POSITION\n" + - "AND "); + "JOIN " + OracleUtils.getAdminAllViewPrefix(session.getProgressMonitor(), getDataSource(), "IND_COLUMNS") + " ic " + + "ON i.owner = ic.index_owner AND i.index_name = ic.index_name\n" + + "LEFT JOIN " + OracleUtils.getAdminAllViewPrefix(session.getProgressMonitor(), getDataSource(), "IND_EXPRESSIONS") + " iex " + + "ON iex.index_owner = i.owner AND iex.INDEX_NAME = i.INDEX_NAME AND iex.COLUMN_POSITION = ic.COLUMN_POSITION\n" + + "WHERE "); if (forTable == null) { sql.append("i.OWNER=?"); } else { diff --git a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/OracleStructureAssistant.java b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/OracleStructureAssistant.java index c93ab320388e3de171323c2bc84b4a75fa6ccb01..41c3b8eff3e4709978268997a3386d371b5098ba 100644 --- a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/OracleStructureAssistant.java +++ b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/OracleStructureAssistant.java @@ -157,9 +157,9 @@ public class OracleStructureAssistant implements DBSStructureAssistant'R'" : "") + - (schema != null ? " AND OWNER=?" : ""))) { - dbStat.setString(1, params.getMask().toUpperCase()); + "WHERE" + (params.isCaseSensitive() ? " CONSTRAINT_NAME " : " UPPER(CONSTRAINT_NAME) ") + + "LIKE ?" + (!hasFK ? " AND CONSTRAINT_TYPE<>'R'" : "") + (schema != null ? " AND OWNER=?" : ""))) { + dbStat.setString(1, params.isCaseSensitive() ? params.getMask() : params.getMask().toUpperCase()); if (schema != null) { dbStat.setString(2, schema.getName()); } @@ -250,13 +250,25 @@ public class OracleStructureAssistant implements DBSStructureAssistant