Try to improve mapsforge auto file detection.

This commit is contained in:
Holt59 2018-02-25 21:39:57 +01:00
parent d4b1ef0481
commit 05c4f0da2a
4 changed files with 104 additions and 155 deletions

View File

@ -1,83 +0,0 @@
package org.insa.graph.io ;
import java.io.* ;
import java.util.zip.* ;
/**
* Class that can be used to open (compressed) files from a specified
* set of folders or for a full path.
*
*/
public class Openfile {
/**
* These folders will be looked up for the files.
*
*/
private static final String[] datadirs = {
// INSA folder containing maps.
"/home/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Maps",
// INSA folder containing paths.
"/home/commetud/3eme Annee MIC/Graphes-et-Algorithmes/",
// Maps sub-folder.
"Maps",
// Current folder.
"."
};
/**
* Available extensions.
*
*/
private static final String[] extensions = { ".map", ".gz", ".map.gz", ".path", ".path.gz", "" };
/**
* Open the given file and return a corresponding DataInputStream.
*
* @param filename Name of the file to open (without extension) or full path to the given file.
* @throws IOException
*/
public static DataInputStream open(String filename) throws IOException {
File file = null;
String fullpath = null;
// If the filename containing only a name (not a path):
if (filename.equals (new File(filename).getName())) {
for (String ext: extensions) {
String fname = filename + ext;
for (int index = 0; file == null && index < datadirs.length; ++index) {
fullpath = datadirs[index] + File.separator + fname;
file = new File(fullpath);
if (!file.exists()) {
file = null;
}
}
}
}
else {
fullpath = filename;
file = new File(filename);
}
InputStream fileInput = new FileInputStream(new File(fullpath));
// If the file is compressed.
if (fullpath.endsWith(".gz")) {
fileInput = new GZIPInputStream(fileInput) ;
}
else {
fileInput = new BufferedInputStream(fileInput) ;
}
return new DataInputStream(fileInput) ;
}
}

View File

