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 cf24b4022bad5f2646f4f4d74e9e603875e18d1e..8325b47918241003466ef1f0d12ef8da02ee81b6 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 19e2fd43ad21eab376c81a1e26c97d147125ad14..3e3c1de6f22299c198e8467d75506ad6a2ff3950 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 0000000000000000000000000000000000000000..8f1ad456b2b2ec7796ef8eab67c5a71434ee3dd4 --- /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 f8aee013f0aa7b15ec16aefc37cac9754fb82f7e..0203ad70ed35a06fddf891bacd543158989b31f6 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 7c1f2d915f5f77cbc5a0f77899fc735a432d6bcc..e8c65d0a5edc1fceb409147d4d53b12c83aadde3 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 654d377ef4f568ad589920745531c41f6465de6d..1af22c713eb354a464788ff6f6a944504b8edbb6 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 d3e590495be7d4f0330bba1391f8f79242e004a9..77c47e77df449f1684fa55726c46a84837533fe4 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 060a5a45fd0561d8bf17cf8d5a90b1a10a97c8aa..7aca094d9754d8069fbafdcde7fcc112c5ab8f14 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 0000000000000000000000000000000000000000..55ef72e77deb48b6c6b21ab1b40e60e20b379eea --- /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 0000000000000000000000000000000000000000..47bdc08a568d300c1db316f862bfe060a4569825 --- /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; + } +}