diff --git a/MDM-LCAG-JavaFunctions/src/main/java/application/FileActionsV3.java b/MDM-LCAG-JavaFunctions/src/main/java/application/FileActionsV3.java
deleted file mode 100644
index 89bd740..0000000
--- a/MDM-LCAG-JavaFunctions/src/main/java/application/FileActionsV3.java
+++ /dev/null
@@ -1,340 +0,0 @@
-package application;
-
-import java.awt.BorderLayout;
-import java.awt.Desktop;
-import java.awt.Dimension;
-import java.awt.GridLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.StandardCopyOption;
-import java.util.List;
-
-import javax.naming.ConfigurationException;
-import javax.swing.BorderFactory;
-import javax.swing.JButton;
-import javax.swing.JFileChooser;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
-import javax.swing.KeyStroke;
-import javax.swing.SwingUtilities;
-import javax.swing.filechooser.FileNameExtensionFilter;
-
-import de.lcag.common.ExcelWorkbook;
-import de.lcag.common.LcagProperties;
-import de.lcag.common.MappingTable;
-import de.lcag.common.WorkbookComparisonResult;
-import routines.LcagFileTools;
-import routines.LcagStringTools;
-
-public class FileActionsV3 extends JFrame {
- private static final int FRAME_HEIGHT = 150;
- private static String MASTER_FILE_LABEL = "Main Excel File";
- private static String CONFIG_FILE_LABEL = "Configuration File";
-
- private JLabel masterFileLabel, clientFileLabel, configFileLabel;
- private JButton selectMasterFile, selectClientFile, selectConfigFile;
- private Path masterFile, clientFile, configFile;
- private JMenuBar menuBar;
- private JMenu actionsMenu;
- private JMenuItem mergeAction;
- private JPopupMenu contextMenuMasterFile, contextMenuClientFile;
- private File configFileDirectoryPath = null;
- private LcagProperties config = null;
- private File masterDirecory = null;
-
- public FileActionsV3() {
- setTitle("Compare 2 Excel Files");
- setSize(800, FRAME_HEIGHT);
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-
- JPanel mainPanel = new JPanel(new BorderLayout());
- JPanel leftButtonPanel = new JPanel(new GridLayout(3, 1, 5, 5));
- JPanel rightTextPanel = new JPanel(new GridLayout(3, 1, 5, 5));
- // setLayout(new GridLayout(4, 2));
-
- leftButtonPanel.setPreferredSize(new Dimension(200, FRAME_HEIGHT)); // Fixed width
-
- // Add an empty border to create a gap on the right side of leftPanel
- leftButtonPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 10)); // right gap: 10px
-
- rightTextPanel.setPreferredSize(new Dimension(500, FRAME_HEIGHT));
- mainPanel.add(leftButtonPanel, BorderLayout.WEST);
- mainPanel.add(rightTextPanel, BorderLayout.EAST);
-
- configFileLabel = new JLabel(String.format(" %s: Not selected", CONFIG_FILE_LABEL));
-
- selectConfigFile = new JButton("Select " + CONFIG_FILE_LABEL);
- leftButtonPanel.add(selectConfigFile);
- rightTextPanel.add(configFileLabel);
-
- // File Chooser for config file
- selectConfigFile.setEnabled(true);
- selectConfigFile.addActionListener(e -> {
- if (!configFileDirectoryPath.isDirectory()) {
- System.err.println(String.format("ERROR: Config directory %s does not exist",
- configFileDirectoryPath.getAbsolutePath()));
- System.exit(1);
- }
-
- JFileChooser fileChooser = new JFileChooser(configFileDirectoryPath);
- FileNameExtensionFilter filter = new FileNameExtensionFilter("Config Files", "properties");
- fileChooser.setFileFilter(filter);
- if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
- String clientDirString = null;
-
- configFile = selectFile(fileChooser);
- config = new LcagProperties(configFile.toString());
-
- configFileLabel.setText(String.format(" %s: %s", CONFIG_FILE_LABEL, configFile));
-
- masterFile = config.getOptionalFilePathProperty("main_file");
- clientFile = config.getOptionalFilePathProperty("compare_file");
-
- if (clientFile.isAbsolute()) {
- clientDirString = clientFile.getParent().toString();
- } else {
- // client file is relative expect it is same directory as master
- Path dirPath = masterFile.getParent();
-
- clientDirString = "same directory as 1st file";
- clientFile = dirPath.resolve(clientFile);
- }
-
- // After user selected a config file enable buttons to set files to compare (can
- // overwrite files listed in config file):
- selectMasterFile.setEnabled(true);
-
- if (clientFile != null) {
- String fileName = clientFile.getFileName().toString();
- clientFileLabel
- .setText(String.format("Selected: %s
in: %s", fileName, clientDirString));
- selectClientFile.setEnabled(true);
- }
-
- if (masterFile != null) {
- String fileName = masterFile.getFileName().toString();
- masterDirecory = new File(masterFile.getParent().toString());
- masterFileLabel.setText(String.format("Selected: %s
in: %s", fileName,
- masterFile.getParent().toString()));
- selectClientFile.setEnabled(true);
- }
- }
- });
-
- // Kontextmen�s erstellen
- contextMenuMasterFile = new JPopupMenu();
- contextMenuClientFile = new JPopupMenu();
- JMenuItem renameFile1 = new JMenuItem("Rename File");
- JMenuItem renameFile2 = new JMenuItem("Rename File");
- contextMenuMasterFile.add(renameFile1);
- contextMenuClientFile.add(renameFile2);
-
- masterFileLabel = new JLabel(String.format(" %s: %s", MASTER_FILE_LABEL,
- masterFile == null ? "Not selected" : masterFile.getFileName()));
-
- selectMasterFile = new JButton("Select " + MASTER_FILE_LABEL);
- leftButtonPanel.add(selectMasterFile);
- rightTextPanel.add(masterFileLabel);
-
- clientFileLabel = new JLabel(String.format(" %s: %s", "Excel to compare",
- clientFile == null ? "Not selected" : clientFile.getFileName()));
-
- selectClientFile = new JButton("Select Excel to Compare");
-
- // MouseListener f�r Kontextmen� auf den Labels
- masterFileLabel.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- if (SwingUtilities.isRightMouseButton(e) && masterFile != null) {
- contextMenuMasterFile.show(masterFileLabel, e.getX(), e.getY());
- }
- }
- });
- clientFileLabel.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- if (SwingUtilities.isRightMouseButton(e) && clientFile != null) {
- contextMenuClientFile.show(clientFileLabel, e.getX(), e.getY());
- }
- }
- });
-
- leftButtonPanel.add(selectClientFile);
- rightTextPanel.add(clientFileLabel);
-
- renameFile1.addActionListener(e -> renameFile(masterFile, masterFileLabel, "Datei 1"));
- renameFile2.addActionListener(e -> renameFile(clientFile, clientFileLabel, "Datei 2"));
-
- // File Chooser f�r Datei 1 (nur Excel-Dateien)
- selectMasterFile.setEnabled(false);
- selectMasterFile.addActionListener(e -> {
- JFileChooser fileChooser = new JFileChooser();
- FileNameExtensionFilter filter = new FileNameExtensionFilter("Excel-Files", "xls", "xlsx");
- fileChooser.setFileFilter(filter);
- if (masterFile != null) {
- masterDirecory = new File(masterFile.getParent().toString());
- fileChooser.setCurrentDirectory(masterDirecory);
- }
- if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
- masterFile = selectFile(fileChooser);
- masterDirecory = new File(masterFile.getParent().toString());
- masterFileLabel.setText(String.format(" %s: %s", MASTER_FILE_LABEL, masterFile.getFileName()));
- selectClientFile.setEnabled(true);
- }
- });
-
- // File Chooser f�r Datei 2 (im selben Verzeichnis wie Datei 1, nur
- // Excel-Dateien)
- selectClientFile.setEnabled(false);
- selectClientFile.addActionListener(e -> {
- if (masterDirecory != null) {
- JFileChooser fileChooser = new JFileChooser(masterDirecory);
- FileNameExtensionFilter filter = new FileNameExtensionFilter("Excel-Dateien", "xls", "xlsx");
- fileChooser.setFileFilter(filter);
- if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
- clientFile = selectFile(fileChooser);
- clientFileLabel.setText("Datei 2: " + clientFile.getFileName());
- }
- }
- });
-
- // Men� erstellen
- menuBar = new JMenuBar();
- actionsMenu = new JMenu("Actions");
- mergeAction = new JMenuItem("Merge 2nd into Main file");
-
- mergeAction.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, ActionEvent.CTRL_MASK));
- mergeAction.addActionListener(e -> {
- System.out.println("Ctrl-C pressed on menu");
- });
-
- actionsMenu.add(mergeAction);
- menuBar.add(actionsMenu);
- setJMenuBar(menuBar);
-
- // Aktion: Erste Datei in Excel �ffnen
- mergeAction.addActionListener(e -> {
- mergeFiles(config, masterFile, clientFile);
- });
-
- add(mainPanel);
- pack();
- setVisible(true);
- }
-
- private Path selectFile(JFileChooser fileChooser) {
- File result = fileChooser.getSelectedFile();
- return Path.of(result.getAbsolutePath());
- }
-
- private void mergeFiles(LcagProperties pConfig, Path pMasterFilePath, Path pClientFilePath) {
- if (pConfig != null) {
- String keyFieldString = pConfig.getProperty("list_of_keys");
-
- List keyFields = LcagStringTools.asList(keyFieldString, ",\\s*");
-
- if (pMasterFilePath != null && pClientFilePath != null)
- try {
- String masterFileName = pMasterFilePath.getFileName().toString();
- Path resultFilePath = LcagFileTools.appendStringToFilePath(pMasterFilePath, "-merged");
- String fieldMapping = pConfig.getProperty("column.mapping.main2compare");
-
- Files.copy(pMasterFilePath, resultFilePath, StandardCopyOption.REPLACE_EXISTING);
-
- ExcelWorkbook excel1 = new ExcelWorkbook(resultFilePath.toString());
- ExcelWorkbook excel2 = new ExcelWorkbook(pClientFilePath.toString());
-
- excel1.setKeyColumns(keyFields);
- excel1.read();
- excel2.setKeyColumns(keyFields);
- excel2.read();
-
- excel1.setOption(keyFieldString, FRAME_HEIGHT);
-
- if (fieldMapping != null) {
- MappingTable mappingTable = new MappingTable(fieldMapping, ";", "->");
-
- excel2.setOption(mappingTable);
- }
-
- WorkbookComparisonResult compareResult = excel1.compareTo(excel2);
-
- ExcelWorkbook integratedTable = (ExcelWorkbook) compareResult.integrateDifferencesIntoMaster();
-
- integratedTable.save();
-
- Desktop.getDesktop().open(resultFilePath.toFile());
- } catch (IOException ex) {
- JOptionPane.showMessageDialog(this, "Cannot open comparison result file.", "Error",
- JOptionPane.ERROR_MESSAGE);
- } catch (ConfigurationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- } else {
- JOptionPane.showMessageDialog(this, "Pls select at least a config file!", "Error",
- JOptionPane.ERROR_MESSAGE);
- }
- }
-
- private Path getPath(LcagProperties config, String pProperty, File pMasterFile) {
- Path result = null;
- String filePathString = (pMasterFile == null) ? config.getProperty(pProperty) : pMasterFile.getAbsolutePath();
-
- if (!LcagStringTools.isEmpty(filePathString)) {
- result = Path.of(filePathString);
- }
-
- return result;
- }
-
- private Path renameFile(Path pFile, JLabel label, String prefix) {
- Path newPath = null;
- if (pFile == null)
- return newPath;
-
- File file = new File(pFile.toString());
- String newName = JOptionPane.showInputDialog(this, "Enter new name:", file.getName());
-
- if (!LcagStringTools.isEmpty(newName)) {
- newPath = pFile.getParent().resolve(newName);
-
- File newFile = new File(newPath.toString());
- if (file.renameTo(newFile)) {
- file = newFile;
- label.setText(prefix + ": " + newFile.getName());
- if (prefix.equals("Datei 1"))
- this.masterFile = newPath;
- else
- this.clientFile = newPath;
- } else {
- JOptionPane.showMessageDialog(this, "Umbenennung fehlgeschlagen!", "Fehler", JOptionPane.ERROR_MESSAGE);
- }
- }
-
- return newPath;
- }
-
- public static void main(String[] args) {
- String cfgFileDirectory = args.length < 1 ? System.getenv("_MY_DATA") + "/Tools" : args[1];
-
- SwingUtilities.invokeLater(() -> {
- FileActionsV3 gui = new FileActionsV3();
-
- gui.configFileDirectoryPath = new File(cfgFileDirectory);
- gui.setVisible(true);
- });
- }
-}
diff --git a/MDM-LCAG-JavaFunctions/src/main/java/de/lcag/common/AbstractTable.java b/MDM-LCAG-JavaFunctions/src/main/java/de/lcag/common/AbstractTable.java
index dddc6d7..dc617d2 100644
--- a/MDM-LCAG-JavaFunctions/src/main/java/de/lcag/common/AbstractTable.java
+++ b/MDM-LCAG-JavaFunctions/src/main/java/de/lcag/common/AbstractTable.java
@@ -50,6 +50,7 @@ public abstract class AbstractTable implements Table {
private PositionOrderedMap rowMap = new PositionOrderedMap();
private Set keyColumns = new ListOrderedSet<>();
+ private Set nonKeyColumnNames = null;
private List wantedColumns = new ArrayList<>();
private List excludedColumns = new ArrayList<>();
protected Map options = new HashMap<>();
@@ -61,7 +62,7 @@ public abstract class AbstractTable implements Table {
public class ListColumn implements TableColumn {
List