diff --git a/FormLocomotive.java b/FormLocomotive.java index 765b90b..beab336 100644 --- a/FormLocomotive.java +++ b/FormLocomotive.java @@ -107,7 +107,4 @@ public class FormLocomotive extends JComponent{ if (_locomotive != null) _locomotive.DrawTransport(g2); super.repaint(); } - public static void main(String[] args) { - new FormMapWithSetLocomotives(); - } } diff --git a/FormMapWithSetLocomotives.java b/FormMapWithSetLocomotives.java index 18610d1..65b6001 100644 --- a/FormMapWithSetLocomotives.java +++ b/FormMapWithSetLocomotives.java @@ -6,6 +6,8 @@ import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.text.ParseException; import java.util.HashMap; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.Logger; public class FormMapWithSetLocomotives extends JComponent { private BufferedImage bufferImg = null; @@ -29,7 +31,12 @@ public class FormMapWithSetLocomotives extends JComponent { JScrollPane listScroller = new JScrollPane(); JList listBoxMaps; - public FormMapWithSetLocomotives() { + private final Logger logger; + + public FormMapWithSetLocomotives(Logger logger) { + + this.logger = logger; + formFrame = new JFrame("Form Map With SetLocomotives"); formFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); formFrame.setSize(750, 500); @@ -78,6 +85,7 @@ public class FormMapWithSetLocomotives extends JComponent { return; } _mapsCollection.AddMap(textFieldNewMapName.getText(), _mapsDict.get(mapSelectComboBox.getSelectedItem().toString())); + logger.log(Level.INFO, "Map " + textFieldNewMapName.getText() + " added"); ReloadMaps(); }); statusPanel.add(addMapButton); @@ -87,6 +95,7 @@ public class FormMapWithSetLocomotives extends JComponent { listBoxMaps.addListSelectionListener(e -> { if(listBoxMaps.getSelectedValue() == null) return; bufferImg = _mapsCollection.Get(listBoxMaps.getSelectedValue().toString()).ShowSet(); + logger.log(Level.INFO,"Map switched to " + listBoxMaps.getSelectedValue().toString()); repaint(); }); statusPanel.add(listBoxMaps); @@ -105,6 +114,7 @@ public class FormMapWithSetLocomotives extends JComponent { } if(listBoxMaps.getSelectedValue().toString() == null) return; _mapsCollection.DelMap(listBoxMaps.getSelectedValue().toString()); + logger.log(Level.INFO,"Map " +listBoxMaps.getSelectedValue().toString() +" deleted"); ReloadMaps(); repaint(); }); @@ -120,14 +130,25 @@ public class FormMapWithSetLocomotives extends JComponent { return; } if (locomotive!=null) { - DrawningObjectLocomotive objectLocomotive = new DrawningObjectLocomotive(locomotive); - if (_mapsCollection.Get(listBoxMaps.getSelectedValue().toString()).Plus(objectLocomotive)!= -1){ - JOptionPane.showMessageDialog(formFrame, "Object added", "Success", JOptionPane.OK_CANCEL_OPTION); - bufferImg = _mapsCollection.Get(listBoxMaps.getSelectedValue().toString()).ShowSet(); - repaint(); + try { + DrawningObjectLocomotive objectLocomotive = new DrawningObjectLocomotive(locomotive); + if (_mapsCollection.Get(listBoxMaps.getSelectedValue().toString()).Plus(objectLocomotive)!= -1){ + JOptionPane.showMessageDialog(formFrame, "Object added", "Success", JOptionPane.OK_CANCEL_OPTION); + bufferImg = _mapsCollection.Get(listBoxMaps.getSelectedValue().toString()).ShowSet(); + logger.log(Level.INFO,"Object " + locomotive + " added"); + repaint(); + } + else { + JOptionPane.showMessageDialog(formFrame, "Object cannot be added", "Error", JOptionPane.OK_CANCEL_OPTION); + } } - else { - JOptionPane.showMessageDialog(formFrame, "Object cannot be added", "Error", JOptionPane.OK_CANCEL_OPTION); + catch (StorageOverflowException ex) { + JOptionPane.showMessageDialog(formFrame, "Storage overflow error: "+ ex.getMessage()); + logger.log(Level.WARN,"Error " + ex.getMessage()); + } + catch (Exception ex) { + JOptionPane.showMessageDialog(formFrame, "Unknown error: "+ ex.getMessage()); + logger.log(Level.FATAL,"Error " + ex.getMessage()); } } }); @@ -149,20 +170,30 @@ public class FormMapWithSetLocomotives extends JComponent { JFormattedTextField finalMaskedTextFieldPosition = maskedTextFieldPosition; deleteLocomotiveButton.addActionListener(e -> { // логика удаления - if ((String)mapSelectComboBox.getSelectedItem() == null) { - return; + try{ + if ((String)mapSelectComboBox.getSelectedItem() == null) { + return; + } + if (finalMaskedTextFieldPosition == null) { + return; + } + int position = Integer.parseInt(finalMaskedTextFieldPosition.getText()); + if (_mapsCollection.Get(listBoxMaps.getSelectedValue().toString()).Minus(position) != null) { + JOptionPane.showMessageDialog(formFrame, "Object removed", "Success", JOptionPane.OK_CANCEL_OPTION); + bufferImg = _mapsCollection.Get(listBoxMaps.getSelectedValue().toString()).ShowSet(); + logger.log(Level.INFO,"Locomotive deleted at position " + position); + repaint(); + } + else{ + JOptionPane.showMessageDialog(formFrame, "Object cannot be removed", "Error", JOptionPane.OK_CANCEL_OPTION); + }} + catch (LocomotiveNotFoundException ex) { + JOptionPane.showMessageDialog(formFrame, "Locomotive not found error: " + ex.getMessage()); + logger.log(Level.WARN,"Error " + ex.getMessage()); } - if (finalMaskedTextFieldPosition == null) { - return; - } - int position = Integer.parseInt(finalMaskedTextFieldPosition.getText()); - if (_mapsCollection.Get(listBoxMaps.getSelectedValue().toString()).Minus(position) != null) { - JOptionPane.showMessageDialog(formFrame, "Object removed", "Success", JOptionPane.OK_CANCEL_OPTION); - bufferImg = _mapsCollection.Get(listBoxMaps.getSelectedValue().toString()).ShowSet(); - repaint(); - } - else{ - JOptionPane.showMessageDialog(formFrame, "Object cannot be removed", "Error", JOptionPane.OK_CANCEL_OPTION); + catch (Exception ex) { + JOptionPane.showMessageDialog(formFrame, "Unknown error: "+ ex.getMessage()); + logger.log(Level.FATAL,"Error " + ex.getMessage()); } }); statusPanel.add(deleteLocomotiveButton); @@ -186,8 +217,18 @@ public class FormMapWithSetLocomotives extends JComponent { { return; } - bufferImg = _mapsCollection.Get(listBoxMaps.getSelectedValue().toString()).ShowOnMap(); - repaint(); + try { + bufferImg = _mapsCollection.Get(listBoxMaps.getSelectedValue().toString()).ShowOnMap(); + repaint(); + } + catch (StorageOverflowException ex) { + JOptionPane.showMessageDialog(formFrame, "Storage overflow error: "+ ex.getMessage()); + logger.log(Level.WARN,"Error " + ex.getMessage()); + } + catch (Exception ex) { + JOptionPane.showMessageDialog(null, "Unknown error: "+ ex.getMessage()); + logger.log(Level.FATAL,"Error " + ex.getMessage()); + } }); statusPanel.add(showOnMapButton); @@ -271,10 +312,15 @@ public class FormMapWithSetLocomotives extends JComponent { fileChooser.setDialogTitle("Saving"); int result = fileChooser.showSaveDialog(FormMapWithSetLocomotives.this); if (result == JFileChooser.APPROVE_OPTION ) { - if (_mapsCollection.SaveData(fileChooser.getSelectedFile().getAbsolutePath())) { + try { + _mapsCollection.SaveData(fileChooser.getSelectedFile().getAbsolutePath()); JOptionPane.showMessageDialog(null, "Save success"); + logger.log(Level.INFO,"Saved all to " + fileChooser.getSelectedFile().getAbsolutePath()); + } + catch (Exception ex) { + JOptionPane.showMessageDialog(null, "Save error: " + ex.getMessage()); + logger.log(Level.ERROR,"Error " + ex.getMessage()); } - else JOptionPane.showMessageDialog(null, "Save failed"); } }); @@ -285,13 +331,18 @@ public class FormMapWithSetLocomotives extends JComponent { fileChooser.setDialogTitle("Loading"); int result = fileChooser.showSaveDialog(FormMapWithSetLocomotives.this); if (result == JFileChooser.APPROVE_OPTION ) { - if (_mapsCollection.LoadData(fileChooser.getSelectedFile().getAbsolutePath())) { + try { + _mapsCollection.LoadData(fileChooser.getSelectedFile().getAbsolutePath()); JOptionPane.showMessageDialog(null, "Load success"); + logger.log(Level.INFO,"Loaded all from " + fileChooser.getSelectedFile().getAbsolutePath()); + ReloadMaps(); + repaint(); + } + catch (Exception ex) { + JOptionPane.showMessageDialog(null, "Load error: " + ex.getMessage()); + logger.log(Level.ERROR,"Error " + ex.getMessage()); } - else JOptionPane.showMessageDialog(null, "Load failed"); } - ReloadMaps(); - repaint(); }); statusPanel.add(loadButton); @@ -306,11 +357,16 @@ public class FormMapWithSetLocomotives extends JComponent { return; } if(listBoxMaps.getSelectedValue().toString() == null) return; - if (_mapsCollection.SaveMap(listBoxMaps.getSelectedValue().toString(), fileChooser.getSelectedFile().getAbsolutePath())) { + try { + _mapsCollection.SaveMap(listBoxMaps.getSelectedValue().toString(), fileChooser.getSelectedFile().getAbsolutePath()); JOptionPane.showMessageDialog(null, "Map saving success"); + logger.log(Level.INFO,"Saved map to " + fileChooser.getSelectedFile().getAbsolutePath()); + repaint(); + } + catch (Exception ex) { + JOptionPane.showMessageDialog(null, "Map saving error: " + ex.getMessage()); + logger.log(Level.ERROR,"Error " + ex.getMessage()); } - else JOptionPane.showMessageDialog(null, "Map saving fail"); - repaint(); } }); statusPanel.add(saveMapButton); @@ -321,13 +377,18 @@ public class FormMapWithSetLocomotives extends JComponent { fileChooser.setDialogTitle("Loading"); int result = fileChooser.showSaveDialog(FormMapWithSetLocomotives.this); if (result == JFileChooser.APPROVE_OPTION ) { - if (_mapsCollection.LoadMap(fileChooser.getSelectedFile().getAbsolutePath())) { + try { + _mapsCollection.LoadMap(fileChooser.getSelectedFile().getAbsolutePath()); JOptionPane.showMessageDialog(null, "Load Map success"); + logger.log(Level.INFO,"Loaded map from " + fileChooser.getSelectedFile().getAbsolutePath()); + ReloadMaps(); + repaint(); + } + catch (Exception ex) { + JOptionPane.showMessageDialog(null, "Load Map error: " + ex.getMessage()); + logger.log(Level.ERROR,"Error " + ex.getMessage()); } - else JOptionPane.showMessageDialog(null, "Load Map failed"); } - ReloadMaps(); - repaint(); }); statusPanel.add(loadMapButton); diff --git a/LocomotiveNotFoundException.java b/LocomotiveNotFoundException.java new file mode 100644 index 0000000..5a1016b --- /dev/null +++ b/LocomotiveNotFoundException.java @@ -0,0 +1,5 @@ +public class LocomotiveNotFoundException extends Exception{ + public LocomotiveNotFoundException(int i) { + super("Не найден объект по позиции " + i); + } +} diff --git a/Main.java b/Main.java new file mode 100644 index 0000000..9e7aef7 --- /dev/null +++ b/Main.java @@ -0,0 +1,11 @@ +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class Main { + private static Logger logger = null; + + public static void main(String[] args) { + logger = LogManager.getLogger(Main.class); + new FormMapWithSetLocomotives(logger); + } +} diff --git a/MapWithSetLocomotivesGeneric.java b/MapWithSetLocomotivesGeneric.java index 0df89e8..0a14654 100644 --- a/MapWithSetLocomotivesGeneric.java +++ b/MapWithSetLocomotivesGeneric.java @@ -13,9 +13,9 @@ public class MapWithSetLocomotivesGeneric /// Высота окна отрисовки private final int _pictureHeight; /// Размер занимаемого объектом места (ширина) - private final int _placeSizeWidth = 210; + private final int _placeSizeWidth = 150; /// Размер занимаемого объектом места (высота) - private final int _placeSizeHeight = 90; + private final int _placeSizeHeight = 150; public final SetLocomotivesGeneric _setLocomotives; // Список удаленных объектов @@ -39,12 +39,12 @@ public class MapWithSetLocomotivesGeneric } /// Добавление - public int Plus(T locomotive) + public int Plus(T locomotive) throws StorageOverflowException { return this._setLocomotives.Insert(locomotive); } /// Удаление - public T Minus(int position) + public T Minus(int position) throws LocomotiveNotFoundException { T temp = this._setLocomotives.Remove(position); if (temp == null) return null; @@ -62,7 +62,7 @@ public class MapWithSetLocomotivesGeneric } /// Просмотр объекта на карте - public BufferedImage ShowOnMap() + public BufferedImage ShowOnMap() throws LocomotiveNotFoundException, StorageOverflowException { Shaking(); for (var locomotive : _setLocomotives.GetLocomotives()) @@ -86,7 +86,7 @@ public class MapWithSetLocomotivesGeneric } /// "Взбалтываем" набор, чтобы все элементы оказались в начале - private void Shaking() + private void Shaking() throws LocomotiveNotFoundException, StorageOverflowException { int j = _setLocomotives.Count() - 1; for (int i = 0; i < _setLocomotives.Count(); i++) @@ -157,8 +157,8 @@ public class MapWithSetLocomotivesGeneric /// Метод прорисовки объектов private void DrawLocomotives(Graphics2D g) { - int width = _pictureWidth / _placeSizeWidth; - int height = _pictureHeight / _placeSizeHeight; + int width = _pictureWidth / _placeSizeWidth - 1; + int height = _pictureHeight / _placeSizeHeight - 1; int curWidth = 0; int curHeight = 0; @@ -166,7 +166,7 @@ public class MapWithSetLocomotivesGeneric for (var locomotive : _setLocomotives.GetLocomotives()) { // установка позиции - if (locomotive != null) locomotive.SetObject(curWidth * _placeSizeWidth + 10, curHeight * _placeSizeHeight + 18, _pictureWidth, _pictureHeight); + if (locomotive != null) locomotive.SetObject(curWidth * _placeSizeWidth + 10, curHeight * _placeSizeHeight + 80, _pictureWidth, _pictureHeight); if (locomotive != null) locomotive.DrawningObject(g); if (curWidth < width) curWidth++; else @@ -189,7 +189,7 @@ public class MapWithSetLocomotivesGeneric } /// Загрузка списка из массива строк - public void LoadData(String[] records) + public void LoadData(String[] records) throws StorageOverflowException { Collections.reverse(Arrays.asList(records)); for (var rec : records) diff --git a/MapsCollection.java b/MapsCollection.java index 0c666b0..6efca26 100644 --- a/MapsCollection.java +++ b/MapsCollection.java @@ -2,6 +2,7 @@ import java.io.*; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.zip.DataFormatException; public class MapsCollection { /// Словарь (хранилище) с картами @@ -51,59 +52,51 @@ public class MapsCollection { } /// Сохранение информации по локомотивам в хранилище в файл - public boolean SaveData(String filename) + public void SaveData(String filename) throws IOException { File file = new File(filename); if (file.exists()) { file.delete(); } - try(BufferedWriter bw = new BufferedWriter(new FileWriter(filename))) { - bw.write("MapsCollection\n"); - for (var storage : _mapStorages.entrySet()) { - bw.write("" + storage.getKey() + separatorDict + storage.getValue().GetData(separatorDict.charAt(0), separatorData) + "\n"); - } + BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); + bw.write("MapsCollection\n"); + for (var storage : _mapStorages.entrySet()) { + bw.write("" + storage.getKey() + separatorDict + storage.getValue().GetData(separatorDict.charAt(0), separatorData) + "\n"); } - catch (IOException ex) { - System.out.println(ex.getMessage()); - } - return true; + bw.flush(); } // Сохранение одной выбранной карты - public boolean SaveMap(String map_name, String filename) { + public void SaveMap(String map_name, String filename) throws IOException{ File file = new File(filename); MapWithSetLocomotivesGeneric map = Get(map_name); if (file.exists()) { file.delete(); } - try(BufferedWriter bw = new BufferedWriter(new FileWriter(filename))) { - bw.write("SingleMap\n"); - bw.write("" + map_name + "\n"); - bw.write("" + map.getClass() + "\n"); - for (var locomotive : map._setLocomotives.GetLocomotives()) { - bw.write("" + locomotive.getInfo() + "\n"); - } + BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); + bw.write("SingleMap\n"); + bw.write("" + map_name + "\n"); + bw.write("" + map.getClass() + "\n"); + for (var locomotive : map._setLocomotives.GetLocomotives()) { + bw.write("" + locomotive.getInfo() + "\n"); } - catch (IOException ex) { - System.out.println(ex.getMessage()); - } - return true; + bw.flush(); + } // Загрузка одной карты - public boolean LoadMap(String filename){ - File file = new File(filename); - if (!file.exists()) - { - return false; - } - try { + public void LoadMap(String filename) throws StorageOverflowException, IOException, DataFormatException{ + File file = new File(filename); + if (!file.exists()) + { + throw new FileNotFoundException("Файл не найден"); + } BufferedReader br = new BufferedReader(new FileReader(filename)); String curLine = br.readLine(); if (!curLine.contains("SingleMap")) { - return false; + throw new DataFormatException("Неверный формат данных"); } String mapName = br.readLine(); String mapClass = br.readLine(); @@ -113,7 +106,6 @@ public class MapsCollection { _mapStorages.get(mapName)._setLocomotives.Insert(DrawningObjectLocomotive.Create(curLine)); } _mapStorages.get(mapName)._setLocomotives.ReversePlaces(); - return true; } AbstractMap map = null; switch (mapClass) @@ -133,53 +125,43 @@ public class MapsCollection { _mapStorages.get(mapName)._setLocomotives.Insert(DrawningObjectLocomotive.Create(curLine)); } _mapStorages.get(mapName)._setLocomotives.ReversePlaces(); - - } catch (IOException ex) { - System.out.println(ex.getMessage()); - } - return true; } /// Загрузка информации по локомотивам в депо из файла - public boolean LoadData(String filename) + public void LoadData(String filename) throws DataFormatException, IOException, StorageOverflowException { File file = new File(filename); if (!file.exists()) { - return false; + throw new FileNotFoundException("Файл не найден"); } - try { - BufferedReader br = new BufferedReader(new FileReader(filename)); - String curLine = br.readLine(); - if (!curLine.contains("MapsCollection")) { - return false; + + BufferedReader br = new BufferedReader(new FileReader(filename)); + String curLine = br.readLine(); + if (!curLine.contains("MapsCollection")) { + throw new DataFormatException("Неверный формат данных"); + } + + _mapStorages.clear(); + while ((curLine = br.readLine()) != null) { + var elems = curLine.split(separatorDict); + AbstractMap map = null; + switch (elems[1]) + { + case "class SimpleMap": + map = new SimpleMap(); + break; + case "class SpikeMap": + map = new SpikeMap(); + break; + case "class RailMap": + map = new RailMap(); + break; } - _mapStorages.clear(); - while ((curLine = br.readLine()) != null) { - var elems = curLine.split(separatorDict); - AbstractMap map = null; - - switch (elems[1]) - { - case "class SimpleMap": - map = new SimpleMap(); - break; - case "class SpikeMap": - map = new SpikeMap(); - break; - case "class RailMap": - map = new RailMap(); - break; - } - - _mapStorages.put(elems[0], new MapWithSetLocomotivesGeneric(_pictureWidth, _pictureHeight, map)); - _mapStorages.get(elems[0]).LoadData(elems[2].split(Character.toString(separatorData))); - } - } catch (IOException ex) { - System.out.println(ex.getMessage()); + _mapStorages.put(elems[0], new MapWithSetLocomotivesGeneric(_pictureWidth, _pictureHeight, map)); + _mapStorages.get(elems[0]).LoadData(elems[2].split(Character.toString(separatorData))); } - return true; } diff --git a/SetLocomotivesGeneric.java b/SetLocomotivesGeneric.java index 07fee4a..1e96946 100644 --- a/SetLocomotivesGeneric.java +++ b/SetLocomotivesGeneric.java @@ -18,20 +18,26 @@ public class SetLocomotivesGeneric _places = new ArrayList<>(); } - public int Insert (T locomotive) { + public int Insert (T locomotive) throws StorageOverflowException{ return Insert(locomotive, 0); } - public int Insert (T locomotive, int position) { - if (position >= _maxCount|| position < 0) return -1; - _places.add(position, locomotive); - return position; + public int Insert (T locomotive, int position) throws StorageOverflowException{ + if (position < 0) return -1; + if (Count() >= _maxCount) { + throw new StorageOverflowException(_maxCount); + } + _places.add(position, locomotive); + return position; } - public T Remove (int position) { + public T Remove (int position) throws LocomotiveNotFoundException { if (position >= _maxCount || position < 0) return null; + if (_places.get(position) == null) { + throw new LocomotiveNotFoundException(position); + } T result = _places.get(position); - _places.remove(position); + _places.set(position, null); return result; } diff --git a/StorageOverflowException.java b/StorageOverflowException.java new file mode 100644 index 0000000..376d6a5 --- /dev/null +++ b/StorageOverflowException.java @@ -0,0 +1,5 @@ +public class StorageOverflowException extends Exception{ + public StorageOverflowException(int count) { + super("В наборе превышено допустимое количество: " + count); + } +} diff --git a/log4j2.xml b/log4j2.xml new file mode 100644 index 0000000..ee4f664 --- /dev/null +++ b/log4j2.xml @@ -0,0 +1,25 @@ + + + + + + %-5level %msg (%d{dd.MM.yyyy})%n + + + + + + %-5level %msg (%d{dd.MM.yyyy})%n + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..7203947 --- /dev/null +++ b/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + groupId + PIbd-23_Mochalov_D.V._Locomotive_Hard + 1.0-SNAPSHOT + + + 19 + 19 + UTF-8 + + + + + org.apache.logging.log4j + log4j-api + 2.19.0 + + + org.apache.logging.log4j + log4j-core + 2.19.0 + + + + \ No newline at end of file