@ -11,10 +11,12 @@ import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
@ -61,11 +63,12 @@ import org.insa.graph.io.BinaryPathReader;
import org.insa.graph.io.BinaryPathWriter;
import org.insa.graph.io.GraphReader;
import org.insa.graph.io.MapMismatchException;
import org.insa.graph.io.Openfile;
import org.insa.graphics.ShortestPathPanel.StartActionEvent;
import org.insa.graphics.drawing.BasicDrawing;
import org.insa.graphics.drawing.BasicGraphPalette;
import org.insa.graphics.drawing.BlackAndWhiteGraphPalette;
import org.insa.graphics.drawing.Drawing;
import org.insa.graphics.drawing.GraphPalette;
import org.insa.graphics.drawing.MapViewDrawing;
import org.insa.graphics.drawing.overlays.PathOverlay;
@ -89,11 +92,13 @@ public class MainWindow extends JFrame {
// Current graph.
protected Graph graph;
// Current loaded path.
// private Path currentPath;
// Path to the last opened graph file.
private String graphFilePath;
// Drawing and click adapter.
protected Drawing drawing;
private MapViewDrawing mapViewDrawing;
private BasicDrawing basicDrawing;
// Main panel.
private JSplitPane mainPanel;
@ -133,7 +138,10 @@ public class MainWindow extends JFrame {
setLayout(new BorderLayout());
// Create drawing and action listeners...
this.drawing = new BasicDrawing();
this.basicDrawing = new BasicDrawing();
this.mapViewDrawing = new MapViewDrawing();
this.drawing = this.basicDrawing;
spPanel = new ShortestPathPanel(MainWindow.this);
spPanel.addStartActionListener(new ActionListener() {
@ -158,6 +166,9 @@ public class MainWindow extends JFrame {
});
spPanel.setVisible(false);
basicDrawing.addDrawingClickListener(spPanel.nodesInputPanel);
mapViewDrawing.addDrawingClickListener(spPanel.nodesInputPanel);
this.currentThread = new ThreadWrapper(this);
this.baf = new BlockingActionFactory(this);
this.baf.addAction(currentThread);
@ -359,23 +370,76 @@ public class MainWindow extends JFrame {
}
private void addDrawingClickListeners() {
drawing.addDrawingClickListener(spPanel.nodesInputPanel);
}
private void updateDrawing(Class<? extends Drawing> newClass) {
/**
* Draw the stored graph on the drawing.
*/
private void drawGraph(Class<? extends Drawing> newClass, GraphPalette palette) {
// Save old divider location
int oldLocation = mainPanel.getDividerLocation();
boolean isNewGraph = newClass == null;
boolean isMapView = (isNewGraph && drawing == mapViewDrawing)
|| (!isNewGraph && newClass.equals(MapViewDrawing.class));
// We need to draw MapView, we have to check if the file exists.
File mfile = null;
if (isMapView) {
String mfpath = graphFilePath.substring(0, graphFilePath.lastIndexOf(".map")) + ".mapfg";
mfile = new File(mfpath);
if (!mfile.exists()) {
if (JOptionPane.showConfirmDialog(this,
"The associated mapsforge (.mapfg) file has not been found, do you want to specify it manually?",
"File not found", JOptionPane.YES_NO_CANCEL_OPTION) == JOptionPane.YES_OPTION) {
JFileChooser chooser = new JFileChooser(mfile.getParentFile());
if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
mfile = chooser.getSelectedFile();
}
else {
mfile = null;
}
}
else {
mfile = null;
}
}
}
if (isMapView && mfile != null) {
// It is a mapview drawing and the file was found, so:
// 1. We create the drawing if necessary.
if (drawing != mapViewDrawing) {
drawing.clear();
if (drawing == null || !newClass.isInstance(drawing)) {
try {
drawing = newClass.newInstance();
}
catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
addDrawingClickListeners();
mainPanel.setLeftComponent((Component) drawing);
drawing = mapViewDrawing;
mainPanel.setLeftComponent(mapViewDrawing);
mainPanel.setDividerLocation(oldLocation);
}
// 2. We draw the graph.
drawing.clear();
((MapViewDrawing) drawing).drawGraph(mfile);
}
else if (!isMapView || (isMapView && mfile == null && isNewGraph)) {
if (drawing == mapViewDrawing) {
mapViewDrawing.clear();
drawing = basicDrawing;
addDrawingClickListeners();
mainPanel.setLeftComponent(basicDrawing);
mainPanel.setDividerLocation(oldLocation);
}
drawing.clear();
drawing.drawGraph(graph, palette);
}
}
private void drawGraph(Class<? extends Drawing> newClass) {
drawGraph(newClass, new BasicGraphPalette());
}
private void drawGraph() {
drawGraph(null, new BasicGraphPalette());
}
private JMenuBar createMenuBar() {
@ -398,7 +462,8 @@ public class MainWindow extends JFrame {
String path = chooser.getSelectedFile().getAbsolutePath();
DataInputStream stream;
try {
stream = Openfile.open(path);
stream = new DataInputStream(
new BufferedInputStream(new FileInputStream(chooser.getSelectedFile())));
}
catch (IOException e1) {
JOptionPane.showMessageDialog(MainWindow.this, "Cannot open the selected file.");
@ -420,8 +485,11 @@ public class MainWindow extends JFrame {
exception.printStackTrace(System.out);
return;
}
drawing.clear();
drawing.drawGraph(graph);
// Save file path.
graphFilePath = path;
drawGraph();
for (JMenuItem item: graphLockItems) {
item.setEnabled(true);
@ -447,7 +515,8 @@ public class MainWindow extends JFrame {
if (chooser.showOpenDialog(MainWindow.this) == JFileChooser.APPROVE_OPTION) {
BinaryPathReader reader;
try {
reader = new BinaryPathReader(Openfile.open(chooser.getSelectedFile().getAbsolutePath()));
reader = new BinaryPathReader(new DataInputStream(
new BufferedInputStream(new FileInputStream(chooser.getSelectedFile()))));
}
catch (IOException e1) {
JOptionPane.showMessageDialog(MainWindow.this, "Cannot open the selected file.");
@ -497,8 +566,7 @@ public class MainWindow extends JFrame {
launchThread(new Runnable() {
@Override
public void run() {
updateDrawing(BasicDrawing.class);
drawing.drawGraph(graph);
drawGraph(BasicDrawing.class);
}
});
}
@ -512,8 +580,7 @@ public class MainWindow extends JFrame {
launchThread(new Runnable() {
@Override
public void run() {
updateDrawing(BasicDrawing.class);
drawing.drawGraph(graph, new BlackAndWhiteGraphPalette());
drawGraph(BasicDrawing.class, new BlackAndWhiteGraphPalette());
}
});
}
@ -527,8 +594,7 @@ public class MainWindow extends JFrame {
launchThread(new Runnable() {
@Override
public void run() {
updateDrawing(MapViewDrawing.class);
drawing.drawGraph(graph);
drawGraph(MapViewDrawing.class);
}
});
}

View File

@ -3,13 +3,8 @@ package org.insa.graphics.drawing;
import java.awt.Color;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
import org.insa.graph.Arc;
import org.insa.graph.Graph;
import org.insa.graph.Path;
@ -141,41 +136,6 @@ public class MapViewDrawing extends MapView implements Drawing {
model.setFixedTileSize(this.tileSize);
}
/**
*
* @param color
* @return
*/
private File getMapsforgeFileFromGraph(Graph graph) {
// TODO: Find a way to change this...
Map<Integer, String> idToNames = new HashMap<Integer, String>();
idToNames.put(0x100, "insa");
idToNames.put(0x110, "paris");
idToNames.put(0x200, "mayotte");
idToNames.put(0x250, "newzealand");
idToNames.put(0x300, "reunion");
idToNames.put(0x400, "midip");
idToNames.put(0x410, "morbihan");
File file = null;
if (idToNames.containsKey(graph.getMapId())) {
file = new File("Maps/" + idToNames.get(graph.getMapId()) + ".mapfg");
if (!file.exists()) {
file = new File("Maps/new/" + idToNames.get(graph.getMapId()) + ".mapfg");
}
}
if (file == null || !file.exists()) {
JFileChooser fileChooser = new JFileChooser("Maps/");
fileChooser.setFileFilter(new FileNameExtensionFilter("mapsforge files", "" + "mapfg"));
if (fileChooser.showOpenDialog(this.getParent()) == JFileChooser.APPROVE_OPTION) {
file = fileChooser.getSelectedFile();
}
}
return file;
}
protected LatLong convertPoint(Point point) {
return new LatLong(point.getLatitude(), point.getLongitude());
}
@ -235,10 +195,7 @@ public class MapViewDrawing extends MapView implements Drawing {
// TODO:
}
@Override
public void drawGraph(Graph graph, GraphPalette palette) {
File graphFile = getMapsforgeFileFromGraph(graph);
public void drawGraph(File file) {
// Tile cache
TileCache tileCache = AwtUtil.createTileCache(tileSize, getModel().frameBufferModel.getOverdrawFactor(), 1024,
@ -247,7 +204,7 @@ public class MapViewDrawing extends MapView implements Drawing {
// Layers
Layers layers = getLayerManager().getLayers();
MapDataStore mapDataStore = new MapFile(graphFile);
MapDataStore mapDataStore = new MapFile(file);
TileRendererLayer tileRendererLayer = createTileRendererLayer(tileCache, mapDataStore,
getModel().mapViewPosition, null);
layers.add(tileRendererLayer);
@ -261,6 +218,11 @@ public class MapViewDrawing extends MapView implements Drawing {
}
}
@Override
public void drawGraph(Graph graph, GraphPalette palette) {
// TODO: Unimplemented for now...
}
@Override
public void drawGraph(Graph graph) {
drawGraph(graph, null);

View File

@ -2,6 +2,9 @@ package org.insa.graph.io;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
@ -20,7 +23,8 @@ public class BinaryGraphReaderTest {
@BeforeAll
static void initAll() throws IOException {
BinaryGraphReader reader = new BinaryGraphReader(Openfile.open("midip"));
BinaryGraphReader reader = new BinaryGraphReader(
new DataInputStream(new BufferedInputStream(new FileInputStream("Maps/midip.map"))));
midip = reader.read();
}