From 92375b8755754a7e6ed4db44fd2005a03c31d19b Mon Sep 17 00:00:00 2001 From: Hallvard Traetteberg <hal@ntnu.no> Date: Fri, 9 Feb 2018 00:04:43 +0100 Subject: [PATCH] Tags for configuring markers, and some fixes. --- .../java/tdt4140/gr1800/app/core/App.java | 13 +++++---- .../tdt4140/gr1800/app/core/GeoLocations.java | 29 ++++++++++++++++++- .../java/tdt4140/gr1800/app/core/Tagged.java | 5 ++++ .../app/doc/AbstractDocumentStorageImpl.java | 6 ++-- .../gr1800/app/gpx/GpxDocumentConverter.java | 6 +++- .../gr1800/app/core/GeoLocationsTest.java | 9 ++++++ .../gr1800/app/ui/FileMenuController.java | 9 +++--- .../gr1800/app/ui/FxAppController.java | 4 ++- .../gr1800/app/ui/IMapMarkerProvider.java | 9 ++++++ .../app/ui/TagBasedMapMarkerProvider.java | 13 +++++++++ 10 files changed, 88 insertions(+), 15 deletions(-) create mode 100644 tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/Tagged.java create mode 100644 tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/IMapMarkerProvider.java create mode 100644 tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/TagBasedMapMarkerProvider.java diff --git a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/App.java b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/App.java index cf24b40..8325b47 100644 --- a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/App.java +++ b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/App.java @@ -5,12 +5,13 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.stream.Collectors; -import tdt4140.gr1800.app.doc.DocumentStorageImpl; +import tdt4140.gr1800.app.doc.AbstractDocumentStorageImpl; import tdt4140.gr1800.app.doc.IDocumentImporter; import tdt4140.gr1800.app.doc.IDocumentLoader; import tdt4140.gr1800.app.doc.IDocumentPersistence; @@ -20,7 +21,7 @@ import tdt4140.gr1800.app.json.GeoLocationsJsonPersistence; public class App { - private GeoLocationsPersistence geoLocationsLoader = new GeoLocationsJsonPersistence(); + private GeoLocationsPersistence geoLocationsPersistence = new GeoLocationsJsonPersistence(); private Collection<GeoLocations> geoLocations = null; @@ -79,16 +80,18 @@ public class App { @Override public Collection<GeoLocations> loadDocument(InputStream inputStream) throws Exception { - return geoLocationsLoader.loadLocations(inputStream); + return geoLocationsPersistence.loadLocations(inputStream); } @Override public void saveDocument(Collection<GeoLocations> document, File documentLocation) throws Exception { - geoLocationsLoader.saveLocations(document, new FileOutputStream(documentLocation)); + try (OutputStream output = new FileOutputStream(documentLocation)) { + geoLocationsPersistence.saveLocations(document, output); + } } }; - private DocumentStorageImpl<Collection<GeoLocations>, File> documentStorage = new DocumentStorageImpl<Collection<GeoLocations>, File>() { + private AbstractDocumentStorageImpl<Collection<GeoLocations>, File> documentStorage = new AbstractDocumentStorageImpl<Collection<GeoLocations>, File>() { @Override protected Collection<GeoLocations> getDocument() { diff --git a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/GeoLocations.java b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/GeoLocations.java index 19e2fd4..3e3c1de 100644 --- a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/GeoLocations.java +++ b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/GeoLocations.java @@ -1,13 +1,18 @@ package tdt4140.gr1800.app.core; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Comparator; +import java.util.HashSet; import java.util.Iterator; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; -public class GeoLocations implements Iterable<GeoLocated> { +import org.junit.Assert; + +public class GeoLocations implements Iterable<GeoLocated>, Tagged { private String name; @@ -82,4 +87,26 @@ public class GeoLocations implements Iterable<GeoLocated> { public Iterator<GeoLocated> iterator() { return locations.iterator(); } + + // + + private Set<String> tags = null; + + @Override + public boolean hasTags(String... tags) { + return this.tags != null && this.tags.containsAll(Arrays.asList(tags)); + } + + public void addTags(String... tags) { + if (this.tags == null) { + this.tags = new HashSet<>(); + } + this.tags.addAll(Arrays.asList(tags)); + } + + public void removeTags(String... tags) { + if (this.tags != null) { + this.tags.removeAll(Arrays.asList(tags)); + } + } } diff --git a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/Tagged.java b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/Tagged.java new file mode 100644 index 0000000..8f1ad45 --- /dev/null +++ b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/Tagged.java @@ -0,0 +1,5 @@ +package tdt4140.gr1800.app.core; + +public interface Tagged { + public boolean hasTags(String... tags); +} diff --git a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/doc/AbstractDocumentStorageImpl.java b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/doc/AbstractDocumentStorageImpl.java index f8aee01..0203ad7 100644 --- a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/doc/AbstractDocumentStorageImpl.java +++ b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/doc/AbstractDocumentStorageImpl.java @@ -5,7 +5,7 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; -public abstract class DocumentStorageImpl<D, L> implements IDocumentStorage<L>, IDocumentPersistence<D, L> { +public abstract class AbstractDocumentStorageImpl<D, L> implements IDocumentStorage<L>, IDocumentPersistence<D, L> { private L documentLocation; @@ -66,8 +66,8 @@ public abstract class DocumentStorageImpl<D, L> implements IDocumentStorage<L>, @Override public void openDocument(L storage) throws IOException { - try { - setDocumentAndLocation(loadDocument(toInputStream(storage)), storage); + try (InputStream input = toInputStream(storage)){ + setDocumentAndLocation(loadDocument(input), storage); } catch (Exception e) { throw new IOException(e); } diff --git a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/gpx/GpxDocumentConverter.java b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/gpx/GpxDocumentConverter.java index 7c1f2d9..e8c65d0 100644 --- a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/gpx/GpxDocumentConverter.java +++ b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/gpx/GpxDocumentConverter.java @@ -62,6 +62,7 @@ public class GpxDocumentConverter implements IDocumentLoader<Collection<GeoLocat String name = (singleTrack ? trackName : String.format(trackSegmentFormat, trackName, segmentCount)); GeoLocations gl = new GeoLocations(name, convert(segment.getPoints())); gl.setPath(true); + gl.addTags(Track.class.getName().toLowerCase()); geoLocations.add(gl); } } @@ -70,10 +71,13 @@ public class GpxDocumentConverter implements IDocumentLoader<Collection<GeoLocat String routeName = (route.getName().isPresent() ? String.format(routeNameFormat, route.getName().get()) : String.format(routeCountFormat, routeCount)); GeoLocations gl = new GeoLocations(routeName, convert(route.getPoints())); gl.setPath(true); + gl.addTags(Route.class.getName().toLowerCase()); geoLocations.add(gl); } if (! gpx.getWayPoints().isEmpty()) { - geoLocations.add(new GeoLocations("Waypoints", convert(gpx.getWayPoints()))); + GeoLocations gl = new GeoLocations("Waypoints", convert(gpx.getWayPoints())); + gl.addTags(WayPoint.class.getName().toLowerCase()); + geoLocations.add(gl); } return geoLocations; } diff --git a/tdt4140-gr1800/app.core/src/test/java/tdt4140/gr1800/app/core/GeoLocationsTest.java b/tdt4140-gr1800/app.core/src/test/java/tdt4140/gr1800/app/core/GeoLocationsTest.java index 654d377..1af22c7 100644 --- a/tdt4140-gr1800/app.core/src/test/java/tdt4140/gr1800/app/core/GeoLocationsTest.java +++ b/tdt4140-gr1800/app.core/src/test/java/tdt4140/gr1800/app/core/GeoLocationsTest.java @@ -38,6 +38,15 @@ public class GeoLocationsTest { } } + public static void assertGeoLocations(GeoLocations geoLocations, GeoLocations geoLocations2) { + Iterator<GeoLocated> it = geoLocations.iterator(), it2 = geoLocations2.iterator(); + while (it.hasNext()) { + Assert.assertTrue(it2.hasNext()); + checkGeoLocated(it2.next(), it.next()); + } + Assert.assertFalse(it2.hasNext()); + } + @Test public void testAddLocation() { Assert.assertEquals(0, geoLocations.size()); diff --git a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FileMenuController.java b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FileMenuController.java index d3e5904..77c47e7 100644 --- a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FileMenuController.java +++ b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FileMenuController.java @@ -3,6 +3,7 @@ package tdt4140.gr1800.app.ui; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; @@ -146,8 +147,8 @@ public class FileMenuController { void handleFileImportAction(File selection) { for (IDocumentImporter importer : documentStorage.getDocumentImporters()) { - try { - importer.importDocument(new FileInputStream(selection)); + try (InputStream input = new FileInputStream(selection)) { + importer.importDocument(input); break; } catch (Exception e) { } @@ -187,8 +188,8 @@ public class FileMenuController { boolean handleURLImportAction(URL url) { for (IDocumentImporter importer : documentStorage.getDocumentImporters()) { - try { - importer.importDocument(url.openStream()); + try (InputStream input = url.openStream()) { + importer.importDocument(input); return true; } catch (Exception e) { System.err.println(e.getMessage()); diff --git a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FxAppController.java b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FxAppController.java index 060a5a4..7aca094 100644 --- a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FxAppController.java +++ b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FxAppController.java @@ -75,6 +75,8 @@ public class FxAppController implements IDocumentListener<Collection<GeoLocation return null; } + private IMapMarkerProvider mapMarkerProvider = new TagBasedMapMarkerProvider(); + private void initMapMarkers() { markersParent.getItems().clear(); geoLocationsSelector.getItems().clear(); @@ -82,7 +84,7 @@ public class FxAppController implements IDocumentListener<Collection<GeoLocation GeoLocations geoLocations = app.getGeoLocations(geoLocationName); MapMarker lastMarker = null; for (GeoLocated geoLoc : geoLocations) { - MapMarker mapMarker = new MapMarker(geoLoc.getLatLong()); + MapMarker mapMarker = mapMarkerProvider.getMapMarker(geoLoc, geoLocations); markersParent.getItems().add(mapMarker); if (geoLocations.isPath() && lastMarker != null) { MapPathLine pathLine = new MapPathLine(lastMarker, mapMarker); diff --git a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/IMapMarkerProvider.java b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/IMapMarkerProvider.java new file mode 100644 index 0000000..55ef72e --- /dev/null +++ b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/IMapMarkerProvider.java @@ -0,0 +1,9 @@ +package tdt4140.gr1800.app.ui; + +import tdt4140.gr1800.app.core.GeoLocated; +import tdt4140.gr1800.app.core.GeoLocations; + +public interface IMapMarkerProvider { + + public MapMarker getMapMarker(GeoLocated geoLoc, GeoLocations geoLocations); +} diff --git a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/TagBasedMapMarkerProvider.java b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/TagBasedMapMarkerProvider.java new file mode 100644 index 0000000..47bdc08 --- /dev/null +++ b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/TagBasedMapMarkerProvider.java @@ -0,0 +1,13 @@ +package tdt4140.gr1800.app.ui; + +import tdt4140.gr1800.app.core.GeoLocated; +import tdt4140.gr1800.app.core.GeoLocations; + +public class TagBasedMapMarkerProvider implements IMapMarkerProvider { + + @Override + public MapMarker getMapMarker(GeoLocated geoLoc, GeoLocations geoLocations) { + MapMarker mapMarker = new MapMarker(geoLoc.getLatLong()); + return mapMarker; + } +} -- GitLab