package nl.fontys.sofa.limo.view.wizard.importer;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import nl.fontys.sofa.limo.domain.BaseEntity;
import nl.fontys.sofa.limo.domain.component.event.Event;
import nl.fontys.sofa.limo.domain.component.hub.Hub;
import nl.fontys.sofa.limo.domain.component.procedure.ProcedureCategory;
import nl.fontys.sofa.limo.domain.component.type.HubType;
import nl.fontys.sofa.limo.domain.component.type.LegType;
import nl.fontys.sofa.limo.externaltrader.JSONImporter;
import nl.fontys.sofa.limo.view.util.LIMOResourceBundle;
import nl.fontys.sofa.limo.view.wizard.export.data.dialog.DefaultTableModel;
import nl.fontys.sofa.limo.view.wizard.export.data.dialog.EventDataDialog;
import nl.fontys.sofa.limo.view.wizard.export.data.dialog.HubDataDialog;
import nl.fontys.sofa.limo.view.wizard.export.data.dialog.ProcedureDataDialog;
import nl.fontys.sofa.limo.view.wizard.export.data.dialog.TypeDataDialog;
/**
* This class handles conflicts while importing a set of data.
*
* @author Matthias Brück
*/
public class ImportConflictPanel extends JPanel implements MouseListener, ActionListener, TableModelListener {
private List<BaseEntity> entitiesToOverride, allEntitiesOld, allEntitiesNew;
private JTable tblEntities;
private DefaultTableModel tblmdlEntities;
private JButton btnSelectAll, btnDeselectAll;
private Map<String, List<Map.Entry<BaseEntity, BaseEntity>>> duplicatedElements;
private JLabel lbConflicts, lbImport, lbDone, lbOlder;
private final CellConstraints cc;
/**
* Creates a new ImportConflictPanel with a given path to a selected file
* that should get imported.
*
* @param path The String containing the filepath to the import file.
*/
public ImportConflictPanel(String path) {
if (!path.isEmpty()) {
duplicatedElements = JSONImporter.importData(path);
} else {
duplicatedElements = new HashMap<>();
}
cc = new CellConstraints();
FormLayout layout = new FormLayout("5px, pref, 5px, pref, 5px, pref:grow, 5px", "5px, pref, 5px, pref, 5px, pref, 5px, pref, 5px, pref, 5px, pref:grow, 5px");
this.setLayout(layout);
initView();
initTable();
this.setVisible(true);
}
/**
* Initializes the view elements except the table.
*/
private void initView() {
entitiesToOverride = new ArrayList<>();
allEntitiesNew = new ArrayList<>();
allEntitiesOld = new ArrayList<>();
lbImport = new JLabel();
this.add(lbImport, cc.xyw(2, 2, 5));
lbDone = new JLabel();
this.add(lbDone, cc.xyw(2, 4, 5));
lbConflicts = new JLabel();
this.add(lbConflicts, cc.xyw(2, 6, 5));
lbOlder = new JLabel();
this.add(lbOlder, cc.xyw(2, 8, 5));
btnSelectAll = new JButton(LIMOResourceBundle.getString("SELECT_ALL"));
btnSelectAll.addActionListener(this);
this.add(btnSelectAll, cc.xy(2, 10));
btnDeselectAll = new JButton(LIMOResourceBundle.getString("DESELECT_ALL"));
btnDeselectAll.addActionListener(this);
this.add(btnDeselectAll, cc.xy(4, 10));
setInfoTexts();
}
private void setInfoTexts() {
lbImport.setText(LIMOResourceBundle.getString("NUMBER_OF", LIMOResourceBundle.getString("ALL", LIMOResourceBundle.getString("ENTITIES")), JSONImporter.getLastEntitiesInFileCount()));
lbDone.setText(LIMOResourceBundle.getString("ALREADY_IMPORTED") + " " + JSONImporter.getLastDirectImportedEntityCount());
lbConflicts.setText(LIMOResourceBundle.getString("NUMBER_OF", LIMOResourceBundle.getString("CONFLICTS"), JSONImporter.getLastDuplicatedEntityCount()));
lbOlder.setText(LIMOResourceBundle.getString("NUMBER_OF_OLDER_ENTITIES") + " " + JSONImporter.getLastOlderEntityCount());
}
/**
* Initializes the table.
*/
private void initTable() {
duplicatedElements.values().stream().forEach((list) -> {
list.stream().map((entity) -> {
allEntitiesOld.add(entity.getKey());
return entity;
}).forEach((entity) -> {
allEntitiesNew.add(entity.getValue());
});
});
resetTableModel();
tblEntities = new JTable(tblmdlEntities);
tblEntities.addMouseListener(this);
JScrollPane scpane = new JScrollPane(tblEntities);
this.add(scpane, cc.xyw(2, 12, 5));
}
/**
* Resets the table model.
*/
private void resetTableModel() {
tblmdlEntities = new DefaultTableModel(getTableObject(), new String[]{LIMOResourceBundle.getString("OLD_ENTITY"),
LIMOResourceBundle.getString("DATE_OF", LIMOResourceBundle.getString("OLD_ENTITY")),
LIMOResourceBundle.getString("NEW_ENTITY"), LIMOResourceBundle.getString("DATE_OF", LIMOResourceBundle.getString("NEW_ENTITY")),
LIMOResourceBundle.getString("OVERWRITE_YOUR_ENTITY")}, new boolean[]{false, false, false, false, true},
new Class[]{BaseEntity.class, Date.class, BaseEntity.class, Date.class, Boolean.class});
tblmdlEntities.addTableModelListener(this);
}
/**
* Returns an data array which fits in the table model. The Objects are
* retrieved from all old entities.
*
* @return An Object Array which fits into the table model.
*/
private Object[][] getTableObject() {
Object[][] data = new Object[allEntitiesOld.size()][5];
for (int i = 0; i < allEntitiesOld.size(); i++) {
data[i][0] = allEntitiesOld.get(i).getName();
data[i][1] = new Date(allEntitiesOld.get(i).getLastUpdate());
data[i][2] = allEntitiesNew.get(i).getName();
data[i][3] = new Date(allEntitiesNew.get(i).getLastUpdate());
data[i][4] = false;
}
return data;
}
/**
* Returns all entities that should be overwritten.
*
* @return A List containing all entities the user has chosen to overwrite.
*/
public List<BaseEntity> getEntitiesToOverride() {
return entitiesToOverride;
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(btnSelectAll)) {
entitiesToOverride.clear();
entitiesToOverride.addAll(allEntitiesNew);
entitiesToOverride.stream().forEach((newent) -> {
allEntitiesOld.stream().filter((oldent) -> (newent.getUniqueIdentifier().equals(oldent.getUniqueIdentifier()))).forEach((oldent) -> {
newent.setId(oldent.getId());
});
});
for (int i = 0; i < tblmdlEntities.getRowCount(); i++) {
tblmdlEntities.setValueAt(true, i, 4);
}
tblmdlEntities.fireTableDataChanged();
}
if (e.getSource().equals(btnDeselectAll)) {
entitiesToOverride.clear();
for (int i = 0; i < tblmdlEntities.getRowCount(); i++) {
tblmdlEntities.setValueAt(false, i, 4);
}
tblmdlEntities.fireTableDataChanged();
}
}
@Override
public void tableChanged(TableModelEvent e) {
if (e.getSource().equals(tblmdlEntities)) {
if (tblEntities.getSelectedRow() >= 0 && tblEntities.getSelectedRow() < allEntitiesNew.size()) {
if ((boolean) (((DefaultTableModel) e.getSource()).getValueAt(tblEntities.getSelectedRow(), 4))) {
BaseEntity newent = allEntitiesNew.get(tblEntities.getSelectedRow());
allEntitiesOld.stream().filter((oldent) -> (newent.getUniqueIdentifier().equals(oldent.getUniqueIdentifier()))).forEach((oldent) -> {
newent.setId(oldent.getId());
});
entitiesToOverride.add(newent);
} else {
BaseEntity newent = allEntitiesNew.get(tblEntities.getSelectedRow());
allEntitiesOld.stream().filter((oldent) -> (newent.getUniqueIdentifier().equals(oldent.getUniqueIdentifier()))).forEach((oldent) -> {
newent.setId(oldent.getId());
});
entitiesToOverride.remove(newent);
}
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
if (tblEntities.getSelectedRow() >= 0 && tblEntities.getSelectedRow() < allEntitiesOld.size()) {
if (tblEntities.getSelectedColumn() == 0) {
BaseEntity entity = allEntitiesOld.get(tblEntities.getSelectedRow());
if (entity instanceof ProcedureCategory) {
new ProcedureDataDialog((ProcedureCategory) entity);
}
if (entity instanceof LegType) {
new TypeDataDialog((LegType) entity);
}
if (entity instanceof HubType) {
new TypeDataDialog((HubType) entity);
}
if (entity instanceof Hub) {
new HubDataDialog((Hub) entity);
}
if (entity instanceof Event) {
new EventDataDialog((Event) entity);
}
}
if (tblEntities.getSelectedColumn() == 2) {
BaseEntity entity = allEntitiesNew.get(tblEntities.getSelectedRow());
if (entity instanceof ProcedureCategory) {
new ProcedureDataDialog((ProcedureCategory) entity);
}
if (entity instanceof LegType) {
new TypeDataDialog((LegType) entity);
}
if (entity instanceof HubType) {
new TypeDataDialog((HubType) entity);
}
if (entity instanceof Hub) {
new HubDataDialog((Hub) entity);
}
if (entity instanceof Event) {
new EventDataDialog((Event) entity);
}
}
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
/**
* Updates the table with a new filepath.
*
* @param filePath The new file containing the entities to import.
*/
public void updateTable(String filePath) {
if (!filePath.isEmpty()) {
duplicatedElements = JSONImporter.importData(filePath);
} else {
duplicatedElements = new HashMap<>();
}
entitiesToOverride = new ArrayList<>();
allEntitiesNew = new ArrayList<>();
allEntitiesOld = new ArrayList<>();
duplicatedElements.values().stream().forEach((list) -> {
list.stream().map((entity) -> {
allEntitiesOld.add(entity.getKey());
return entity;
}).forEach((entity) -> {
allEntitiesNew.add(entity.getValue());
});
});
resetTableModel();
tblEntities.setModel(tblmdlEntities);
tblmdlEntities.fireTableDataChanged();
setInfoTexts();
}
}